当前位置: 首页 > article >正文

AOP记录操作日志

创建数据库表

-- 操作日志
create table operate_log (
    id int unsigned primary key auto_increment comment'id',
    operate_user int unsigned comment '操作人员Id',
    operate_time datetime comment '操作时间',
    class_name varchar(100)comment '操作类',
    method_name varchar(100)comment '操作的方法',
    method_params varchar(1000)comment '方法参数',
    return_value varchar(2000)comment '返回值',
    cost_time bigint comment '方法执行耗时, 单位:ms'
    ) comment '操作日志表';

引入APO依赖

 <!-- AOP依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 

创建数据库对应的类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperateLog {
    private Integer id;
    private Integer operateUser;// 操作人员的id
    private LocalDateTime operateTime;//操作时间
    private String className; // 操作类名
    private String methodName ; //操作方法
    private String methodParams; //方法参数
    private String returnValue; //返回值
    private Long costTime; //操作耗时

创建注解类

package com.it.anno;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) //运行的时候
@Target(ElementType.METHOD) //目标是方法
public @interface Log {

}

创建AOP类

package com.it.aop;


import com.alibaba.fastjson.JSONObject;
import com.it.mapper.OperateLogMapper;
import com.it.pojo.OperateLog;
import com.it.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Arrays;

@Slf4j
@Component
@Aspect //切面类
public class LogAspect {

    @Autowired
    private HttpServletRequest response;
    @Autowired
    private OperateLogMapper operateLogMapper;


    @Around("@annotation(com.it.anno.Log)")
    public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable{

        //id 自增
        //操作人的id
       String jwt= response.getHeader("token");
        Claims claims = JwtUtils.parseJWT(jwt);
        Integer operateUser =(Integer) claims.get("id");

        //操作时间
        LocalDateTime operateTime = LocalDateTime.now();

        //操作类名
        String className = joinPoint.proceed().getClass().getName();

        //操作方法名
        String methodName = joinPoint.getSignature().getName();

        //操作方法参数
        Object[] args = joinPoint.getArgs();
        String methodParams = Arrays.toString(args);

        //记录时间 (开始)
        long begin = System.currentTimeMillis();

        //调用原始的目标方法运行
        Object proceed = joinPoint.proceed();
        //记录时间 (结束)
        long end = System.currentTimeMillis();

        //方法返回值
        String returnValue = JSONObject.toJSONString(proceed);

        //耗时时间
        long costTime = end - begin;



        //记录日志
        OperateLog operateLog=new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);
        operateLogMapper.insert(operateLog);
        log.info("AOP记录操作日志:{}",operateLog);
        return proceed;
    }
}

 每个方法上把自定义的@Log注解引入进来

 /*根据ID删除部门*/
    //@DeleteMapping("/{id}")
    @Log
    @DeleteMapping("/depts/{id}")
    public Result delete( @PathVariable Integer id) throws Exception {
        log.info("根据ID删除部门:{}",id);
        deptservec.delete(id);
        return Result.success();

    }
        //新增部门
   // @PostMapping
    @Log
       @PostMapping ("/depts")
    public Result add( @PathVariable Dept dept) {
        log .info("新增部门:{}",dept);
            deptservec.add(dept);
       return  Result.success();
    }

 


http://www.kler.cn/a/159482.html

相关文章:

  • ubuntu下openssl签名证书制作流程及验证demo
  • DNS批量解析管理软件有什么用
  • 【eNSP】路由基础与路由来源——静态路由实验
  • 【论文阅读】WaDec: Decompiling WebAssembly Using Large Language Model
  • STM32设计学生宿舍监测控制系统
  • BILSTM法律网站用户提问自动分类
  • 【EI会议征稿中】第三届光学与机器视觉国际学术会议(ICOMV 2024)
  • 【译】 Spring AOP API
  • Java-宋红康-(课P132)-多线程的概念
  • GO学习之 单例模式 sync.Once
  • Zabbix自动发现机制
  • 感觉到自己思想扭曲了
  • 工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)
  • 【Ratis】Grpc.proto文件里定义的一些RPC
  • iOS 通用链接的配置(Universal Links)
  • 使用Ansible Expect模块实现自动化交互式任务
  • Orvibo另款网关ViCenter-300的分析之一
  • 深度解析:PDM、PDM产品数据管理
  • 数据结构之选择排序
  • Redis系列之keys命令和scan命令性能对比
  • 【开发问题解决方法记录】04.dian 权限表单优化
  • 【图像拼接】论文精读:Quasi-Homography Warps in Image Stitching(QHW)
  • 【PTA题目】6-4 走台阶方法 分数 15
  • 【1day】Panabit 日志系统openid接口SQL注入漏洞
  • el-table全部选择和全部取消
  • 大语言模型有那些能力和应用