From 0d166aa400c197eab9a9e996a63286b7e8884860 Mon Sep 17 00:00:00 2001 From: KilLze Date: Sat, 27 Dec 2025 17:37:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/bao/dating/anno/Log.java | 11 ++++ .../bao/dating/aspect/OperateLogAspect.java | 62 +++++++++++++++++++ .../bao/dating/controller/PostController.java | 5 ++ .../bao/dating/controller/UserController.java | 4 ++ .../dating/interceptor/TokenInterceptor.java | 3 +- .../bao/dating/mapper/OperateLogMapper.java | 19 ++++++ .../bao/dating/pojo/entity/OperateLog.java | 28 +++++++++ 7 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/bao/dating/anno/Log.java create mode 100644 src/main/java/com/bao/dating/aspect/OperateLogAspect.java create mode 100644 src/main/java/com/bao/dating/mapper/OperateLogMapper.java create mode 100644 src/main/java/com/bao/dating/pojo/entity/OperateLog.java diff --git a/src/main/java/com/bao/dating/anno/Log.java b/src/main/java/com/bao/dating/anno/Log.java new file mode 100644 index 0000000..d867395 --- /dev/null +++ b/src/main/java/com/bao/dating/anno/Log.java @@ -0,0 +1,11 @@ +package com.bao.dating.anno; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Log { +} diff --git a/src/main/java/com/bao/dating/aspect/OperateLogAspect.java b/src/main/java/com/bao/dating/aspect/OperateLogAspect.java new file mode 100644 index 0000000..505457f --- /dev/null +++ b/src/main/java/com/bao/dating/aspect/OperateLogAspect.java @@ -0,0 +1,62 @@ +package com.bao.dating.aspect; + + +import com.bao.dating.context.UserContext; +import com.bao.dating.mapper.OperateLogMapper; +import com.bao.dating.pojo.entity.OperateLog; +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.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.time.LocalDateTime; +import java.util.Arrays; + +@Slf4j +@Aspect +@Component +public class OperateLogAspect { + + @Autowired + private OperateLogMapper operateLogMapper; + + @Around("@annotation(com.bao.dating.anno.Log)") + public Object logOperate(ProceedingJoinPoint pjp) throws Throwable{ + + // 记录方法开始的时间 + long startTime = System.currentTimeMillis(); + + // 执行目标方法 + Object result = pjp.proceed(); + + long endTime = System.currentTimeMillis(); + long costTime = endTime - startTime; + + + // 构建日志对象 + OperateLog operatelog = new OperateLog(); + operatelog.setOperateUserId(getUserId()); + operatelog.setOperateTime(LocalDateTime.now()); + operatelog.setClassName(pjp.getTarget().getClass().getName()); + operatelog.setMethodName(pjp.getSignature().getName()); + operatelog.setMethodParams(Arrays.toString(pjp.getArgs())); + operatelog.setReturnValue(result != null ? result.toString() : "void"); + operatelog.setCostTime(costTime); + + log.info("记录操作日志: {}", operatelog); + + operateLogMapper.insert(operatelog); + + return result; + } + + private Long getUserId() { + return UserContext.getUserId(); + } + +} diff --git a/src/main/java/com/bao/dating/controller/PostController.java b/src/main/java/com/bao/dating/controller/PostController.java index 648e32f..fa48cd6 100644 --- a/src/main/java/com/bao/dating/controller/PostController.java +++ b/src/main/java/com/bao/dating/controller/PostController.java @@ -1,6 +1,7 @@ package com.bao.dating.controller; +import com.bao.dating.anno.Log; import com.bao.dating.common.Result; import com.bao.dating.common.ResultCode; import com.bao.dating.pojo.dto.PostRequestDTO; @@ -30,6 +31,7 @@ public class PostController { * @param files 媒体文件数组 * @return 上传后的文件URL列表 */ + @Log @PostMapping(value = "/upload", consumes = "multipart/form-data") public Result> uploadMedia(@RequestParam("files") MultipartFile[] files) { List fileUrls = postService.uploadMedia(files); @@ -41,6 +43,7 @@ public class PostController { * @param postDTO 动态信息 * @return 发布的动态对象 */ + @Log @PostMapping( "/createPost") public Result createPostJson(@RequestBody PostRequestDTO postDTO) { // 调用 Service 层处理发布动态业务逻辑 @@ -54,6 +57,7 @@ public class PostController { * @param postIds 动态ID * @return 删除结果 */ + @Log @PostMapping("/deletePost") public Result deleteById(@RequestBody List postIds){ int deletedCount = postService.deletePostById(postIds); @@ -77,6 +81,7 @@ public class PostController { * @param postRequestDTO 动态信息 * @return 更新后的动态对象 */ + @Log @PostMapping("/{postId}/updatePost") public Result updatePost(@PathVariable Long postId, @RequestBody PostRequestDTO postRequestDTO) { PostEditVO result = postService.updatePost(postId, postRequestDTO); diff --git a/src/main/java/com/bao/dating/controller/UserController.java b/src/main/java/com/bao/dating/controller/UserController.java index b62cdfd..78e0e9e 100644 --- a/src/main/java/com/bao/dating/controller/UserController.java +++ b/src/main/java/com/bao/dating/controller/UserController.java @@ -1,5 +1,6 @@ package com.bao.dating.controller; +import com.bao.dating.anno.Log; import com.bao.dating.common.Result; import com.bao.dating.common.ResultCode; import com.bao.dating.context.UserContext; @@ -50,6 +51,7 @@ public class UserController { * @param file 头像文件 * @return 上传后的文件URL列表 */ + @Log @PostMapping(value = "/info/uploadAvatar", consumes = "multipart/form-data") public Result uploadAvatar(@RequestParam("file") MultipartFile file) { String fileUrl = userService.uploadAvatar(file); @@ -61,6 +63,7 @@ public class UserController { * @param file 背景文件 * @return 上传后的文件URL列表 */ + @Log @PostMapping(value = "/info/uploadBackground", consumes = "multipart/form-data") public Result uploadBackground(@RequestParam("file") MultipartFile file) { String fileUrl = userService.uploadBackground(file); @@ -72,6 +75,7 @@ public class UserController { * @param userInfoUpdateDTO 用户信息更新参数 * @return 更新后的用户信息 */ + @Log @PostMapping("/info/update") public Result userInfoUpdate(@RequestBody UserInfoUpdateDTO userInfoUpdateDTO) { Long userId = UserContext.getUserId(); diff --git a/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java b/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java index e520ce8..1942a12 100644 --- a/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java +++ b/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java @@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse; import com.bao.dating.context.UserContext; import com.bao.dating.util.JwtUtil; +import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; @@ -50,8 +51,8 @@ public class TokenInterceptor implements HandlerInterceptor { // 解析 token String userId = JwtUtil.getSubjectFromToken(token); + log.info("用户: {}", userId); - // 保存 userId 到 ThreadLocal UserContext.setUserId(Long.valueOf(userId)); return true; diff --git a/src/main/java/com/bao/dating/mapper/OperateLogMapper.java b/src/main/java/com/bao/dating/mapper/OperateLogMapper.java new file mode 100644 index 0000000..e97c421 --- /dev/null +++ b/src/main/java/com/bao/dating/mapper/OperateLogMapper.java @@ -0,0 +1,19 @@ +package com.bao.dating.mapper; + + +import com.bao.dating.pojo.entity.OperateLog; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; + +/** + * 操作日志Mapper + * @author KilLze + */ +@Mapper +public interface OperateLogMapper { + + @Insert("insert into operate_log (operate_user_id, operate_time, class_name, method_name, method_params, return_value, cost_time) " + + "values (#{operateUserId}, #{operateTime}, #{className}, #{methodName}, #{methodParams}, #{returnValue}, #{costTime});") + public void insert(OperateLog log); + +} diff --git a/src/main/java/com/bao/dating/pojo/entity/OperateLog.java b/src/main/java/com/bao/dating/pojo/entity/OperateLog.java new file mode 100644 index 0000000..95dacf8 --- /dev/null +++ b/src/main/java/com/bao/dating/pojo/entity/OperateLog.java @@ -0,0 +1,28 @@ +package com.bao.dating.pojo.entity; + +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 操作日志 + * @author KilLze + */ +@Data +public class OperateLog { + /** ID */ + private Long id; + /** 操作人ID */ + private Long operateUserId; + /** 操作时间 */ + private LocalDateTime operateTime; + /** 操作类名 */ + private String className; + /** 操作方法名 */ + private String methodName; + /** 操作方法参数 */ + private String methodParams; + /** 操作方法返回值 */ + private String returnValue; + /** 操作耗时 */ + private Long costTime; +}