海南高端网站建设定制,媒体发稿推广,wordpress 是免费的嘛,申请建设部门网站的报告文章目录 前言演示代码演示环境引入项目项目框架操作步骤 设计介绍参考仓库 前言 系统基于mybatis-plus, springboot环境 对于重要的一些数据#xff0c;我们需要记录一条记录的所有版本变化过程#xff0c;做到持续追踪#xff0c;为后续问题追踪提供思路。下面展示预期效果… 文章目录 前言演示代码演示环境引入项目项目框架操作步骤 设计介绍参考仓库 前言 系统基于mybatis-plus, springboot环境 对于重要的一些数据我们需要记录一条记录的所有版本变化过程做到持续追踪为后续问题追踪提供思路。下面展示预期效果(根据对象field渲染即可) 除了上面这种简单的记录外还可以记录复合操作下面举两个例子 对于批量导入除了记录对象a本身的变化过程还维护了父操作id父操作id我们可以直观了解这个对象a创建的源头在源头记录中我们可以获取源头操作所有操作内容(包含了对象a的操作)实现不同对象的联动。对于单个对象a若存在关联表字段b对象的修改会自动将b对象的变更记录和对象a操作记录绑定当然对象a本身也会产生操作记录 源代码地址感兴趣的朋友gitee上提issue单后面持续补充。
演示代码
下面我们通过一段代码演示代码展示如何自动将枚举字段主键关联字段多行文本串富文本内容等字段自动进行转换和记录对于其他类型的你可以按照系统规则自己重写逻辑。在此期间你只需要配置两个注解LogEntityLogPoint相关的属性即可实现对象日志的记录非常方便。 工具采用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 {Resourceprivate SysUserService userService;Resourceprivate SysRoleService roleService;Resourceprivate ObjectOperationService operationService;GetMapping(value /add)ResponseBodypublic 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 ServiceImplSysUserMapper, SysUserModel implements SysUserService {OverrideLogPoint( 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这个是你自身业务系统的基类。
设计介绍
首先是前文提到的两个注解LogEntityLogPoint BASE : 单个的对象记录不存在子对象的记录COMMENT 一组对象的记录不存在父子关系如批量导入COMPLEX单个对象的记录存在子对象的记录 在核心包中有一个handler包下面提供字段如何字段转换和解析。在包中提供了基础类型(NORMALRICHTEXTTEXT的类型处理器和值处理器他们分别实现了AttributeTypeHandlerAttributeValueHandler中的方法下面我们对其进行一些讲解。 在LogEntity注解中如果没有指定类型处理器我们发现使用了默认处理器处理如果你当前系统实现不符合业务逻辑你可以重写默认处理器中的逻辑即可或者你创建一个类继承相关接口重写逻辑然后在把重写的类赋予注解中的值即可 参考仓库
原仓库只是简单的实现入侵业务严重不过对于本系统中RICHTEXT,TEXT类型的字段提供了思路 github