设计一个业务改动信息时的自定义记录,例如新增、修改、删除数据等。并且记录的规则可以通过配置的方式控制。大家需要根据各自业务场景参考,欢迎讨论。伪代码如下:

实体类:

@TableName("tbl_user")
User{
String id
String name
Integer age
String addr
}

DAO层:

UserDao{
getById(Long id);
list(Wrapper wrapper);
}

自定义注解:

MybatisPropAnno{

  String value

  Class<?> daoClazz

}

Http接口请求参数:

SaveReq{
@MybatisPropAnno(value="name", daoClazz = UserDao.class)
String userName;
@MybatisPropAnno(value="age", daoClazz = UserDao.class)
Integer userAge;
} UpdateReq{
@MybatisPropAnno(value="id", daoClazz = UserDao.class)
String userNo;
@MybatisPropAnno(value="name", daoClazz = UserDao.class)
String userName;
@MybatisPropAnno(value="age", daoClazz = UserDao.class)
Integer userAge; @MybatisPropAnno(value="id", daoClazz = DepartDao.class)
String departId;
String departAddress;
}

Http接口:

TestController{
public void save(SaveReq saveReq){
operTypeInheritedThreadLocal.set(Enum."添加数据");
sthInheritedThreadLocal.set(saveReq);
}; public void update(UpdateReq updateReq){
operTypeInheritedThreadLocal.set(Enum."更新数据");
sthInheritedThreadLocal.set(updateReq);
}; @MybatisLogAnno("删除数据")
public void delete(){}; @MybatisLogAnno("查询数据")
public void query(){}; public void other(){};
}

SQL拦截器:

SqlInterceptor{
public Object intercept(Mybatis param){
OperType operType = operTypeInheritedThreadLocal.get
if(operType == null){
return ;
} // insert/update/delete/select
String type = param.getSqlType();
if(operType == select){
return ;
} String sql = param.getSql(); String tableName = sql.getTableName(); List<Field> fields = Reflect.getFields(sthInheritedThreadLocal.get()); for(Field field : fields){
MybatisPropAnno propAnno = field.getAnnotation(MybatisPropAnno);
if(propAnno == null){
continue;
}
if(propAnno.getDaoClazz.getEntity.getTableName.equals(tableName )){
User oldUser = new JSONObject();
User newUser = new JSONObject();
if(type == insert){
oldUser = new JSONObject();
newUser = getInsertInfo(sql);
} if(type == update){
oldUser = SpringContext.get(daoClazz).getById(field.value());
newUser = getUpdateInfo(sql);
insertChangeLog(new JSONObject(), JSON.toJson(newUser));
}
if(type == delete){
oldUser = SpringContext.get(daoClazz).getById(field.value());
newUser = new JSONObject();
} insertChangeLog(operType, traceId, oldUser, newUser);
break;
}
}
}
}

Spring切面:

SpringAop {
public Object doAround(){
operTypeInheritedThreadLocal.remove
}
}

数据库设计:
Table:dc_change_log
id    changeTime    changeType    traceId    oldInfo        newInfo        httpMethod        table        operator    changeDesc
1    2020-01-01    添加用户        123    {}        {"name":"lil"}    com.xx.TestCtrl.saveUser    tbl_user        admin    descxxxxxxxxxxxx
2    2020-01-01    修改用户        124    {"name":"lil"}    {"name":"a"}    com.xx.TestCtrl.updateUser    tbl_user        admin    descxxxxxxxxxxxx
3    2020-01-01    修改用户        124    {"addr":"南山"}    {"addr":"福田"}    com.xx.TestCtrl.updateUser    tbl_department    admin    descxxxxxxxxxxxx

Table:dc_change_rule
id    httpMethod        table        showRule
1    com.xx.TestCtrl.saveUser    tbl_user        [{"propKey":"name", "propDesc":"name detail info"}]
1    com.xx.TestCtrl.updateUser    tbl_user        [{"propKey":"name", "propDesc":"name detail info"}]
1    com.xx.TestCtrl.updateUser    tbl_department    [{"propKey":"addr", "propDesc":"addr detail info"}]

【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?的更多相关文章

  1. springboot + mybatis 的项目,实现简单的CRUD

    以前都是用Springboot+jdbcTemplate实现CRUD 但是趋势是用mybatis,今天稍微修改,创建springboot + mybatis 的项目,实现简单的CRUD  上图是项目的 ...

  2. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  3. Springboot+Mybatis+MySQL实例练习时踩坑记录

    最近刚开始学习后端,直接让上手学习Springboot+Mybatis+MySQL对CRUD的实例,虽然实例不难,但是上面的三个知识我都不懂,就有点为难我了 所以经常遇到一个点卡自己很久的情况,这里列 ...

  4. springboot+mybatis+thymeleaf项目搭建及前后端交互

    前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...

  5. springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、

    要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...

  6. springboot多模块项目搭建遇到的问题记录

    废话不多说,直接上问题报错与解决方法. 问题报错一:(报错信息看下方代码) 问题原因:'com.company.logistics.service.company.CompanyService' 未找 ...

  7. 由做网站操作日志想到的HttpModule应用

    背景 在以前的Web项目中,记录用户操作日志,总是在方法里,加一行代码,记录此时用户操作类型与相关信息.该记录日志的方法对原来的业务操作侵入性较强,也比较零散,不便于查看和管理.那么有没有更加通用点的 ...

  8. 操作日志的设计小结by大熊

    一.首先由同事的操作日志说起 同事做了一个这样的操作日志,他定义系统所有发的json加入这两个字段,module和msg,然后在service里面用注解@Log拦截,即可记录对应的操作日志. { mo ...

  9. linux centos7 增加操作日志记录

    2021-08-24 1. 需求产生原因 linux 系统中的日志存放在目录 /var/log/ 下,今天想看看我之前的操作记录,发现系统中的日志并不包括各个用户操作文件的记录,所以打算自己建一个. ...

  10. springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生

    人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...

随机推荐

  1. mybatisplus数据层标准开发---分页功能

    1.创建一个拦截器类 package com.itheima.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlus ...

  2. Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别

    Array VS Slice 数组允许你以特定的顺序在变量中存储相同类型的多个元素. 对于数组来说,最常见的就是迭代数组中的元素. 我们创建一个 Sum 函数,它使用 for 来循环获取数组中的元素并 ...

  3. salesforce零基础学习(一百一十六)workflow -> flow浅谈

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.migrate_to_flow_tool_considerations_workflow.h ...

  4. .NET周报 【3月第4期 2023-03-24】

    国内文章 .NET应用系统的国际化-多语言翻译服务 https://www.cnblogs.com/tianqing/p/17232559.html 本文重点介绍了多语言翻译服务的设计和实现.文章描述 ...

  5. 使用 Azure OpenAI 打造自己的 ChatGPT

    一.前言 当今的人工智能技术正在不断发展,越来越多的企业和个人开始探索人工智能在各个领域中的应用.其中,在自然语言处理领域,OpenAI 的 GPT 系列模型成为了研究热点.OpenAI 公司的 Ch ...

  6. PVE开启硬件显卡直通功能

    首先编辑GRUB配置文件: root@pve:~# vim /etc/default/grub root@pve:~# root@pve:~# cat /etc/default/grub # If y ...

  7. [Linux]监控外部用户登录及外部主机连接情况

    1 外部用户/外部主机 /var/log 在CentOS系统上,用户登录历史存储在以下这些文件中: /var/log/wtmp 用于存储系统连接历史记录被last工具用来记录最后登录的用户的列表 /v ...

  8. 如何实现 Java SpringBoot 自动验证入参数据的有效性

    Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证 如果碰到 @NotEmpty 否则不生效,注意看下 @RequestBody ...

  9. Java SpringBoot 中,动态执行 bean 对象中的方法

    根据不同的条件,调用不同的 bean 对象,执行对象中的方法 SpringUtils 工具类 package com.vipsoft.web.utils; import cn.hutool.core. ...

  10. Ubuntu Server搭建个人服务器

    Ubuntu Server20.04.5 LTS [参考资料] Ubuntu官方地址:https://www.ubuntu.com/ Ubuntu论坛地址:https://ubuntuforums.o ...