Aop实现操作日志存储在数据库-mybatisPlus - Go语言中文社区

Aop实现操作日志存储在数据库-mybatisPlus


aop面向切面的编程

一、aop

@Slf4j
    //切面注解 声明切面
@Aspect
    //声明是Bean组件
@Component
public class OperationLogAop {
    @Autowired
    private LogOperateService logOperateService;


    //定义切入点
    @Pointcut("execution(public * com.qcby.xmfs.information1.controller..*.*(..))")
    public void paramPointCut(){

    }
    @Around("paramPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{





        /**
         * 保存操作日志
         */
        LogOperate logOperate=new LogOperate();

        //获取用户名
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String token= request.getHeader("token");
        if (token!=null){
            logOperate.setUsername(JwtUtil.getUser(token).getUsername());
        }




        /**
         * 从切面织入点除通过反射机制获取织入点处的方法
         */
        MethodSignature signature =(MethodSignature) joinPoint .getSignature();
        //获取织入点处的方法名
        Method method=signature.getMethod();


        //获取模块名
        //
        Class clazz =joinPoint.getTarget().getClass();
        Module module= (Module) clazz.getAnnotation(Module.class);
        if(module!=null){
            logOperate.setModule(module.value());

        }





        //获取操作
        Operate operate=method.getAnnotation(Operate.class);
        if(operate!=null){
            logOperate.setType(operate.value());

        }


        //操作路径

        String className =joinPoint.getTarget().getClass().getName();
        String methodName=method.getName();
        logOperate.setOperatePath(className+"."+methodName);


        //操作时间
        LocalDateTime localDateTime = LocalDateTime.now();
        logOperate.setOperateTime(localDateTime);

        log.info("开发测试:aop操作日志=》"+logOperate);

        logOperateService.save(logOperate);

        //如果没有此两行代码,正常的方法执行会没有返回参数参数
        Object result = joinPoint.proceed();
        return result;




    }
}

1、自定义注解,通过自定义注解的方式来获取,方法的操作名,模块名。

@Target(ElementType.METHOD) //注解级别,method:注解用在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行,runime:运行时执行
@Documented //
public @interface Operate {
    //操作名
    String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Module {
    //模块名
    String value() default "";
}

 2、获取方法名和模块名的操作

        //获取模块名,
        //模块名注解在类上面,属于类,所以通过类获取注解信息
        Class clazz =joinPoint.getTarget().getClass();
        Module module= (Module) clazz.getAnnotation(Module.class);
        if(module!=null){
            logOperate.setModule(module.value());

        }



        //获取操作
        //操作名注解属于方法,通过Method获取注解信息
        Operate operate=method.getAnnotation(Operate.class);
        if(operate!=null){
            logOperate.setType(operate.value());

        }

3、获取操作用户的用户信息

   //获取用户名
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String token= request.getHeader("token");
        if (token!=null){
            logOperate.setUsername(JwtUtil.getUser(token).getUsername());
        }

二、实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogOperate {
    private Long id;
    private Long username;
    private String module;
    private String type;
    private String operatePath;
    private LocalDateTime operateTime;

}

三、结果

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_57659908/article/details/122778087
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 13:59:27
  • 阅读 ( 101 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢