# 数据生命周期

# 概述

数据生命周期模块主要功能有:日志使用场景,查看数据生命周期,查看数据日志,表字段维护

其中数据生命周期日志使用场景主要包含:

# 日志使用场景

# 1.单表(包含单个字段)的日志场景

将前后数据组装成new,ord两个对象(对象格式允许为JSONObject,Map,entity等)然后调用 processData(List beforData, List afterData,LogProperty logProperty)方法插入日志;示例如下:

***记录实体新增数据日志***
//创建LogProperty对象
saveBussinessLog(Config config){
   LogProperty logProperty=new LogProperty();
   //设置数据日志类型
   logProperty.setType(BussinessLogEnum.INSERT.getCode());
   //数据日志开始记录时间
   logProperty.setSDateTime(System.currentTimeMillis());
   //如果默认的处理无法满足需求可以传入自定义的Processor
   logProperty.setLogStrengthenProcessor(CustomBusinessLogStrengthenProcessor);
   //根据实体对象Config,扩展封装LogProperty对象
   LogProperty logProp = BussinessLogUtils.polishingProperty(logProperty, Config.class);
   //记录数据日志
   BussinessLogUtils.processData(new ArrayList(), Arrays.asList(config),logProp);
}

***记录实体更新数据日志***
saveBussinessLog(PagePreset newPagePreset){
    //查找历史数据
    PagePreset pagePreset = this.selectById(id);
    //创建LogProperty对象
    LogProperty logProperty=new LogProperty();
   //设置数据日志类型
    logProperty.setType(BussinessLogEnum.UPDATE.getCode());
   //数据日志开始记录时间
    logProperty.setSDateTime(System.currentTimeMillis());
   //如果需要不显示某一些字段可以进行排除
    logProperty.setIgnoreFields("name,code");
   //如果默认的处理无法满足需求可以传入自定义的Processor
   logProperty.setLogStrengthenProcessor(CustomBusinessLogStrengthenProcessor);
   //根据实体对象PagePreset,扩展封装LogProperty对象
    LogProperty logProp = BussinessLogUtils.polishingProperty(logProperty, PagePreset.class);
   //调用保存日志方法
    BussinessLogUtils.processData(Arrays.asList(pagePreset), Arrays.asList(newPagePreset),logProp);
}

***记录字段更新数据日志***
saveBussinessLog(String id,boolean actived){
    //查找历史数据
    PagePreset pagePreset = this.selectById(id);
    //创建LogProperty对象
    LogProperty logProperty=new LogProperty();
   //设置数据日志类型
    logProperty.setType(BussinessLogEnum.UPDATE.getCode());
   //数据日志开始记录时间
    logProperty.setSDateTime(System.currentTimeMillis());
   //如果默认的处理无法满足需求可以传入自定义的Processor
   logProperty.setLogStrengthenProcessor(CustomBusinessLogStrengthenProcessor);
   //根据实体对象PagePreset,扩展封装LogProperty对象
    LogProperty logProp = BussinessLogUtils.polishingProperty(logProperty, PagePreset.class);
    //调用保存日志方法
   JSONObject ordMap=new JSONObject();
   ordMap.put("id",id);
   ordMap.put("actived",actived);
   //调用保存日志方法
   JSONObject newMap=new JSONObject();
   newMap.put("id",id);
   newMap.put("actived",actived);
   BussinessLogUtils.processData(Arrays.asList(ordMap), Arrays.asList(newMap),logProp);
}

提示

主键id必传。

# 2.关联表的日志场景

需要将修改之前的数据与修改之后的数据封装到BindProperty对象中;调用processData(List beforData, List afterData,LogProperty logProperty)方法插入日志;示例如下:

 saveBussinessLog(List<Resource>oldResourceIdList,List<Resource>resourceIdList){
      // 新资源权限记录,用于日志数据记录 
     List<BindProperty>beforeBindList=oldResourceIdList.stream().map(m->{
         BindProperty b=new BindProperty();
         b.setIdentify(b.getId());
         b.setDescribe(b.name);
     }).collect(Collectors.toList());
     List<BindProperty>afterBindList=resourceIdList.stream().map(m->{
         BindProperty b=new BindProperty();
         b.setIdentify(b.getId());
         b.setDescribe(b.name);
     }).collect(Collectors.toList());
     .....
      LogProperty property=new LogProperty();
      //设置主关联表业务id
      property.setBusinessId(roleId);
      property.setSDateTime(System.currentTimeMillis());
      //自定义日志显示title
      property.setTitle(role.getName()+"(资源授权)");
      //设置日志类型
      property.setType(BussinessLogEnum.BIND.getCode());
      //polishingProperty传入的是主表中的类
      BussinessLogUtils.processData(beforeBindList,afterBindList,BussinessLogUtils.polishingProperty(property,Role.class));
 }


提示

logProperty中的BusinessId必传

# 3.父子表的日志场景

如果是父子的日志类型需要将LogProperty 中的isSkirt设置为true;在父子表日志的场景中由于需要根据TableMainField找到子表和父表的关联关系, 因此在使用时before和afer对象需要传实体的完整对象。

saveBussinessLog(){
   LogProperty logProperty=new LogProperty();
   logProperty.setType(BussinessLogEnum.INSERT.getCode());
   logProperty.setSDateTime(System.currentTimeMillis());
   logProperty.setIsSkirt(true);//设置为true以后在父表的数据日志中就可以看到子表更新的内容
   LogProperty logProp = BussinessLogUtils.polishingProperty(logProperty, PageColumn.class);
   BussinessLogUtils.processData(new ArrayList(), Arrays.asList(column),logProp);
}
------------------------------------------
Class PageColumn{
    //子实体中的父字段加上注解
    @TableMainField(tableClass = PagePreset.class)
    private String pageId;
}

# 4.自定义日志场景

保存并需封装业务日志实体BussinessLogEntity,调用saveBussinessLog方法。

       BussinessLogEntity entity = new BussinessLogEntity();
        entity.setEntityCode("com.dhcc.user");
        entity.setTableName("用户管理");
        ....
        BussinessLogUtils.saveBussinessLog(entity);

# 注意

不管哪一个种类型的日志都需要往LogProperty中添加必要的参数:

type:类型见BaseBusinessLogEnum()

sDateTime:开始时间戳

key:默认为id

BusinessId:在关联时必须传递;主表的id例如用户关联角色BusinessId则为用户id.

title:非关联表如果不传时会根据describeField的字段名称拼接如果describeField为空则默认为name

其他参数可以通过工具类的polishingProperty方法获取


提示

1.工具类polishingProperty方法中的参数有部分取自注解TableName,ApiModel;如果使用此方法时需在实体中维护这两个注解



# 日志对象参数描述

# 对象LogProperty

封装日志属性内容对象

  @ApiModelProperty("开始时间")
    private  long sDateTime;

    @ApiModelProperty("实体编码")
    private  String entityCode;

    @ApiModelProperty("约束键值(id,code等)")
    private  String key;

    @ApiModelProperty("类型见BaseBusinessLogEnum")
    private  String type;

    private  String ip;

    @ApiModelProperty("访问路径")
    private  String loginLocation;

    @ApiModelProperty("实体名称")
    private  String entityName;

    @ApiModelProperty("表名称")
    private  String tableName;

    @ApiModelProperty("租户id")
    private  String tentantId;

    @ApiModelProperty("需要忽略的字段")
    private  String ignoreFields;

    @ApiModelProperty("spel表达式")
    private  String expression;

    @ApiModelProperty("是否存在父子关系")
    private  Boolean isSkirt;

    @ApiModelProperty("业务数据id在做关联表的日志时使用")
    private  String businessId;

    @ApiModelProperty("对象描述")
    private  String title;

    @ApiModelProperty("描述字段用于title空时填充title")
    private  String describeField;

# 对象BindProperty

用于关联类型的操作数据封装

 /**
    *@Description:  唯一标识一般是主键id用于数据对比
    * @param null:
    * @return: null
    *@auth:whh
    *@date 2022/6/2
     **/
    private  String identify;
    /**
    *@Description:  描述,一般指的是name,用于数据日志展示关联关系差异
    * @param null:
    * @return: null
    *@auth:whh
    *@date 2022/6/2
     **/
    private  String describe;

# 对象BussinessLogEntity

储存各个类型日志的数据表

    @ApiModelProperty(value = "业务的名称")
    @TableField("title")
    private String title;

    @ApiModelProperty(value = "实体名称")
    @TableField("entity_name")
    private String entityName;

    @ApiModelProperty(value = "实体类名")
    @TableField("entity_code")
    private String entityCode;

    @ApiModelProperty(value = "实体表名")
    @TableField("table_name")
    private String tableName;

    @ApiModelProperty(value = "操作类型")
    @TableField("type")

    private String type;

    @ApiModelProperty(value = "业务id")
    @TableField("bussiness_id")
    private String bussinessId;


    @ApiModelProperty(value = "耗时")
    @TableField("take_up_time")
    private Long takeUpTime;

    @ApiModelProperty(value = "IP")
    @TableField("ip")
    private String ip;

    @ApiModelProperty(value = "服务IP")
    @TableField("service_ip")
    private String serviceIp;

    @ApiModelProperty(value = "登录地址")
    @TableField("login_location")
    private String loginLocation;

# BussinessLogEnum枚举


    // 日志类型
    INSERT("insert","新增"),
    UPDATE("update","修改"),
    DELETE("delete","删除"),
    IMPORT("import","导入"),
    BIND("bind","关联");

# 日志BussinessLogUtils工具类

日志工具类方法说明

方法名        方法说明
polishingProperty 封装LogProperty类中的属性值,可以省去手动添加日志时的一部分属性的配置
processData(List beforData, List afterData,LogProperty logProperty) 用于非导入类型的数据,进行日志的插入操作,需要传入之前数据,之后数据,以及日志的属性对象;如果是关联关系类型的属性,beforData与afterData需要是BindProperty的集合
saveBussinessLog(BussinessLogEntity log) 插入日志,业务系统单独维护日志实体内容,此方法只提供保存日志

# 查看数据生命周期

查看每个对象主体的生命周期,包含操作事件、操作类型、操作人、操作人ip、操作表、操作类描述及操作内容信息。如下图所示:

生命周期

# 查看数据日志

# 1. 概述

数据日志主要记录数据所有的操作过程,包含新增、修改、删除、导入等对数据做了变更的操作,查询除外。

# 2. 查询数据日志

数据日志可以根据对象描述、操作人、操作类型、操作时间来查询。默认查询最近一周的数据。如下图所示:

# 3. 查看日志详细

支持查看每条日志的详细信息。不同的操作类型显示的不一样。如下图所示:


提示
`删除`操作没有详细信息按钮

查看详情

新增编辑,展示对象的属性信息操作前后值

数据日志

导入,展示导入类型(包含添加新数据、添加并更新数据、更新数据)、导入总数、成功数。

数据日志

绑定,展示操作前后值的记录(主要用于授权、关联信息的变更记录)。

数据日志

# 4. 查看数据生命周期

用于查看每条数据完整的生命周期。如下图所示:


提示
导入操作没有生命周期按钮。

# 表字段维护

(2.5.0+版本)数据生命周期日志显示用到的表字段信息目前来源于表结构管理,请维护所有表字段(包含非国际化的字段)(此维护为过度方案,后续HOS会提供元数据建模平台支持表结构及字段的详细维护,敬请等待文档更新)。