多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
我们通过`@BussinessLog注解`来记录日志,该注解源码如下, ``` /** * 标记需要做业务日志的方法 * * @author fengshuonan * @date 2017-03-31 12:46 */ @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface BussinessLog { /** * 业务的名称,例如:"修改菜单" */ String value() default ""; /** * 被修改的实体的唯一标识,例如:菜单实体的唯一标识为"id" */ String key() default "id"; /** * 字典(用于查找key的中文名称和字段的中文名称) */ Class<? extends AbstractDictMap> dict() default SystemDict.class; } ``` 其中,`value`为需要记录日志的业务名称,`key`为修改或删除内容的唯一标识,通过这个唯一标识可以知道具体的修改的哪条记录,删除的哪条记录等等,`dict`为对修改字段的中文翻译字典,因为程序记录的都是英文的字段名称,这里通过字典,把英文字段和中文名称对应起来,那么日志信息记录到数据库中就可以变为中文的记录 以`UserDict`为例, ``` /** * 用户的字典 * * @author fengshuonan * @date 2017-05-06 15:01 */ public class UserDict extends AbstractDictMap { @Override public void init() { put("userId","账号"); put("avatar","头像"); put("account","账号"); put("name","名字"); put("birthday","生日"); put("sex","性别"); put("email","电子邮件"); put("phone","电话"); put("roleid","角色名称"); put("deptid","部门名称"); put("roleIds","角色名称集合"); } @Override protected void initBeWrapped() { putFieldWrapperMethodName("sex","getSexName"); putFieldWrapperMethodName("deptid","getDeptName"); putFieldWrapperMethodName("roleid","getSingleRoleName"); putFieldWrapperMethodName("userId","getUserAccountById"); putFieldWrapperMethodName("roleIds","getRoleName"); } } ``` 翻译字典类中包含两个方法`init()`和`initBeWrapped()`,其中`init()`为存放英文字段和中文字段的匹配,`initBeWrapped()`操作的是把某些字段的数字值翻译为中文直观名称的过程,例如当修改用户信息时,用户修改了一个人性别信息(数据库中1是男,2是女),由1变为了2,程序记录的是数据库中1变为2,但是这句话给业务人员看到他是不知道1和2是什么东西的,所以这里做了一个`值的包装`,把`1`包装为对应的中文名称`男`,`2`包装为对应的中文名称`女`,这样,记录到数据库中,信息就变为了,xxx用户操作了`修改用户`功能,值由`男`变为了`女`.  在initBeWrapped()方法中`putFieldWrapperMethodName()`这个方法的第一参数是被包装的字段名,第二个参数是`ConstantFactory`中的方法名,因为默认会调用`ConstantFactory`来包装值属性 下面介绍业务日志记录的具体步骤: > * 1.在需要被记录日志的接口上添加@BussinessLog注解,并根据需要填写三个属性(value,key,dict) > * 2.若是添加或者修改业务,往往需要去编写Dict字典类 > * 3.若是修改业务,例如修改用户信息,因为点击更新用户的时候不会提交修改之前的数据,所以在更新用户信息之前需要保存一下用户的旧的信息才可以记录用户修改的内容,这个缓存用户临时信息的地方一般添加在跳转到用户详情接口,用`LogObjectHolder.me().set(user);`这行代码来缓存用户的旧的信息,具体用法可以参考`UserMgrController`类中的`userEdit()`和`edit()`