【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?
设计一个业务改动信息时的自定义记录,例如新增、修改、删除数据等。并且记录的规则可以通过配置的方式控制。大家需要根据各自业务场景参考,欢迎讨论。伪代码如下:
实体类:
@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记录?的更多相关文章
- springboot + mybatis 的项目,实现简单的CRUD
以前都是用Springboot+jdbcTemplate实现CRUD 但是趋势是用mybatis,今天稍微修改,创建springboot + mybatis 的项目,实现简单的CRUD 上图是项目的 ...
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
[SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...
- Springboot+Mybatis+MySQL实例练习时踩坑记录
最近刚开始学习后端,直接让上手学习Springboot+Mybatis+MySQL对CRUD的实例,虽然实例不难,但是上面的三个知识我都不懂,就有点为难我了 所以经常遇到一个点卡自己很久的情况,这里列 ...
- springboot+mybatis+thymeleaf项目搭建及前后端交互
前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...
- springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...
- springboot多模块项目搭建遇到的问题记录
废话不多说,直接上问题报错与解决方法. 问题报错一:(报错信息看下方代码) 问题原因:'com.company.logistics.service.company.CompanyService' 未找 ...
- 由做网站操作日志想到的HttpModule应用
背景 在以前的Web项目中,记录用户操作日志,总是在方法里,加一行代码,记录此时用户操作类型与相关信息.该记录日志的方法对原来的业务操作侵入性较强,也比较零散,不便于查看和管理.那么有没有更加通用点的 ...
- 操作日志的设计小结by大熊
一.首先由同事的操作日志说起 同事做了一个这样的操作日志,他定义系统所有发的json加入这两个字段,module和msg,然后在service里面用注解@Log拦截,即可记录对应的操作日志. { mo ...
- linux centos7 增加操作日志记录
2021-08-24 1. 需求产生原因 linux 系统中的日志存放在目录 /var/log/ 下,今天想看看我之前的操作记录,发现系统中的日志并不包括各个用户操作文件的记录,所以打算自己建一个. ...
- springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生
人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...
随机推荐
- 宏任务&微处理
事件循环 JavaScript 语言的一大特点就是单线程,同一个时间只能做一件事.为了协调事件.用户交互.脚本.UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop 的方案应用而生. ...
- 声网深度学习时序编码器的资源预测实践丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网大后端智能运营算法团队 算法工程师@黄南薰. 随着深度学习技术的发展,编码器的结构在构建神经网络中成为了热门之选,在计算机视觉领域有众多成功案 ...
- Kafka 生产者写入数据
一.生产者发送消息的步骤
- 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计
前言 设计模式是一种高级编程技巧,也是一种通用的解决方案.它能在不同的应用场景中使用,它可以提高代码的可读性.可复用性和可维护性.设计模式的学习能提高我们的编程能力以及代码质量,同时也能提高我们的开发 ...
- GPT接入企微应用 - 让工作快乐起来
引子 最近最火的莫过于ChatGPT了,在自己体验后就想着如何其他同事也能方便的起起来,毕竟独乐乐不如众乐乐,自己注册又是V-P-N,又是国外手机验证,对于大部分同事来说门槛还是高的.现在也有不少小程 ...
- Docker部署nginx+vue项目并运行
一.打包VUE项目 npm run build:prod 二.编写default.conf 文件 server { listen 80; server_name localhost; #charset ...
- js循环中reduce的用法简单介绍
reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引 ...
- 把一个列表拆成N个子列表的四种方法
编程的方法往往不止一种,比如怎么把一个Python种的列表拆成N个子列表,我们可以很容易找到N种方法,也许这就是编程的魅力所在. 一.列表表达式法 这种方法最为简洁,不过可读性差一些 这个方法中,即使 ...
- (原创)【B4A】一步一步入门10:TabHost,标签页、标题带图标(控件篇06)
一.前言 本篇教程我们来讲一下TabHost(标签页)的基本使用方法. 相信看完的你,一定会有所收获! 本文地址:https://www.cnblogs.com/lesliexin/p/1728556 ...
- python内置模块之ctype
ctypes --- Python 的外部函数库¶ ctypes 是 Python 的外部函数库.它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数.可使用该模块以纯 Python ...