Explorar o código

日志管理-根据url和权限表自动生成接口操作日志记录
(菜单->菜单->菜单--操作)

caozixuan %!s(int64=2) %!d(string=hai) anos
pai
achega
e46bee4783

+ 3 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicClazzController.java

@@ -4,11 +4,13 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.templete.execute.AsyncBasicClazzImportService;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.params.BasicClazzParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.service.BasicClazzService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
@@ -49,6 +51,7 @@ public class BasicClazzController {
     @ApiOperation(value = "班级基本信息管理-查询")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
     public Result findBasicClazzList(@ApiParam(value = "查询参数(班级号或班级名)") @RequestParam(required = false) String queryParams,
                                      @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                      @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {

+ 49 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/aspect/LogAspect.java

@@ -1,13 +1,19 @@
 package com.qmth.teachcloud.common.aspect;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.dto.LogArgsDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicOperationLog;
+import com.qmth.teachcloud.common.entity.SysPrivilege;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.PrivilegeEnum;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.service.BasicOperationLogService;
+import com.qmth.teachcloud.common.service.SysPrivilegeService;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.aspectj.lang.JoinPoint;
@@ -36,6 +42,8 @@ import java.util.*;
 public class LogAspect {
     @Resource
     private BasicOperationLogService basicOperationLogService;
+    @Resource
+    private SysPrivilegeService sysPrivilegeService;
 
     private final static Logger log = LoggerFactory.getLogger(LogAspect.class);
 
@@ -124,10 +132,20 @@ public class LogAspect {
         // 注解中的信息
         OperationLogDetail annotation = signature.getMethod().getAnnotation(OperationLogDetail.class);
         if (annotation != null) {
-            operationLog.setDetail(getDetail(((MethodSignature) joinPoint.getSignature()).getParameterNames(), joinPoint.getArgs(), annotation));
+            String detail = annotation.detail();
+            if (SystemConstant.strNotNull(detail)) {
+                operationLog.setDetail(getDetail(((MethodSignature) joinPoint.getSignature()).getParameterNames(), joinPoint.getArgs(), annotation));
+            } else {
+                operationLog.setDetail(autoCreateOperationLogDetailByUrl(request.getServletPath()));
+            }
             operationLog.setLevel(annotation.level());
-            operationLog.setCustomizedOperationType(annotation.customizedOperationType());
-            operationLog.setOperationType(annotation.operationType());
+            CustomizedOperationTypeEnum customizedOperationType = annotation.customizedOperationType();
+            operationLog.setCustomizedOperationType(customizedOperationType);
+            OperationTypeEnum operationType = annotation.operationType();
+            if (OperationTypeEnum.UN_KNOW.equals(operationType)) {
+                operationType = customizedOperationType.getOperationType();
+            }
+            operationLog.setOperationType(operationType);
             operationLog.setOperationUnit(annotation.operationUnit());
             operationLog.setSystemType(annotation.system());
         }
@@ -182,6 +200,34 @@ public class LogAspect {
         return detail;
     }
 
+    /**
+     * 根据权限url自动创建操作日志详情
+     *
+     * @param url url
+     * @return 操作日志详情
+     */
+    private String autoCreateOperationLogDetailByUrl(String url) {
+        String detail = "";
+        List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>()
+                .lambda()
+                .eq(SysPrivilege::getUrl, url)
+                .eq(SysPrivilege::getType, PrivilegeEnum.URL)
+                .orderByAsc(SysPrivilege::getId));
+        if (sysPrivilegeList.size() > 0) {
+            SysPrivilege sysPrivilege = sysPrivilegeList.get(0);
+            Long parentId = sysPrivilege.getParentId();
+            String operationName = sysPrivilege.getName();
+            String path = sysPrivilegeService.findPrivilegeUrlCatalog(parentId);
+            if (SystemConstant.strNotNull(path)) {
+                path = path.substring(0, path.length() - SystemConstant.CATALOG_LINK.length());
+                detail = path + SystemConstant.OPERATE_LINK + operationName;
+            } else {
+                detail = operationName;
+            }
+        }
+        return detail;
+    }
+
     @Before(value = "operationLog()")
     public void doBeforeAdvice(JoinPoint joinPoint) {
         System.out.println("进入方法前执行.....");

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -252,6 +252,8 @@ public class SystemConstant {
     public static final String GET_EQUAL = "=";
     public static final String PATH_MATCH = "*";
     public static final String PATH_SUBSTR = "/#";
+    public static final String CATALOG_LINK = "->";
+    public static final String OPERATE_LINK = "--";
 
     /**
      * oss url过期时间

+ 17 - 10
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/log/CustomizedOperationTypeEnum.java

@@ -6,22 +6,29 @@ package com.qmth.teachcloud.common.enums.log;
  * @Date: 2022-11-29
  */
 public enum CustomizedOperationTypeEnum {
-    LOGIN("用户登录"),
-    LOGOUT("用户登出"),
-    ADD("新增"),
-    DELETE("删除"),
-    UPDATE("修改"),
-    SEARCH("查询"),
-    IMPORT("导入"),
-    EXPORT("导出"),
-    UN_KNOW("未知");
+    LOGIN("用户登录", OperationTypeEnum.UN_KNOW),
+    LOGOUT("用户登出", OperationTypeEnum.UN_KNOW),
+    ADD("新增", OperationTypeEnum.EDIT),
+    DELETE("删除", OperationTypeEnum.DELETE),
+    UPDATE("修改", OperationTypeEnum.EDIT),
+    SEARCH("查询", OperationTypeEnum.SELECT),
+    IMPORT("导入", OperationTypeEnum.EDIT),
+    EXPORT("导出", OperationTypeEnum.SELECT),
+    PUSH("推送", OperationTypeEnum.UN_KNOW),
+    UN_KNOW("未知", OperationTypeEnum.UN_KNOW);
     private final String desc;
+    private final OperationTypeEnum operationType;
 
-    CustomizedOperationTypeEnum(String desc) {
+    CustomizedOperationTypeEnum(String desc, OperationTypeEnum operationType) {
         this.desc = desc;
+        this.operationType = operationType;
     }
 
     public String getDesc() {
         return desc;
     }
+
+    public OperationTypeEnum getOperationType() {
+        return operationType;
+    }
 }

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysPrivilegeService.java

@@ -72,4 +72,13 @@ public interface SysPrivilegeService extends IService<SysPrivilege> {
      * @return
      */
     void removeCustomList();
+
+    /**
+     * 构建权限url的目录
+     *
+     * @param privilegeParentId 权限父id eg。 101
+     * @param path              当前路径
+     * @return eg。考试中心->印刷管理->印刷计划管理
+     */
+    String findPrivilegeUrlCatalog(Long privilegeParentId);
 }

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysPrivilegeServiceImpl.java

@@ -312,6 +312,21 @@ public class SysPrivilegeServiceImpl extends ServiceImpl<SysPrivilegeMapper, Sys
 
     }
 
+    @Override
+    public String findPrivilegeUrlCatalog(Long privilegeParentId) {
+        SysPrivilege sysPrivilege = this.getById(privilegeParentId);
+        if (Objects.nonNull(sysPrivilege)) {
+            String currentName = sysPrivilege.getName();
+            Long parentId = sysPrivilege.getParentId();
+            if (SystemConstant.longNotNull(parentId)) {
+                return this.findPrivilegeUrlCatalog(parentId) + SystemConstant.CATALOG_LINK + currentName;
+            }else {
+                return currentName;
+            }
+        }
+        return SystemConstant.CATALOG_LINK;
+    }
+
     /**
      * 获取自定义菜单
      *