一個成熟的系統,都會針對一些關鍵的操作,去建立使用者操作紀錄檔。
比如:
XX人建立了一條訂單,訂單號:XXXXXXXXX
因為操作人
或者訂單號
是動態的,所以有些開發人員,不知道獲取,就將這種操作紀錄檔和業務程式碼融在一起。
我們當然要杜絕這種現象,一定會有更好的解決方案。
當前專案除了滿足上面這個基礎需求場景外,還可以滿足一些常見的紀錄檔記錄需求。
下面通過一些測試用例來了解下當前專案吧。
我們在記錄操作紀錄檔的時候,為了獲取介面中的入參資訊,就可以通過SpEL表示式。
@GetMapping(value = "/queryUser")
@OperateLog(bizNo = "{#userName}", operateName = "查詢使用者", operateContent = "通過 {#userName} 查詢使用者")
public Result<String> queryUser(@RequestParam String userName) {
return Result.success(userName);
}
這裡入參 userName
的獲取,就是通過SpEL表示式獲取到
http://localhost:8080/queryUser?userName=James
紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=James, operateName=查詢使用者, operateContent=通過 James 查詢使用者, status=true, errMsg=null)
可以看出通過SpEL表示式,已經將 {#userName}
預留位置,成功替換請求的引數 James
。
有些時候我們僅僅是獲取請求引數的資料還不夠,還需要拿著請求引數的資料,去請求其它介面,才能組成一條完整的紀錄檔,最典型的場景就是
商品ID為 XXX 的商品的名稱已經從 XXX 改成 XXX
這裡前端肯定只會傳當前的商品ID和當前修改後的商品名稱,也就是說該商品老的名稱還需要通過商品ID去商品表查完後,才能組成完整紀錄檔。
@GetMapping(value = "/deleteUser")
@OperateLog(bizNo = "{#userId}", operateName = "刪除使用者",
operateContent = "使用者id為 {#userId} 使用者名稱為 [getUserNameByUserId{#userId}] 已被刪除")
public Result<Void> deleteUser(Long userId) {
return Result.success();
}
http://localhost:8080/deleteUser?userId=888
紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=888, operateName=刪除使用者, operateContent=使用者id為 888 使用者名稱為 張老三 已被刪除, status=true, errMsg=null)
這裡使用者名稱張老三
,是模擬查詢資料庫獲取的使用者名稱。
有時候我們可能根據是否傳主鍵id來判斷是新增還是更新,或者傳不同的type來確定什麼操作型別。
@PostMapping(value = "/saveOrUpdateUser")
@OperateLog(bizNo = "{#dto.userId}", operateName = "#dto.userId == null ? '新增使用者':'更新使用者'",
operateContent = "#dto.userId == null ? '新增' + #dto.userName + '使用者':'將使用者id為' + #dto.userId + '的使用者名稱更新為' + #dto.userName")
public Result<Void> saveOrUpdateUser(@RequestBody UserDTO dto) {
return Result.success();
}
請求url
localhost:8080/saveOrUpdateUser
請求引數
{
"userId": 17,
"userName": "趙磊"
}
傳入userId的紀錄檔
紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=null, operateName=更新使用者, operateContent=將使用者id為17的使用者名稱更新為趙磊, status=true, errMsg=null)
如果不傳入userId只傳userName,我們再看下紀錄檔
紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=null, operateName=新增使用者, operateContent=新增趙磊使用者, status=true, errMsg=null)
請求一個介面的時候,可以分為三種情況:
對於第三種情況,我們可以不去記錄這個使用者操作紀錄檔,如果有需要可以記錄在異常記錄表中。
但對於第一和第二種情況,我們需要記錄操作是成功還是失敗。
@PostMapping(value = "/saveUser")
@OperateLog(bizNo = "{#dto.userId}", operateName = "新增使用者", operateContent = "新增使用者名稱為{#dto.userName}")
public Result<Void> saveUser(@RequestBody UserDTO dto) {
return Result.failed("該使用者名稱稱已存在");
}
可以看出介面返回的是 該使用者名稱稱已存在
,業務異常。
請求url
localhost:8080/saveUser
請求引數
{
"userId": 2,
"userName": "閻平"
}
紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=2, operateName=新增使用者, operateContent=新增使用者名稱為閻平, status=false, errMsg=該使用者名稱稱已存在)
可以看出這裡的status狀態是 false
,同時記錄了錯誤原因 該使用者名稱稱已存在
。
最後附上GitHub原始碼地址:
https://github.com/yudiandemingzi/spring-boot-operate-log
宣告: 公眾號如需轉載該篇文章,發表文章的頭部一定要 告知是轉至公眾號: 後端元宇宙。同時也可以問本人要markdown原稿和原圖片。其它情況一律禁止轉載!