SpringBoot + 自定義註解,實現使用者操作紀錄檔(支援SpEL表示式)

2023-09-11 12:03:54

背景

一個成熟的系統,都會針對一些關鍵的操作,去建立使用者操作紀錄檔。

比如:

XX人建立了一條訂單,訂單號:XXXXXXXXX

因為操作人或者訂單號是動態的,所以有些開發人員,不知道獲取,就將這種操作紀錄檔和業務程式碼融在一起。

我們當然要杜絕這種現象,一定會有更好的解決方案。

當前專案除了滿足上面這個基礎需求場景外,還可以滿足一些常見的紀錄檔記錄需求。

下面通過一些測試用例來了解下當前專案吧。

一、支援SpEL表示式

1、使用場景

我們在記錄操作紀錄檔的時候,為了獲取介面中的入參資訊,就可以通過SpEL表示式。

2、介面範例

 @GetMapping(value = "/queryUser")
 @OperateLog(bizNo = "{#userName}", operateName = "查詢使用者", operateContent = "通過 {#userName} 查詢使用者")
 public Result<String> queryUser(@RequestParam String userName) {
        return Result.success(userName);
}

這裡入參 userName 的獲取,就是通過SpEL表示式獲取到

3、請求介面

http://localhost:8080/queryUser?userName=James

4、輸出紀錄檔

紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=James, operateName=查詢使用者, operateContent=通過 James 查詢使用者, status=true, errMsg=null)

可以看出通過SpEL表示式,已經將 {#userName} 預留位置,成功替換請求的引數 James


二、支援函數表示式

1、使用場景

有些時候我們僅僅是獲取請求引數的資料還不夠,還需要拿著請求引數的資料,去請求其它介面,才能組成一條完整的紀錄檔,最典型的場景就是

商品ID為 XXX 的商品的名稱已經從 XXX  改成 XXX

這裡前端肯定只會傳當前的商品ID和當前修改後的商品名稱,也就是說該商品老的名稱還需要通過商品ID去商品表查完後,才能組成完整紀錄檔。

2、介面範例

@GetMapping(value = "/deleteUser")
@OperateLog(bizNo = "{#userId}", operateName = "刪除使用者",
        operateContent = "使用者id為 {#userId} 使用者名稱為 [getUserNameByUserId{#userId}] 已被刪除")
public Result<Void> deleteUser(Long userId) {
        return Result.success();
        }

3、請求介面

http://localhost:8080/deleteUser?userId=888

4、輸出紀錄檔

紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=888, operateName=刪除使用者, operateContent=使用者id為 888 使用者名稱為 張老三 已被刪除, status=true, errMsg=null)

這裡使用者名稱張老三,是模擬查詢資料庫獲取的使用者名稱。


三、支援三目表示式

1、使用場景

有時候我們可能根據是否傳主鍵id來判斷是新增還是更新,或者傳不同的type來確定什麼操作型別。

2、介面範例

@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();
}

3、請求範例

請求url

localhost:8080/saveOrUpdateUser

請求引數

{
  "userId": 17,
  "userName": "趙磊"
}

4、輸出紀錄檔

傳入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)

四、支援標記成功紀錄檔或業務異常紀錄檔

1、使用場景

請求一個介面的時候,可以分為三種情況:

  • 介面返回成功,同時返回成功狀態碼
  • 介面返回成功,但返回業務異常狀態碼,比如:沒有查詢到該訂單資訊
  • 介面直接報錯,比如我們常見的空指標異常

對於第三種情況,我們可以不去記錄這個使用者操作紀錄檔,如果有需要可以記錄在異常記錄表中。

但對於第一和第二種情況,我們需要記錄操作是成功還是失敗。

2、介面範例

@PostMapping(value = "/saveUser")
@OperateLog(bizNo = "{#dto.userId}", operateName = "新增使用者", operateContent = "新增使用者名稱為{#dto.userName}")
public Result<Void> saveUser(@RequestBody UserDTO dto) {
        return Result.failed("該使用者名稱稱已存在");
        }

可以看出介面返回的是 該使用者名稱稱已存在,業務異常。

3、請求範例

請求url

localhost:8080/saveUser

請求引數

{
  "userId": 2,
  "userName": "閻平"
}

4、輸出紀錄檔

紀錄檔操作記錄------ OperateLogDTO(operator=張三, bizNo=2, operateName=新增使用者, operateContent=新增使用者名稱為閻平, status=false, errMsg=該使用者名稱稱已存在)

可以看出這裡的status狀態是 false,同時記錄了錯誤原因 該使用者名稱稱已存在

最後附上GitHub原始碼地址:

https://github.com/yudiandemingzi/spring-boot-operate-log



宣告: 公眾號如需轉載該篇文章,發表文章的頭部一定要 告知是轉至公眾號: 後端元宇宙。同時也可以問本人要markdown原稿和原圖片。其它情況一律禁止轉載!