Bladeren bron

feat: 新增app接口,记录用户使用记录

weijianghai 2 jaren geleden
bovenliggende
commit
95a92ba5c9

+ 67 - 1
doc/开发测试文档/开发环境建设/开发环境建设.md

@@ -50,5 +50,71 @@ CREATE TABLE sqmdb_rpt.acl_role (
 	role_name varchar NULL,
 	"system" varchar NULL,
 	CONSTRAINT role_pk PRIMARY KEY (role_id)
-)
+);
+-- sqmdb_rpt.acl_function definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_function;
+
+CREATE TABLE sqmdb_rpt.acl_function (
+	id int4 NOT NULL, -- 主键
+	"name" varchar NOT NULL, -- 功能名称
+	url varchar NOT NULL, -- 功能链接
+	client int4 NOT NULL, -- 展示的客户端
+	CONSTRAINT acl_app_function_pk PRIMARY KEY (id)
+);
+COMMENT ON TABLE sqmdb_rpt.acl_function IS '功能';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_function.id IS '主键';
+COMMENT ON COLUMN sqmdb_rpt.acl_function."name" IS '功能名称';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.url IS '功能链接';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.client IS '展示的客户端';
+-- sqmdb_rpt.acl__user_function definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl__user_function;
+
+CREATE TABLE sqmdb_rpt.acl__user_function (
+	user_id int4 NOT NULL, -- 用户id
+	function_id int4 NOT NULL, -- 功能id
+	CONSTRAINT acl_app_user_function_pk PRIMARY KEY (user_id, function_id)
+);
+COMMENT ON TABLE sqmdb_rpt.acl__user_function IS '用户功能关联';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl__user_function.user_id IS '用户id';
+COMMENT ON COLUMN sqmdb_rpt.acl__user_function.function_id IS '功能id';
+    
+-- sqmdb_rpt.acl_verification_log definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_verification_log;
+
+CREATE TABLE sqmdb_rpt.acl_verification_log (
+	id bigserial NOT NULL, -- 主键
+	user_id int4 NOT NULL, -- 用户id
+	login_name varchar NOT NULL, -- 用户账号
+	user_name varchar NOT NULL, -- 用户姓名
+	city_id int4 NOT NULL, -- 所属地市
+	"system" varchar NOT NULL, -- 登入模块
+	login_time timestamp NOT NULL, -- 登录时间
+	CONSTRAINT acl_verification_log_pk PRIMARY KEY (id)
+);
+COMMENT ON TABLE sqmdb_rpt.acl_verification_log IS '用户登录日志';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.id IS '主键';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.user_id IS '用户id';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.login_name IS '用户账号';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.user_name IS '用户姓名';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.city_id IS '所属地市';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log."system" IS '登入模块';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.login_time IS '登录时间';
 ```

+ 55 - 0
doc/开发测试文档/接口开发/acl提供给app的接口.md

@@ -0,0 +1,55 @@
+# acl提供给app的接口
+
+## 鉴权接口
+
+```http
+POST HTTP://127.0.0.1:12128/api/verification
+Content-Type: application/json
+
+{
+  "token": "token",
+  "system": "app",
+  "fromSystem": "test"
+}
+```
+
+```json
+{
+  "success": true,
+  "code": 1,
+  "message": "成功",
+  "data": [
+    {
+      "id": 1,
+      "name": "工单处理",
+      "url": "url"
+    },
+    {
+      "id": 2,
+      "name": "工单答复",
+      "url": "url"
+    }
+  ]
+}
+```
+
+### 输出参数说明
+
+id: 功能id
+
+name: 功能名称
+
+url: 功能链接
+
+### 特殊情况
+
+- 无任何权限
+
+```json
+{
+  "success": true,
+  "code": 1,
+  "message": "成功",
+  "data": []
+}
+```

+ 25 - 0
src/main/java/com/nokia/constants/ClientEnum.java

@@ -0,0 +1,25 @@
+package com.nokia.constants;
+
+/**
+ * 客户端枚举
+ */
+public enum ClientEnum {
+    /**
+     * 所有客户端
+     */
+    ALL(0),
+    /**
+     * app端
+     */
+    APP(1),
+    /**
+     * web端
+     */
+    WEB(2);
+
+    public final int value;
+
+    ClientEnum(int value) {
+        this.value = value;
+    }
+}

+ 12 - 9
src/main/java/com/nokia/controller/VerificationController.java

@@ -1,25 +1,22 @@
 package com.nokia.controller;
 
 import com.nokia.common.R;
+import com.nokia.constants.ClientEnum;
 import com.nokia.pojo.User;
 import com.nokia.service.AclService;
-import com.nokia.vo.DapingUserVo;
-import com.nokia.vo.FenxiUserVo;
-import com.nokia.vo.LiuchengUserVo;
-import com.nokia.vo.TokenVo;
-import com.nokia.vo.VolteT2UserVo;
-import com.nokia.vo.YuceUserVo;
-import com.nokia.vo.HeidiankuUserVo;
-
+import com.nokia.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -38,8 +35,9 @@ public class VerificationController {
     @Value("${top.redirect.url}")
     private String topRedirectUrl;
 
+    @Transactional(rollbackFor = Exception.class)
     @PostMapping("/verification")
-    public R verifySystem(@RequestBody TokenVo tokenEntity) {
+    public R verifySystem(@Valid @RequestBody TokenVo tokenEntity) {
         User userEntity = aclService.verifySystem(tokenEntity.getToken(), tokenEntity.getFromSystem());
         log.debug("输出用户信息: {}", userEntity);
         Map<String, String> map = new HashMap<>();
@@ -65,6 +63,7 @@ public class VerificationController {
         if (userEntity == null) {
             return R.error().data(map).message("用户不存在");
         } else {
+            aclService.logVerification(tokenEntity, userEntity);
             switch (tokenEntity.getSystem().trim().toLowerCase()) {
                 case "liucheng":
                     return R.ok().data(new LiuchengUserVo(userEntity));
@@ -98,6 +97,10 @@ public class VerificationController {
                 case "luyin":
                     LvYinVo lvYinVo = new LvYinVo(userEntity);
                     return R.ok().data(lvYinVo);
+                case "app":
+                    List<AppVerificationVO> vo = aclService.listUserFunctions(tokenEntity, userEntity.getUserId(),
+                            ClientEnum.APP.value);
+                    return R.ok().data(vo);
                 default:
                     return R.error().message("当前允许的system为: liucheng/fenxi/daping/yuce/heidianku/volte_t2/luyin");
             }

+ 4 - 0
src/main/java/com/nokia/dao/UserDao.java

@@ -3,6 +3,7 @@ package com.nokia.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.nokia.pojo.Role;
 import com.nokia.pojo.User;
+import com.nokia.vo.AppVerificationVO;
 import com.nokia.vo.flow.FlowRoleVo;
 import com.nokia.vo.flow.FlowUserVo;
 
@@ -105,4 +106,7 @@ public interface UserDao extends BaseMapper<User> {
         @Insert("INSERT INTO sqmdb_rpt.acl_user (login_name, user_name, phone, email, city_id, area_id, province_id, org) "
                         + " VALUES(#{loginName}, #{userName}, #{phone}, #{email}, #{cityId}, #{areaId}, #{provinceId}, #{org})")
         int insert(User user);
+
+        @Select("select af.id, af.name, af.url from sqmdb_rpt.acl_function af inner join sqmdb_rpt.acl_user_function auf on af.id = auf.function_id where auf.user_id = #{userId} and (af.client = 0 or af.client = #{client})")
+        List<AppVerificationVO> listUserFunctions(Integer userId, Integer client);
 }

+ 10 - 0
src/main/java/com/nokia/dao/VerificationLogDao.java

@@ -0,0 +1,10 @@
+package com.nokia.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nokia.pojo.VerificationLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface VerificationLogDao extends BaseMapper<VerificationLog> {
+    int insert(VerificationLog verificationLog);
+}

+ 23 - 0
src/main/java/com/nokia/pojo/VerificationLog.java

@@ -0,0 +1,23 @@
+package com.nokia.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("sqmdb_rpt.acl_verification_log")
+public class VerificationLog implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Integer userId;
+    private String loginName;
+    private String userName;
+    private Integer cityId;
+    private String system;
+    private LocalDateTime loginTime;
+}

+ 28 - 1
src/main/java/com/nokia/service/AclService.java

@@ -1,14 +1,20 @@
 package com.nokia.service;
 
 import com.nokia.dao.UserDao;
+import com.nokia.dao.VerificationLogDao;
 import com.nokia.pojo.User;
+import com.nokia.pojo.VerificationLog;
+import com.nokia.vo.AppVerificationVO;
 import com.nokia.vo.TokenFlagVo;
+import com.nokia.vo.TokenVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 @Slf4j
@@ -23,14 +29,35 @@ public class AclService {
     private final DopService dopService;
 
     private final RedisTemplate<String, Object> redisTemplate;
+    private final VerificationLogDao verificationLogDao;
 
     @Autowired
     public AclService(UserDao userDao, TopService topService, DopService dopService,
-            RedisTemplate<String, Object> redisTemplate) {
+                      RedisTemplate<String, Object> redisTemplate, VerificationLogDao verificationLogDao) {
         this.userDao = userDao;
         this.topService = topService;
         this.dopService = dopService;
         this.redisTemplate = redisTemplate;
+        this.verificationLogDao = verificationLogDao;
+    }
+
+    public List<AppVerificationVO> listUserFunctions(TokenVo tokenEntity, Integer userId, Integer client) {
+        List<AppVerificationVO> list = userDao.listUserFunctions(userId, client);
+        for (AppVerificationVO t : list) {
+            t.setUrl(t.getUrl() + "&fromSystem=" + tokenEntity.getFromSystem() + "&token=" + tokenEntity.getToken());
+        }
+        return list;
+    }
+
+    public void logVerification(TokenVo tokenEntity, User userEntity) {
+        VerificationLog verificationLog = new VerificationLog();
+        verificationLog.setUserId(userEntity.getUserId());
+        verificationLog.setLoginName(userEntity.getLoginName());
+        verificationLog.setUserName(userEntity.getUserName());
+        verificationLog.setCityId(userEntity.getCityId());
+        verificationLog.setSystem(tokenEntity.getSystem());
+        verificationLog.setLoginTime(LocalDateTime.now());
+        verificationLogDao.insert(verificationLog);
     }
 
     public User verifySystem(String token, String fromSystem) {

+ 14 - 0
src/main/java/com/nokia/vo/AppVerificationVO.java

@@ -0,0 +1,14 @@
+package com.nokia.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AppVerificationVO {
+    private Integer id;
+    private String name;
+    private String url;
+}

+ 1 - 1
src/main/java/com/nokia/controller/LvYinVo.java → src/main/java/com/nokia/vo/LvYinVo.java

@@ -1,4 +1,4 @@
-package com.nokia.controller;
+package com.nokia.vo;
 
 import com.nokia.pojo.User;
 import lombok.Data;

+ 4 - 0
src/main/java/com/nokia/vo/TokenVo.java

@@ -2,6 +2,7 @@ package com.nokia.vo;
 
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 
 /**
@@ -9,7 +10,10 @@ import java.io.Serializable;
  */
 @Data
 public class TokenVo implements Serializable {
+    @NotBlank(message = "token不能为空")
     private String token;
+    @NotBlank(message = "system不能为空")
     private String system;
+    @NotBlank(message = "fromSystem不能为空")
     private String fromSystem;
 }

+ 1 - 1
src/main/resources/application-test.properties

@@ -3,7 +3,7 @@ server.port=12128
 
 # log配置
 logging.level.root=info
-logging.level.com.nokia=debug
+#logging.level.com.nokia=debug
 
 # 测试环境数据库配置
 spring.datasource.driver-class-name=org.postgresql.Driver