# 数据生命周期
# 概述
数据生命周期模块主要功能有:日志使用场景,查看数据生命周期,查看数据日志,表字段维护
其中数据生命周期日志使用场景主要包含:
# 日志使用场景
# 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会提供元数据建模平台支持表结构及字段的详细维护,敬请等待文档更新)。