对象变更记录objectlog工具(持续跟新)

简介: 记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包,以非侵入方式实现对标记的对象属性进行记录,仅需要导入依赖即可,几乎不需要对原系统代码改动.

@[TOC]

前言

系统基于mybatis-plus, springboot环境

对于重要的一些数据,我们需要记录一条记录的所有版本变化过程,做到持续追踪,为后续问题追踪提供思路。下面展示预期效果(根据对象field渲染即可):
image.png

除了上面这种简单的记录外,还可以记录复合操作,下面举两个例子:

  • 对于批量导入,除了记录对象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);
    }
}

结果如下图所示:
image.png

{
   
    "version":"1.0.0",
    "content":[
        {
   
            "lineNumber":1,
            "partList":[
                {
   
                    "partContent":"这是第一行",
                    "partType":"CHANGE_NEW"
                },
                {
   
                    "partContent":"这是第二行",
                    "partType":"CHANGE_NEW"
                }
            ]
        }
    ]
}

可以看到操作很简单,标记两个注解就可以了。

演示环境

  • 导入表 (mysql)
    image.png

  • 启动nacos(需要发现服务)

  • 启动项目

引入项目

系统现在默认将日志记录api作为依赖集成到某个具体的业务模块中,当然也可以直接将日志做为一个新的服务下面我们按集成到某个具体的业务模块中进行介绍

项目框架

演示系统将核心逻辑拆解为objectlog-apiobjectlog-api-test,其中api是作为依赖引入到你的业务模块中api-test则是演示系统中的业务模块
image.png

api依赖中分为core,domain,feign三个包,其中core是核心内容,另外两个根据自身业务可以进行删除和变更

  • core包:核心逻辑的实现
  • domain包:自身业务的基类BaseEntity,自动填充字段逻辑BaseMetaObjectHandler和操作记录查询封装类ObjectOperationDto.
  • feignt包:查询操作记录相关的feign配置

image.png

操作步骤

  • 导入表objectlog-api-test模块下的 object_attribute.sqlobject_operation.sql导入到业务模块中

  • 改变基类对象,目前主流的mybatis-plug提供了自带curd操作类ServiceImpl,IService,BaseMapper,在@LogPoint中ServiceImpl切换自身业务系统基于ServiceImpl进一步封装类,其次是 BaseEntity.class,这个是你自身业务系统的基类。
    image.png

设计介绍

首先是前文提到的两个注解@LogEntity@LogPoint
image.png

  • BASE : 单个的对象记录,不存在子对象的记录
  • COMMENT: 一组对象的记录,不存在父子关系,如批量导入
  • COMPLEX:单个对象的记录,存在子对象的记录

image.png

在核心包中有一个handler包,下面提供字段如何字段转换和解析。在包中提供了基础类型(NORMALRICHTEXTTEXT)的类型处理器和值处理器,他们分别实现了AttributeTypeHandlerAttributeValueHandler中的方法,下面我们对其进行一些讲解。
image.png

在@LogEntity注解中如果没有指定类型处理器我们发现使用了默认处理器处理,如果你当前系统实现不符合业务逻辑,你可以重写默认处理器中的逻辑即可或者创建一个类继承相关接口,重写逻辑,然后在把重写的类赋予注解中的值即可

image.png

源代码地址,感兴趣的朋友gitee上提issue单,后面持续补充。

参考仓库

原仓库只是简单的实现,入侵业务严重,不过对于本系统中RICHTEXT,TEXT类型的字段提供了思路 参考仓库

相关文章
|
9月前
|
存储 监控 算法
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
140 0
|
9月前
|
运维 JavaScript Devops
云效产品使用报错问题之更新后,旧数据的完成时间导出来没有了如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
9月前
|
算法 Java 程序员
技术更新迭代与“八股文”知识库的清理与更新
随着互联网技术的不断更新迭代,曾经被认为是“标准答案”的观点和方法已经逐渐失去适应当前需求的能力,甚至被视为过时的做法。就拿最近的技术圈新闻来讲,在新的JDK版本中,Java编程引入了许多新的特性、工具和方法,使其变得更加简洁、高效和强大,但是之前的旧特性和方法也有许多被废弃了,比如曾经比较经典的偏向锁已经被废弃了,因此,个人觉得是时候对“八股文”进行一次知识库的清理和更新了。那么本文就来分享一下关于偏向锁被废弃以及个人对此的看法,并回顾一下自己的“八股文”知识库,以及技术更新迭代地时候我们要保持及时更新自己的知识储备。
128 2
技术更新迭代与“八股文”知识库的清理与更新
如何进行需求评审后续跟踪和更新?附模板
如何进行需求评审后续跟踪和更新?附模板
165 0
|
Dubbo Cloud Native Java
数据变更白屏化利器-推送轨迹上线
微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。
数据变更白屏化利器-推送轨迹上线
|
消息中间件 容灾 关系型数据库
核心特性—全局日志变更
MySQL binlog是MySQL记录变更数据的“二进制日志”,它可以看做是一个消息队列,队列中按顺序保存了MySQL中详细的增量变更信息,通过消费队列中的变更条目,下游系统或工具实现了与MySQL的实时数据同步,这样的机制也称为CDC(Change Data Capture,增量数据捕捉)。
126 0
核心特性—全局日志变更
|
JSON JavaScript 前端开发
前端工作小结18-报错简单记录
前端工作小结18-报错简单记录
136 0
|
存储 测试技术 开发工具
BSTestRunner增加历史执行记录展示和重试功能
之前对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中,以后我们使用BSTestRunner直接就可以使用里面的失败重试和展示历史记录了。
BSTestRunner增加历史执行记录展示和重试功能
|
编解码 自然语言处理 监控
|
设计模式 缓存 自然语言处理