@[TOC]
前言
系统基于mybatis-plus, springboot环境
对于重要的一些数据,我们需要记录一条记录的所有版本变化过程
,做到持续追踪,为后续问题追踪提供思路。下面展示预期效果(根据对象field渲染即可):
除了上面这种简单的记录外,还可以记录复合操作,下面举两个例子:
- 对于批量导入,除了记录对象a本身的变化过程,还维护了父操作id,父操作id我们可以直观了解这个对象a创建的源头,在源头记录中,我们可以获取源头操作所有操作内容(包含了对象a的操作),实现不同对象的联动。
- 对于单个对象a,若存在关联表字段b对象的修改,会自动将b对象的变更记录和对象a操作记录绑定(当然对象a本身也会产生操作记录)
源代码地址,感兴趣的朋友gitee上提issue单,后面持续补充。
演示代码
下面我们通过一段代码演示代码,展示如何自动将枚举字段,主键关联字段,多行文本串,富文本内容等字段自动进行转换和记录
(对于其他类型的你可以按照系统规则,自己重写逻辑)。在此期间,你只需要配置两个注解
(@LogEntity
,@LogPoint
)相关的属性即可实现对象日志的记录
,非常方便。
工具采用spring切面和mybatis拦截器相关技术编写了
api依赖包
,以非侵入方式
实现对标记的对象属性进行记录
,仅需要导入依赖即可,几乎不需要对原系统代码改动
@LogEntity //开启标识
public class SysUserModel extends BaseEntity {
@LogEntity(alias = "角色信息", associationValue = true, serviceImplClass = SysRoleServiceImpl.class, entityFieldName = "roleName")
//角色表存在 (9830274072323 测试角色) 这一条数据
@ApiModelProperty(name = "roleId",value = "角色表,角色id,逗号隔开")
private String roleId;
@LogEntity(alias = "用户昵称")
@ApiModelProperty(name = "userName",value = "用户昵称")
private String userName;
@LogEntity(alias = "备注" ,attributeTypeEnum = AttributeTypeEnum.TEXT)
@ApiModelProperty(name = "remark",value = "备注")
private String remark;
@LogEntity(alias = "富文本内容" , attributeTypeEnum = AttributeTypeEnum.RICHTEXT)
@ApiModelProperty(name = "richText",value = "富文本内容")
private String richText;
@LogEntity(alias = "帐号状态",enumValue = true,enumClass = StatusEnum.class)
@ApiModelProperty(name = "status",value = "帐号状态(0正常 1停用)")
private Integer status;
}
public enum StatusEnum {
NORMAL(0,"正常"),
DEACTIVATE(1,"停用"),;
//....
}
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Resource
private SysUserService userService;
@Resource
private SysRoleService roleService;
@Resource
private ObjectOperationService operationService;
@GetMapping(value = "/add")
@ResponseBody
public Object testAdd(){
SysUserModel userModel = new SysUserModel();
userModel.setRoleId("9830274072323");
userModel.setUserName("哈哈");
userModel.setRemark("这是第一行\n" + "这是第二行");
userModel.setStatus(0);
userModel.setRichText("<p1>富文本<p1>");
userService.add(userModel);
}
}
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserModel> implements SysUserService {
@Override
@LogPoint( serviceHandler = SysUserServiceImpl.class, entityHandler = SysUserModel.class,
moduleName = "sysUser", remark = "测试用户模块")
public void add(SysUserModel insertModel) {
this.insert(insertModel);
}
}
结果如下图所示:
{
"version":"1.0.0",
"content":[
{
"lineNumber":1,
"partList":[
{
"partContent":"这是第一行",
"partType":"CHANGE_NEW"
},
{
"partContent":"这是第二行",
"partType":"CHANGE_NEW"
}
]
}
]
}
可以看到操作很简单,标记两个注解就可以了。
演示环境
导入表 (mysql)
启动nacos(需要发现服务)
启动项目
引入项目
系统现在默认将日志记录api作为依赖
集成到某个具体的业务模块中
,当然也可以直接将日志做为一个新的服务
,下面我们按集成到某个具体的业务模块中进行介绍
。项目框架
演示系统将核心逻辑拆解为
objectlog-api
和objectlog-api-test
,其中api是作为依赖引入到你的业务模块中
,api-test则是演示系统中的业务模块
。
在api依赖中
分为core,domain,feign三个包,其中core是核心内容,另外两个根据自身业务可以进行删除和变更
- core包:核心逻辑的实现
- domain包:自身业务的基类BaseEntity,自动填充字段逻辑BaseMetaObjectHandler和操作记录查询封装类ObjectOperationDto.
- feignt包:查询操作记录相关的feign配置
操作步骤
导入表,
objectlog-api-test
模块下的object_attribute.sql
和object_operation.sql
导入到业务模块中改变基类对象,目前主流的mybatis-plug提供了自带curd操作类
ServiceImpl
,IService
,BaseMapper
,在@LogPoint
中ServiceImpl切换自身业务系统基于ServiceImpl
进一步封装类,其次是BaseEntity.class
,这个是你自身业务系统的基类。
设计介绍
首先是前文提到的两个注解@LogEntity
,@LogPoint
- BASE : 单个的对象记录,不存在子对象的记录
- COMMENT: 一组对象的记录,不存在父子关系,如批量导入
- COMPLEX:单个对象的记录,存在子对象的记录
在核心包中有一个handler包,下面提供字段如何字段转换和解析。在包中提供了基础类型(NORMAL
,RICHTEXT
,TEXT
)的类型处理器和值处理器,他们分别实现了AttributeTypeHandler
,AttributeValueHandler
中的方法,下面我们对其进行一些讲解。
在@LogEntity注解中如果没有指定类型处理器我们发现使用了默认处理器处理,如果你
当前系统
实现不符合业务逻辑
,你可以重写默认处理器中的逻辑即可
,或者
你创建一个类继承相关接口,重写逻辑,然后在把重写的类赋予注解中的值即可
源代码地址,感兴趣的朋友gitee上提issue单,后面持续补充。
参考仓库
原仓库只是简单的实现,入侵业务严重,不过对于本系统中RICHTEXT,TEXT类型的字段提供了思路 参考仓库