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;

}

三、结果

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值