我們通過`@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()`
- Guns 技術文檔 v5.1
- 1. 序言
- 1.1 文檔簡介
- 1.2 Guns教程
- 1.3 獲取幫助
- 2. 使用手冊
- 2.1 下載項目
- 2.2 導入項目
- 2.2.1 eclipse導入
- 2.2.2 IDEA導入
- 2.3 運行項目
- 2.4 打包部署
- 3. 開發手冊
- 3.1 了解Guns
- 3.1.1 模塊結構
- 3.1.2 包結構說明
- 3.2 實戰開發
- 3.2.1 建表
- 3.2.2 代碼生成
- 3.3.3 添加菜單與分配權限
- 3.3.4 編寫業務代碼
- 3.3 權限控制與校驗
- 3.3.1 用戶,角色和資源
- 3.3.2 如何對資源進行權限控制
- 3.3.3 前端頁面對權限資源的顯示
- 3.4 多數據源的使用
- 3.5 如何分頁
- 3.5.1 簡單查詢的分頁
- 3.5.2 復雜查詢的分頁
- 3.5.3 獲取前端表格插件傳值
- 3.6 數據范圍
- 3.6.1 介紹
- 3.6.2 如何使用
- 3.6.3 原理
- 3.7 guns-rest模塊的使用
- 3.7.1 關于jwt鑒權
- 3.7.2 關于傳輸數據的簽名
- 3.7.3 guns-rest模塊的運行流程
- 3.7.4 運行原理
- 3.8 工作流
- 3.9 日志記錄
- 3.9.1 業務日志
- 3.9.2 異常日志
- 3.10 如何使用緩存
- 3.10.1 用工具類操作
- 3.10.2 用spring cache操作緩存
- 3.11 使用枚舉
- 3.12 spring boot熱部署
- 3.12.1 重新加載html
- 3.12.2 重新加載java類
- 4. 擴展與高級配置
- 4.1 修改項目名和包名
- 4.1.1 修改項目名
- 4.1.2 修改包名
- 4.2 放過接口權限驗證
- 4.3 靜態資源和模板位置的變更
- 4.4 三個或更多數據源如何配置
- 4.5 添加登錄驗證碼
- 4.6 spring profile
- 4.7 多機器部署開啟spring session
- 4.8 使用Redis
- 4.9 XSS過濾器
- 4.9.1 介紹
- 4.9.2 原理
- 4.9.3 放過過濾
- 5. 核心思想
- 5.1 分包
- 5.2 統一異常攔截
- 5.2.1 介紹
- 5.2.2 優點
- 5.2.3 關于性能
- 5.3 結果包裝器
- 5.3.1 如何使用
- 5.3.2 ConstantFactory
- 5.4 前端思想
- 5.4.1 布局
- 5.4.2 標簽
- 5.4.3 手動新增標簽頁
- 6. 常見問題答疑
- 6.1 默認的系統登錄賬號和密碼是多少
- 6.2 權限異常
- 6.3 為何分頁是前端實現
- 6.4 關于${ctxPath}
- 6.5 放過某些url的權限驗證
- 6.6 主頁的搜索功能
- 6.7 運行sql報錯
- 6.8 關于打包
- 6.9 查詢結果的駝峰轉化問題
- 6.10 為何使用beetl
- 6.11 為何有的業務沒有service層
- 6.12 為何既有dao,又有mapper
- 6.13 提示@spring.active@錯誤