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

实体类:

@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. 云原生API网关全生命周期管理Apache APISIX探究实操

    @ 目录 概述 定义 NGINX 与 Kong 的痛点 APISIX 的技术优势 特性 架构 应用场景 主要概念 部署 快速入门 quickstart安装 Admin API创建路由 RPM安装 安装 ...

  2. 分库分表ShardingJDBC最佳实践

    1 添加依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId> ...

  3. Java方法的定义

    前言 经过前面两篇关于面向对象.类和对象的文章,壹哥相信你现在对面向对象已经有了基本的了解.我们知道,在一个类中,包括属性和行为两大核心要素.我们之前已经给大家讲解了如何定义属性,但很多同学对方法还不 ...

  4. Skywalking搭建

    因毕设前端太丑,所以后端要稍微搞的高大上一点才能忽悠住老师,所以分享一下搭建skywalking的步. 我是参考https://baijiahao.baidu.com/s?id=17211835411 ...

  5. 搞一个自己用的node-cli

    我们都用过 vue 的cli ,或者 react的cli,  亦或是其他的cli 如 vite 等.他们都是提供了一个全局命令,然后在终端执行这个全局命令就可以创建出模板项目.今天我们就自己做一个,给 ...

  6. Centos7.9中使用Docker安装云崽机器人

    Centos7.9中使用Docker安装云崽机器人 前面我写了如何普通版搭建云崽教程,今天我们来使用docker来安装,感谢docker镜像源作者:如青桑(QQ: 1666633887) 普通版教程: ...

  7. 003-Cruehead-CrackMeV3

    第二个需要写注册机 首先查看文件,打开文件,什么也没有,help ->about,弹出下面的弹窗 看来是没有什么线索,直接放进OD里面 这里有一个函数CreatFileA,这个函数目的是访问一个 ...

  8. Troubleshooting 专题 - 问正确的问题 得到正确的答案

    在很多公司中,IT.数据中心.业务系统一出故障,会有很多人被叫到作战室(就是一个为了解决该问题,而把所有相关人员集中在一起的一个会议室), 但是对于这个问题他们是否可以修复, 是否他们应该负有责任, ...

  9. 属性指令之class和style

    目录 说明 class style 说明 class与style本身是属性指令,但是他们比较特殊,应用更广泛. # class :class='变量' 变量可以为:字符串.数组.对象 推荐使用数组,因 ...

  10. 二进制安装Kubernetes(k8s) v1.24.3 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.24.3 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支 ...