文章目录前言演示代码演示环境引入项目项目框架操作步骤设计介绍参考仓库前言系统基于mybatis-plus, springboot环境对于重要的一些数据我们需要记录一条记录的所有版本变化过程做到持续追踪为后续问题追踪提供思路。下面展示预期效果(根据对象field渲染即可)除了上面这种简单的记录外还可以记录复合操作下面举两个例子对于批量导入除了记录对象a本身的变化过程还维护了父操作id父操作id我们可以直观了解这个对象a创建的源头在源头记录中我们可以获取源头操作所有操作内容(包含了对象a的操作)实现不同对象的联动。对于单个对象a若存在关联表字段b对象的修改会自动将b对象的变更记录和对象a操作记录绑定当然对象a本身也会产生操作记录源代码地址其中README.md文档中有详细的描述。演示代码下面我们通过一段代码演示代码展示如何自动将枚举字段主键关联字段多行文本串富文本内容等字段自动进行转换和记录对于其他类型的你可以按照系统规则自己重写逻辑。在此期间你只需要配置两个注解LogEntityLogPoint相关的属性即可实现对象日志的记录非常方便。工具采用spring切面和mybatis拦截器相关技术编写了api依赖包以非侵入方式实现对标记的对象属性进行记录仅需要导入依赖即可几乎不需要对原系统代码改动LogEntity//开启标识publicclassSysUserModelextendsBaseEntity{LogEntity(alias角色信息,associationValuetrue,serviceImplClassSysRoleServiceImpl.class,entityFieldNameroleName)//角色表存在 (9830274072323 测试角色) 这一条数据ApiModelProperty(nameroleId,value角色表角色id,逗号隔开)privateStringroleId;LogEntity(alias用户昵称)ApiModelProperty(nameuserName,value用户昵称)privateStringuserName;LogEntity(alias备注,attributeTypeEnumAttributeTypeEnum.TEXT)ApiModelProperty(nameremark,value备注)privateStringremark;LogEntity(alias富文本内容,attributeTypeEnumAttributeTypeEnum.RICHTEXT)ApiModelProperty(namerichText,value富文本内容)privateStringrichText;LogEntity(alias帐号状态,enumValuetrue,enumClassStatusEnum.class)ApiModelProperty(namestatus,value帐号状态0正常 1停用)privateIntegerstatus;}publicenumStatusEnum{NORMAL(0,正常),DEACTIVATE(1,停用),;//....}RestControllerRequestMapping(value/test)publicclassTestController{ResourceprivateSysUserServiceuserService;ResourceprivateSysRoleServiceroleService;ResourceprivateObjectOperationServiceoperationService;GetMapping(value/add)ResponseBodypublicObjecttestAdd(){SysUserModeluserModelnewSysUserModel();userModel.setRoleId(9830274072323);userModel.setUserName(哈哈);userModel.setRemark(这是第一行\n这是第二行);userModel.setStatus(0);userModel.setRichText(p1富文本p1);userService.add(userModel);}}ServicepublicclassSysUserServiceImplextendsServiceImplSysUserMapper,SysUserModelimplementsSysUserService{OverrideLogPoint(serviceHandlerSysUserServiceImpl.class,entityHandlerSysUserModel.class,moduleNamesysUser,remark测试用户模块)publicvoidadd(SysUserModelinsertModel){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这个是你自身业务系统的基类。设计介绍首先是前文提到的两个注解LogEntityLogPointBASE : 单个的对象记录不存在子对象的记录COMMENT 一组对象的记录不存在父子关系如批量导入COMPLEX单个对象的记录存在子对象的记录在核心包中有一个handler包下面提供字段如何字段转换和解析。在包中提供了基础类型(NORMALRICHTEXTTEXT的类型处理器和值处理器他们分别实现了AttributeTypeHandlerAttributeValueHandler中的方法下面我们对其进行一些讲解。在LogEntity注解中如果没有指定类型处理器我们发现使用了默认处理器处理如果你当前系统实现不符合业务逻辑你可以重写默认处理器中的逻辑即可或者你创建一个类继承相关接口重写逻辑然后在把重写的类赋予注解中的值即可源代码地址感兴趣的朋友gitee上提issue单后面持续补充。参考仓库原仓库只是简单的实现入侵业务严重不过对于本系统中RICHTEXT,TEXT类型的字段提供了思路 参考仓库