Commit 000b6cf47fd8f14827a28b43c4f2c410b372163c

Authored by YunaiV
1 parent 22a170ee

【重构】V2 操作日志转正,基于注解的可使用变量、可以自定义函数的通用操作日志组件

Showing 30 changed files with 185 additions and 1188 deletions
sql/mysql/ruoyi-vue-pro.sql
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 Target Server Version : 80200 (8.2.0) 11 Target Server Version : 80200 (8.2.0)
12 File Encoding : 65001 12 File Encoding : 65001
13 13
14 - Date: 03/04/2024 19:07:31 14 + Date: 04/04/2024 01:17:25
15 */ 15 */
16 16
17 SET NAMES utf8mb4; 17 SET NAMES utf8mb4;
@@ -347,7 +347,7 @@ CREATE TABLE `infra_api_access_log` ( @@ -347,7 +347,7 @@ CREATE TABLE `infra_api_access_log` (
347 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 347 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
348 PRIMARY KEY (`id`) USING BTREE, 348 PRIMARY KEY (`id`) USING BTREE,
349 INDEX `idx_create_time`(`create_time` ASC) USING BTREE 349 INDEX `idx_create_time`(`create_time` ASC) USING BTREE
350 -) ENGINE = InnoDB AUTO_INCREMENT = 35920 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表'; 350 +) ENGINE = InnoDB AUTO_INCREMENT = 35925 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表';
351 351
352 -- ---------------------------- 352 -- ----------------------------
353 -- Records of infra_api_access_log 353 -- Records of infra_api_access_log
@@ -726,7 +726,7 @@ CREATE TABLE `infra_file_config` ( @@ -726,7 +726,7 @@ CREATE TABLE `infra_file_config` (
726 -- ---------------------------- 726 -- ----------------------------
727 BEGIN; 727 BEGIN;
728 INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '数据库', 1, '我是数据库', b'0', '{\"@class\":\"cn.iocoder.yudao.module.infra.framework.file.core.client.db.DBFileClientConfig\",\"domain\":\"http://127.0.0.1:48080\"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', b'0'); 728 INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '数据库', 1, '我是数据库', b'0', '{\"@class\":\"cn.iocoder.yudao.module.infra.framework.file.core.client.db.DBFileClientConfig\",\"domain\":\"http://127.0.0.1:48080\"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', b'0');
729 -INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, '七牛存储器', 20, '', b'1', '{\"@class\":\"cn.iocoder.yudao.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3.cn-south-1.qiniucs.com\",\"domain\":\"http://test.yudao.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS\",\"accessSecret\":\"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY\"}', '1', '2024-01-13 22:11:12', '1', '2024-01-13 22:24:06', b'0'); 729 +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, '七牛存储器', 20, '', b'1', '{\"@class\":\"cn.iocoder.yudao.module.infra.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3.cn-south-1.qiniucs.com\",\"domain\":\"http://test.yudao.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS\",\"accessSecret\":\"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY\"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', b'0');
730 COMMIT; 730 COMMIT;
731 731
732 -- ---------------------------- 732 -- ----------------------------
@@ -1420,7 +1420,7 @@ CREATE TABLE `system_login_log` ( @@ -1420,7 +1420,7 @@ CREATE TABLE `system_login_log` (
1420 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 1420 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
1421 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 1421 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
1422 PRIMARY KEY (`id`) USING BTREE 1422 PRIMARY KEY (`id`) USING BTREE
1423 -) ENGINE = InnoDB AUTO_INCREMENT = 3066 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; 1423 +) ENGINE = InnoDB AUTO_INCREMENT = 3067 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
1424 1424
1425 -- ---------------------------- 1425 -- ----------------------------
1426 -- Records of system_login_log 1426 -- Records of system_login_log
@@ -2457,7 +2457,7 @@ CREATE TABLE `system_oauth2_access_token` ( @@ -2457,7 +2457,7 @@ CREATE TABLE `system_oauth2_access_token` (
2457 PRIMARY KEY (`id`) USING BTREE, 2457 PRIMARY KEY (`id`) USING BTREE,
2458 INDEX `idx_access_token`(`access_token` ASC) USING BTREE, 2458 INDEX `idx_access_token`(`access_token` ASC) USING BTREE,
2459 INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE 2459 INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE
2460 -) ENGINE = InnoDB AUTO_INCREMENT = 6366 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; 2460 +) ENGINE = InnoDB AUTO_INCREMENT = 6372 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
2461 2461
2462 -- ---------------------------- 2462 -- ----------------------------
2463 -- Records of system_oauth2_access_token 2463 -- Records of system_oauth2_access_token
@@ -2579,7 +2579,7 @@ CREATE TABLE `system_oauth2_refresh_token` ( @@ -2579,7 +2579,7 @@ CREATE TABLE `system_oauth2_refresh_token` (
2579 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 2579 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
2580 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 2580 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
2581 PRIMARY KEY (`id`) USING BTREE 2581 PRIMARY KEY (`id`) USING BTREE
2582 -) ENGINE = InnoDB AUTO_INCREMENT = 1441 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; 2582 +) ENGINE = InnoDB AUTO_INCREMENT = 1442 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
2583 2583
2584 -- ---------------------------- 2584 -- ----------------------------
2585 -- Records of system_oauth2_refresh_token 2585 -- Records of system_oauth2_refresh_token
@@ -2596,46 +2596,6 @@ CREATE TABLE `system_operate_log` ( @@ -2596,46 +2596,6 @@ CREATE TABLE `system_operate_log` (
2596 `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', 2596 `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号',
2597 `user_id` bigint NOT NULL COMMENT '用户编号', 2597 `user_id` bigint NOT NULL COMMENT '用户编号',
2598 `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', 2598 `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型',
2599 - `module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块标题',  
2600 - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名',  
2601 - `type` bigint NOT NULL DEFAULT 0 COMMENT '操作分类',  
2602 - `content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作内容',  
2603 - `exts` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '拓展字段',  
2604 - `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求方法名',  
2605 - `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求地址',  
2606 - `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户 IP',  
2607 - `user_agent` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '浏览器 UA',  
2608 - `java_method` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Java 方法名',  
2609 - `java_method_args` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'Java 方法的参数',  
2610 - `start_time` datetime NOT NULL COMMENT '操作时间',  
2611 - `duration` int NOT NULL COMMENT '执行时长',  
2612 - `result_code` int NOT NULL DEFAULT 0 COMMENT '结果码',  
2613 - `result_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果提示',  
2614 - `result_data` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果数据',  
2615 - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',  
2616 - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  
2617 - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',  
2618 - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',  
2619 - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',  
2620 - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',  
2621 - PRIMARY KEY (`id`) USING BTREE  
2622 -) ENGINE = InnoDB AUTO_INCREMENT = 12000 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录';  
2623 -  
2624 --- ----------------------------  
2625 --- Records of system_operate_log  
2626 --- ----------------------------  
2627 -BEGIN;  
2628 -COMMIT;  
2629 -  
2630 --- ----------------------------  
2631 --- Table structure for system_operate_log_v2  
2632 --- ----------------------------  
2633 -DROP TABLE IF EXISTS `system_operate_log_v2`;  
2634 -CREATE TABLE `system_operate_log_v2` (  
2635 - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',  
2636 - `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号',  
2637 - `user_id` bigint NOT NULL COMMENT '用户编号',  
2638 - `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型',  
2639 `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作模块类型', 2599 `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作模块类型',
2640 `sub_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名', 2600 `sub_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名',
2641 `biz_id` bigint NOT NULL COMMENT '操作数据模块编号', 2601 `biz_id` bigint NOT NULL COMMENT '操作数据模块编号',
@@ -2655,7 +2615,7 @@ CREATE TABLE `system_operate_log_v2` ( @@ -2655,7 +2615,7 @@ CREATE TABLE `system_operate_log_v2` (
2655 ) ENGINE = InnoDB AUTO_INCREMENT = 9019 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; 2615 ) ENGINE = InnoDB AUTO_INCREMENT = 9019 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本';
2656 2616
2657 -- ---------------------------- 2617 -- ----------------------------
2658 --- Records of system_operate_log_v2 2618 +-- Records of system_operate_log
2659 -- ---------------------------- 2619 -- ----------------------------
2660 BEGIN; 2620 BEGIN;
2661 COMMIT; 2621 COMMIT;
@@ -5623,7 +5583,7 @@ CREATE TABLE `system_users` ( @@ -5623,7 +5583,7 @@ CREATE TABLE `system_users` (
5623 -- Records of system_users 5583 -- Records of system_users
5624 -- ---------------------------- 5584 -- ----------------------------
5625 BEGIN; 5585 BEGIN;
5626 -INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.yudao.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '127.0.0.1', '2024-04-03 17:31:00', 'admin', '2021-01-05 17:03:47', NULL, '2024-04-03 17:31:00', b'0', 1); 5586 +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.yudao.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '127.0.0.1', '2024-04-03 20:01:18', 'admin', '2021-01-05 17:03:47', NULL, '2024-04-03 20:01:18', b'0', 1);
5627 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', b'0', 1); 5587 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', b'0', 1);
5628 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-03-18 21:09:04', '', '2021-01-13 23:50:35', NULL, '2024-03-18 21:09:04', b'0', 1); 5588 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-03-18 21:09:04', '', '2021-01-13 23:50:35', NULL, '2024-03-18 21:09:04', b'0', 1);
5629 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-26 07:11:35', '', '2021-01-21 02:13:53', NULL, '2024-03-26 07:11:35', b'0', 1); 5589 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-26 07:11:35', '', '2021-01-21 02:13:53', NULL, '2024-03-26 07:11:35', b'0', 1);
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/config/YudaoOperateLogAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.config;  
2 -  
3 -import cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect;  
4 -import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService;  
5 -import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkServiceImpl;  
6 -import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;  
7 -import org.springframework.boot.autoconfigure.AutoConfiguration;  
8 -import org.springframework.context.annotation.Bean;  
9 -  
10 -@AutoConfiguration  
11 -public class YudaoOperateLogAutoConfiguration {  
12 -  
13 - @Bean  
14 - public OperateLogAspect operateLogAspect() {  
15 - return new OperateLogAspect();  
16 - }  
17 -  
18 - @Bean  
19 - public OperateLogFrameworkService operateLogFrameworkService(OperateLogApi operateLogApi) {  
20 - return new OperateLogFrameworkServiceImpl(operateLogApi);  
21 - }  
22 -  
23 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/aop/OperateLogAspect.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core.aop;  
2 -  
3 -import cn.hutool.core.date.LocalDateTimeUtil;  
4 -import cn.hutool.core.exceptions.ExceptionUtil;  
5 -import cn.hutool.core.util.ArrayUtil;  
6 -import cn.hutool.core.util.StrUtil;  
7 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
8 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
9 -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;  
10 -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;  
11 -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;  
12 -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;  
13 -import cn.iocoder.yudao.framework.operatelog.core.service.OperateLog;  
14 -import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService;  
15 -import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;  
16 -import com.google.common.collect.Maps;  
17 -import io.swagger.v3.oas.annotations.tags.Tag;  
18 -import io.swagger.v3.oas.annotations.Operation;  
19 -import lombok.extern.slf4j.Slf4j;  
20 -import org.aspectj.lang.ProceedingJoinPoint;  
21 -import org.aspectj.lang.annotation.Around;  
22 -import org.aspectj.lang.annotation.Aspect;  
23 -import org.aspectj.lang.reflect.MethodSignature;  
24 -import org.springframework.core.annotation.AnnotationUtils;  
25 -import org.springframework.validation.BindingResult;  
26 -import org.springframework.web.bind.annotation.RequestMapping;  
27 -import org.springframework.web.bind.annotation.RequestMethod;  
28 -import org.springframework.web.multipart.MultipartFile;  
29 -  
30 -import jakarta.annotation.Resource;  
31 -import jakarta.servlet.http.HttpServletRequest;  
32 -import jakarta.servlet.http.HttpServletResponse;  
33 -import java.lang.annotation.Annotation;  
34 -import java.lang.reflect.Array;  
35 -import java.time.LocalDateTime;  
36 -import java.util.*;  
37 -import java.util.function.Predicate;  
38 -import java.util.stream.IntStream;  
39 -  
40 -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;  
41 -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS;  
42 -  
43 -/**  
44 - * 拦截使用 @OperateLog 注解,如果满足条件,则生成操作日志。  
45 - * 满足如下任一条件,则会进行记录:  
46 - * 1. 使用 @ApiOperation + 非 @GetMapping  
47 - * 2. 使用 @OperateLog 注解  
48 - * <p>  
49 - * 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。  
50 - *  
51 - * @author 芋道源码  
52 - */  
53 -@Aspect  
54 -@Slf4j  
55 -public class OperateLogAspect {  
56 -  
57 - /**  
58 - * 用于记录操作内容的上下文  
59 - *  
60 - * @see OperateLog#getContent()  
61 - */  
62 - private static final ThreadLocal<String> CONTENT = new ThreadLocal<>();  
63 - /**  
64 - * 用于记录拓展字段的上下文  
65 - *  
66 - * @see OperateLog#getExts()  
67 - */  
68 - private static final ThreadLocal<Map<String, Object>> EXTS = new ThreadLocal<>();  
69 -  
70 - @Resource  
71 - private OperateLogFrameworkService operateLogFrameworkService;  
72 -  
73 - @Around("@annotation(operation)")  
74 - public Object around(ProceedingJoinPoint joinPoint, Operation operation) throws Throwable {  
75 - // 可能也添加了 @ApiOperation 注解  
76 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog = getMethodAnnotation(joinPoint,  
77 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog.class);  
78 - return around0(joinPoint, operateLog, operation);  
79 - }  
80 -  
81 - @Around("!@annotation(io.swagger.v3.oas.annotations.Operation) && @annotation(operateLog)")  
82 - // 兼容处理,只添加 @OperateLog 注解的情况  
83 - public Object around(ProceedingJoinPoint joinPoint,  
84 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable {  
85 - return around0(joinPoint, operateLog, null);  
86 - }  
87 -  
88 - private Object around0(ProceedingJoinPoint joinPoint,  
89 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,  
90 - Operation operation) throws Throwable {  
91 - // 目前,只有管理员,才记录操作日志!所以非管理员,直接调用,不进行记录  
92 - Integer userType = WebFrameworkUtils.getLoginUserType();  
93 - if (!Objects.equals(userType, UserTypeEnum.ADMIN.getValue())) {  
94 - return joinPoint.proceed();  
95 - }  
96 -  
97 - // 记录开始时间  
98 - LocalDateTime startTime = LocalDateTime.now();  
99 - try {  
100 - // 执行原有方法  
101 - Object result = joinPoint.proceed();  
102 - // 记录正常执行时的操作日志  
103 - this.log(joinPoint, operateLog, operation, startTime, result, null);  
104 - return result;  
105 - } catch (Throwable exception) {  
106 - this.log(joinPoint, operateLog, operation, startTime, null, exception);  
107 - throw exception;  
108 - } finally {  
109 - clearThreadLocal();  
110 - }  
111 - }  
112 -  
113 - public static void setContent(String content) {  
114 - CONTENT.set(content);  
115 - }  
116 -  
117 - public static void addExt(String key, Object value) {  
118 - if (EXTS.get() == null) {  
119 - EXTS.set(new HashMap<>());  
120 - }  
121 - EXTS.get().put(key, value);  
122 - }  
123 -  
124 - private static void clearThreadLocal() {  
125 - CONTENT.remove();  
126 - EXTS.remove();  
127 - }  
128 -  
129 - private void log(ProceedingJoinPoint joinPoint,  
130 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,  
131 - Operation operation,  
132 - LocalDateTime startTime, Object result, Throwable exception) {  
133 - try {  
134 - // 判断不记录的情况  
135 - if (!isLogEnable(joinPoint, operateLog)) {  
136 - return;  
137 - }  
138 - // 真正记录操作日志  
139 - this.log0(joinPoint, operateLog, operation, startTime, result, exception);  
140 - } catch (Throwable ex) {  
141 - log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) apiOperation({}) result({}) exception({}) ]",  
142 - joinPoint, operateLog, operation, result, exception, ex);  
143 - }  
144 - }  
145 -  
146 - private void log0(ProceedingJoinPoint joinPoint,  
147 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,  
148 - Operation operation,  
149 - LocalDateTime startTime, Object result, Throwable exception) {  
150 - OperateLog operateLogObj = new OperateLog();  
151 - // 补全通用字段  
152 - operateLogObj.setTraceId(TracerUtils.getTraceId());  
153 - operateLogObj.setStartTime(startTime);  
154 - // 补充用户信息  
155 - fillUserFields(operateLogObj);  
156 - // 补全模块信息  
157 - fillModuleFields(operateLogObj, joinPoint, operateLog, operation);  
158 - // 补全请求信息  
159 - fillRequestFields(operateLogObj);  
160 - // 补全方法信息  
161 - fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception);  
162 -  
163 - // 异步记录日志  
164 - operateLogFrameworkService.createOperateLog(operateLogObj);  
165 - }  
166 -  
167 - private static void fillUserFields(OperateLog operateLogObj) {  
168 - operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId());  
169 - operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType());  
170 - }  
171 -  
172 - private static void fillModuleFields(OperateLog operateLogObj,  
173 - ProceedingJoinPoint joinPoint,  
174 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,  
175 - Operation operation) {  
176 - // module 属性  
177 - if (operateLog != null) {  
178 - operateLogObj.setModule(operateLog.module());  
179 - }  
180 - if (StrUtil.isEmpty(operateLogObj.getModule())) {  
181 - Tag tag = getClassAnnotation(joinPoint, Tag.class);  
182 - if (tag != null) {  
183 - // 优先读取 @Tag 的 name 属性  
184 - if (StrUtil.isNotEmpty(tag.name())) {  
185 - operateLogObj.setModule(tag.name());  
186 - }  
187 - // 没有的话,读取 @API 的 description 属性  
188 - if (StrUtil.isEmpty(operateLogObj.getModule()) && ArrayUtil.isNotEmpty(tag.description())) {  
189 - operateLogObj.setModule(tag.description());  
190 - }  
191 - }  
192 - }  
193 - // name 属性  
194 - if (operateLog != null) {  
195 - operateLogObj.setName(operateLog.name());  
196 - }  
197 - if (StrUtil.isEmpty(operateLogObj.getName()) && operation != null) {  
198 - operateLogObj.setName(operation.summary());  
199 - }  
200 - // type 属性  
201 - if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) {  
202 - operateLogObj.setType(operateLog.type()[0].getType());  
203 - }  
204 - if (operateLogObj.getType() == null) {  
205 - RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint));  
206 - OperateTypeEnum operateLogType = convertOperateLogType(requestMethod);  
207 - operateLogObj.setType(operateLogType != null ? operateLogType.getType() : null);  
208 - }  
209 - // content 和 exts 属性  
210 - operateLogObj.setContent(CONTENT.get());  
211 - operateLogObj.setExts(EXTS.get());  
212 - }  
213 -  
214 - private static void fillRequestFields(OperateLog operateLogObj) {  
215 - // 获得 Request 对象  
216 - HttpServletRequest request = ServletUtils.getRequest();  
217 - if (request == null) {  
218 - return;  
219 - }  
220 - // 补全请求信息  
221 - operateLogObj.setRequestMethod(request.getMethod());  
222 - operateLogObj.setRequestUrl(request.getRequestURI());  
223 - operateLogObj.setUserIp(ServletUtils.getClientIP(request));  
224 - operateLogObj.setUserAgent(ServletUtils.getUserAgent(request));  
225 - }  
226 -  
227 - private static void fillMethodFields(OperateLog operateLogObj,  
228 - ProceedingJoinPoint joinPoint,  
229 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,  
230 - LocalDateTime startTime, Object result, Throwable exception) {  
231 - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();  
232 - operateLogObj.setJavaMethod(methodSignature.toString());  
233 - if (operateLog == null || operateLog.logArgs()) {  
234 - operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint));  
235 - }  
236 - if (operateLog == null || operateLog.logResultData()) {  
237 - operateLogObj.setResultData(obtainResultData(result));  
238 - }  
239 - operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis()));  
240 - // (正常)处理 resultCode 和 resultMsg 字段  
241 - if (result instanceof CommonResult) {  
242 - CommonResult<?> commonResult = (CommonResult<?>) result;  
243 - operateLogObj.setResultCode(commonResult.getCode());  
244 - operateLogObj.setResultMsg(commonResult.getMsg());  
245 - } else {  
246 - operateLogObj.setResultCode(SUCCESS.getCode());  
247 - }  
248 - // (异常)处理 resultCode 和 resultMsg 字段  
249 - if (exception != null) {  
250 - operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode());  
251 - operateLogObj.setResultMsg(ExceptionUtil.getRootCauseMessage(exception));  
252 - }  
253 - }  
254 -  
255 - private static boolean isLogEnable(ProceedingJoinPoint joinPoint,  
256 - cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) {  
257 - // 有 @OperateLog 注解的情况下  
258 - if (operateLog != null) {  
259 - return operateLog.enable();  
260 - }  
261 - // 没有 @ApiOperation 注解的情况下,只记录 POST、PUT、DELETE 的情况  
262 - return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null;  
263 - }  
264 -  
265 - private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) {  
266 - if (ArrayUtil.isEmpty(requestMethods)) {  
267 - return null;  
268 - }  
269 - return Arrays.stream(requestMethods).filter(requestMethod ->  
270 - requestMethod == RequestMethod.POST  
271 - || requestMethod == RequestMethod.PUT  
272 - || requestMethod == RequestMethod.DELETE)  
273 - .findFirst().orElse(null);  
274 - }  
275 -  
276 - private static RequestMethod obtainFirstMatchRequestMethod(RequestMethod[] requestMethods) {  
277 - if (ArrayUtil.isEmpty(requestMethods)) {  
278 - return null;  
279 - }  
280 - // 优先,匹配最优的 POST、PUT、DELETE  
281 - RequestMethod result = obtainFirstLogRequestMethod(requestMethods);  
282 - if (result != null) {  
283 - return result;  
284 - }  
285 - // 然后,匹配次优的 GET  
286 - result = Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.GET)  
287 - .findFirst().orElse(null);  
288 - if (result != null) {  
289 - return result;  
290 - }  
291 - // 兜底,获得第一个  
292 - return requestMethods[0];  
293 - }  
294 -  
295 - private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) {  
296 - if (requestMethod == null) {  
297 - return null;  
298 - }  
299 - switch (requestMethod) {  
300 - case GET:  
301 - return OperateTypeEnum.GET;  
302 - case POST:  
303 - return OperateTypeEnum.CREATE;  
304 - case PUT:  
305 - return OperateTypeEnum.UPDATE;  
306 - case DELETE:  
307 - return OperateTypeEnum.DELETE;  
308 - default:  
309 - return OperateTypeEnum.OTHER;  
310 - }  
311 - }  
312 -  
313 - private static RequestMethod[] obtainRequestMethod(ProceedingJoinPoint joinPoint) {  
314 - RequestMapping requestMapping = AnnotationUtils.getAnnotation( // 使用 Spring 的工具类,可以处理 @RequestMapping 别名注解  
315 - ((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class);  
316 - return requestMapping != null ? requestMapping.method() : new RequestMethod[]{};  
317 - }  
318 -  
319 - @SuppressWarnings("SameParameterValue")  
320 - private static <T extends Annotation> T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class<T> annotationClass) {  
321 - return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(annotationClass);  
322 - }  
323 -  
324 - @SuppressWarnings("SameParameterValue")  
325 - private static <T extends Annotation> T getClassAnnotation(ProceedingJoinPoint joinPoint, Class<T> annotationClass) {  
326 - return ((MethodSignature) joinPoint.getSignature()).getMethod().getDeclaringClass().getAnnotation(annotationClass);  
327 - }  
328 -  
329 - private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) {  
330 - // TODO 提升:参数脱敏和忽略  
331 - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();  
332 - String[] argNames = methodSignature.getParameterNames();  
333 - Object[] argValues = joinPoint.getArgs();  
334 - // 拼接参数  
335 - Map<String, Object> args = Maps.newHashMapWithExpectedSize(argValues.length);  
336 - for (int i = 0; i < argNames.length; i++) {  
337 - String argName = argNames[i];  
338 - Object argValue = argValues[i];  
339 - // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起  
340 - args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]");  
341 - }  
342 - return JsonUtils.toJsonString(args);  
343 - }  
344 -  
345 - private static String obtainResultData(Object result) {  
346 - // TODO 提升:结果脱敏和忽略  
347 - if (result instanceof CommonResult) {  
348 - result = ((CommonResult<?>) result).getData();  
349 - }  
350 - return JsonUtils.toJsonString(result);  
351 - }  
352 -  
353 - private static boolean isIgnoreArgs(Object object) {  
354 - Class<?> clazz = object.getClass();  
355 - // 处理数组的情况  
356 - if (clazz.isArray()) {  
357 - return IntStream.range(0, Array.getLength(object))  
358 - .anyMatch(index -> isIgnoreArgs(Array.get(object, index)));  
359 - }  
360 - // 递归,处理数组、Collection、Map 的情况  
361 - if (Collection.class.isAssignableFrom(clazz)) {  
362 - return ((Collection<?>) object).stream()  
363 - .anyMatch((Predicate<Object>) OperateLogAspect::isIgnoreArgs);  
364 - }  
365 - if (Map.class.isAssignableFrom(clazz)) {  
366 - return isIgnoreArgs(((Map<?, ?>) object).values());  
367 - }  
368 - // obj  
369 - return object instanceof MultipartFile  
370 - || object instanceof HttpServletRequest  
371 - || object instanceof HttpServletResponse  
372 - || object instanceof BindingResult;  
373 - }  
374 -  
375 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/package-info.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core;  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/OperateLog.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core.service;  
2 -  
3 -import lombok.Data;  
4 -  
5 -import java.time.LocalDateTime;  
6 -import java.util.Map;  
7 -  
8 -/**  
9 - * 操作日志  
10 - *  
11 - * @author 芋道源码  
12 - */  
13 -@Data  
14 -public class OperateLog {  
15 -  
16 - /**  
17 - * 链路追踪编号  
18 - */  
19 - private String traceId;  
20 -  
21 - /**  
22 - * 用户编号  
23 - */  
24 - private Long userId;  
25 - /**  
26 - * 用户类型  
27 - */  
28 - private Integer userType;  
29 -  
30 - /**  
31 - * 操作模块  
32 - */  
33 - private String module;  
34 -  
35 - /**  
36 - * 操作名  
37 - */  
38 - private String name;  
39 -  
40 - /**  
41 - * 操作分类  
42 - */  
43 - private Integer type;  
44 -  
45 - /**  
46 - * 操作明细  
47 - */  
48 - private String content;  
49 -  
50 - /**  
51 - * 拓展字段  
52 - */  
53 - private Map<String, Object> exts;  
54 -  
55 - /**  
56 - * 请求方法名  
57 - */  
58 - private String requestMethod;  
59 -  
60 - /**  
61 - * 请求地址  
62 - */  
63 - private String requestUrl;  
64 -  
65 - /**  
66 - * 用户 IP  
67 - */  
68 - private String userIp;  
69 -  
70 - /**  
71 - * 浏览器 UserAgent  
72 - */  
73 - private String userAgent;  
74 -  
75 - /**  
76 - * Java 方法名  
77 - */  
78 - private String javaMethod;  
79 -  
80 - /**  
81 - * Java 方法的参数  
82 - */  
83 - private String javaMethodArgs;  
84 -  
85 - /**  
86 - * 开始时间  
87 - */  
88 - private LocalDateTime startTime;  
89 -  
90 - /**  
91 - * 执行时长,单位:毫秒  
92 - */  
93 - private Integer duration;  
94 -  
95 - /**  
96 - * 结果码  
97 - */  
98 - private Integer resultCode;  
99 -  
100 - /**  
101 - * 结果提示  
102 - */  
103 - private String resultMsg;  
104 -  
105 - /**  
106 - * 结果数据  
107 - */  
108 - private String resultData;  
109 -  
110 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/OperateLogFrameworkService.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core.service;  
2 -  
3 -/**  
4 - * 操作日志 Framework Service 接口  
5 - *  
6 - * @author 芋道源码  
7 - */  
8 -public interface OperateLogFrameworkService {  
9 -  
10 - /**  
11 - * 记录操作日志  
12 - *  
13 - * @param operateLog 操作日志请求  
14 - */  
15 - void createOperateLog(OperateLog operateLog);  
16 -  
17 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core.service;  
2 -  
3 -import cn.hutool.core.bean.BeanUtil;  
4 -import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;  
5 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;  
6 -import lombok.RequiredArgsConstructor;  
7 -import org.springframework.scheduling.annotation.Async;  
8 -  
9 -/**  
10 - * 操作日志 Framework Service 实现类  
11 - *  
12 - * 基于 {@link OperateLogApi} 实现,记录操作日志  
13 - *  
14 - * @author 芋道源码  
15 - */  
16 -@RequiredArgsConstructor  
17 -public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkService {  
18 -  
19 - private final OperateLogApi operateLogApi;  
20 -  
21 - @Override  
22 - @Async  
23 - public void createOperateLog(OperateLog operateLog) {  
24 - OperateLogCreateReqDTO reqDTO = BeanUtil.toBean(operateLog, OperateLogCreateReqDTO.class);  
25 - operateLogApi.createOperateLog(reqDTO);  
26 - }  
27 -  
28 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/core/util/OperateLogUtils.java deleted
1 -package cn.iocoder.yudao.framework.operatelog.core.util;  
2 -  
3 -import cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect;  
4 -  
5 -/**  
6 - * 操作日志工具类  
7 - * 目前主要的作用,是提供给业务代码,记录操作明细和拓展字段  
8 - *  
9 - * @author 芋道源码  
10 - */  
11 -public class OperateLogUtils {  
12 -  
13 - public static void setContent(String content) {  
14 - OperateLogAspect.setContent(content);  
15 - }  
16 -  
17 - public static void addExt(String key, Object value) {  
18 - OperateLogAspect.addExt(key, value);  
19 - }  
20 -  
21 -}  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelog/package-info.java deleted
1 -/**  
2 - * 用户操作日志:记录用户的操作,用于对用户的操作的审计与追溯,永久保存。  
3 - *  
4 - * @author 芋道源码  
5 - */  
6 -package cn.iocoder.yudao.framework.operatelog;  
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted
1 -cn.iocoder.yudao.framework.operatelog.config.YudaoOperateLogAutoConfiguration  
2 \ No newline at end of file 0 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
5 import cn.iocoder.yudao.framework.security.core.LoginUser; 5 import cn.iocoder.yudao.framework.security.core.LoginUser;
6 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 6 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
7 import cn.iocoder.yudao.module.system.api.logger.OperateLogApi; 7 import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
8 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO; 8 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
9 import com.mzt.logapi.beans.LogRecord; 9 import com.mzt.logapi.beans.LogRecord;
10 import com.mzt.logapi.service.ILogRecordService; 10 import com.mzt.logapi.service.ILogRecordService;
11 import jakarta.annotation.Resource; 11 import jakarta.annotation.Resource;
@@ -30,7 +30,7 @@ public class LogRecordServiceImpl implements ILogRecordService { @@ -30,7 +30,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
30 @Override 30 @Override
31 public void record(LogRecord logRecord) { 31 public void record(LogRecord logRecord) {
32 // 1. 补全通用字段 32 // 1. 补全通用字段
33 - OperateLogV2CreateReqDTO reqDTO = new OperateLogV2CreateReqDTO(); 33 + OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO();
34 reqDTO.setTraceId(TracerUtils.getTraceId()); 34 reqDTO.setTraceId(TracerUtils.getTraceId());
35 // 补充用户信息 35 // 补充用户信息
36 fillUserFields(reqDTO); 36 fillUserFields(reqDTO);
@@ -40,12 +40,10 @@ public class LogRecordServiceImpl implements ILogRecordService { @@ -40,12 +40,10 @@ public class LogRecordServiceImpl implements ILogRecordService {
40 fillRequestFields(reqDTO); 40 fillRequestFields(reqDTO);
41 41
42 // 2. 异步记录日志 42 // 2. 异步记录日志
43 - operateLogApi.createOperateLogV2(reqDTO);  
44 - // TODO 测试结束删除或搞个开关  
45 - log.info("操作日志 ===> {}", reqDTO); 43 + operateLogApi.createOperateLog(reqDTO);
46 } 44 }
47 45
48 - private static void fillUserFields(OperateLogV2CreateReqDTO reqDTO) { 46 + private static void fillUserFields(OperateLogCreateReqDTO reqDTO) {
49 // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web; 47 // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
50 LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); 48 LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
51 if (loginUser == null) { 49 if (loginUser == null) {
@@ -55,7 +53,7 @@ public class LogRecordServiceImpl implements ILogRecordService { @@ -55,7 +53,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
55 reqDTO.setUserType(loginUser.getUserType()); 53 reqDTO.setUserType(loginUser.getUserType());
56 } 54 }
57 55
58 - public static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, LogRecord logRecord) { 56 + public static void fillModuleFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) {
59 reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户 57 reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户
60 reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户 58 reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户
61 reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号 59 reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号
@@ -63,7 +61,7 @@ public class LogRecordServiceImpl implements ILogRecordService { @@ -63,7 +61,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
63 reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"} 61 reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"}
64 } 62 }
65 63
66 - private static void fillRequestFields(OperateLogV2CreateReqDTO reqDTO) { 64 + private static void fillRequestFields(OperateLogCreateReqDTO reqDTO) {
67 // 获得 Request 对象 65 // 获得 Request 对象
68 HttpServletRequest request = ServletUtils.getRequest(); 66 HttpServletRequest request = ServletUtils.getRequest();
69 if (request == null) { 67 if (request == null) {
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/CrmOperateLogController.java
@@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.operatelog.vo.CrmOperateLogR @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.operatelog.vo.CrmOperateLogR
8 import cn.iocoder.yudao.module.crm.enums.LogRecordConstants; 8 import cn.iocoder.yudao.module.crm.enums.LogRecordConstants;
9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
10 import cn.iocoder.yudao.module.system.api.logger.OperateLogApi; 10 import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
11 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO; 11 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
12 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
14 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
@@ -55,9 +55,9 @@ public class CrmOperateLogController { @@ -55,9 +55,9 @@ public class CrmOperateLogController {
55 @Operation(summary = "获得操作日志") 55 @Operation(summary = "获得操作日志")
56 @PreAuthorize("@ss.hasPermission('crm:operate-log:query')") 56 @PreAuthorize("@ss.hasPermission('crm:operate-log:query')")
57 public CommonResult<PageResult<CrmOperateLogRespVO>> getCustomerOperateLog(@Valid CrmOperateLogPageReqVO pageReqVO) { 57 public CommonResult<PageResult<CrmOperateLogRespVO>> getCustomerOperateLog(@Valid CrmOperateLogPageReqVO pageReqVO) {
58 - OperateLogV2PageReqDTO reqDTO = new OperateLogV2PageReqDTO(); 58 + OperateLogPageReqDTO reqDTO = new OperateLogPageReqDTO();
59 reqDTO.setPageSize(PAGE_SIZE_NONE); // 默认不分页,需要分页需注释 59 reqDTO.setPageSize(PAGE_SIZE_NONE); // 默认不分页,需要分页需注释
60 - reqDTO.setBizType(BIZ_TYPE_MAP.get(pageReqVO.getBizType())).setBizId(pageReqVO.getBizId()); 60 + reqDTO.setType(BIZ_TYPE_MAP.get(pageReqVO.getBizType())).setBizId(pageReqVO.getBizId());
61 return success(BeanUtils.toBean(operateLogApi.getOperateLogPage(reqDTO), CrmOperateLogRespVO.class)); 61 return success(BeanUtils.toBean(operateLogApi.getOperateLogPage(reqDTO), CrmOperateLogRespVO.class));
62 } 62 }
63 63
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -8,6 +8,8 @@ import cn.hutool.extra.template.TemplateConfig; @@ -8,6 +8,8 @@ import cn.hutool.extra.template.TemplateConfig;
8 import cn.hutool.extra.template.TemplateEngine; 8 import cn.hutool.extra.template.TemplateEngine;
9 import cn.hutool.extra.template.engine.velocity.VelocityEngine; 9 import cn.hutool.extra.template.engine.velocity.VelocityEngine;
10 import cn.hutool.system.SystemUtil; 10 import cn.hutool.system.SystemUtil;
  11 +import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
  12 +import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum;
11 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 13 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
12 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 14 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
13 import cn.iocoder.yudao.framework.common.pojo.PageParam; 15 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -24,8 +26,6 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -24,8 +26,6 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
24 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 26 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
25 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 27 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
26 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 28 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
27 -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;  
28 -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;  
29 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO; 29 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
30 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; 30 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
31 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; 31 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
@@ -211,7 +211,7 @@ public class CodegenEngine { @@ -211,7 +211,7 @@ public class CodegenEngine {
211 globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName()); 211 globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName());
212 globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); 212 globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName());
213 globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); 213 globalBindingMap.put("DictConvertClassName", DictConvert.class.getName());
214 - globalBindingMap.put("OperateLogClassName", OperateLog.class.getName()); 214 + globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName());
215 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); 215 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName());
216 globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); 216 globalBindingMap.put("BeanUtils", BeanUtils.class.getName());
217 } 217 }
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm
@@ -23,7 +23,7 @@ import static ${CommonResultClassName}.success; @@ -23,7 +23,7 @@ import static ${CommonResultClassName}.success;
23 23
24 import ${ExcelUtilsClassName}; 24 import ${ExcelUtilsClassName};
25 25
26 -import ${OperateLogClassName}; 26 +import ${ApiAccessLogClassName};
27 import static ${OperateTypeEnumClassName}.*; 27 import static ${OperateTypeEnumClassName}.*;
28 28
29 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; 29 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
@@ -114,7 +114,7 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { @@ -114,7 +114,7 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
114 #if ($sceneEnum.scene == 1) 114 #if ($sceneEnum.scene == 1)
115 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')") 115 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")
116 #end 116 #end
117 - @OperateLog(type = EXPORT) 117 + @ApiAccessLog(operateType = EXPORT)
118 #if ( $table.templateType != 2 ) 118 #if ( $table.templateType != 2 )
119 public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO, 119 public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO,
120 HttpServletResponse response) throws IOException { 120 HttpServletResponse response) throws IOException {
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApi.java
@@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.system.api.logger; @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.system.api.logger;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
5 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;  
6 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;  
7 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO; 5 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogRespDTO;
8 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
9 8
10 /** 9 /**
@@ -22,18 +21,11 @@ public interface OperateLogApi { @@ -22,18 +21,11 @@ public interface OperateLogApi {
22 void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO); 21 void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO);
23 22
24 /** 23 /**
25 - * 创建操作日志  
26 - *  
27 - * @param createReqDTO 请求  
28 - */  
29 - void createOperateLogV2(@Valid OperateLogV2CreateReqDTO createReqDTO);  
30 -  
31 - /**  
32 * 获取指定模块的指定数据的操作日志分页 24 * 获取指定模块的指定数据的操作日志分页
33 * 25 *
34 * @param pageReqVO 请求 26 * @param pageReqVO 请求
35 * @return 操作日志分页 27 * @return 操作日志分页
36 */ 28 */
37 - PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO); 29 + PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO);
38 30
39 } 31 }
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogCreateReqDTO.java
1 package cn.iocoder.yudao.module.system.api.logger.dto; 1 package cn.iocoder.yudao.module.system.api.logger.dto;
2 2
3 -import lombok.Data;  
4 - 3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
6 import jakarta.validation.constraints.NotNull; 5 import jakarta.validation.constraints.NotNull;
7 -import java.time.LocalDateTime;  
8 -import java.util.Map; 6 +import lombok.Data;
9 7
10 /** 8 /**
11 - * 操作日志创建 Request DTO 9 + * 系统操作日志 Create Request DTO
  10 + *
  11 + * @author HUIHUI
12 */ 12 */
13 @Data 13 @Data
14 public class OperateLogCreateReqDTO { 14 public class OperateLogCreateReqDTO {
15 15
16 /** 16 /**
17 * 链路追踪编号 17 * 链路追踪编号
  18 + *
  19 + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
18 */ 20 */
19 private String traceId; 21 private String traceId;
20 -  
21 /** 22 /**
22 * 用户编号 23 * 用户编号
  24 + *
  25 + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
23 */ 26 */
24 @NotNull(message = "用户编号不能为空") 27 @NotNull(message = "用户编号不能为空")
25 private Long userId; 28 private Long userId;
26 /** 29 /**
27 * 用户类型 30 * 用户类型
  31 + *
  32 + * 关联 {@link UserTypeEnum}
28 */ 33 */
29 @NotNull(message = "用户类型不能为空") 34 @NotNull(message = "用户类型不能为空")
30 private Integer userType; 35 private Integer userType;
31 -  
32 /** 36 /**
33 - * 操作模块 37 + * 操作模块类型
34 */ 38 */
35 - @NotEmpty(message = "操作模块不能为空")  
36 - private String module;  
37 - 39 + @NotEmpty(message = "操作模块类型不能为空")
  40 + private String type;
38 /** 41 /**
39 * 操作名 42 * 操作名
40 */ 43 */
41 - @NotEmpty(message = "操作名")  
42 - private String name;  
43 - 44 + @NotEmpty(message = "操作名不能为空")
  45 + private String subType;
44 /** 46 /**
45 - * 操作分类 47 + * 操作模块业务编号
46 */ 48 */
47 - @NotNull(message = "操作分类不能为空")  
48 - private Integer type;  
49 - 49 + @NotNull(message = "操作模块业务编号不能为空")
  50 + private Long bizId;
50 /** 51 /**
51 - * 操作明细 52 + * 操作内容,记录整个操作的明细
  53 + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
52 */ 54 */
53 - private String content;  
54 - 55 + @NotEmpty(message = "操作内容不能为空")
  56 + private String action;
55 /** 57 /**
56 - * 拓展字段 58 + * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
  59 + * 例如说,记录订单编号,{ orderId: "1"}
57 */ 60 */
58 - private Map<String, Object> exts; 61 + private String extra;
59 62
60 /** 63 /**
61 * 请求方法名 64 * 请求方法名
62 */ 65 */
63 @NotEmpty(message = "请求方法名不能为空") 66 @NotEmpty(message = "请求方法名不能为空")
64 private String requestMethod; 67 private String requestMethod;
65 -  
66 /** 68 /**
67 * 请求地址 69 * 请求地址
68 */ 70 */
69 @NotEmpty(message = "请求地址不能为空") 71 @NotEmpty(message = "请求地址不能为空")
70 private String requestUrl; 72 private String requestUrl;
71 -  
72 /** 73 /**
73 * 用户 IP 74 * 用户 IP
74 */ 75 */
75 @NotEmpty(message = "用户 IP 不能为空") 76 @NotEmpty(message = "用户 IP 不能为空")
76 private String userIp; 77 private String userIp;
77 -  
78 /** 78 /**
79 - * 浏览器 UserAgent 79 + * 浏览器 UA
80 */ 80 */
81 - @NotEmpty(message = "浏览器 UserAgent 不能为空") 81 + @NotEmpty(message = "浏览器 UA 不能为空")
82 private String userAgent; 82 private String userAgent;
83 83
84 - /**  
85 - * Java 方法名  
86 - */  
87 - @NotEmpty(message = "Java 方法名不能为空")  
88 - private String javaMethod;  
89 -  
90 - /**  
91 - * Java 方法的参数  
92 - */  
93 - private String javaMethodArgs;  
94 -  
95 - /**  
96 - * 开始时间  
97 - */  
98 - @NotNull(message = "开始时间不能为空")  
99 - private LocalDateTime startTime;  
100 -  
101 - /**  
102 - * 执行时长,单位:毫秒  
103 - */  
104 - @NotNull(message = "执行时长不能为空")  
105 - private Integer duration;  
106 -  
107 - /**  
108 - * 结果码  
109 - */  
110 - @NotNull(message = "结果码不能为空")  
111 - private Integer resultCode;  
112 -  
113 - /**  
114 - * 结果提示  
115 - */  
116 - private String resultMsg;  
117 -  
118 - /**  
119 - * 结果数据  
120 - */  
121 - private String resultData;  
122 -  
123 } 84 }
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2PageReqDTO.java renamed to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogPageReqDTO.java
@@ -9,12 +9,12 @@ import lombok.Data; @@ -9,12 +9,12 @@ import lombok.Data;
9 * @author HUIHUI 9 * @author HUIHUI
10 */ 10 */
11 @Data 11 @Data
12 -public class OperateLogV2PageReqDTO extends PageParam { 12 +public class OperateLogPageReqDTO extends PageParam {
13 13
14 /** 14 /**
15 * 模块类型 15 * 模块类型
16 */ 16 */
17 - private String bizType; 17 + private String type;
18 /** 18 /**
19 * 模块数据编号 19 * 模块数据编号
20 */ 20 */
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2RespDTO.java renamed to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogRespDTO.java
@@ -13,7 +13,7 @@ import java.time.LocalDateTime; @@ -13,7 +13,7 @@ import java.time.LocalDateTime;
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
15 @Data 15 @Data
16 -public class OperateLogV2RespDTO implements VO { 16 +public class OperateLogRespDTO implements VO {
17 17
18 /** 18 /**
19 * 日志编号 19 * 日志编号
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2CreateReqDTO.java deleted
1 -package cn.iocoder.yudao.module.system.api.logger.dto;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import jakarta.validation.constraints.NotEmpty;  
5 -import jakarta.validation.constraints.NotNull;  
6 -import lombok.Data;  
7 -  
8 -/**  
9 - * 系统操作日志 Create Request DTO  
10 - *  
11 - * @author HUIHUI  
12 - */  
13 -@Data  
14 -public class OperateLogV2CreateReqDTO {  
15 -  
16 - /**  
17 - * 链路追踪编号  
18 - *  
19 - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。  
20 - */  
21 - private String traceId;  
22 - /**  
23 - * 用户编号  
24 - *  
25 - * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性  
26 - */  
27 - @NotNull(message = "用户编号不能为空")  
28 - private Long userId;  
29 - /**  
30 - * 用户类型  
31 - *  
32 - * 关联 {@link UserTypeEnum}  
33 - */  
34 - @NotNull(message = "用户类型不能为空")  
35 - private Integer userType;  
36 - /**  
37 - * 操作模块类型  
38 - */  
39 - @NotEmpty(message = "操作模块类型不能为空")  
40 - private String type;  
41 - /**  
42 - * 操作名  
43 - */  
44 - @NotEmpty(message = "操作名不能为空")  
45 - private String subType;  
46 - /**  
47 - * 操作模块业务编号  
48 - */  
49 - @NotNull(message = "操作模块业务编号不能为空")  
50 - private Long bizId;  
51 - /**  
52 - * 操作内容,记录整个操作的明细  
53 - * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。  
54 - */  
55 - @NotEmpty(message = "操作内容不能为空")  
56 - private String action;  
57 - /**  
58 - * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )  
59 - * 例如说,记录订单编号,{ orderId: "1"}  
60 - */  
61 - private String extra;  
62 -  
63 - /**  
64 - * 请求方法名  
65 - */  
66 - @NotEmpty(message = "请求方法名不能为空")  
67 - private String requestMethod;  
68 - /**  
69 - * 请求地址  
70 - */  
71 - @NotEmpty(message = "请求地址不能为空")  
72 - private String requestUrl;  
73 - /**  
74 - * 用户 IP  
75 - */  
76 - @NotEmpty(message = "用户 IP 不能为空")  
77 - private String userIp;  
78 - /**  
79 - * 浏览器 UA  
80 - */  
81 - @NotEmpty(message = "浏览器 UA 不能为空")  
82 - private String userAgent;  
83 -  
84 -}  
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApiImpl.java
1 package cn.iocoder.yudao.module.system.api.logger; 1 package cn.iocoder.yudao.module.system.api.logger;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 5 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
7 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;  
8 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;  
9 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;  
10 -import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; 6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
  7 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogRespDTO;
  8 +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
11 import cn.iocoder.yudao.module.system.service.logger.OperateLogService; 9 import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
12 import com.fhs.core.trans.anno.TransMethodResult; 10 import com.fhs.core.trans.anno.TransMethodResult;
13 import jakarta.annotation.Resource; 11 import jakarta.annotation.Resource;
@@ -28,24 +26,16 @@ public class OperateLogApiImpl implements OperateLogApi { @@ -28,24 +26,16 @@ public class OperateLogApiImpl implements OperateLogApi {
28 private OperateLogService operateLogService; 26 private OperateLogService operateLogService;
29 27
30 @Override 28 @Override
  29 + @Async
31 public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { 30 public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
32 operateLogService.createOperateLog(createReqDTO); 31 operateLogService.createOperateLog(createReqDTO);
33 } 32 }
34 33
35 @Override 34 @Override
36 - @Async  
37 - public void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO) {  
38 - operateLogService.createOperateLogV2(createReqDTO);  
39 - }  
40 -  
41 - @Override  
42 @TransMethodResult 35 @TransMethodResult
43 - public PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO) {  
44 - PageResult<OperateLogV2DO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO);  
45 - if (CollUtil.isEmpty(operateLogPage.getList())) {  
46 - return PageResult.empty();  
47 - }  
48 - return BeanUtils.toBean(operateLogPage, OperateLogV2RespDTO.class); 36 + public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO) {
  37 + PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO);
  38 + return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class);
49 } 39 }
50 40
51 } 41 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java
@@ -13,20 +13,23 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -13,20 +13,23 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
13 @Data 13 @Data
14 public class OperateLogPageReqVO extends PageParam { 14 public class OperateLogPageReqVO extends PageParam {
15 15
16 - @Schema(description = "操作模块,模拟匹配", example = "订单")  
17 - private String module; 16 + @Schema(description = "用户编号", example = "芋道")
  17 + private Long userId;
  18 +
  19 + @Schema(description = "操作模块业务编号", example = "1")
  20 + private Long bizId;
18 21
19 - @Schema(description = "用户昵称,模拟匹配", example = "芋道")  
20 - private String userNickname; 22 + @Schema(description = "操作模块,模拟匹配", example = "订单")
  23 + private String type;
21 24
22 - @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", example = "1")  
23 - private Integer type; 25 + @Schema(description = "操作名,模拟匹配", example = "创建订单")
  26 + private String subType;
24 27
25 - @Schema(description = "操作状态", example = "true")  
26 - private Boolean success; 28 + @Schema(description = "操作明细,模拟匹配", example = "修改编号为 1 的用户信息")
  29 + private String action;
27 30
28 @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") 31 @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
29 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
30 - private LocalDateTime[] startTime; 33 + private LocalDateTime[] createTime;
31 34
32 } 35 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java
1 package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog; 1 package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog;
2 2
3 -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;  
4 -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;  
5 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 3 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
6 -import cn.iocoder.yudao.module.system.enums.DictTypeConstants;  
7 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; 4 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
8 import com.alibaba.excel.annotation.ExcelProperty; 5 import com.alibaba.excel.annotation.ExcelProperty;
9 import com.fhs.core.trans.anno.Trans; 6 import com.fhs.core.trans.anno.Trans;
@@ -14,7 +11,6 @@ import jakarta.validation.constraints.NotEmpty; @@ -14,7 +11,6 @@ import jakarta.validation.constraints.NotEmpty;
14 import lombok.Data; 11 import lombok.Data;
15 12
16 import java.time.LocalDateTime; 13 import java.time.LocalDateTime;
17 -import java.util.Map;  
18 14
19 @Schema(description = "管理后台 - 操作日志 Response VO") 15 @Schema(description = "管理后台 - 操作日志 Response VO")
20 @Data 16 @Data
@@ -29,31 +25,29 @@ public class OperateLogRespVO implements VO { @@ -29,31 +25,29 @@ public class OperateLogRespVO implements VO {
29 private String traceId; 25 private String traceId;
30 26
31 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 27 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
32 - @Trans(type = TransType.SIMPLE, target = AdminUserDO.class, fields = "nickname", ref = "userNickname") 28 + @Trans(type = TransType.SIMPLE, target = AdminUserDO.class, fields = "nickname", ref = "userName")
33 private Long userId; 29 private Long userId;
34 -  
35 @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") 30 @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
36 @ExcelProperty("操作人") 31 @ExcelProperty("操作人")
37 - private String userNickname; 32 + private String userName;
38 33
39 - @Schema(description = "操作模块", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单")  
40 - @ExcelProperty("操作模块")  
41 - private String module; 34 + @Schema(description = "操作模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单")
  35 + @ExcelProperty("操作模块类型")
  36 + private String type;
42 37
43 @Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单") 38 @Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单")
44 @ExcelProperty("操作名") 39 @ExcelProperty("操作名")
45 - private String name; 40 + private String subType;
46 41
47 - @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
48 - @ExcelProperty(value = "操作类型", converter = DictConvert.class)  
49 - @DictFormat(DictTypeConstants.OPERATE_TYPE)  
50 - private Integer type; 42 + @Schema(description = "操作模块业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  43 + @ExcelProperty("操作模块业务编号")
  44 + private Long bizId;
51 45
52 @Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") 46 @Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。")
53 - private String content; 47 + private String action;
54 48
55 @Schema(description = "拓展字段", example = "{'orderId': 1}") 49 @Schema(description = "拓展字段", example = "{'orderId': 1}")
56 - private Map<String, Object> exts; 50 + private String extra;
57 51
58 @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") 52 @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET")
59 @NotEmpty(message = "请求方法名不能为空") 53 @NotEmpty(message = "请求方法名不能为空")
@@ -68,28 +62,7 @@ public class OperateLogRespVO implements VO { @@ -68,28 +62,7 @@ public class OperateLogRespVO implements VO {
68 @Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") 62 @Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0")
69 private String userAgent; 63 private String userAgent;
70 64
71 - @Schema(description = "Java 方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "cn.iocoder.yudao.adminserver.UserController.save(...)")  
72 - private String javaMethod;  
73 -  
74 - @Schema(description = "Java 方法的参数")  
75 - private String javaMethodArgs;  
76 -  
77 - @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)  
78 - @ExcelProperty("操作日志")  
79 - private LocalDateTime startTime;  
80 -  
81 - @Schema(description = "执行时长,单位:毫秒", requiredMode = Schema.RequiredMode.REQUIRED)  
82 - @ExcelProperty("执行时长")  
83 - private Integer duration;  
84 -  
85 - @Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED)  
86 - @ExcelProperty(value = "结果码")  
87 - private Integer resultCode;  
88 -  
89 - @Schema(description = "结果提示")  
90 - private String resultMsg;  
91 -  
92 - @Schema(description = "结果数据")  
93 - private String resultData; 65 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  66 + private LocalDateTime createTime;
94 67
95 } 68 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java
1 package cn.iocoder.yudao.module.system.dal.dataobject.logger; 1 package cn.iocoder.yudao.module.system.dal.dataobject.logger;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;  
7 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
8 -import com.baomidou.mybatisplus.annotation.TableField;  
9 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
10 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
11 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
12 import lombok.Data; 8 import lombok.Data;
13 -import lombok.EqualsAndHashCode;  
14 -  
15 -import java.time.LocalDateTime;  
16 -import java.util.Map;  
17 9
18 /** 10 /**
19 * 操作日志表 11 * 操作日志表
@@ -23,20 +15,9 @@ import java.util.Map; @@ -23,20 +15,9 @@ import java.util.Map;
23 @TableName(value = "system_operate_log", autoResultMap = true) 15 @TableName(value = "system_operate_log", autoResultMap = true)
24 @KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 16 @KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
25 @Data 17 @Data
26 -@EqualsAndHashCode(callSuper = true)  
27 public class OperateLogDO extends BaseDO { 18 public class OperateLogDO extends BaseDO {
28 19
29 /** 20 /**
30 - * {@link #javaMethodArgs} 的最大长度  
31 - */  
32 - public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000;  
33 -  
34 - /**  
35 - * {@link #resultData} 的最大长度  
36 - */  
37 - public static final Integer RESULT_MAX_LENGTH = 4000;  
38 -  
39 - /**  
40 * 日志主键 21 * 日志主键
41 */ 22 */
42 @TableId 23 @TableId
@@ -60,30 +41,29 @@ public class OperateLogDO extends BaseDO { @@ -60,30 +41,29 @@ public class OperateLogDO extends BaseDO {
60 */ 41 */
61 private Integer userType; 42 private Integer userType;
62 /** 43 /**
63 - * 操作模块 44 + * 操作模块类型
64 */ 45 */
65 - private String module; 46 + private String type;
66 /** 47 /**
67 * 操作名 48 * 操作名
68 */ 49 */
69 - private String name; 50 + private String subType;
70 /** 51 /**
71 - * 操作分类  
72 - *  
73 - * 枚举 {@link OperateTypeEnum} 52 + * 操作模块业务编号
74 */ 53 */
75 - private Integer type; 54 + private Long bizId;
76 /** 55 /**
77 - * 操作内容,记录整个操作的明细 56 + * 日志内容,记录整个操作的明细
  57 + *
78 * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 58 * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
79 */ 59 */
80 - private String content; 60 + private String action;
81 /** 61 /**
82 - * 拓展字段,有些复杂的业务,需要记录一些字段  
83 - * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 62 + * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
  63 + *
  64 + * 例如说,记录订单编号,{ orderId: "1"}
84 */ 65 */
85 - @TableField(typeHandler = JacksonTypeHandler.class)  
86 - private Map<String, Object> exts; 66 + private String extra;
87 67
88 /** 68 /**
89 * 请求方法名 69 * 请求方法名
@@ -102,43 +82,4 @@ public class OperateLogDO extends BaseDO { @@ -102,43 +82,4 @@ public class OperateLogDO extends BaseDO {
102 */ 82 */
103 private String userAgent; 83 private String userAgent;
104 84
105 - /**  
106 - * Java 方法名  
107 - */  
108 - private String javaMethod;  
109 - /**  
110 - * Java 方法的参数  
111 - *  
112 - * 实际格式为 Map<String, Object>  
113 - * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败  
114 - * 其中,key 为参数名,value 为参数值  
115 - */  
116 - private String javaMethodArgs;  
117 - /**  
118 - * 开始时间  
119 - */  
120 - private LocalDateTime startTime;  
121 - /**  
122 - * 执行时长,单位:毫秒  
123 - */  
124 - private Integer duration;  
125 - /**  
126 - * 结果码  
127 - *  
128 - * 目前使用的 {@link CommonResult#getCode()} 属性  
129 - */  
130 - private Integer resultCode;  
131 - /**  
132 - * 结果提示  
133 - *  
134 - * 目前使用的 {@link CommonResult#getMsg()} 属性  
135 - */  
136 - private String resultMsg;  
137 - /**  
138 - * 结果数据  
139 - *  
140 - * 如果是对象,则使用 JSON 格式化  
141 - */  
142 - private String resultData;  
143 -  
144 } 85 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java deleted
1 -package cn.iocoder.yudao.module.system.dal.dataobject.logger;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
5 -import com.baomidou.mybatisplus.annotation.KeySequence;  
6 -import com.baomidou.mybatisplus.annotation.TableId;  
7 -import com.baomidou.mybatisplus.annotation.TableName;  
8 -import lombok.Data;  
9 -import lombok.EqualsAndHashCode;  
10 -  
11 -/**  
12 - * 操作日志表 V2  
13 - *  
14 - * @author 芋道源码  
15 - */  
16 -@TableName(value = "system_operate_log_v2", autoResultMap = true)  
17 -@KeySequence("system_operate_log_seq_v2") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。  
18 -@Data  
19 -@EqualsAndHashCode(callSuper = true)  
20 -public class OperateLogV2DO extends BaseDO {  
21 -  
22 - /**  
23 - * 日志主键  
24 - */  
25 - @TableId  
26 - private Long id;  
27 - /**  
28 - * 链路追踪编号  
29 - *  
30 - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。  
31 - */  
32 - private String traceId;  
33 - /**  
34 - * 用户编号  
35 - *  
36 - * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性  
37 - */  
38 - private Long userId;  
39 - /**  
40 - * 用户类型  
41 - *  
42 - * 关联 {@link UserTypeEnum}  
43 - */  
44 - private Integer userType;  
45 - /**  
46 - * 操作模块类型  
47 - */  
48 - private String type;  
49 - /**  
50 - * 操作名  
51 - */  
52 - private String subType;  
53 - /**  
54 - * 操作模块业务编号  
55 - */  
56 - private Long bizId;  
57 - /**  
58 - * 日志内容,记录整个操作的明细  
59 - *  
60 - * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。  
61 - */  
62 - private String action;  
63 - /**  
64 - * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )  
65 - *  
66 - * 例如说,记录订单编号,{ orderId: "1"}  
67 - */  
68 - private String extra;  
69 -  
70 - /**  
71 - * 请求方法名  
72 - */  
73 - private String requestMethod;  
74 - /**  
75 - * 请求地址  
76 - */  
77 - private String requestUrl;  
78 - /**  
79 - * 用户 IP  
80 - */  
81 - private String userIp;  
82 - /**  
83 - * 浏览器 UA  
84 - */  
85 - private String userAgent;  
86 -  
87 -}  
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.logger; 1 package cn.iocoder.yudao.module.system.dal.mysql.logger;
2 2
3 -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;  
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
10 10
11 -import java.util.Collection;  
12 -  
13 @Mapper 11 @Mapper
14 public interface OperateLogMapper extends BaseMapperX<OperateLogDO> { 12 public interface OperateLogMapper extends BaseMapperX<OperateLogDO> {
15 13
16 - default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) {  
17 - LambdaQueryWrapperX<OperateLogDO> query = new LambdaQueryWrapperX<OperateLogDO>()  
18 - .likeIfPresent(OperateLogDO::getModule, reqVO.getModule())  
19 - .inIfPresent(OperateLogDO::getUserId, userIds)  
20 - .eqIfPresent(OperateLogDO::getType, reqVO.getType())  
21 - .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime());  
22 - if (Boolean.TRUE.equals(reqVO.getSuccess())) {  
23 - query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());  
24 - } else if (Boolean.FALSE.equals(reqVO.getSuccess())) {  
25 - query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());  
26 - }  
27 - query.orderByDesc(OperateLogDO::getId); // 降序  
28 - return selectPage(reqVO, query); 14 + default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO pageReqDTO) {
  15 + return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogDO>()
  16 + .eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId())
  17 + .eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId())
  18 + .likeIfPresent(OperateLogDO::getType, pageReqDTO.getType())
  19 + .likeIfPresent(OperateLogDO::getSubType, pageReqDTO.getSubType())
  20 + .likeIfPresent(OperateLogDO::getAction, pageReqDTO.getAction())
  21 + .betweenIfPresent(OperateLogDO::getCreateTime, pageReqDTO.getCreateTime())
  22 + .orderByDesc(OperateLogDO::getId));
  23 + }
  24 +
  25 + default PageResult<OperateLogDO> selectPage(OperateLogPageReqDTO pageReqDTO) {
  26 + return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogDO>()
  27 + .eqIfPresent(OperateLogDO::getType, pageReqDTO.getType())
  28 + .eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId())
  29 + .eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId())
  30 + .orderByDesc(OperateLogDO::getId));
29 } 31 }
30 32
31 } 33 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java deleted
1 -package cn.iocoder.yudao.module.system.dal.mysql.logger;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;  
7 -import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;  
8 -import org.apache.ibatis.annotations.Mapper;  
9 -  
10 -@Mapper  
11 -public interface OperateLogV2Mapper extends BaseMapperX<OperateLogV2DO> {  
12 -  
13 - default PageResult<OperateLogV2DO> selectPage(OperateLogV2PageReqDTO pageReqDTO) {  
14 - return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogV2DO>()  
15 - .eqIfPresent(OperateLogV2DO::getType, pageReqDTO.getBizType())  
16 - .eqIfPresent(OperateLogV2DO::getBizId, pageReqDTO.getBizId())  
17 - .eqIfPresent(OperateLogV2DO::getUserId, pageReqDTO.getUserId())  
18 - .orderByDesc(OperateLogV2DO::getId));  
19 - }  
20 -  
21 -}  
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
@@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.system.service.logger; @@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.system.service.logger;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
5 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;  
6 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO; 5 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 6 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 7 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
9 -import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;  
10 8
11 /** 9 /**
12 * 操作日志 Service 接口 10 * 操作日志 Service 接口
@@ -18,7 +16,7 @@ public interface OperateLogService { @@ -18,7 +16,7 @@ public interface OperateLogService {
18 /** 16 /**
19 * 记录操作日志 17 * 记录操作日志
20 * 18 *
21 - * @param createReqDTO 操作日志请求 19 + * @param createReqDTO 创建请求
22 */ 20 */
23 void createOperateLog(OperateLogCreateReqDTO createReqDTO); 21 void createOperateLog(OperateLogCreateReqDTO createReqDTO);
24 22
@@ -30,21 +28,12 @@ public interface OperateLogService { @@ -30,21 +28,12 @@ public interface OperateLogService {
30 */ 28 */
31 PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO); 29 PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO);
32 30
33 - // ======================= LOG V2 =======================  
34 -  
35 - /**  
36 - * 记录操作日志 V2  
37 - *  
38 - * @param createReqDTO 创建请求  
39 - */  
40 - void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO);  
41 -  
42 /** 31 /**
43 * 获得操作日志分页列表 32 * 获得操作日志分页列表
44 * 33 *
45 * @param pageReqVO 分页条件 34 * @param pageReqVO 分页条件
46 * @return 操作日志分页列表 35 * @return 操作日志分页列表
47 */ 36 */
48 - PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO); 37 + PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqDTO pageReqVO);
49 38
50 } 39 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
1 package cn.iocoder.yudao.module.system.service.logger; 1 package cn.iocoder.yudao.module.system.service.logger;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.util.StrUtil;  
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 -import cn.iocoder.yudao.framework.common.util.string.StrUtils;  
8 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 5 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
9 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;  
10 -import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO; 6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
11 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
12 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
13 -import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;  
14 -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;  
15 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; 9 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
16 -import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper;  
17 -import cn.iocoder.yudao.module.system.service.user.AdminUserService;  
18 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
19 import lombok.extern.slf4j.Slf4j; 11 import lombok.extern.slf4j.Slf4j;
20 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
21 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
22 14
23 -import java.util.Collection;  
24 -  
25 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;  
26 -import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH;  
27 -import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.RESULT_MAX_LENGTH;  
28 -  
29 /** 15 /**
30 * 操作日志 Service 实现类 16 * 操作日志 Service 实现类
31 * 17 *
@@ -38,45 +24,21 @@ public class OperateLogServiceImpl implements OperateLogService { @@ -38,45 +24,21 @@ public class OperateLogServiceImpl implements OperateLogService {
38 24
39 @Resource 25 @Resource
40 private OperateLogMapper operateLogMapper; 26 private OperateLogMapper operateLogMapper;
41 - @Resource  
42 - private OperateLogV2Mapper operateLogV2Mapper;  
43 -  
44 - @Resource  
45 - private AdminUserService userService;  
46 27
47 @Override 28 @Override
48 public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { 29 public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
49 OperateLogDO log = BeanUtils.toBean(createReqDTO, OperateLogDO.class); 30 OperateLogDO log = BeanUtils.toBean(createReqDTO, OperateLogDO.class);
50 - log.setJavaMethodArgs(StrUtils.maxLength(log.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH));  
51 - log.setResultData(StrUtils.maxLength(log.getResultData(), RESULT_MAX_LENGTH));  
52 operateLogMapper.insert(log); 31 operateLogMapper.insert(log);
53 } 32 }
54 33
55 @Override 34 @Override
56 public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) { 35 public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) {
57 - // 处理基于用户昵称的查询  
58 - Collection<Long> userIds = null;  
59 - if (StrUtil.isNotEmpty(pageReqVO.getUserNickname())) {  
60 - userIds = convertSet(userService.getUserListByNickname(pageReqVO.getUserNickname()), AdminUserDO::getId);  
61 - if (CollUtil.isEmpty(userIds)) {  
62 - return PageResult.empty();  
63 - }  
64 - }  
65 - // 查询分页  
66 - return operateLogMapper.selectPage(pageReqVO, userIds);  
67 - }  
68 -  
69 - // ======================= LOG V2 =======================  
70 -  
71 - @Override  
72 - public void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO) {  
73 - OperateLogV2DO log = BeanUtils.toBean(createReqDTO, OperateLogV2DO.class);  
74 - operateLogV2Mapper.insert(log); 36 + return operateLogMapper.selectPage(pageReqVO);
75 } 37 }
76 38
77 @Override 39 @Override
78 - public PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqDTO) {  
79 - return operateLogV2Mapper.selectPage(pageReqDTO); 40 + public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO) {
  41 + return operateLogMapper.selectPage(pageReqDTO);
80 } 42 }
81 43
82 } 44 }
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java
1 package cn.iocoder.yudao.module.system.service.logger; 1 package cn.iocoder.yudao.module.system.service.logger;
2 2
3 -import cn.hutool.core.map.MapUtil;  
4 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
5 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
6 -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;  
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;  
9 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
10 import cn.iocoder.yudao.framework.test.core.util.RandomUtils; 5 import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
11 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 6 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
  7 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
12 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 8 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
13 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 9 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
14 -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;  
15 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; 10 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
16 -import cn.iocoder.yudao.module.system.service.user.AdminUserService; 11 +import jakarta.annotation.Resource;
17 import org.junit.jupiter.api.Test; 12 import org.junit.jupiter.api.Test;
18 -import org.springframework.boot.test.mock.mockito.MockBean;  
19 import org.springframework.context.annotation.Import; 13 import org.springframework.context.annotation.Import;
20 14
21 -import jakarta.annotation.Resource;  
22 -import java.util.Collections;  
23 -  
24 -import static cn.hutool.core.util.RandomUtil.randomEle;  
25 -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;  
26 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; 15 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
27 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; 16 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
28 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; 17 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
29 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; 18 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
30 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;  
31 import static org.junit.jupiter.api.Assertions.assertEquals; 19 import static org.junit.jupiter.api.Assertions.assertEquals;
32 -import static org.mockito.Mockito.when;  
33 20
34 @Import({OperateLogServiceImpl.class}) 21 @Import({OperateLogServiceImpl.class})
35 public class OperateLogServiceImplTest extends BaseDbUnitTest { 22 public class OperateLogServiceImplTest extends BaseDbUnitTest {
@@ -40,13 +27,9 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { @@ -40,13 +27,9 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest {
40 @Resource 27 @Resource
41 private OperateLogMapper operateLogMapper; 28 private OperateLogMapper operateLogMapper;
42 29
43 - @MockBean  
44 - private AdminUserService userService;  
45 -  
46 @Test 30 @Test
47 public void testCreateOperateLog() { 31 public void testCreateOperateLog() {
48 - OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class,  
49 - o -> o.setExts(MapUtil.<String, Object>builder("orderId", randomLongId()).build())); 32 + OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class);
50 33
51 // 调研 34 // 调研
52 operateLogServiceImpl.createOperateLog(reqVO); 35 operateLogServiceImpl.createOperateLog(reqVO);
@@ -56,44 +39,38 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { @@ -56,44 +39,38 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest {
56 } 39 }
57 40
58 @Test 41 @Test
59 - public void testGetOperateLogPage() {  
60 - // mock(用户信息)  
61 - AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> {  
62 - o.setNickname("wang");  
63 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
64 - });  
65 - when(userService.getUserListByNickname("wang")).thenReturn(Collections.singletonList(user));  
66 - Long userId = user.getId();  
67 - 42 + public void testGetOperateLogPage_vo() {
68 // 构造操作日志 43 // 构造操作日志
69 OperateLogDO operateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> { 44 OperateLogDO operateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> {
70 - o.setUserId(userId);  
71 - o.setUserType(randomEle(UserTypeEnum.values()).getValue());  
72 - o.setModule("order");  
73 - o.setType(OperateTypeEnum.CREATE.getType());  
74 - o.setStartTime(buildTime(2021, 3, 6));  
75 - o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());  
76 - o.setExts(MapUtil.<String, Object>builder("orderId", randomLongId()).build()); 45 + o.setUserId(2048L);
  46 + o.setBizId(999L);
  47 + o.setType("订单");
  48 + o.setSubType("创建订单");
  49 + o.setAction("修改编号为 1 的用户信息");
  50 + o.setCreateTime(buildTime(2021, 3, 6));
77 }); 51 });
78 operateLogMapper.insert(operateLogDO); 52 operateLogMapper.insert(operateLogDO);
79 // 测试 userId 不匹配 53 // 测试 userId 不匹配
80 - operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setUserId(userId + 1)));  
81 - // 测试 module 不匹配  
82 - operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setModule("user"))); 54 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setUserId(1024L)));
  55 + // 测试 bizId 不匹配
  56 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setBizId(888L)));
83 // 测试 type 不匹配 57 // 测试 type 不匹配
84 - operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setType(OperateTypeEnum.IMPORT.getType()))); 58 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setType("退款")));
  59 + // 测试 subType 不匹配
  60 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setSubType("创建退款")));
  61 + // 测试 action 不匹配
  62 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setAction("修改编号为 1 退款信息")));
85 // 测试 createTime 不匹配 63 // 测试 createTime 不匹配
86 - operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setStartTime(buildTime(2021, 2, 6))));  
87 - // 测试 resultCode 不匹配  
88 - operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setResultCode(BAD_REQUEST.getCode()))); 64 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setCreateTime(buildTime(2021, 2, 6))));
89 65
90 // 构造调用参数 66 // 构造调用参数
91 OperateLogPageReqVO reqVO = new OperateLogPageReqVO(); 67 OperateLogPageReqVO reqVO = new OperateLogPageReqVO();
92 - reqVO.setUserNickname("wang");  
93 - reqVO.setModule("order");  
94 - reqVO.setType(OperateTypeEnum.CREATE.getType());  
95 - reqVO.setStartTime(buildBetweenTime(2021, 3, 5, 2021, 3, 7));  
96 - reqVO.setSuccess(true); 68 + reqVO.setUserId(2048L);
  69 + reqVO.setBizId(999L);
  70 + reqVO.setType("订");
  71 + reqVO.setSubType("订单");
  72 + reqVO.setAction("用户信息");
  73 + reqVO.setCreateTime(buildBetweenTime(2021, 3, 5, 2021, 3, 7));
97 74
98 // 调用 75 // 调用
99 PageResult<OperateLogDO> pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); 76 PageResult<OperateLogDO> pageResult = operateLogServiceImpl.getOperateLogPage(reqVO);
@@ -103,4 +80,34 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest { @@ -103,4 +80,34 @@ public class OperateLogServiceImplTest extends BaseDbUnitTest {
103 assertPojoEquals(operateLogDO, pageResult.getList().get(0)); 80 assertPojoEquals(operateLogDO, pageResult.getList().get(0));
104 } 81 }
105 82
  83 + @Test
  84 + public void testGetOperateLogPage_dto() {
  85 + // 构造操作日志
  86 + OperateLogDO operateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> {
  87 + o.setUserId(2048L);
  88 + o.setBizId(999L);
  89 + o.setType("订单");
  90 + });
  91 + operateLogMapper.insert(operateLogDO);
  92 + // 测试 userId 不匹配
  93 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setUserId(1024L)));
  94 + // 测试 bizId 不匹配
  95 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setBizId(888L)));
  96 + // 测试 type 不匹配
  97 + operateLogMapper.insert(cloneIgnoreId(operateLogDO, o -> o.setType("退款")));
  98 +
  99 + // 构造调用参数
  100 + OperateLogPageReqDTO reqDTO = new OperateLogPageReqDTO();
  101 + reqDTO.setUserId(2048L);
  102 + reqDTO.setBizId(999L);
  103 + reqDTO.setType("订单");
  104 +
  105 + // 调用
  106 + PageResult<OperateLogDO> pageResult = operateLogServiceImpl.getOperateLogPage(reqDTO);
  107 + // 断言,只查到了一条符合条件的
  108 + assertEquals(1, pageResult.getTotal());
  109 + assertEquals(1, pageResult.getList().size());
  110 + assertPojoEquals(operateLogDO, pageResult.getList().get(0));
  111 + }
  112 +
106 } 113 }
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
@@ -202,22 +202,15 @@ CREATE TABLE IF NOT EXISTS `system_operate_log` ( @@ -202,22 +202,15 @@ CREATE TABLE IF NOT EXISTS `system_operate_log` (
202 `trace_id` varchar(64) NOT NULL DEFAULT '', 202 `trace_id` varchar(64) NOT NULL DEFAULT '',
203 `user_id` bigint(20) NOT NULL, 203 `user_id` bigint(20) NOT NULL,
204 "user_type" tinyint not null default '0', 204 "user_type" tinyint not null default '0',
205 - `module` varchar(50) NOT NULL,  
206 - `name` varchar(50) NOT NULL,  
207 - `type` bigint(4) NOT NULL DEFAULT '0',  
208 - `content` varchar(2000) NOT NULL DEFAULT '',  
209 - `exts` varchar(512) NOT NULL DEFAULT '', 205 + `type` varchar(50) NOT NULL,
  206 + `sub_type` varchar(50) NOT NULL,
  207 + `biz_id` bigint(20) NOT NULL,
  208 + `action` varchar(2000) NOT NULL DEFAULT '',
  209 + `extra` varchar(512) NOT NULL DEFAULT '',
210 `request_method` varchar(16) DEFAULT '', 210 `request_method` varchar(16) DEFAULT '',
211 `request_url` varchar(255) DEFAULT '', 211 `request_url` varchar(255) DEFAULT '',
212 `user_ip` varchar(50) DEFAULT NULL, 212 `user_ip` varchar(50) DEFAULT NULL,
213 `user_agent` varchar(200) DEFAULT NULL, 213 `user_agent` varchar(200) DEFAULT NULL,
214 - `java_method` varchar(512) NOT NULL DEFAULT '',  
215 - `java_method_args` varchar(8000) DEFAULT '',  
216 - `start_time` datetime NOT NULL,  
217 - `duration` int(11) NOT NULL,  
218 - `result_code` int(11) NOT NULL DEFAULT '0',  
219 - `result_msg` varchar(512) DEFAULT '',  
220 - `result_data` varchar(4000) DEFAULT '',  
221 `creator` varchar(64) DEFAULT '', 214 `creator` varchar(64) DEFAULT '',
222 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 215 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
223 `updater` varchar(64) DEFAULT '', 216 `updater` varchar(64) DEFAULT '',