前言
这段时间罐头
在开发公司的一个工作流系统
,这个系统需要一个强壮的日志记录功能。基本需求如下:
- 所有该系统的用户登录、登出需要记录日志
- 用户在该系统进行的任何操作需要记录日志
(换言之,所有数据库的增删改
都需要记录) - 在每个子功能下面显示动态模板,管理员可以方便地查看日志。日志必须正确地显示
每个字段的注释意义
,而且还需要显示新值
和旧值
。 - 管理员可以为本子功能模块下面的日志添加和修改备注。
- 管理可以操作批量展开/闭合日志,对日志列表顺序/逆序展示。
讨论
说实话,看到需求的时候确实有点无语了,就差没bibi了。没法子,谁叫开发是万能的。
我们先抛开1
、4
、5
:无谓的登陆/登出,展开/闭合,顺序/逆序……集中思路来看看这个2
、3
。我们讨论这个强壮的日志系统是否可以实现?
所有数据库增删改都需要记录
换言之,第一,我们需要设计一个适用所有场景的日志表结构。总不可能为每张表都建立一张与之对应的日志表吧。第二,整个系统必须符合MVC设计,我们需要把写日志的接口建立在model层。
需要一个解析日志通用接口
需求提到需要显示字段注释的意义,还要显示新值和旧值。基本思路是,我们在记录日志时,存放差异集合。差异集合必须包含字段名、新值、老值、字段类型、字段注释。这才有可能正确地展示日志。
思路
通用的日志表
记录对应哪张表的日志信息:relate_table、relate_id
记录操作者信息:operator、 operate_time、 operate_msg
记录触发按钮、或者可以说是触发方法:trigger
记录类型 - 增删改,有利于后面解析日志:type
记录父子级关系,主要处理关联表日志:parent
记录修改字段和数据值:restore_arr
id | relate_table | relate_id | operator | operate_time | operate_msg | trigger | type | parent | restore_arr |
---|---|---|---|---|---|---|---|---|---|
id | 关联表 | 关联表主键 | 操作者 | 操作时间 | 操作备注 | 触发按钮 | 类型 | 父级 | 新老数据(json格式) |
restore_arr的数据结构
restore_arr字段是以json格式记录了差异集合的,这种设计才使得历史表变得通用成为现实。下面来看看restore_arr的设计:
|
|
这里看到,我们并没有记录字段的注释、类型。糟糕,我们还需要解析这一串json字段的意思给管理者。总不能直接解析:
|
|
而正确的,应该为:
|
|
利用数据的注释
由于在保存差异集的时候,并没有保存字段注释,类型。所有为了完整的暂时日志信息,我们需要充分地利用数据库注释。
待续……