不一样 使用别名 数据字段和bean_使用AOP和注解记录用户操作日志

产品需求

前几天,产品提了个需求,要记录下所有用户在管理平台的操作记录,这个简单通过AOP半天搞定,后来和产品聊了下,对于更新操作要记录操作前的值和操作后的值,比如用户修改某条数据要展示修改了哪些字段,并且要记录修改前的值和修改后的值,字段名称也要用中文,方便运营人员看

这就让人有点头大,会有个地方比较麻烦

因为前台的编辑保存操作都是将数据全量传给后端,如果需要知道哪些字段发生了变更就需要和数据库的旧值进行比较

思路

  • 使用注解记录日志的元数据
  • 使用AOP切面进行操作日志数据的组装插入
  • 对dto字段增加注解别名
  • 比较新老dto,将变更的内容存入http会话
  • aop方法调用完毕获取字段变更内容

表设计

e17d405d4b9822590a245dc3e8b2b6ef.png

扩展字段(op_extend):记录数据的变更

主要实现代码

注解记录操作日志元数据
/**
 * @author simplezero
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperationLog {
    
    String category();
    String subcategory();
    String desc();
    OperationLogTypeEnum type() default INSERT;
}
使用 AOP注解在接口层进行切面,无侵入
@PostMapping("/skill/editSkill")
@OperationLog(category = "技能管理", subcategory = "技能开发", desc = "编辑技能", type = OperationLogTypeEnum.UPDATE)
public BaseOutDto editSkill(@RequestBody EditSkillReqDTO req, HttpServletRequest request) throws IllegalAccessException {
    
    bizSkillManagementService.editSkill(req, request);
    return new BaseOutDto();
}
AOP实现,记录操作用户信息、请求返回等信息
/**
 * @author simplezero
 */
@Aspect
@Component
@Slf4j
public class OperationLogAspect {
    

    @Autowired
    private OperationLogService operationLogService;

    @Autowired
    private SystemAccountManagementService accountManagementService;

    @Around("@annotation(com.x.x.annotation.Oper
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值