Ver Fonte

feat: add TreeLogging AOP注解,用于记录操作日志

Chen YZ há 5 anos atrás
pai
commit
ecd6105850

+ 17 - 0
web/src/main/java/seecoder/devcloud/web/aop/TreeLogging.java

@@ -0,0 +1,17 @@
+package seecoder.devcloud.web.aop;
+
+import seecoder.devcloud.web.enums.OperationEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * 以注解方式标记日志插入
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface TreeLogging {
+
+    public OperationEnum value();
+
+}

+ 73 - 0
web/src/main/java/seecoder/devcloud/web/aspect/TreeLoggingAspect.java

@@ -0,0 +1,73 @@
+package seecoder.devcloud.web.aspect;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import seecoder.devcloud.web.aop.TreeLogging;
+import seecoder.devcloud.web.dao.tree.TreeLogMapper;
+import seecoder.devcloud.web.enums.ResponseEnums;
+import seecoder.devcloud.web.po.tree.TreeLog;
+import seecoder.devcloud.web.vo.Response;
+import seecoder.devcloud.web.vo.TreeNodeVO;
+
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 树操作日志类切面,关联@TreeLogging注解
+ */
+@Aspect
+@Component
+public class TreeLoggingAspect {
+    @Autowired
+    TreeLogMapper treeLogMapper;
+
+    @Pointcut("@annotation(seecoder.devcloud.web.aop.TreeLogging)")
+    public void logPointCut() {
+
+    }
+
+    @AfterReturning(pointcut = "logPointCut()", returning = "result")
+    public void doAfterReturning(JoinPoint joinPoint, Response result) {
+        // 只处理成功的情况
+        if (result.getCode().equals(ResponseEnums.OK.getCode())) {
+            TreeLog log = new TreeLog();
+            //从切面织入点处通过反射机制获取织入点处的方法
+            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+            //获取切入点所在的方法
+            Method method = signature.getMethod();
+            //获取注解,提取操作类型属性
+            TreeLogging logging = method.getAnnotation(TreeLogging.class);
+            if (logging != null) {
+                log.setOperation(logging.value());
+            }
+            //请求的参数
+            Object[] args = joinPoint.getArgs();
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            for (Object arg : args) {
+                if (arg instanceof TreeNodeVO) {
+                    TreeNodeVO node = (TreeNodeVO) arg;
+                    log.setTreeId(node.getId());
+//                    log.setUserId();
+//                    log.setUserName();
+//                    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+//                    HttpSession session = request.getSession();
+//                    读取session中的用户
+//                    User user = (User) session.getAttribute("user");
+//                    请求的IP
+//                    String ip = request.getRemoteAddr();
+//                    TODO:从session中获取userId和userName
+                    log.setTime(sf.format(new Date()));
+                    System.out.println(log);
+                    break;
+                }
+            }
+            treeLogMapper.insertTreeLog(log);
+        }
+    }
+}

+ 29 - 0
web/src/main/java/seecoder/devcloud/web/dao/tree/TreeLogMapper.java

@@ -0,0 +1,29 @@
+package seecoder.devcloud.web.dao.tree;
+
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import seecoder.devcloud.web.dao.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.po.tree.TreeLog;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface TreeLogMapper {
+
+    /**
+     * 插入,自增ID
+     */
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id")
+    int insertTreeLog(TreeLog project, String... ignoredCols);
+
+    @Select("select * from tree_log where tree_id=#{treeId}")
+    @Results(id="treeLogMap",value = {
+            @Result(column = "user_name", property = "userName"),
+            @Result(column = "tree_id", property = "treeId"),
+            @Result(column = "user_id", property = "userId")
+    })
+    List<TreeLog> listTreeLogsByTreeId(int treeId);
+}

+ 22 - 0
web/src/main/java/seecoder/devcloud/web/enums/OperationEnum.java

@@ -0,0 +1,22 @@
+package seecoder.devcloud.web.enums;
+
+/**
+ * TreeNode操作类型
+ */
+public enum  OperationEnum {
+    START("开启"),
+    RESTART("重新开启"),
+    UPDATE("更新"),
+    FINISH("结束");
+
+    private String value;
+
+    OperationEnum(String value){
+        this.value=value;
+    }
+
+    @Override
+    public String toString(){
+        return value;
+    }
+}

+ 40 - 0
web/src/main/java/seecoder/devcloud/web/po/tree/TreeLog.java

@@ -0,0 +1,40 @@
+package seecoder.devcloud.web.po.tree;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import seecoder.devcloud.web.enums.OperationEnum;
+
+/**
+ * 树操作的日志类,用于后序进行数据分析
+ */
+@Data
+@NoArgsConstructor
+public class TreeLog {
+
+    private Integer id;
+
+    /**
+     * 操作时间
+     */
+    private String time;
+
+    /**
+     * 操作类型
+     */
+    private OperationEnum operation;
+
+    /**
+     * 树节点
+     */
+    private Integer treeId;
+
+    /**
+     * 操作人
+     */
+    private Integer userId;
+
+    /**
+     * 操作名
+     */
+    private String userName;
+}

+ 4 - 0
web/src/main/java/seecoder/devcloud/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -4,6 +4,8 @@ package seecoder.devcloud.web.service.impl.tree;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import seecoder.devcloud.web.aop.TreeLogging;
+import seecoder.devcloud.web.enums.OperationEnum;
 import seecoder.devcloud.web.po.TreeNodePO;
 import seecoder.devcloud.web.service.tree.TreeNodeService;
 import seecoder.devcloud.web.vo.Response;
@@ -28,6 +30,7 @@ public class TreeNodeServiceImpl implements TreeNodeService {
     }
 
     @Override
+    @TreeLogging(OperationEnum.START)
     public Response insertTreeNode(TreeNodeVO treeNodeVO) {
         TreeNodePO treeNodePO = new TreeNodePO();
         BeanUtils.copyProperties(treeNodeVO,treeNodePO);
@@ -37,6 +40,7 @@ public class TreeNodeServiceImpl implements TreeNodeService {
     }
 
     @Override
+    @TreeLogging(OperationEnum.UPDATE)
     public Response updateTreeNode(TreeNodeVO treeNodeVO) {
         TreeNodePO treeNodePO = new TreeNodePO();
         BeanUtils.copyProperties(treeNodeVO,treeNodePO);

+ 43 - 0
web/src/test/java/seecoder/devcloud/web/dao/tree/TreeLogMapperTest.java

@@ -0,0 +1,43 @@
+package seecoder.devcloud.web.dao.tree;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
+import org.springframework.test.context.junit4.SpringRunner;
+import seecoder.devcloud.web.enums.OperationEnum;
+import seecoder.devcloud.web.po.tree.TreeLog;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@MybatisTest
+@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
+public class TreeLogMapperTest {
+    @Autowired
+    TreeLogMapper treeLogMapper;
+
+    @Test
+    public void testInsertAndSelect(){
+        TreeLog treeLog = new TreeLog();
+        treeLog.setTreeId(1);
+        treeLog.setUserId(1);
+        treeLog.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        treeLog.setUserName("test");
+        treeLog.setOperation(OperationEnum.START);
+        treeLogMapper.insertTreeLog(treeLog);
+        List<TreeLog> logList = treeLogMapper.listTreeLogsByTreeId(1);
+        boolean res = false;
+        for(TreeLog log:logList){
+            if(log.equals(treeLog)){
+                res = true;
+                System.out.println(log);
+                break;
+            }
+        }
+        assert res;
+    }
+}