caozixuan 3 anni fa
parent
commit
f5399fe00a

+ 7 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java

@@ -7,6 +7,9 @@ import com.qmth.distributed.print.business.service.TeachCourseService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.log.LevelEnum;
+import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
+import com.qmth.teachcloud.common.enums.log.OperationUnitEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -38,7 +41,7 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    @OperationLogDetail
+    @OperationLogDetail(detail = "根据查询条件课程名称[{{courseName}}]模糊查询教学课程,查询第[{{pageNumber}}]页,每页查[{{pageSize}}]个", operationType = OperationTypeEnum.SELECT, operationUnit = OperationUnitEnum.TEACH_COURSE)
     public Result findTeachCoursePage(@ApiParam(value = "课程名称(模糊查询)") @RequestParam(required = false) String courseName,
                                       @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,6 +52,7 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-创建教学课程")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
+    @OperationLogDetail(detail = "创建教学课程,参数[{{teachCourseParams}}]", level = LevelEnum.TERTIARY, operationType = OperationTypeEnum.EDIT, operationUnit = OperationUnitEnum.TEACH_COURSE)
     public Result createTeachCourse(@Valid @RequestBody TeachCourseParams teachCourseParams, BindingResult bindingResult) throws IllegalAccessException {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (bindingResult.hasErrors()) {
@@ -61,6 +65,7 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-查找基础课程")
     @RequestMapping(value = "/find_basic_course", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @OperationLogDetail(detail = "用户查找可被创建课程的基础课程信息", operationType = OperationTypeEnum.SELECT)
     public Result findBasicCourse() {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         return ResultUtil.ok(teachCourseService.findBasicCourseByUser(requestUser));
@@ -69,6 +74,7 @@ public class TeachCourseController {
     @ApiOperation(value = "教学课程-批量删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @OperationLogDetail(detail = "用户根据教学课程id集合[{{idList}}]批量删除教学课程", level = LevelEnum.TERTIARY, operationType = OperationTypeEnum.DELETE, operationUnit = OperationUnitEnum.TEACH_COURSE)
     public Result deleteTeachCourse(@ApiParam(value = "选择的要删除的课程id集合", required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(teachCourseService.deleteTeachCourseBatch(idList));
     }

+ 59 - 26
teachcloud-common/src/main/java/com/qmth/teachcloud/common/aspect/LogAspect.java

@@ -2,9 +2,11 @@ package com.qmth.teachcloud.common.aspect;
 
 import com.alibaba.fastjson.JSON;
 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.SysUser;
+import com.qmth.teachcloud.common.service.BasicOperationLogService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -13,10 +15,14 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 
 /**
  * @Description: 日志操作记录拦截aop
@@ -26,6 +32,8 @@ import java.util.Map;
 @Aspect
 @Component
 public class LogAspect {
+    @Resource
+    private BasicOperationLogService basicOperationLogService;
 
     private final static Logger log = LoggerFactory.getLogger(LogAspect.class);
 
@@ -33,12 +41,13 @@ public class LogAspect {
      * 日志注解切入点
      */
     @Pointcut("@annotation(com.qmth.teachcloud.common.annotation.OperationLogDetail)")
-    public void operationLog(){
+    public void operationLog() {
 
     }
 
     /**
      * 环绕增强,操作日志环绕切入
+     *
      * @param joinPoint joinPoint
      * @return return
      * @throws Throwable Throwable
@@ -48,14 +57,14 @@ public class LogAspect {
         Object res = null;
         long time = System.currentTimeMillis();
         try {
-            res =  joinPoint.proceed();
+            res = joinPoint.proceed();
             time = System.currentTimeMillis() - time;
             return res;
         } finally {
             try {
                 //方法执行完成后增加日志
-                addOperationLog(joinPoint,res,time);
-            }catch (Exception e){
+                addOperationLog(joinPoint, res, time);
+            } catch (Exception e) {
                 System.out.println("LogAspect 操作失败:" + e.getMessage());
                 e.printStackTrace();
             }
@@ -64,21 +73,29 @@ public class LogAspect {
 
     /**
      * 记录日志操作
+     *
      * @param joinPoint joinPoint
-     * @param res 返回值
-     * @param time 方法执行时间
+     * @param res       返回值
+     * @param time      方法执行时间
      */
-    private void addOperationLog(JoinPoint joinPoint, Object res, long time){
+    private void addOperationLog(JoinPoint joinPoint, Object res, long time) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         String userName = requestUser.getRealName();
+        HttpServletRequest request = ServletUtil.getRequest();
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        String clazzName = signature.getDeclaringTypeName();
+        String methodName = signature.getName();
+        Object[] args = joinPoint.getArgs();
+        String[] paramsName = signature.getParameterNames();
 
-        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
         BasicOperationLog operationLog = new BasicOperationLog();
 
         // 方法中的信息
         operationLog.setId(SystemConstant.getDbUuid());
-        operationLog.setMethod(signature.getDeclaringTypeName() + "." + signature.getName());
-        operationLog.setArgs(JSON.toJSONString(joinPoint.getArgs()));
+        operationLog.setUrl(request.getServletPath());
+        operationLog.setClazzName(clazzName);
+        operationLog.setMethod(methodName);
+        operationLog.setArgs(this.getTranslateArgs(paramsName, args));
         operationLog.setRunTime(time);
         operationLog.setReturnValue(JSON.toJSONString(res));
         operationLog.setUserId(requestUser.getId());
@@ -87,30 +104,45 @@ public class LogAspect {
 
         // 注解中的信息
         OperationLogDetail annotation = signature.getMethod().getAnnotation(OperationLogDetail.class);
-        if(annotation != null){
-            operationLog.setDetail(getDetail(((MethodSignature)joinPoint.getSignature()).getParameterNames(),joinPoint.getArgs(),annotation));
+        if (annotation != null) {
+            operationLog.setDetail(getDetail(((MethodSignature) joinPoint.getSignature()).getParameterNames(), joinPoint.getArgs(), annotation));
             operationLog.setLevel(annotation.level());
             operationLog.setOperationType(annotation.operationType());
             operationLog.setOperationUnit(annotation.operationUnit());
             operationLog.setSystemType(annotation.system());
         }
-        //TODO 这里保存日志
-        System.out.println(JSON.toJSONString(operationLog));
+        // 保存操作日志
+        basicOperationLogService.save(operationLog);
+    }
+
+    private String getTranslateArgs(String[] paramsName, Object[] args) {
+        List<LogArgsDto> logArgsDtoList = new ArrayList<>();
+        for (int i = 0; i < args.length; i++) {
+            if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                continue;
+            }
+            LogArgsDto logArgsDto = new LogArgsDto();
+            logArgsDto.setArg(String.valueOf(args[i]));
+            logArgsDto.setParamName(paramsName[i]);
+            logArgsDtoList.add(logArgsDto);
+        }
+        return JSON.toJSONString(logArgsDtoList);
     }
 
     /**
      * 对当前登录用户和占位符处理
-     * @param argNames 方法参数名称数组
-     * @param args 方法参数数组
+     *
+     * @param argNames   方法参数名称数组
+     * @param args       方法参数数组
      * @param annotation 注解信息
      * @return 返回处理后的描述
      */
-    private String getDetail(String[] argNames, Object[] args, OperationLogDetail annotation){
+    private String getDetail(String[] argNames, Object[] args, OperationLogDetail annotation) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
 
         Map<Object, Object> map = new HashMap<>();
-        for(int i = 0;i < argNames.length;i++){
-            map.put(argNames[i],args[i]);
+        for (int i = 0; i < argNames.length; i++) {
+            map.put(argNames[i], args[i]);
         }
 
         String detail = annotation.detail();
@@ -121,20 +153,21 @@ public class LogAspect {
                 Object v = entry.getValue();
                 detail = detail.replace("{{" + k + "}}", JSON.toJSONString(v));
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return detail;
     }
 
     @Before(value = "operationLog()")
-    public void doBeforeAdvice(JoinPoint joinPoint){
+    public void doBeforeAdvice(JoinPoint joinPoint) {
         System.out.println("进入方法前执行.....");
 
     }
 
     /**
      * 处理完请求,返回内容
+     *
      * @param ret ret
      */
     @AfterReturning(returning = "ret", pointcut = "operationLog()")
@@ -146,7 +179,7 @@ public class LogAspect {
      * 后置异常通知
      */
     @AfterThrowing(value = "operationLog()")
-    public void throwss(JoinPoint jp){
+    public void throwss(JoinPoint jp) {
         System.out.println("方法异常时执行.....");
     }
 
@@ -155,7 +188,7 @@ public class LogAspect {
      * 后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
      */
     @After(value = "operationLog()")
-    public void after(JoinPoint jp){
+    public void after(JoinPoint jp) {
         System.out.println("方法最后执行.....");
     }
 }

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/LogArgsDto.java

@@ -0,0 +1,32 @@
+package com.qmth.teachcloud.common.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 日志方法中参数Dto
+ * @Author: CaoZixuan
+ * @Date: 2022-02-15
+ */
+public class LogArgsDto {
+    @ApiModelProperty(value = "参数")
+    private String arg;
+
+    @ApiModelProperty(value = "参数名称")
+    private String paramName;
+
+    public String getArg() {
+        return arg;
+    }
+
+    public void setArg(String arg) {
+        this.arg = arg;
+    }
+
+    public String getParamName() {
+        return paramName;
+    }
+
+    public void setParamName(String paramName) {
+        this.paramName = paramName;
+    }
+}

+ 23 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicOperationLog.java

@@ -39,7 +39,13 @@ public class BasicOperationLog implements Serializable {
     @ApiModelProperty(value = "日志系统类型")
     private SystemEnum systemType;
 
-    @ApiModelProperty(value = "方法url")
+    @ApiModelProperty(value = "请求地址url")
+    private String url;
+
+    @ApiModelProperty(value = "类名称")
+    private String clazzName;
+
+    @ApiModelProperty(value = "方法名称")
     private String method;
 
     @ApiModelProperty(value = "参数")
@@ -111,6 +117,22 @@ public class BasicOperationLog implements Serializable {
         this.systemType = systemType;
     }
 
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
     public String getMethod() {
         return method;
     }

+ 9 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/log/OperationUnitEnum.java

@@ -8,15 +8,17 @@ import java.util.Objects;
  * @Date: 2022-02-14
  */
 public enum OperationUnitEnum {
-    UN_KNOW("未知", ""),
-    TEACH_COURSE("操作'teach_course'表", "teach_course"),
+    UN_KNOW("未知", "", ""),
+    TEACH_COURSE("操作'teach_course'表", "teach_course", "TeachCourse"),
     ;
     private final String desc;
     private final String table;
+    private final String object;
 
-    OperationUnitEnum(String desc, String table) {
+    OperationUnitEnum(String desc, String table, String object) {
         this.desc = desc;
         this.table = table;
+        this.object = object;
     }
 
     public String getTable() {
@@ -27,6 +29,10 @@ public enum OperationUnitEnum {
         return desc;
     }
 
+    public String getObject() {
+        return object;
+    }
+
     /**
      * 状态转换 toName
      *

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicOperationLogMapper.java

@@ -0,0 +1,12 @@
+package com.qmth.teachcloud.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.common.entity.BasicOperationLog;
+
+/**
+ * @Description: 基础操作日志记录mapper
+ * @Author: CaoZixuan
+ * @Date: 2022-02-15
+ */
+public interface BasicOperationLogMapper extends BaseMapper<BasicOperationLog> {
+}

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicOperationLogService.java

@@ -0,0 +1,12 @@
+package com.qmth.teachcloud.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.entity.BasicOperationLog;
+
+/**
+ * @Description: 操作日志记录服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-2-15
+ */
+public interface BasicOperationLogService extends IService<BasicOperationLog> {
+}

+ 16 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicOperationLogServiceImpl.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.entity.BasicOperationLog;
+import com.qmth.teachcloud.common.mapper.BasicOperationLogMapper;
+import com.qmth.teachcloud.common.service.BasicOperationLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 基础操作日志服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-02-15
+ */
+@Service
+public class BasicOperationLogServiceImpl extends ServiceImpl<BasicOperationLogMapper, BasicOperationLog> implements BasicOperationLogService {
+}

+ 5 - 0
teachcloud-common/src/main/resources/mapper/BasicOperationLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.common.mapper.BasicOperationLogMapper">
+
+</mapper>