From 5cc26472738e5a04774e3d1a538a92135ef6834f Mon Sep 17 00:00:00 2001
From: buaixuexideshitongxue <2936013465@qq.com>
Date: Wed, 19 Aug 2026 18:30:49 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../supervision/aop/SystemLogAspect.java | 446 ++++++++++++++++++
.../system/SystemLogController.java | 34 ++
.../supervision/job/SystemLogCleanJob.java | 37 ++
.../supervision/mapper/SystemLogMapper.java | 12 +
.../supervision/pojo/entity/SystemLog.java | 69 +++
.../pojo/param/SystemLogQueryParam.java | 43 ++
.../supervision/service/SystemLogService.java | 78 +++
7 files changed, 719 insertions(+)
create mode 100644 src/main/java/com/biutag/supervision/aop/SystemLogAspect.java
create mode 100644 src/main/java/com/biutag/supervision/controller/system/SystemLogController.java
create mode 100644 src/main/java/com/biutag/supervision/job/SystemLogCleanJob.java
create mode 100644 src/main/java/com/biutag/supervision/mapper/SystemLogMapper.java
create mode 100644 src/main/java/com/biutag/supervision/pojo/entity/SystemLog.java
create mode 100644 src/main/java/com/biutag/supervision/pojo/param/SystemLogQueryParam.java
create mode 100644 src/main/java/com/biutag/supervision/service/SystemLogService.java
diff --git a/src/main/java/com/biutag/supervision/aop/SystemLogAspect.java b/src/main/java/com/biutag/supervision/aop/SystemLogAspect.java
new file mode 100644
index 0000000..8c83455
--- /dev/null
+++ b/src/main/java/com/biutag/supervision/aop/SystemLogAspect.java
@@ -0,0 +1,446 @@
+package com.biutag.supervision.aop;
+
+import com.biutag.supervision.common.UserContextHolder;
+import com.biutag.supervision.constants.RedisKeyConstants;
+import com.biutag.supervision.pojo.Result;
+import com.biutag.supervision.pojo.domain.AppUser;
+import com.biutag.supervision.pojo.entity.SystemLog;
+import com.biutag.supervision.pojo.model.UserAuth;
+import com.biutag.supervision.pojo.vo.TokenVo;
+import com.biutag.supervision.service.SystemLogService;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * 统一记录进入 Controller 调用链的接口访问日志。
+ *
+ * 日志切面优先级高于现有参数检查切面,因此参数检查抛出的业务异常也可以被记录;
+ * 在 Spring MVC 调用 Controller 之前就被鉴权拦截的请求不会进入本切面。
+ */
+@Slf4j
+@Aspect
+@Component
+@Order(-100)
+@RequiredArgsConstructor
+public class SystemLogAspect {
+
+ private static final int SUCCESS = 1;
+ private static final int FAILURE = 0;
+ private static final int MAX_PARAMS_LENGTH = 4000;
+ private static final int MAX_ERROR_LENGTH = 1000;
+ private static final String MASK_VALUE = "******";
+ private static final String TRUNCATED_MARK = "...[内容已截断]";
+
+ private final SystemLogService systemLogService;
+ private final ObjectMapper objectMapper;
+ private final RedisTemplate