Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
# Conflicts: # yudao-module-bpm/yudao-module-bpm-biz/pom.xml # yudao-module-crm/yudao-module-crm-biz/pom.xml # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/CrmClueController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/CrmOperateLogController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivablePlanController.java # yudao-module-erp/yudao-module-erp-biz/pom.xml # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpAccountController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinancePaymentController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinanceReceiptController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductCategoryController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseInController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseReturnController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpSupplierController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpCustomerController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOutController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleReturnController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java # yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java # yudao-module-infra/yudao-module-infra-biz/src/test/resources/sql/create_tables.sql # yudao-module-mall/yudao-module-product-biz/pom.xml # yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java # yudao-module-mall/yudao-module-promotion-biz/pom.xml # yudao-module-mall/yudao-module-statistics-biz/pom.xml # yudao-module-mall/yudao-module-trade-biz/pom.xml # yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/AfterSaleController.java # yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressController.java # yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartAddReqVO.java # yudao-module-member/yudao-module-member-biz/pom.xml # yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java # yudao-module-mp/yudao-module-mp-biz/pom.xml # yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/open/MpOpenController.java # yudao-module-pay/yudao-module-pay-biz/pom.xml # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/demo/PayDemoOrderController.java # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/demo/PayDemoTransferController.java # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/notify/PayNotifyController.java # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/PayOrderController.java # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/PayRefundController.java # yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/wallet/PayWalletRechargeController.java # yudao-module-report/yudao-module-report-biz/pom.xml # yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewDataController.java # yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java # yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
This commit is contained in:
commit
c945f4335d
@ -11,7 +11,7 @@
|
|||||||
Target Server Version : 80200 (8.2.0)
|
Target Server Version : 80200 (8.2.0)
|
||||||
File Encoding : 65001
|
File Encoding : 65001
|
||||||
|
|
||||||
Date: 30/03/2024 20:42:06
|
Date: 04/04/2024 01:17:25
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
@ -327,9 +327,13 @@ CREATE TABLE `infra_api_access_log` (
|
|||||||
`application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名',
|
`application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名',
|
||||||
`request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法名',
|
`request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法名',
|
||||||
`request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求地址',
|
`request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求地址',
|
||||||
`request_params` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求参数',
|
`request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '请求参数',
|
||||||
|
`response_body` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '响应结果',
|
||||||
`user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP',
|
`user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP',
|
||||||
`user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA',
|
`user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA',
|
||||||
|
`operate_module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '操作模块',
|
||||||
|
`operate_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '操作名',
|
||||||
|
`operate_type` tinyint NULL DEFAULT 0 COMMENT '操作分类',
|
||||||
`begin_time` datetime NOT NULL COMMENT '开始请求时间',
|
`begin_time` datetime NOT NULL COMMENT '开始请求时间',
|
||||||
`end_time` datetime NOT NULL COMMENT '结束请求时间',
|
`end_time` datetime NOT NULL COMMENT '结束请求时间',
|
||||||
`duration` int NOT NULL COMMENT '执行时长',
|
`duration` int NOT NULL COMMENT '执行时长',
|
||||||
@ -343,7 +347,7 @@ CREATE TABLE `infra_api_access_log` (
|
|||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
INDEX `idx_create_time`(`create_time` ASC) USING BTREE
|
INDEX `idx_create_time`(`create_time` ASC) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 35832 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 35925 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_api_access_log
|
-- Records of infra_api_access_log
|
||||||
@ -385,7 +389,7 @@ CREATE TABLE `infra_api_error_log` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 16429 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志';
|
) ENGINE = InnoDB AUTO_INCREMENT = 16462 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_api_error_log
|
-- Records of infra_api_error_log
|
||||||
@ -494,7 +498,7 @@ CREATE TABLE `infra_config` (
|
|||||||
-- Records of infra_config
|
-- Records of infra_config
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-02-28 22:54:14', b'0');
|
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-04-03 17:22:28', b'0');
|
||||||
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', b'0');
|
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', b'0');
|
||||||
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0');
|
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0');
|
||||||
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0');
|
INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0');
|
||||||
@ -690,7 +694,7 @@ CREATE TABLE `infra_file` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1301 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1302 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_file
|
-- Records of infra_file
|
||||||
@ -722,7 +726,7 @@ CREATE TABLE `infra_file_config` (
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -1416,7 +1420,7 @@ CREATE TABLE `system_login_log` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 3054 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
|
) ENGINE = InnoDB AUTO_INCREMENT = 3067 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_login_log
|
-- Records of system_login_log
|
||||||
@ -2453,7 +2457,7 @@ CREATE TABLE `system_oauth2_access_token` (
|
|||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
INDEX `idx_access_token`(`access_token` ASC) USING BTREE,
|
INDEX `idx_access_token`(`access_token` ASC) USING BTREE,
|
||||||
INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE
|
INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 6332 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
|
) ENGINE = InnoDB AUTO_INCREMENT = 6372 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_oauth2_access_token
|
-- Records of system_oauth2_access_token
|
||||||
@ -2575,7 +2579,7 @@ CREATE TABLE `system_oauth2_refresh_token` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1430 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1442 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_oauth2_refresh_token
|
-- Records of system_oauth2_refresh_token
|
||||||
@ -2588,46 +2592,6 @@ COMMIT;
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `system_operate_log`;
|
DROP TABLE IF EXISTS `system_operate_log`;
|
||||||
CREATE TABLE `system_operate_log` (
|
CREATE TABLE `system_operate_log` (
|
||||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
|
|
||||||
`trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号',
|
|
||||||
`user_id` bigint NOT NULL COMMENT '用户编号',
|
|
||||||
`user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型',
|
|
||||||
`module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块标题',
|
|
||||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名',
|
|
||||||
`type` bigint NOT NULL DEFAULT 0 COMMENT '操作分类',
|
|
||||||
`content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作内容',
|
|
||||||
`exts` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '拓展字段',
|
|
||||||
`request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求方法名',
|
|
||||||
`request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求地址',
|
|
||||||
`user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户 IP',
|
|
||||||
`user_agent` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '浏览器 UA',
|
|
||||||
`java_method` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Java 方法名',
|
|
||||||
`java_method_args` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'Java 方法的参数',
|
|
||||||
`start_time` datetime NOT NULL COMMENT '操作时间',
|
|
||||||
`duration` int NOT NULL COMMENT '执行时长',
|
|
||||||
`result_code` int NOT NULL DEFAULT 0 COMMENT '结果码',
|
|
||||||
`result_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果提示',
|
|
||||||
`result_data` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果数据',
|
|
||||||
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
|
|
||||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
||||||
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
|
|
||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 11964 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录';
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Records of system_operate_log
|
|
||||||
-- ----------------------------
|
|
||||||
BEGIN;
|
|
||||||
COMMIT;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Table structure for system_operate_log_v2
|
|
||||||
-- ----------------------------
|
|
||||||
DROP TABLE IF EXISTS `system_operate_log_v2`;
|
|
||||||
CREATE TABLE `system_operate_log_v2` (
|
|
||||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
|
||||||
`trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号',
|
`trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号',
|
||||||
`user_id` bigint NOT NULL COMMENT '用户编号',
|
`user_id` bigint NOT NULL COMMENT '用户编号',
|
||||||
@ -2651,7 +2615,7 @@ CREATE TABLE `system_operate_log_v2` (
|
|||||||
) ENGINE = InnoDB AUTO_INCREMENT = 9019 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本';
|
) ENGINE = InnoDB AUTO_INCREMENT = 9019 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_operate_log_v2
|
-- Records of system_operate_log
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
@ -5305,7 +5269,7 @@ CREATE TABLE `system_sms_log` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 946 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志';
|
) ENGINE = InnoDB AUTO_INCREMENT = 947 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_sms_log
|
-- Records of system_sms_log
|
||||||
@ -5475,7 +5439,7 @@ INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `c
|
|||||||
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (151, '大租户', 126, '土豆大', NULL, 0, 'https://tudou.iocoder.cn', 111, '2023-12-08 00:00:00', 10, '1', '2023-12-02 23:35:05', '1', '2023-12-08 23:39:56', b'0');
|
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (151, '大租户', 126, '土豆大', NULL, 0, 'https://tudou.iocoder.cn', 111, '2023-12-08 00:00:00', 10, '1', '2023-12-02 23:35:05', '1', '2023-12-08 23:39:56', b'0');
|
||||||
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (152, '新租户', 127, '土豆', NULL, 0, 'http://xx.iocoder.cn', 111, '2025-12-31 00:00:00', 50, '1', '2023-12-30 11:43:17', '1', '2023-12-30 11:43:17', b'0');
|
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (152, '新租户', 127, '土豆', NULL, 0, 'http://xx.iocoder.cn', 111, '2025-12-31 00:00:00', 50, '1', '2023-12-30 11:43:17', '1', '2023-12-30 11:43:17', b'0');
|
||||||
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (153, '小明的租户', 128, 'xiaoming', '15601691301', 0, 'xiaoming.iocoder.cn', 111, '2025-12-01 00:00:00', 100, '1', '2024-02-27 21:58:25', '1', '2024-02-28 22:53:54', b'0');
|
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (153, '小明的租户', 128, 'xiaoming', '15601691301', 0, 'xiaoming.iocoder.cn', 111, '2025-12-01 00:00:00', 100, '1', '2024-02-27 21:58:25', '1', '2024-02-28 22:53:54', b'0');
|
||||||
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (154, 'hh', 129, 'hh', NULL, 0, 'http://hh.iocoder.cn', 111, '2024-04-30 00:00:00', 123, '1', '2024-03-30 17:52:59', '1', '2024-03-30 17:52:59', b'0');
|
INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (154, 'hh', 129, 'hh', NULL, 0, 'http://hh.iocoder.cn', 111, '2024-04-30 00:00:00', 123, '1', '2024-03-30 17:52:59', '1', '2024-04-03 15:06:42', b'0');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -5619,7 +5583,7 @@ CREATE TABLE `system_users` (
|
|||||||
-- Records of system_users
|
-- Records of system_users
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
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, '0:0:0:0:0:0:0:1', '2024-03-30 17:18:34', 'admin', '2021-01-05 17:03:47', NULL, '2024-03-30 17:18:34', b'0', 1);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
|
@ -90,11 +90,6 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 业务组件 -->
|
<!-- 业务组件 -->
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.mouzt</groupId>
|
<groupId>io.github.mouzt</groupId>
|
||||||
<artifactId>bizlog-sdk</artifactId>
|
<artifactId>bizlog-sdk</artifactId>
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
<module>yudao-spring-boot-starter-excel</module>
|
<module>yudao-spring-boot-starter-excel</module>
|
||||||
|
|
||||||
<module>yudao-spring-boot-starter-biz-operatelog</module>
|
|
||||||
<module>yudao-spring-boot-starter-biz-tenant</module>
|
<module>yudao-spring-boot-starter-biz-tenant</module>
|
||||||
<module>yudao-spring-boot-starter-biz-data-permission</module>
|
<module>yudao-spring-boot-starter-biz-data-permission</module>
|
||||||
<module>yudao-spring-boot-starter-biz-ip</module>
|
<module>yudao-spring-boot-starter-biz-ip</module>
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.common.util.spring;
|
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import org.springframework.aop.framework.AdvisedSupport;
|
|
||||||
import org.springframework.aop.framework.AopProxy;
|
|
||||||
import org.springframework.aop.support.AopUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring AOP 工具类
|
|
||||||
*
|
|
||||||
* 参考波克尔 http://www.bubuko.com/infodetail-3471885.html 实现
|
|
||||||
*/
|
|
||||||
public class SpringAopUtils {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取代理的目标对象
|
|
||||||
*
|
|
||||||
* @param proxy 代理对象
|
|
||||||
* @return 目标对象
|
|
||||||
*/
|
|
||||||
public static Object getTarget(Object proxy) throws Exception {
|
|
||||||
// 不是代理对象
|
|
||||||
if (!AopUtils.isAopProxy(proxy)) {
|
|
||||||
return proxy;
|
|
||||||
}
|
|
||||||
// Jdk 代理
|
|
||||||
if (AopUtils.isJdkDynamicProxy(proxy)) {
|
|
||||||
return getJdkDynamicProxyTargetObject(proxy);
|
|
||||||
}
|
|
||||||
// Cglib 代理
|
|
||||||
return getCglibProxyTargetObject(proxy);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
|
|
||||||
Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0");
|
|
||||||
AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised");
|
|
||||||
return advisedSupport.getTargetSource().getTarget();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
|
|
||||||
AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h");
|
|
||||||
AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised");
|
|
||||||
return advisedSupport.getTargetSource().getTarget();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,24 @@
|
|||||||
|
package cn.iocoder.yudao.framework.common.util.spring;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring 工具类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
public class SpringUtils extends SpringUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为生产环境
|
||||||
|
*
|
||||||
|
* @return 是否生产环境
|
||||||
|
*/
|
||||||
|
public static boolean isProd() {
|
||||||
|
String activeProfile = getActiveProfile();
|
||||||
|
return Objects.equals("prod", activeProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,52 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-framework</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<name>${project.artifactId}</name>
|
|
||||||
<description>操作日志</description>
|
|
||||||
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-common</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- Spring 核心 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-aop</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- Web 相关 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-spring-boot-starter-web</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 业务组件 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-module-system-api</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 工具类相关 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.guava</groupId>
|
|
||||||
<artifactId>guava</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
@ -1,23 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.config;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkServiceImpl;
|
|
||||||
import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
|
|
||||||
@AutoConfiguration
|
|
||||||
public class YudaoOperateLogAutoConfiguration {
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public OperateLogAspect operateLogAspect() {
|
|
||||||
return new OperateLogAspect();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public OperateLogFrameworkService operateLogFrameworkService(OperateLogApi operateLogApi) {
|
|
||||||
return new OperateLogFrameworkServiceImpl(operateLogApi);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.annotations;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志注解
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Target({ElementType.METHOD})
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
public @interface OperateLog {
|
|
||||||
|
|
||||||
// ========== 模块字段 ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作模块
|
|
||||||
*
|
|
||||||
* 为空时,会尝试读取 {@link Tag#name()} 属性
|
|
||||||
*/
|
|
||||||
String module() default "";
|
|
||||||
/**
|
|
||||||
* 操作名
|
|
||||||
*
|
|
||||||
* 为空时,会尝试读取 {@link Operation#summary()} 属性
|
|
||||||
*/
|
|
||||||
String name() default "";
|
|
||||||
/**
|
|
||||||
* 操作分类
|
|
||||||
*
|
|
||||||
* 实际并不是数组,因为枚举不能设置 null 作为默认值
|
|
||||||
*/
|
|
||||||
OperateTypeEnum[] type() default {};
|
|
||||||
|
|
||||||
// ========== 开关字段 ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否记录操作日志
|
|
||||||
*/
|
|
||||||
boolean enable() default true;
|
|
||||||
/**
|
|
||||||
* 是否记录方法参数
|
|
||||||
*/
|
|
||||||
boolean logArgs() default true;
|
|
||||||
/**
|
|
||||||
* 是否记录方法结果的数据
|
|
||||||
*/
|
|
||||||
boolean logResultData() default true;
|
|
||||||
|
|
||||||
}
|
|
@ -1,375 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.aop;
|
|
||||||
|
|
||||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
|
||||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.service.OperateLog;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService;
|
|
||||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.aspectj.lang.ProceedingJoinPoint;
|
|
||||||
import org.aspectj.lang.annotation.Around;
|
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
|
||||||
import org.aspectj.lang.reflect.MethodSignature;
|
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
|
||||||
import org.springframework.validation.BindingResult;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.lang.annotation.Annotation;
|
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.stream.IntStream;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 拦截使用 @OperateLog 注解,如果满足条件,则生成操作日志。
|
|
||||||
* 满足如下任一条件,则会进行记录:
|
|
||||||
* 1. 使用 @ApiOperation + 非 @GetMapping
|
|
||||||
* 2. 使用 @OperateLog 注解
|
|
||||||
* <p>
|
|
||||||
* 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Aspect
|
|
||||||
@Slf4j
|
|
||||||
public class OperateLogAspect {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于记录操作内容的上下文
|
|
||||||
*
|
|
||||||
* @see OperateLog#getContent()
|
|
||||||
*/
|
|
||||||
private static final ThreadLocal<String> CONTENT = new ThreadLocal<>();
|
|
||||||
/**
|
|
||||||
* 用于记录拓展字段的上下文
|
|
||||||
*
|
|
||||||
* @see OperateLog#getExts()
|
|
||||||
*/
|
|
||||||
private static final ThreadLocal<Map<String, Object>> EXTS = new ThreadLocal<>();
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private OperateLogFrameworkService operateLogFrameworkService;
|
|
||||||
|
|
||||||
@Around("@annotation(operation)")
|
|
||||||
public Object around(ProceedingJoinPoint joinPoint, Operation operation) throws Throwable {
|
|
||||||
// 可能也添加了 @ApiOperation 注解
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog = getMethodAnnotation(joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog.class);
|
|
||||||
return around0(joinPoint, operateLog, operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Around("!@annotation(io.swagger.v3.oas.annotations.Operation) && @annotation(operateLog)")
|
|
||||||
// 兼容处理,只添加 @OperateLog 注解的情况
|
|
||||||
public Object around(ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable {
|
|
||||||
return around0(joinPoint, operateLog, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object around0(ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
|
|
||||||
Operation operation) throws Throwable {
|
|
||||||
// 目前,只有管理员,才记录操作日志!所以非管理员,直接调用,不进行记录
|
|
||||||
Integer userType = WebFrameworkUtils.getLoginUserType();
|
|
||||||
if (!Objects.equals(userType, UserTypeEnum.ADMIN.getValue())) {
|
|
||||||
return joinPoint.proceed();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 记录开始时间
|
|
||||||
LocalDateTime startTime = LocalDateTime.now();
|
|
||||||
try {
|
|
||||||
// 执行原有方法
|
|
||||||
Object result = joinPoint.proceed();
|
|
||||||
// 记录正常执行时的操作日志
|
|
||||||
this.log(joinPoint, operateLog, operation, startTime, result, null);
|
|
||||||
return result;
|
|
||||||
} catch (Throwable exception) {
|
|
||||||
this.log(joinPoint, operateLog, operation, startTime, null, exception);
|
|
||||||
throw exception;
|
|
||||||
} finally {
|
|
||||||
clearThreadLocal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setContent(String content) {
|
|
||||||
CONTENT.set(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addExt(String key, Object value) {
|
|
||||||
if (EXTS.get() == null) {
|
|
||||||
EXTS.set(new HashMap<>());
|
|
||||||
}
|
|
||||||
EXTS.get().put(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void clearThreadLocal() {
|
|
||||||
CONTENT.remove();
|
|
||||||
EXTS.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void log(ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
|
|
||||||
Operation operation,
|
|
||||||
LocalDateTime startTime, Object result, Throwable exception) {
|
|
||||||
try {
|
|
||||||
// 判断不记录的情况
|
|
||||||
if (!isLogEnable(joinPoint, operateLog)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 真正记录操作日志
|
|
||||||
this.log0(joinPoint, operateLog, operation, startTime, result, exception);
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) apiOperation({}) result({}) exception({}) ]",
|
|
||||||
joinPoint, operateLog, operation, result, exception, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void log0(ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
|
|
||||||
Operation operation,
|
|
||||||
LocalDateTime startTime, Object result, Throwable exception) {
|
|
||||||
OperateLog operateLogObj = new OperateLog();
|
|
||||||
// 补全通用字段
|
|
||||||
operateLogObj.setTraceId(TracerUtils.getTraceId());
|
|
||||||
operateLogObj.setStartTime(startTime);
|
|
||||||
// 补充用户信息
|
|
||||||
fillUserFields(operateLogObj);
|
|
||||||
// 补全模块信息
|
|
||||||
fillModuleFields(operateLogObj, joinPoint, operateLog, operation);
|
|
||||||
// 补全请求信息
|
|
||||||
fillRequestFields(operateLogObj);
|
|
||||||
// 补全方法信息
|
|
||||||
fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception);
|
|
||||||
|
|
||||||
// 异步记录日志
|
|
||||||
operateLogFrameworkService.createOperateLog(operateLogObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void fillUserFields(OperateLog operateLogObj) {
|
|
||||||
operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId());
|
|
||||||
operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void fillModuleFields(OperateLog operateLogObj,
|
|
||||||
ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
|
|
||||||
Operation operation) {
|
|
||||||
// module 属性
|
|
||||||
if (operateLog != null) {
|
|
||||||
operateLogObj.setModule(operateLog.module());
|
|
||||||
}
|
|
||||||
if (StrUtil.isEmpty(operateLogObj.getModule())) {
|
|
||||||
Tag tag = getClassAnnotation(joinPoint, Tag.class);
|
|
||||||
if (tag != null) {
|
|
||||||
// 优先读取 @Tag 的 name 属性
|
|
||||||
if (StrUtil.isNotEmpty(tag.name())) {
|
|
||||||
operateLogObj.setModule(tag.name());
|
|
||||||
}
|
|
||||||
// 没有的话,读取 @API 的 description 属性
|
|
||||||
if (StrUtil.isEmpty(operateLogObj.getModule()) && ArrayUtil.isNotEmpty(tag.description())) {
|
|
||||||
operateLogObj.setModule(tag.description());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// name 属性
|
|
||||||
if (operateLog != null) {
|
|
||||||
operateLogObj.setName(operateLog.name());
|
|
||||||
}
|
|
||||||
if (StrUtil.isEmpty(operateLogObj.getName()) && operation != null) {
|
|
||||||
operateLogObj.setName(operation.summary());
|
|
||||||
}
|
|
||||||
// type 属性
|
|
||||||
if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) {
|
|
||||||
operateLogObj.setType(operateLog.type()[0].getType());
|
|
||||||
}
|
|
||||||
if (operateLogObj.getType() == null) {
|
|
||||||
RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint));
|
|
||||||
OperateTypeEnum operateLogType = convertOperateLogType(requestMethod);
|
|
||||||
operateLogObj.setType(operateLogType != null ? operateLogType.getType() : null);
|
|
||||||
}
|
|
||||||
// content 和 exts 属性
|
|
||||||
operateLogObj.setContent(CONTENT.get());
|
|
||||||
operateLogObj.setExts(EXTS.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void fillRequestFields(OperateLog operateLogObj) {
|
|
||||||
// 获得 Request 对象
|
|
||||||
HttpServletRequest request = ServletUtils.getRequest();
|
|
||||||
if (request == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 补全请求信息
|
|
||||||
operateLogObj.setRequestMethod(request.getMethod());
|
|
||||||
operateLogObj.setRequestUrl(request.getRequestURI());
|
|
||||||
operateLogObj.setUserIp(ServletUtils.getClientIP(request));
|
|
||||||
operateLogObj.setUserAgent(ServletUtils.getUserAgent(request));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void fillMethodFields(OperateLog operateLogObj,
|
|
||||||
ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog,
|
|
||||||
LocalDateTime startTime, Object result, Throwable exception) {
|
|
||||||
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
|
|
||||||
operateLogObj.setJavaMethod(methodSignature.toString());
|
|
||||||
if (operateLog == null || operateLog.logArgs()) {
|
|
||||||
operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint));
|
|
||||||
}
|
|
||||||
if (operateLog == null || operateLog.logResultData()) {
|
|
||||||
operateLogObj.setResultData(obtainResultData(result));
|
|
||||||
}
|
|
||||||
operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis()));
|
|
||||||
// (正常)处理 resultCode 和 resultMsg 字段
|
|
||||||
if (result instanceof CommonResult) {
|
|
||||||
CommonResult<?> commonResult = (CommonResult<?>) result;
|
|
||||||
operateLogObj.setResultCode(commonResult.getCode());
|
|
||||||
operateLogObj.setResultMsg(commonResult.getMsg());
|
|
||||||
} else {
|
|
||||||
operateLogObj.setResultCode(SUCCESS.getCode());
|
|
||||||
}
|
|
||||||
// (异常)处理 resultCode 和 resultMsg 字段
|
|
||||||
if (exception != null) {
|
|
||||||
operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode());
|
|
||||||
operateLogObj.setResultMsg(ExceptionUtil.getRootCauseMessage(exception));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isLogEnable(ProceedingJoinPoint joinPoint,
|
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) {
|
|
||||||
// 有 @OperateLog 注解的情况下
|
|
||||||
if (operateLog != null) {
|
|
||||||
return operateLog.enable();
|
|
||||||
}
|
|
||||||
// 没有 @ApiOperation 注解的情况下,只记录 POST、PUT、DELETE 的情况
|
|
||||||
return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) {
|
|
||||||
if (ArrayUtil.isEmpty(requestMethods)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return Arrays.stream(requestMethods).filter(requestMethod ->
|
|
||||||
requestMethod == RequestMethod.POST
|
|
||||||
|| requestMethod == RequestMethod.PUT
|
|
||||||
|| requestMethod == RequestMethod.DELETE)
|
|
||||||
.findFirst().orElse(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RequestMethod obtainFirstMatchRequestMethod(RequestMethod[] requestMethods) {
|
|
||||||
if (ArrayUtil.isEmpty(requestMethods)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// 优先,匹配最优的 POST、PUT、DELETE
|
|
||||||
RequestMethod result = obtainFirstLogRequestMethod(requestMethods);
|
|
||||||
if (result != null) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// 然后,匹配次优的 GET
|
|
||||||
result = Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.GET)
|
|
||||||
.findFirst().orElse(null);
|
|
||||||
if (result != null) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// 兜底,获得第一个
|
|
||||||
return requestMethods[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) {
|
|
||||||
if (requestMethod == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
switch (requestMethod) {
|
|
||||||
case GET:
|
|
||||||
return OperateTypeEnum.GET;
|
|
||||||
case POST:
|
|
||||||
return OperateTypeEnum.CREATE;
|
|
||||||
case PUT:
|
|
||||||
return OperateTypeEnum.UPDATE;
|
|
||||||
case DELETE:
|
|
||||||
return OperateTypeEnum.DELETE;
|
|
||||||
default:
|
|
||||||
return OperateTypeEnum.OTHER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RequestMethod[] obtainRequestMethod(ProceedingJoinPoint joinPoint) {
|
|
||||||
RequestMapping requestMapping = AnnotationUtils.getAnnotation( // 使用 Spring 的工具类,可以处理 @RequestMapping 别名注解
|
|
||||||
((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class);
|
|
||||||
return requestMapping != null ? requestMapping.method() : new RequestMethod[]{};
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("SameParameterValue")
|
|
||||||
private static <T extends Annotation> T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class<T> annotationClass) {
|
|
||||||
return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(annotationClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("SameParameterValue")
|
|
||||||
private static <T extends Annotation> T getClassAnnotation(ProceedingJoinPoint joinPoint, Class<T> annotationClass) {
|
|
||||||
return ((MethodSignature) joinPoint.getSignature()).getMethod().getDeclaringClass().getAnnotation(annotationClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) {
|
|
||||||
// TODO 提升:参数脱敏和忽略
|
|
||||||
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
|
|
||||||
String[] argNames = methodSignature.getParameterNames();
|
|
||||||
Object[] argValues = joinPoint.getArgs();
|
|
||||||
// 拼接参数
|
|
||||||
Map<String, Object> args = Maps.newHashMapWithExpectedSize(argValues.length);
|
|
||||||
for (int i = 0; i < argNames.length; i++) {
|
|
||||||
String argName = argNames[i];
|
|
||||||
Object argValue = argValues[i];
|
|
||||||
// 被忽略时,标记为 ignore 字符串,避免和 null 混在一起
|
|
||||||
args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]");
|
|
||||||
}
|
|
||||||
return JsonUtils.toJsonString(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String obtainResultData(Object result) {
|
|
||||||
// TODO 提升:结果脱敏和忽略
|
|
||||||
if (result instanceof CommonResult) {
|
|
||||||
result = ((CommonResult<?>) result).getData();
|
|
||||||
}
|
|
||||||
return JsonUtils.toJsonString(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isIgnoreArgs(Object object) {
|
|
||||||
Class<?> clazz = object.getClass();
|
|
||||||
// 处理数组的情况
|
|
||||||
if (clazz.isArray()) {
|
|
||||||
return IntStream.range(0, Array.getLength(object))
|
|
||||||
.anyMatch(index -> isIgnoreArgs(Array.get(object, index)));
|
|
||||||
}
|
|
||||||
// 递归,处理数组、Collection、Map 的情况
|
|
||||||
if (Collection.class.isAssignableFrom(clazz)) {
|
|
||||||
return ((Collection<?>) object).stream()
|
|
||||||
.anyMatch((Predicate<Object>) OperateLogAspect::isIgnoreArgs);
|
|
||||||
}
|
|
||||||
if (Map.class.isAssignableFrom(clazz)) {
|
|
||||||
return isIgnoreArgs(((Map<?, ?>) object).values());
|
|
||||||
}
|
|
||||||
// obj
|
|
||||||
return object instanceof MultipartFile
|
|
||||||
|| object instanceof HttpServletRequest
|
|
||||||
|| object instanceof HttpServletResponse
|
|
||||||
|| object instanceof BindingResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core;
|
|
@ -1,110 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.service;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class OperateLog {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 链路追踪编号
|
|
||||||
*/
|
|
||||||
private String traceId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Long userId;
|
|
||||||
/**
|
|
||||||
* 用户类型
|
|
||||||
*/
|
|
||||||
private Integer userType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作模块
|
|
||||||
*/
|
|
||||||
private String module;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作名
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作分类
|
|
||||||
*/
|
|
||||||
private Integer type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作明细
|
|
||||||
*/
|
|
||||||
private String content;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 拓展字段
|
|
||||||
*/
|
|
||||||
private Map<String, Object> exts;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求方法名
|
|
||||||
*/
|
|
||||||
private String requestMethod;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求地址
|
|
||||||
*/
|
|
||||||
private String requestUrl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户 IP
|
|
||||||
*/
|
|
||||||
private String userIp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 浏览器 UserAgent
|
|
||||||
*/
|
|
||||||
private String userAgent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Java 方法名
|
|
||||||
*/
|
|
||||||
private String javaMethod;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Java 方法的参数
|
|
||||||
*/
|
|
||||||
private String javaMethodArgs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开始时间
|
|
||||||
*/
|
|
||||||
private LocalDateTime startTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行时长,单位:毫秒
|
|
||||||
*/
|
|
||||||
private Integer duration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果码
|
|
||||||
*/
|
|
||||||
private Integer resultCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果提示
|
|
||||||
*/
|
|
||||||
private String resultMsg;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果数据
|
|
||||||
*/
|
|
||||||
private String resultData;
|
|
||||||
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志 Framework Service 接口
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
public interface OperateLogFrameworkService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 记录操作日志
|
|
||||||
*
|
|
||||||
* @param operateLog 操作日志请求
|
|
||||||
*/
|
|
||||||
void createOperateLog(OperateLog operateLog);
|
|
||||||
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.service;
|
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
|
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.scheduling.annotation.Async;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志 Framework Service 实现类
|
|
||||||
*
|
|
||||||
* 基于 {@link OperateLogApi} 实现,记录操作日志
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkService {
|
|
||||||
|
|
||||||
private final OperateLogApi operateLogApi;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Async
|
|
||||||
public void createOperateLog(OperateLog operateLog) {
|
|
||||||
OperateLogCreateReqDTO reqDTO = BeanUtil.toBean(operateLog, OperateLogCreateReqDTO.class);
|
|
||||||
operateLogApi.createOperateLog(reqDTO);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.util;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.aop.OperateLogAspect;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志工具类
|
|
||||||
* 目前主要的作用,是提供给业务代码,记录操作明细和拓展字段
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
public class OperateLogUtils {
|
|
||||||
|
|
||||||
public static void setContent(String content) {
|
|
||||||
OperateLogAspect.setContent(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addExt(String key, Object value) {
|
|
||||||
OperateLogAspect.addExt(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
/**
|
|
||||||
* 用户操作日志:记录用户的操作,用于对用户的操作的审计与追溯,永久保存。
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
package cn.iocoder.yudao.framework.operatelog;
|
|
@ -1 +0,0 @@
|
|||||||
cn.iocoder.yudao.framework.operatelog.config.YudaoOperateLogAutoConfiguration
|
|
@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
|
import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
||||||
import com.mzt.logapi.beans.LogRecord;
|
import com.mzt.logapi.beans.LogRecord;
|
||||||
import com.mzt.logapi.service.ILogRecordService;
|
import com.mzt.logapi.service.ILogRecordService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -30,7 +30,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
|
|||||||
@Override
|
@Override
|
||||||
public void record(LogRecord logRecord) {
|
public void record(LogRecord logRecord) {
|
||||||
// 1. 补全通用字段
|
// 1. 补全通用字段
|
||||||
OperateLogV2CreateReqDTO reqDTO = new OperateLogV2CreateReqDTO();
|
OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO();
|
||||||
reqDTO.setTraceId(TracerUtils.getTraceId());
|
reqDTO.setTraceId(TracerUtils.getTraceId());
|
||||||
// 补充用户信息
|
// 补充用户信息
|
||||||
fillUserFields(reqDTO);
|
fillUserFields(reqDTO);
|
||||||
@ -40,12 +40,10 @@ public class LogRecordServiceImpl implements ILogRecordService {
|
|||||||
fillRequestFields(reqDTO);
|
fillRequestFields(reqDTO);
|
||||||
|
|
||||||
// 2. 异步记录日志
|
// 2. 异步记录日志
|
||||||
operateLogApi.createOperateLogV2(reqDTO);
|
operateLogApi.createOperateLog(reqDTO);
|
||||||
// TODO 测试结束删除或搞个开关
|
|
||||||
log.info("操作日志 ===> {}", reqDTO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void fillUserFields(OperateLogV2CreateReqDTO reqDTO) {
|
private static void fillUserFields(OperateLogCreateReqDTO reqDTO) {
|
||||||
// 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
|
// 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
|
||||||
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
||||||
if (loginUser == null) {
|
if (loginUser == null) {
|
||||||
@ -55,7 +53,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
|
|||||||
reqDTO.setUserType(loginUser.getUserType());
|
reqDTO.setUserType(loginUser.getUserType());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void fillModuleFields(OperateLogV2CreateReqDTO reqDTO, LogRecord logRecord) {
|
public static void fillModuleFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) {
|
||||||
reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户
|
reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户
|
||||||
reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户
|
reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户
|
||||||
reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号
|
reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号
|
||||||
@ -63,7 +61,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
|
|||||||
reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"}
|
reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void fillRequestFields(OperateLogV2CreateReqDTO reqDTO) {
|
private static void fillRequestFields(OperateLogCreateReqDTO reqDTO) {
|
||||||
// 获得 Request 对象
|
// 获得 Request 对象
|
||||||
HttpServletRequest request = ServletUtils.getRequest();
|
HttpServletRequest request = ServletUtils.getRequest();
|
||||||
if (request == null) {
|
if (request == null) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.config;
|
package cn.iocoder.yudao.framework.apilog.config;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter;
|
import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
||||||
@ -15,18 +16,22 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
|
|||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
|
|
||||||
@AutoConfiguration(after = YudaoWebAutoConfiguration.class)
|
@AutoConfiguration(after = YudaoWebAutoConfiguration.class)
|
||||||
public class YudaoApiLogAutoConfiguration {
|
public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) {
|
public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) {
|
||||||
return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi);
|
return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) {
|
public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) {
|
||||||
return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi);
|
return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi);
|
||||||
}
|
}
|
||||||
@ -49,4 +54,9 @@ public class YudaoApiLogAutoConfiguration {
|
|||||||
return bean;
|
return bean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
registry.addInterceptor(new ApiAccessLogInterceptor());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
package cn.iocoder.yudao.framework.apilog.core.annotations;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访问日志注解
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Target({ElementType.METHOD})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface ApiAccessLog {
|
||||||
|
|
||||||
|
// ========== 开关字段 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否记录访问日志
|
||||||
|
*/
|
||||||
|
boolean enable() default true;
|
||||||
|
/**
|
||||||
|
* 是否记录请求参数
|
||||||
|
*
|
||||||
|
* 默认记录,主要考虑请求数据一般不大。可手动设置为 false 进行关闭
|
||||||
|
*/
|
||||||
|
boolean requestEnable() default true;
|
||||||
|
/**
|
||||||
|
* 是否记录响应结果
|
||||||
|
*
|
||||||
|
* 默认不记录,主要考虑响应数据可能比较大。可手动设置为 true 进行打开
|
||||||
|
*/
|
||||||
|
boolean responseEnable() default false;
|
||||||
|
/**
|
||||||
|
* 敏感参数数组
|
||||||
|
*
|
||||||
|
* 添加后,请求参数、响应结果不会记录该参数
|
||||||
|
*/
|
||||||
|
String[] sanitizeKeys() default {};
|
||||||
|
|
||||||
|
// ========== 模块字段 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模块
|
||||||
|
*
|
||||||
|
* 为空时,会尝试读取 {@link io.swagger.v3.oas.annotations.tags.Tag#name()} 属性
|
||||||
|
*/
|
||||||
|
String operateModule() default "";
|
||||||
|
/**
|
||||||
|
* 操作名
|
||||||
|
*
|
||||||
|
* 为空时,会尝试读取 {@link io.swagger.v3.oas.annotations.Operation#summary()} 属性
|
||||||
|
*/
|
||||||
|
String operateName() default "";
|
||||||
|
/**
|
||||||
|
* 操作分类
|
||||||
|
*
|
||||||
|
* 实际并不是数组,因为枚举不能设置 null 作为默认值
|
||||||
|
*/
|
||||||
|
OperateTypeEnum[] operateType() default {};
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package cn.iocoder.yudao.framework.operatelog.core.enums;
|
package cn.iocoder.yudao.framework.apilog.core.enums;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@ -15,9 +14,6 @@ public enum OperateTypeEnum {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询
|
* 查询
|
||||||
*
|
|
||||||
* 绝大多数情况下,不会记录查询动作,因为过于大量显得没有意义。
|
|
||||||
* 在有需要的时候,通过声明 {@link OperateLog} 注解来记录
|
|
||||||
*/
|
*/
|
||||||
GET(1),
|
GET(1),
|
||||||
/**
|
/**
|
@ -1,18 +1,30 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.filter;
|
package cn.iocoder.yudao.framework.apilog.core.filter;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLog;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
|
import cn.hutool.core.util.BooleanUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
|
||||||
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.web.config.WebProperties;
|
import cn.iocoder.yudao.framework.web.config.WebProperties;
|
||||||
import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter;
|
import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter;
|
||||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.method.HandlerMethod;
|
||||||
|
|
||||||
import javax.servlet.FilterChain;
|
import javax.servlet.FilterChain;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
@ -21,18 +33,24 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor.ATTRIBUTE_HANDLER_METHOD;
|
||||||
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API 访问日志 Filter
|
* API 访问日志 Filter
|
||||||
*
|
*
|
||||||
|
* 目的:记录 API 访问日志到数据库中
|
||||||
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ApiAccessLogFilter extends ApiRequestFilter {
|
public class ApiAccessLogFilter extends ApiRequestFilter {
|
||||||
|
|
||||||
|
private static final String[] SANITIZE_KEYS = new String[]{"password", "token", "accessToken", "refreshToken"};
|
||||||
|
|
||||||
private final String applicationName;
|
private final String applicationName;
|
||||||
|
|
||||||
private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
|
private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
|
||||||
@ -44,6 +62,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("NullableProblems")
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
// 获得开始时间
|
// 获得开始时间
|
||||||
@ -66,45 +85,167 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
|
|||||||
|
|
||||||
private void createApiAccessLog(HttpServletRequest request, LocalDateTime beginTime,
|
private void createApiAccessLog(HttpServletRequest request, LocalDateTime beginTime,
|
||||||
Map<String, String> queryString, String requestBody, Exception ex) {
|
Map<String, String> queryString, String requestBody, Exception ex) {
|
||||||
ApiAccessLog accessLog = new ApiAccessLog();
|
ApiAccessLogCreateReqDTO accessLog = new ApiAccessLogCreateReqDTO();
|
||||||
try {
|
try {
|
||||||
this.buildApiAccessLogDTO(accessLog, request, beginTime, queryString, requestBody, ex);
|
boolean enable = buildApiAccessLog(accessLog, request, beginTime, queryString, requestBody, ex);
|
||||||
|
if (!enable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
apiAccessLogFrameworkService.createApiAccessLog(accessLog);
|
apiAccessLogFrameworkService.createApiAccessLog(accessLog);
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th);
|
log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildApiAccessLogDTO(ApiAccessLog accessLog, HttpServletRequest request, LocalDateTime beginTime,
|
private boolean buildApiAccessLog(ApiAccessLogCreateReqDTO accessLog, HttpServletRequest request, LocalDateTime beginTime,
|
||||||
Map<String, String> queryString, String requestBody, Exception ex) {
|
Map<String, String> queryString, String requestBody, Exception ex) {
|
||||||
|
// 判断:是否要记录操作日志
|
||||||
|
HandlerMethod handlerMethod = (HandlerMethod) request.getAttribute(ATTRIBUTE_HANDLER_METHOD);
|
||||||
|
ApiAccessLog accessLogAnnotation = null;
|
||||||
|
if (handlerMethod != null) {
|
||||||
|
accessLogAnnotation = handlerMethod.getMethodAnnotation(ApiAccessLog.class);
|
||||||
|
if (accessLogAnnotation != null && BooleanUtil.isFalse(accessLogAnnotation.enable())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 处理用户信息
|
// 处理用户信息
|
||||||
accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
|
accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request))
|
||||||
accessLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
|
.setUserType(WebFrameworkUtils.getLoginUserType(request));
|
||||||
// 设置访问结果
|
// 设置访问结果
|
||||||
CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
|
CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
accessLog.setResultCode(result.getCode());
|
accessLog.setResultCode(result.getCode()).setResultMsg(result.getMsg());
|
||||||
accessLog.setResultMsg(result.getMsg());
|
|
||||||
} else if (ex != null) {
|
} else if (ex != null) {
|
||||||
accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode());
|
accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode())
|
||||||
accessLog.setResultMsg(ExceptionUtil.getRootCauseMessage(ex));
|
.setResultMsg(ExceptionUtil.getRootCauseMessage(ex));
|
||||||
} else {
|
} else {
|
||||||
accessLog.setResultCode(0);
|
accessLog.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()).setResultMsg("");
|
||||||
accessLog.setResultMsg("");
|
}
|
||||||
|
// 设置请求字段
|
||||||
|
accessLog.setTraceId(TracerUtils.getTraceId()).setApplicationName(applicationName)
|
||||||
|
.setRequestUrl(request.getRequestURI()).setRequestMethod(request.getMethod())
|
||||||
|
.setUserAgent(ServletUtils.getUserAgent(request)).setUserIp(ServletUtils.getClientIP(request));
|
||||||
|
String[] sanitizeKeys = accessLogAnnotation != null ? accessLogAnnotation.sanitizeKeys() : null;
|
||||||
|
Boolean requestEnable = accessLogAnnotation != null ? accessLogAnnotation.requestEnable() : Boolean.TRUE;
|
||||||
|
if (!BooleanUtil.isFalse(requestEnable)) { // 默认记录,所以判断 !false
|
||||||
|
Map<String, Object> requestParams = MapUtil.<String, Object>builder()
|
||||||
|
.put("query", sanitizeMap(queryString, sanitizeKeys))
|
||||||
|
.put("body", sanitizeJson(requestBody, sanitizeKeys)).build();
|
||||||
|
accessLog.setRequestParams(toJsonString(requestParams));
|
||||||
|
}
|
||||||
|
Boolean responseEnable = accessLogAnnotation != null ? accessLogAnnotation.responseEnable() : Boolean.FALSE;
|
||||||
|
if (BooleanUtil.isTrue(responseEnable)) { // 默认不记录,默认强制要求 true
|
||||||
|
accessLog.setResponseBody(sanitizeJson(result, sanitizeKeys));
|
||||||
}
|
}
|
||||||
// 设置其它字段
|
|
||||||
accessLog.setTraceId(TracerUtils.getTraceId());
|
|
||||||
accessLog.setApplicationName(applicationName);
|
|
||||||
accessLog.setRequestUrl(request.getRequestURI());
|
|
||||||
Map<String, Object> requestParams = MapUtil.<String, Object>builder().put("query", queryString).put("body", requestBody).build();
|
|
||||||
accessLog.setRequestParams(toJsonString(requestParams));
|
|
||||||
accessLog.setRequestMethod(request.getMethod());
|
|
||||||
accessLog.setUserAgent(ServletUtils.getUserAgent(request));
|
|
||||||
accessLog.setUserIp(ServletUtils.getClientIP(request));
|
|
||||||
// 持续时间
|
// 持续时间
|
||||||
accessLog.setBeginTime(beginTime);
|
accessLog.setBeginTime(beginTime).setEndTime(LocalDateTime.now())
|
||||||
accessLog.setEndTime(LocalDateTime.now());
|
.setDuration((int) LocalDateTimeUtil.between(accessLog.getBeginTime(), accessLog.getEndTime(), ChronoUnit.MILLIS));
|
||||||
accessLog.setDuration((int) LocalDateTimeUtil.between(accessLog.getBeginTime(), accessLog.getEndTime(), ChronoUnit.MILLIS));
|
|
||||||
|
// 操作模块
|
||||||
|
if (handlerMethod != null) {
|
||||||
|
Tag tagAnnotation = handlerMethod.getBeanType().getAnnotation(Tag.class);
|
||||||
|
Operation operationAnnotation = handlerMethod.getMethodAnnotation(Operation.class);
|
||||||
|
String operateModule = accessLogAnnotation != null ? accessLogAnnotation.operateModule() :
|
||||||
|
tagAnnotation != null ? StrUtil.nullToDefault(tagAnnotation.name(), tagAnnotation.description()) : null;
|
||||||
|
String operateName = accessLogAnnotation != null ? accessLogAnnotation.operateName() :
|
||||||
|
operationAnnotation != null ? operationAnnotation.summary() : null;
|
||||||
|
OperateTypeEnum operateType = accessLogAnnotation != null && accessLogAnnotation.operateType().length > 0 ?
|
||||||
|
accessLogAnnotation.operateType()[0] : parseOperateLogType(request);
|
||||||
|
accessLog.setOperateModule(operateModule).setOperateName(operateName).setOperateType(operateType.getType());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 解析 @ApiAccessLog、@Swagger 注解 ==========
|
||||||
|
|
||||||
|
private static OperateTypeEnum parseOperateLogType(HttpServletRequest request) {
|
||||||
|
RequestMethod requestMethod = ArrayUtil.firstMatch(method ->
|
||||||
|
StrUtil.equalsAnyIgnoreCase(method.name(), request.getMethod()), RequestMethod.values());
|
||||||
|
if (requestMethod == null) {
|
||||||
|
return OperateTypeEnum.OTHER;
|
||||||
|
}
|
||||||
|
switch (requestMethod) {
|
||||||
|
case GET:
|
||||||
|
return OperateTypeEnum.GET;
|
||||||
|
case POST:
|
||||||
|
return OperateTypeEnum.CREATE;
|
||||||
|
case PUT:
|
||||||
|
return OperateTypeEnum.UPDATE;
|
||||||
|
case DELETE:
|
||||||
|
return OperateTypeEnum.DELETE;
|
||||||
|
default:
|
||||||
|
return OperateTypeEnum.OTHER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 请求和响应的脱敏逻辑,移除类似 password、token 等敏感字段 ==========
|
||||||
|
|
||||||
|
private static String sanitizeMap(Map<String, ?> map, String[] sanitizeKeys) {
|
||||||
|
if (CollUtil.isNotEmpty(map)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (sanitizeKeys != null) {
|
||||||
|
MapUtil.removeAny(map, sanitizeKeys);
|
||||||
|
}
|
||||||
|
MapUtil.removeAny(map, SANITIZE_KEYS);
|
||||||
|
return JsonUtils.toJsonString(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String sanitizeJson(String jsonString, String[] sanitizeKeys) {
|
||||||
|
if (StrUtil.isEmpty(jsonString)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
JsonNode rootNode = JsonUtils.parseTree(jsonString);
|
||||||
|
sanitizeJson(rootNode, sanitizeKeys);
|
||||||
|
return JsonUtils.toJsonString(rootNode);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 脱敏失败的情况下,直接忽略异常,避免影响用户请求
|
||||||
|
log.error("[sanitizeJson][脱敏({}) 发生异常]", jsonString, e);
|
||||||
|
return jsonString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String sanitizeJson(CommonResult<?> commonResult, String[] sanitizeKeys) {
|
||||||
|
if (commonResult == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String jsonString = toJsonString(commonResult);
|
||||||
|
try {
|
||||||
|
JsonNode rootNode = JsonUtils.parseTree(jsonString);
|
||||||
|
sanitizeJson(rootNode.get("data"), sanitizeKeys); // 只处理 data 字段,不处理 code、msg 字段,避免错误被脱敏掉
|
||||||
|
return JsonUtils.toJsonString(rootNode);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 脱敏失败的情况下,直接忽略异常,避免影响用户请求
|
||||||
|
log.error("[sanitizeJson][脱敏({}) 发生异常]", jsonString, e);
|
||||||
|
return jsonString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void sanitizeJson(JsonNode node, String[] sanitizeKeys) {
|
||||||
|
// 情况一:数组,遍历处理
|
||||||
|
if (node.isArray()) {
|
||||||
|
for (JsonNode childNode : node) {
|
||||||
|
sanitizeJson(childNode, sanitizeKeys);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 情况二:非 Object,只是某个值,直接返回
|
||||||
|
if (!node.isObject()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 情况三:Object,遍历处理
|
||||||
|
Iterator<Map.Entry<String, JsonNode>> iterator = node.fields();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Map.Entry<String, JsonNode> entry = iterator.next();
|
||||||
|
if (ArrayUtil.contains(sanitizeKeys, entry.getKey())
|
||||||
|
|| ArrayUtil.contains(SANITIZE_KEYS, entry.getKey())) {
|
||||||
|
iterator.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sanitizeJson(entry.getValue(), sanitizeKeys);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package cn.iocoder.yudao.framework.apilog.core.interceptor;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.util.StopWatch;
|
||||||
|
import org.springframework.web.method.HandlerMethod;
|
||||||
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API 访问日志 Interceptor
|
||||||
|
*
|
||||||
|
* 目的:在非 prod 环境时,打印 request 和 response 两条日志到日志文件(控制台)中。
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class ApiAccessLogInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
|
public static final String ATTRIBUTE_HANDLER_METHOD = "HANDLER_METHOD";
|
||||||
|
|
||||||
|
private static final String ATTRIBUTE_STOP_WATCH = "ApiAccessLogInterceptor.StopWatch";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
||||||
|
// 记录 HandlerMethod,提供给 ApiAccessLogFilter 使用
|
||||||
|
HandlerMethod handlerMethod = handler instanceof HandlerMethod ? (HandlerMethod) handler : null;
|
||||||
|
if (handlerMethod != null) {
|
||||||
|
request.setAttribute(ATTRIBUTE_HANDLER_METHOD, handlerMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打印 request 日志
|
||||||
|
if (!SpringUtils.isProd()) {
|
||||||
|
Map<String, String> queryString = ServletUtils.getParamMap(request);
|
||||||
|
String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null;
|
||||||
|
if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) {
|
||||||
|
log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI());
|
||||||
|
} else {
|
||||||
|
log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(),
|
||||||
|
StrUtil.nullToDefault(requestBody, queryString.toString()));
|
||||||
|
}
|
||||||
|
// 计时
|
||||||
|
StopWatch stopWatch = new StopWatch();
|
||||||
|
stopWatch.start();
|
||||||
|
request.setAttribute(ATTRIBUTE_STOP_WATCH, stopWatch);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
|
||||||
|
// 打印 response 日志
|
||||||
|
if (!SpringUtils.isProd()) {
|
||||||
|
StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH);
|
||||||
|
stopWatch.stop();
|
||||||
|
log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]",
|
||||||
|
request.getRequestURI(), stopWatch.getTotalTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,85 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API 访问日志
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class ApiAccessLog {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 链路追踪编号
|
|
||||||
*/
|
|
||||||
private String traceId;
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Long userId;
|
|
||||||
/**
|
|
||||||
* 用户类型
|
|
||||||
*/
|
|
||||||
private Integer userType;
|
|
||||||
/**
|
|
||||||
* 应用名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "应用名不能为空")
|
|
||||||
private String applicationName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求方法名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "http 请求方法不能为空")
|
|
||||||
private String requestMethod;
|
|
||||||
/**
|
|
||||||
* 访问地址
|
|
||||||
*/
|
|
||||||
@NotNull(message = "访问地址不能为空")
|
|
||||||
private String requestUrl;
|
|
||||||
/**
|
|
||||||
* 请求参数
|
|
||||||
*/
|
|
||||||
@NotNull(message = "请求参数不能为空")
|
|
||||||
private String requestParams;
|
|
||||||
/**
|
|
||||||
* 用户 IP
|
|
||||||
*/
|
|
||||||
@NotNull(message = "ip 不能为空")
|
|
||||||
private String userIp;
|
|
||||||
/**
|
|
||||||
* 浏览器 UA
|
|
||||||
*/
|
|
||||||
@NotNull(message = "User-Agent 不能为空")
|
|
||||||
private String userAgent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开始请求时间
|
|
||||||
*/
|
|
||||||
@NotNull(message = "开始请求时间不能为空")
|
|
||||||
private LocalDateTime beginTime;
|
|
||||||
/**
|
|
||||||
* 结束请求时间
|
|
||||||
*/
|
|
||||||
@NotNull(message = "结束请求时间不能为空")
|
|
||||||
private LocalDateTime endTime;
|
|
||||||
/**
|
|
||||||
* 执行时长,单位:毫秒
|
|
||||||
*/
|
|
||||||
@NotNull(message = "执行时长不能为空")
|
|
||||||
private Integer duration;
|
|
||||||
/**
|
|
||||||
* 结果码
|
|
||||||
*/
|
|
||||||
@NotNull(message = "错误码不能为空")
|
|
||||||
private Integer resultCode;
|
|
||||||
/**
|
|
||||||
* 结果提示
|
|
||||||
*/
|
|
||||||
private String resultMsg;
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +1,7 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
package cn.iocoder.yudao.framework.apilog.core.service;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API 访问日志 Framework Service 接口
|
* API 访问日志 Framework Service 接口
|
||||||
*
|
*
|
||||||
@ -10,7 +12,8 @@ public interface ApiAccessLogFrameworkService {
|
|||||||
/**
|
/**
|
||||||
* 创建 API 访问日志
|
* 创建 API 访问日志
|
||||||
*
|
*
|
||||||
* @param apiAccessLog API 访问日志
|
* @param reqDTO API 访问日志
|
||||||
*/
|
*/
|
||||||
void createApiAccessLog(ApiAccessLog apiAccessLog);
|
void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
package cn.iocoder.yudao.framework.apilog.core.service;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi;
|
import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi;
|
||||||
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -20,8 +19,7 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
public void createApiAccessLog(ApiAccessLog apiAccessLog) {
|
public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) {
|
||||||
ApiAccessLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiAccessLog, ApiAccessLogCreateReqDTO.class);
|
|
||||||
apiAccessLogApi.createApiAccessLog(reqDTO);
|
apiAccessLogApi.createApiAccessLog(reqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,107 +0,0 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API 错误日志
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class ApiErrorLog {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 链路编号
|
|
||||||
*/
|
|
||||||
private String traceId;
|
|
||||||
/**
|
|
||||||
* 账号编号
|
|
||||||
*/
|
|
||||||
private Long userId;
|
|
||||||
/**
|
|
||||||
* 用户类型
|
|
||||||
*/
|
|
||||||
private Integer userType;
|
|
||||||
/**
|
|
||||||
* 应用名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "应用名不能为空")
|
|
||||||
private String applicationName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求方法名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "http 请求方法不能为空")
|
|
||||||
private String requestMethod;
|
|
||||||
/**
|
|
||||||
* 访问地址
|
|
||||||
*/
|
|
||||||
@NotNull(message = "访问地址不能为空")
|
|
||||||
private String requestUrl;
|
|
||||||
/**
|
|
||||||
* 请求参数
|
|
||||||
*/
|
|
||||||
@NotNull(message = "请求参数不能为空")
|
|
||||||
private String requestParams;
|
|
||||||
/**
|
|
||||||
* 用户 IP
|
|
||||||
*/
|
|
||||||
@NotNull(message = "ip 不能为空")
|
|
||||||
private String userIp;
|
|
||||||
/**
|
|
||||||
* 浏览器 UA
|
|
||||||
*/
|
|
||||||
@NotNull(message = "User-Agent 不能为空")
|
|
||||||
private String userAgent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 异常时间
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常时间不能为空")
|
|
||||||
private LocalDateTime exceptionTime;
|
|
||||||
/**
|
|
||||||
* 异常名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常名不能为空")
|
|
||||||
private String exceptionName;
|
|
||||||
/**
|
|
||||||
* 异常发生的类全名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常发生的类全名不能为空")
|
|
||||||
private String exceptionClassName;
|
|
||||||
/**
|
|
||||||
* 异常发生的类文件
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常发生的类文件不能为空")
|
|
||||||
private String exceptionFileName;
|
|
||||||
/**
|
|
||||||
* 异常发生的方法名
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常发生的方法名不能为空")
|
|
||||||
private String exceptionMethodName;
|
|
||||||
/**
|
|
||||||
* 异常发生的方法所在行
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常发生的方法所在行不能为空")
|
|
||||||
private Integer exceptionLineNumber;
|
|
||||||
/**
|
|
||||||
* 异常的栈轨迹异常的栈轨迹
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常的栈轨迹不能为空")
|
|
||||||
private String exceptionStackTrace;
|
|
||||||
/**
|
|
||||||
* 异常导致的根消息
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常导致的根消息不能为空")
|
|
||||||
private String exceptionRootCauseMessage;
|
|
||||||
/**
|
|
||||||
* 异常导致的消息
|
|
||||||
*/
|
|
||||||
@NotNull(message = "异常导致的消息不能为空")
|
|
||||||
private String exceptionMessage;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +1,7 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
package cn.iocoder.yudao.framework.apilog.core.service;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API 错误日志 Framework Service 接口
|
* API 错误日志 Framework Service 接口
|
||||||
*
|
*
|
||||||
@ -10,7 +12,8 @@ public interface ApiErrorLogFrameworkService {
|
|||||||
/**
|
/**
|
||||||
* 创建 API 错误日志
|
* 创建 API 错误日志
|
||||||
*
|
*
|
||||||
* @param apiErrorLog API 错误日志
|
* @param reqDTO API 错误日志
|
||||||
*/
|
*/
|
||||||
void createApiErrorLog(ApiErrorLog apiErrorLog);
|
void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package cn.iocoder.yudao.framework.apilog.core.service;
|
package cn.iocoder.yudao.framework.apilog.core.service;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi;
|
import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi;
|
||||||
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -20,8 +19,7 @@ public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkServ
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
public void createApiErrorLog(ApiErrorLog apiErrorLog) {
|
public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) {
|
||||||
ApiErrorLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiErrorLog, ApiErrorLogCreateReqDTO.class);
|
|
||||||
apiErrorLogApi.createApiErrorLog(reqDTO);
|
apiErrorLogApi.createApiErrorLog(reqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.web.core.handler;
|
|||||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLog;
|
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
@ -11,6 +10,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|||||||
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
@ -46,6 +46,7 @@ import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeC
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class GlobalExceptionHandler {
|
public class GlobalExceptionHandler {
|
||||||
|
|
||||||
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
private final String applicationName;
|
private final String applicationName;
|
||||||
|
|
||||||
private final ApiErrorLogFrameworkService apiErrorLogFrameworkService;
|
private final ApiErrorLogFrameworkService apiErrorLogFrameworkService;
|
||||||
@ -237,10 +238,10 @@ public class GlobalExceptionHandler {
|
|||||||
|
|
||||||
private void createExceptionLog(HttpServletRequest req, Throwable e) {
|
private void createExceptionLog(HttpServletRequest req, Throwable e) {
|
||||||
// 插入错误日志
|
// 插入错误日志
|
||||||
ApiErrorLog errorLog = new ApiErrorLog();
|
ApiErrorLogCreateReqDTO errorLog = new ApiErrorLogCreateReqDTO();
|
||||||
try {
|
try {
|
||||||
// 初始化 errorLog
|
// 初始化 errorLog
|
||||||
initExceptionLog(errorLog, req, e);
|
buildExceptionLog(errorLog, req, e);
|
||||||
// 执行插入 errorLog
|
// 执行插入 errorLog
|
||||||
apiErrorLogFrameworkService.createApiErrorLog(errorLog);
|
apiErrorLogFrameworkService.createApiErrorLog(errorLog);
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
@ -248,7 +249,7 @@ public class GlobalExceptionHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initExceptionLog(ApiErrorLog errorLog, HttpServletRequest request, Throwable e) {
|
private void buildExceptionLog(ApiErrorLogCreateReqDTO errorLog, HttpServletRequest request, Throwable e) {
|
||||||
// 处理用户信息
|
// 处理用户信息
|
||||||
errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
|
errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
|
||||||
errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
|
errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
|
||||||
|
@ -44,8 +44,11 @@ public class ApiAccessLogCreateReqDTO {
|
|||||||
/**
|
/**
|
||||||
* 请求参数
|
* 请求参数
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "请求参数不能为空")
|
|
||||||
private String requestParams;
|
private String requestParams;
|
||||||
|
/**
|
||||||
|
* 响应结果
|
||||||
|
*/
|
||||||
|
private String responseBody;
|
||||||
/**
|
/**
|
||||||
* 用户 IP
|
* 用户 IP
|
||||||
*/
|
*/
|
||||||
@ -57,6 +60,21 @@ public class ApiAccessLogCreateReqDTO {
|
|||||||
@NotNull(message = "User-Agent 不能为空")
|
@NotNull(message = "User-Agent 不能为空")
|
||||||
private String userAgent;
|
private String userAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模块
|
||||||
|
*/
|
||||||
|
private String operateModule;
|
||||||
|
/**
|
||||||
|
* 操作名
|
||||||
|
*/
|
||||||
|
private String operateName;
|
||||||
|
/**
|
||||||
|
* 操作分类
|
||||||
|
*
|
||||||
|
* 枚举,参见 OperateTypeEnum 类
|
||||||
|
*/
|
||||||
|
private Integer operateType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始请求时间
|
* 开始请求时间
|
||||||
*/
|
*/
|
||||||
|
@ -31,10 +31,6 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 业务组件 -->
|
<!-- 业务组件 -->
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
|
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.config;
|
package cn.iocoder.yudao.module.infra.controller.admin.config;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.config.vo.*;
|
import cn.iocoder.yudao.module.infra.controller.admin.config.vo.*;
|
||||||
import cn.iocoder.yudao.module.infra.convert.config.ConfigConvert;
|
import cn.iocoder.yudao.module.infra.convert.config.ConfigConvert;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO;
|
||||||
@ -23,9 +23,9 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 参数配置")
|
@Tag(name = "管理后台 - 参数配置")
|
||||||
@RestController
|
@RestController
|
||||||
@ -93,7 +93,7 @@ public class ConfigController {
|
|||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@Operation(summary = "导出参数配置")
|
@Operation(summary = "导出参数配置")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:config:export')")
|
@PreAuthorize("@ss.hasPermission('infra:config:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportConfig(@Valid ConfigPageReqVO exportReqVO,
|
public void exportConfig(@Valid ConfigPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01;
|
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO;
|
||||||
@ -24,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 示例联系人")
|
@Tag(name = "管理后台 - 示例联系人")
|
||||||
@RestController
|
@RestController
|
||||||
@ -80,7 +80,7 @@ public class Demo01ContactController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出示例联系人 Excel")
|
@Operation(summary = "导出示例联系人 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:demo01-contact:export')")
|
@PreAuthorize("@ss.hasPermission('infra:demo01-contact:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportDemo01ContactExcel(@Valid Demo01ContactPageReqVO pageReqVO,
|
public void exportDemo01ContactExcel(@Valid Demo01ContactPageReqVO pageReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo02;
|
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo02;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO;
|
||||||
@ -22,8 +22,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 示例分类")
|
@Tag(name = "管理后台 - 示例分类")
|
||||||
@RestController
|
@RestController
|
||||||
@ -78,7 +78,7 @@ public class Demo02CategoryController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出示例分类 Excel")
|
@Operation(summary = "导出示例分类 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:demo02-category:export')")
|
@PreAuthorize("@ss.hasPermission('infra:demo02-category:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportDemo02CategoryExcel(@Valid Demo02CategoryListReqVO listReqVO,
|
public void exportDemo02CategoryExcel(@Valid Demo02CategoryListReqVO listReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
List<Demo02CategoryDO> list = demo02CategoryService.getDemo02CategoryList(listReqVO);
|
List<Demo02CategoryDO> list = demo02CategoryService.getDemo02CategoryList(listReqVO);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03;
|
package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO;
|
||||||
@ -26,8 +26,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 学生")
|
@Tag(name = "管理后台 - 学生")
|
||||||
@RestController
|
@RestController
|
||||||
@ -82,7 +82,7 @@ public class Demo03StudentController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出学生 Excel")
|
@Operation(summary = "导出学生 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:demo03-student:export')")
|
@PreAuthorize("@ss.hasPermission('infra:demo03-student:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportDemo03StudentExcel(@Valid Demo03StudentPageReqVO pageReqVO,
|
public void exportDemo03StudentExcel(@Valid Demo03StudentPageReqVO pageReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.*;
|
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.*;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
|
||||||
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
||||||
@ -41,7 +40,6 @@ public class FileController {
|
|||||||
|
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
@Operation(summary = "上传文件", description = "模式一:后端上传文件")
|
@Operation(summary = "上传文件", description = "模式一:后端上传文件")
|
||||||
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
|
|
||||||
public CommonResult<String> uploadFile(FileUploadReqVO uploadReqVO) throws Exception {
|
public CommonResult<String> uploadFile(FileUploadReqVO uploadReqVO) throws Exception {
|
||||||
MultipartFile file = uploadReqVO.getFile();
|
MultipartFile file = uploadReqVO.getFile();
|
||||||
String path = uploadReqVO.getPath();
|
String path = uploadReqVO.getPath();
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.job;
|
package cn.iocoder.yudao.module.infra.controller.admin.job;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.framework.quartz.core.util.CronUtils;
|
import cn.iocoder.yudao.framework.quartz.core.util.CronUtils;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobRespVO;
|
||||||
@ -29,8 +29,8 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 定时任务")
|
@Tag(name = "管理后台 - 定时任务")
|
||||||
@RestController
|
@RestController
|
||||||
@ -110,7 +110,7 @@ public class JobController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出定时任务 Excel")
|
@Operation(summary = "导出定时任务 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:job:export')")
|
@PreAuthorize("@ss.hasPermission('infra:job:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportJobExcel(@Valid JobPageReqVO exportReqVO,
|
public void exportJobExcel(@Valid JobPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.job;
|
package cn.iocoder.yudao.module.infra.controller.admin.job;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO;
|
||||||
@ -26,8 +26,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 定时任务日志")
|
@Tag(name = "管理后台 - 定时任务日志")
|
||||||
@RestController
|
@RestController
|
||||||
@ -58,7 +58,7 @@ public class JobLogController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出定时任务日志 Excel")
|
@Operation(summary = "导出定时任务日志 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:job:export')")
|
@PreAuthorize("@ss.hasPermission('infra:job:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportJobLogExcel(@Valid JobLogPageReqVO exportReqVO,
|
public void exportJobLogExcel(@Valid JobLogPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.logger;
|
package cn.iocoder.yudao.module.infra.controller.admin.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
|
||||||
@ -24,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - API 访问日志")
|
@Tag(name = "管理后台 - API 访问日志")
|
||||||
@RestController
|
@RestController
|
||||||
@ -47,7 +47,7 @@ public class ApiAccessLogController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出API 访问日志 Excel")
|
@Operation(summary = "导出API 访问日志 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:api-access-log:export')")
|
@PreAuthorize("@ss.hasPermission('infra:api-access-log:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportApiAccessLogExcel(@Valid ApiAccessLogPageReqVO exportReqVO,
|
public void exportApiAccessLogExcel(@Valid ApiAccessLogPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.infra.controller.admin.logger;
|
package cn.iocoder.yudao.module.infra.controller.admin.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO;
|
import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
|
||||||
@ -24,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
@Tag(name = "管理后台 - API 错误日志")
|
@Tag(name = "管理后台 - API 错误日志")
|
||||||
@ -61,7 +61,7 @@ public class ApiErrorLogController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出 API 错误日志 Excel")
|
@Operation(summary = "导出 API 错误日志 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('infra:api-error-log:export')")
|
@PreAuthorize("@ss.hasPermission('infra:api-error-log:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportApiErrorLogExcel(@Valid ApiErrorLogPageReqVO exportReqVO,
|
public void exportApiErrorLogExcel(@Valid ApiErrorLogPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -48,6 +48,10 @@ public class ApiAccessLogRespVO {
|
|||||||
@ExcelProperty("请求参数")
|
@ExcelProperty("请求参数")
|
||||||
private String requestParams;
|
private String requestParams;
|
||||||
|
|
||||||
|
@Schema(description = "响应结果")
|
||||||
|
@ExcelProperty("响应结果")
|
||||||
|
private String responseBody;
|
||||||
|
|
||||||
@Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
|
@Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
|
||||||
@ExcelProperty("用户 IP")
|
@ExcelProperty("用户 IP")
|
||||||
private String userIp;
|
private String userIp;
|
||||||
@ -56,6 +60,19 @@ public class ApiAccessLogRespVO {
|
|||||||
@ExcelProperty("浏览器 UA")
|
@ExcelProperty("浏览器 UA")
|
||||||
private String userAgent;
|
private String userAgent;
|
||||||
|
|
||||||
|
@Schema(description = "操作模块", requiredMode = Schema.RequiredMode.REQUIRED, example = "商品模块")
|
||||||
|
@ExcelProperty("操作模块")
|
||||||
|
private String operateModule;
|
||||||
|
|
||||||
|
@Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建商品")
|
||||||
|
@ExcelProperty("操作名")
|
||||||
|
private String operateName;
|
||||||
|
|
||||||
|
@Schema(description = "操作分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@ExcelProperty(value = "操作分类", converter = DictConvert.class)
|
||||||
|
@DictFormat(DictTypeConstants.OPERATE_TYPE)
|
||||||
|
private Integer operateType;
|
||||||
|
|
||||||
@Schema(description = "开始请求时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "开始请求时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@ExcelProperty("开始请求时间")
|
@ExcelProperty("开始请求时间")
|
||||||
private LocalDateTime beginTime;
|
private LocalDateTime beginTime;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.infra.dal.dataobject.logger;
|
package cn.iocoder.yudao.module.infra.dal.dataobject.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
@ -70,6 +71,10 @@ public class ApiAccessLogDO extends BaseDO {
|
|||||||
* body: Quest Body
|
* body: Quest Body
|
||||||
*/
|
*/
|
||||||
private String requestParams;
|
private String requestParams;
|
||||||
|
/**
|
||||||
|
* 响应结果
|
||||||
|
*/
|
||||||
|
private String responseBody;
|
||||||
/**
|
/**
|
||||||
* 用户 IP
|
* 用户 IP
|
||||||
*/
|
*/
|
||||||
@ -81,6 +86,21 @@ public class ApiAccessLogDO extends BaseDO {
|
|||||||
|
|
||||||
// ========== 执行相关字段 ==========
|
// ========== 执行相关字段 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模块
|
||||||
|
*/
|
||||||
|
private String operateModule;
|
||||||
|
/**
|
||||||
|
* 操作名
|
||||||
|
*/
|
||||||
|
private String operateName;
|
||||||
|
/**
|
||||||
|
* 操作分类
|
||||||
|
*
|
||||||
|
* 枚举 {@link OperateTypeEnum}
|
||||||
|
*/
|
||||||
|
private Integer operateType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始请求时间
|
* 开始请求时间
|
||||||
*/
|
*/
|
||||||
@ -93,6 +113,7 @@ public class ApiAccessLogDO extends BaseDO {
|
|||||||
* 执行时长,单位:毫秒
|
* 执行时长,单位:毫秒
|
||||||
*/
|
*/
|
||||||
private Integer duration;
|
private Integer duration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 结果码
|
* 结果码
|
||||||
*
|
*
|
||||||
|
@ -8,6 +8,8 @@ import cn.hutool.extra.template.TemplateConfig;
|
|||||||
import cn.hutool.extra.template.TemplateEngine;
|
import cn.hutool.extra.template.TemplateEngine;
|
||||||
import cn.hutool.extra.template.engine.velocity.VelocityEngine;
|
import cn.hutool.extra.template.engine.velocity.VelocityEngine;
|
||||||
import cn.hutool.system.SystemUtil;
|
import cn.hutool.system.SystemUtil;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
@ -24,8 +26,6 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
|
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
|
||||||
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
|
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
|
||||||
@ -211,7 +211,7 @@ public class CodegenEngine {
|
|||||||
globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName());
|
globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName());
|
||||||
globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName());
|
globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName());
|
||||||
globalBindingMap.put("DictConvertClassName", DictConvert.class.getName());
|
globalBindingMap.put("DictConvertClassName", DictConvert.class.getName());
|
||||||
globalBindingMap.put("OperateLogClassName", OperateLog.class.getName());
|
globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName());
|
||||||
globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName());
|
globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName());
|
||||||
globalBindingMap.put("BeanUtils", BeanUtils.class.getName());
|
globalBindingMap.put("BeanUtils", BeanUtils.class.getName());
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ import static ${CommonResultClassName}.success;
|
|||||||
|
|
||||||
import ${ExcelUtilsClassName};
|
import ${ExcelUtilsClassName};
|
||||||
|
|
||||||
import ${OperateLogClassName};
|
import ${ApiAccessLogClassName};
|
||||||
import static ${OperateTypeEnumClassName}.*;
|
import static ${OperateTypeEnumClassName}.*;
|
||||||
|
|
||||||
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
|
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
|
||||||
@ -114,7 +114,7 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
|
|||||||
#if ($sceneEnum.scene == 1)
|
#if ($sceneEnum.scene == 1)
|
||||||
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")
|
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")
|
||||||
#end
|
#end
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
#if ( $table.templateType != 2 )
|
#if ( $table.templateType != 2 )
|
||||||
public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO,
|
public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
|
@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.system.api.logger;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogRespDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;
|
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@ -22,19 +21,12 @@ public interface OperateLogApi {
|
|||||||
*/
|
*/
|
||||||
void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO);
|
void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建操作日志
|
|
||||||
*
|
|
||||||
* @param createReqDTO 请求
|
|
||||||
*/
|
|
||||||
void createOperateLogV2(@Valid OperateLogV2CreateReqDTO createReqDTO);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取指定模块的指定数据的操作日志分页
|
* 获取指定模块的指定数据的操作日志分页
|
||||||
*
|
*
|
||||||
* @param pageReqVO 请求
|
* @param pageReqVO 请求
|
||||||
* @return 操作日志分页
|
* @return 操作日志分页
|
||||||
*/
|
*/
|
||||||
PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO);
|
PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,123 +1,85 @@
|
|||||||
package cn.iocoder.yudao.module.system.api.logger.dto;
|
package cn.iocoder.yudao.module.system.api.logger.dto;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志创建 Request DTO
|
* 系统操作日志 Create Request DTO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class OperateLogCreateReqDTO {
|
public class OperateLogCreateReqDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 链路追踪编号
|
* 链路追踪编号
|
||||||
|
*
|
||||||
|
* 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
|
||||||
*/
|
*/
|
||||||
private String traceId;
|
private String traceId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户编号
|
* 用户编号
|
||||||
|
*
|
||||||
|
* 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "用户编号不能为空")
|
@NotNull(message = "用户编号不能为空")
|
||||||
private Long userId;
|
private Long userId;
|
||||||
/**
|
/**
|
||||||
* 用户类型
|
* 用户类型
|
||||||
|
*
|
||||||
|
* 关联 {@link UserTypeEnum}
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "用户类型不能为空")
|
@NotNull(message = "用户类型不能为空")
|
||||||
private Integer userType;
|
private Integer userType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作模块
|
* 操作模块类型
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "操作模块不能为空")
|
@NotEmpty(message = "操作模块类型不能为空")
|
||||||
private String module;
|
private String type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作名
|
* 操作名
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "操作名")
|
@NotEmpty(message = "操作名不能为空")
|
||||||
private String name;
|
private String subType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作分类
|
* 操作模块业务编号
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "操作分类不能为空")
|
@NotNull(message = "操作模块业务编号不能为空")
|
||||||
private Integer type;
|
private Long bizId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作明细
|
* 操作内容,记录整个操作的明细
|
||||||
|
* 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
|
||||||
*/
|
*/
|
||||||
private String content;
|
@NotEmpty(message = "操作内容不能为空")
|
||||||
|
private String action;
|
||||||
/**
|
/**
|
||||||
* 拓展字段
|
* 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
|
||||||
|
* 例如说,记录订单编号,{ orderId: "1"}
|
||||||
*/
|
*/
|
||||||
private Map<String, Object> exts;
|
private String extra;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求方法名
|
* 请求方法名
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "请求方法名不能为空")
|
@NotEmpty(message = "请求方法名不能为空")
|
||||||
private String requestMethod;
|
private String requestMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求地址
|
* 请求地址
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "请求地址不能为空")
|
@NotEmpty(message = "请求地址不能为空")
|
||||||
private String requestUrl;
|
private String requestUrl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户 IP
|
* 用户 IP
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "用户 IP 不能为空")
|
@NotEmpty(message = "用户 IP 不能为空")
|
||||||
private String userIp;
|
private String userIp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 浏览器 UserAgent
|
* 浏览器 UA
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "浏览器 UserAgent 不能为空")
|
@NotEmpty(message = "浏览器 UA 不能为空")
|
||||||
private String userAgent;
|
private String userAgent;
|
||||||
|
|
||||||
/**
|
|
||||||
* Java 方法名
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "Java 方法名不能为空")
|
|
||||||
private String javaMethod;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Java 方法的参数
|
|
||||||
*/
|
|
||||||
private String javaMethodArgs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开始时间
|
|
||||||
*/
|
|
||||||
@NotNull(message = "开始时间不能为空")
|
|
||||||
private LocalDateTime startTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行时长,单位:毫秒
|
|
||||||
*/
|
|
||||||
@NotNull(message = "执行时长不能为空")
|
|
||||||
private Integer duration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果码
|
|
||||||
*/
|
|
||||||
@NotNull(message = "结果码不能为空")
|
|
||||||
private Integer resultCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果提示
|
|
||||||
*/
|
|
||||||
private String resultMsg;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结果数据
|
|
||||||
*/
|
|
||||||
private String resultData;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,12 @@ import lombok.Data;
|
|||||||
* @author HUIHUI
|
* @author HUIHUI
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class OperateLogV2PageReqDTO extends PageParam {
|
public class OperateLogPageReqDTO extends PageParam {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模块类型
|
* 模块类型
|
||||||
*/
|
*/
|
||||||
private String bizType;
|
private String type;
|
||||||
/**
|
/**
|
||||||
* 模块数据编号
|
* 模块数据编号
|
||||||
*/
|
*/
|
@ -13,7 +13,7 @@ import java.time.LocalDateTime;
|
|||||||
* @author HUIHUI
|
* @author HUIHUI
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class OperateLogV2RespDTO implements VO {
|
public class OperateLogRespDTO implements VO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 日志编号
|
* 日志编号
|
@ -1,85 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.system.api.logger.dto;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 系统操作日志 Create Request DTO
|
|
||||||
*
|
|
||||||
* @author HUIHUI
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class OperateLogV2CreateReqDTO {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 链路追踪编号
|
|
||||||
*
|
|
||||||
* 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
|
|
||||||
*/
|
|
||||||
private String traceId;
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*
|
|
||||||
* 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
|
|
||||||
*/
|
|
||||||
@NotNull(message = "用户编号不能为空")
|
|
||||||
private Long userId;
|
|
||||||
/**
|
|
||||||
* 用户类型
|
|
||||||
*
|
|
||||||
* 关联 {@link UserTypeEnum}
|
|
||||||
*/
|
|
||||||
@NotNull(message = "用户类型不能为空")
|
|
||||||
private Integer userType;
|
|
||||||
/**
|
|
||||||
* 操作模块类型
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "操作模块类型不能为空")
|
|
||||||
private String type;
|
|
||||||
/**
|
|
||||||
* 操作名
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "操作名不能为空")
|
|
||||||
private String subType;
|
|
||||||
/**
|
|
||||||
* 操作模块业务编号
|
|
||||||
*/
|
|
||||||
@NotNull(message = "操作模块业务编号不能为空")
|
|
||||||
private Long bizId;
|
|
||||||
/**
|
|
||||||
* 操作内容,记录整个操作的明细
|
|
||||||
* 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "操作内容不能为空")
|
|
||||||
private String action;
|
|
||||||
/**
|
|
||||||
* 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
|
|
||||||
* 例如说,记录订单编号,{ orderId: "1"}
|
|
||||||
*/
|
|
||||||
private String extra;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求方法名
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "请求方法名不能为空")
|
|
||||||
private String requestMethod;
|
|
||||||
/**
|
|
||||||
* 请求地址
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "请求地址不能为空")
|
|
||||||
private String requestUrl;
|
|
||||||
/**
|
|
||||||
* 用户 IP
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "用户 IP 不能为空")
|
|
||||||
private String userIp;
|
|
||||||
/**
|
|
||||||
* 浏览器 UA
|
|
||||||
*/
|
|
||||||
@NotEmpty(message = "浏览器 UA 不能为空")
|
|
||||||
private String userAgent;
|
|
||||||
|
|
||||||
}
|
|
@ -30,10 +30,6 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 业务组件 -->
|
<!-- 业务组件 -->
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
|
<artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.api.logger;
|
package cn.iocoder.yudao.module.system.api.logger;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogRespDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
|
|
||||||
import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
|
import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
|
||||||
import com.fhs.core.trans.anno.TransMethodResult;
|
import com.fhs.core.trans.anno.TransMethodResult;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
@ -29,24 +27,16 @@ public class OperateLogApiImpl implements OperateLogApi {
|
|||||||
private OperateLogService operateLogService;
|
private OperateLogService operateLogService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Async
|
||||||
public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
|
public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
|
||||||
operateLogService.createOperateLog(createReqDTO);
|
operateLogService.createOperateLog(createReqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Async
|
|
||||||
public void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO) {
|
|
||||||
operateLogService.createOperateLogV2(createReqDTO);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@TransMethodResult
|
@TransMethodResult
|
||||||
public PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO) {
|
public PageResult<OperateLogRespDTO> getOperateLogPage(OperateLogPageReqDTO pageReqVO) {
|
||||||
PageResult<OperateLogV2DO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO);
|
PageResult<OperateLogDO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO);
|
||||||
if (CollUtil.isEmpty(operateLogPage.getList())) {
|
return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class);
|
||||||
return PageResult.empty();
|
|
||||||
}
|
|
||||||
return BeanUtils.toBean(operateLogPage, OperateLogV2RespDTO.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.framework.security.config.SecurityProperties;
|
import cn.iocoder.yudao.framework.security.config.SecurityProperties;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
|
||||||
@ -66,7 +65,6 @@ public class AuthController {
|
|||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "使用账号密码登录")
|
@Operation(summary = "使用账号密码登录")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) {
|
public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) {
|
||||||
return success(authService.login(reqVO));
|
return success(authService.login(reqVO));
|
||||||
}
|
}
|
||||||
@ -74,7 +72,6 @@ public class AuthController {
|
|||||||
@PostMapping("/logout")
|
@PostMapping("/logout")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "登出系统")
|
@Operation(summary = "登出系统")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<Boolean> logout(HttpServletRequest request) {
|
public CommonResult<Boolean> logout(HttpServletRequest request) {
|
||||||
String token = SecurityFrameworkUtils.obtainAuthorization(request,
|
String token = SecurityFrameworkUtils.obtainAuthorization(request,
|
||||||
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
|
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
|
||||||
@ -88,7 +85,6 @@ public class AuthController {
|
|||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "刷新令牌")
|
@Operation(summary = "刷新令牌")
|
||||||
@Parameter(name = "refreshToken", description = "刷新令牌", required = true)
|
@Parameter(name = "refreshToken", description = "刷新令牌", required = true)
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AuthLoginRespVO> refreshToken(@RequestParam("refreshToken") String refreshToken) {
|
public CommonResult<AuthLoginRespVO> refreshToken(@RequestParam("refreshToken") String refreshToken) {
|
||||||
return success(authService.refreshToken(refreshToken));
|
return success(authService.refreshToken(refreshToken));
|
||||||
}
|
}
|
||||||
@ -124,7 +120,6 @@ public class AuthController {
|
|||||||
@PostMapping("/sms-login")
|
@PostMapping("/sms-login")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "使用短信验证码登录")
|
@Operation(summary = "使用短信验证码登录")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AuthLoginRespVO> smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) {
|
public CommonResult<AuthLoginRespVO> smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) {
|
||||||
return success(authService.smsLogin(reqVO));
|
return success(authService.smsLogin(reqVO));
|
||||||
}
|
}
|
||||||
@ -132,7 +127,6 @@ public class AuthController {
|
|||||||
@PostMapping("/send-sms-code")
|
@PostMapping("/send-sms-code")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "发送手机验证码")
|
@Operation(summary = "发送手机验证码")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<Boolean> sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) {
|
public CommonResult<Boolean> sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) {
|
||||||
authService.sendSmsCode(reqVO);
|
authService.sendSmsCode(reqVO);
|
||||||
return success(true);
|
return success(true);
|
||||||
@ -156,7 +150,6 @@ public class AuthController {
|
|||||||
@PostMapping("/social-login")
|
@PostMapping("/social-login")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户")
|
@Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AuthLoginRespVO> socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) {
|
public CommonResult<AuthLoginRespVO> socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) {
|
||||||
return success(authService.socialLogin(reqVO));
|
return success(authService.socialLogin(reqVO));
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.controller.admin.captcha;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import com.xingyuv.captcha.model.common.ResponseModel;
|
import com.xingyuv.captcha.model.common.ResponseModel;
|
||||||
import com.xingyuv.captcha.model.vo.CaptchaVO;
|
import com.xingyuv.captcha.model.vo.CaptchaVO;
|
||||||
import com.xingyuv.captcha.service.CaptchaService;
|
import com.xingyuv.captcha.service.CaptchaService;
|
||||||
@ -28,7 +27,6 @@ public class CaptchaController {
|
|||||||
@PostMapping({"/get"})
|
@PostMapping({"/get"})
|
||||||
@Operation(summary = "获得验证码")
|
@Operation(summary = "获得验证码")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) {
|
public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) {
|
||||||
assert request.getRemoteHost() != null;
|
assert request.getRemoteHost() != null;
|
||||||
data.setBrowserInfo(getRemoteId(request));
|
data.setBrowserInfo(getRemoteId(request));
|
||||||
@ -38,7 +36,6 @@ public class CaptchaController {
|
|||||||
@PostMapping("/check")
|
@PostMapping("/check")
|
||||||
@Operation(summary = "校验验证码")
|
@Operation(summary = "校验验证码")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) {
|
public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) {
|
||||||
data.setBrowserInfo(getRemoteId(request));
|
data.setBrowserInfo(getRemoteId(request));
|
||||||
return captchaService.check(data);
|
return captchaService.check(data);
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.dept;
|
package cn.iocoder.yudao.module.system.controller.admin.dept;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostRespVO;
|
||||||
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSimpleRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSimpleRespVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
|
||||||
import cn.iocoder.yudao.module.system.service.dept.PostService;
|
import cn.iocoder.yudao.module.system.service.dept.PostService;
|
||||||
@ -28,8 +28,8 @@ import java.util.Collections;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 岗位")
|
@Tag(name = "管理后台 - 岗位")
|
||||||
@RestController
|
@RestController
|
||||||
@ -94,7 +94,7 @@ public class PostController {
|
|||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@Operation(summary = "岗位管理")
|
@Operation(summary = "岗位管理")
|
||||||
@PreAuthorize("@ss.hasPermission('system:post:export')")
|
@PreAuthorize("@ss.hasPermission('system:post:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException {
|
public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException {
|
||||||
reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
List<PostDO> list = postService.getPostPage(reqVO).getList();
|
List<PostDO> list = postService.getPostPage(reqVO).getList();
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.dict;
|
package cn.iocoder.yudao.module.system.controller.admin.dict;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
|
||||||
@ -26,8 +26,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 字典数据")
|
@Tag(name = "管理后台 - 字典数据")
|
||||||
@RestController
|
@RestController
|
||||||
@ -92,7 +92,7 @@ public class DictDataController {
|
|||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@Operation(summary = "导出字典数据")
|
@Operation(summary = "导出字典数据")
|
||||||
@PreAuthorize("@ss.hasPermission('system:dict:export')")
|
@PreAuthorize("@ss.hasPermission('system:dict:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void export(HttpServletResponse response, @Valid DictDataPageReqVO exportReqVO) throws IOException {
|
public void export(HttpServletResponse response, @Valid DictDataPageReqVO exportReqVO) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
List<DictDataDO> list = dictDataService.getDictDataPage(exportReqVO).getList();
|
List<DictDataDO> list = dictDataService.getDictDataPage(exportReqVO).getList();
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.dict;
|
package cn.iocoder.yudao.module.system.controller.admin.dict;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO;
|
||||||
@ -25,8 +25,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 字典类型")
|
@Tag(name = "管理后台 - 字典类型")
|
||||||
@RestController
|
@RestController
|
||||||
@ -90,7 +90,7 @@ public class DictTypeController {
|
|||||||
@Operation(summary = "导出数据类型")
|
@Operation(summary = "导出数据类型")
|
||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@PreAuthorize("@ss.hasPermission('system:dict:query')")
|
@PreAuthorize("@ss.hasPermission('system:dict:query')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void export(HttpServletResponse response, @Valid DictTypePageReqVO exportReqVO) throws IOException {
|
public void export(HttpServletResponse response, @Valid DictTypePageReqVO exportReqVO) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
List<DictTypeDO> list = dictTypeService.getDictTypePage(exportReqVO).getList();
|
List<DictTypeDO> list = dictTypeService.getDictTypePage(exportReqVO).getList();
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.errorcode;
|
package cn.iocoder.yudao.module.system.controller.admin.errorcode;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.*;
|
import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeRespVO;
|
||||||
|
import cn.iocoder.yudao.module.system.controller.admin.errorcode.vo.ErrorCodeSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.errorcode.ErrorCodeDO;
|
||||||
import cn.iocoder.yudao.module.system.service.errorcode.ErrorCodeService;
|
import cn.iocoder.yudao.module.system.service.errorcode.ErrorCodeService;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@ -22,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 错误码")
|
@Tag(name = "管理后台 - 错误码")
|
||||||
@RestController
|
@RestController
|
||||||
@ -78,7 +80,7 @@ public class ErrorCodeController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出错误码 Excel")
|
@Operation(summary = "导出错误码 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:error-code:export')")
|
@PreAuthorize("@ss.hasPermission('system:error-code:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportErrorCodeExcel(@Valid ErrorCodePageReqVO exportReqVO,
|
public void exportErrorCodeExcel(@Valid ErrorCodePageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.logger;
|
package cn.iocoder.yudao.module.system.controller.admin.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.logger.LoginLogDO;
|
||||||
@ -24,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 登录日志")
|
@Tag(name = "管理后台 - 登录日志")
|
||||||
@RestController
|
@RestController
|
||||||
@ -47,7 +47,7 @@ public class LoginLogController {
|
|||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@Operation(summary = "导出登录日志 Excel")
|
@Operation(summary = "导出登录日志 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:login-log:export')")
|
@PreAuthorize("@ss.hasPermission('system:login-log:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportLoginLog(HttpServletResponse response, @Valid LoginLogPageReqVO exportReqVO) throws IOException {
|
public void exportLoginLog(HttpServletResponse response, @Valid LoginLogPageReqVO exportReqVO) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
List<LoginLogDO> list = loginLogService.getLoginLogPage(exportReqVO).getList();
|
List<LoginLogDO> list = loginLogService.getLoginLogPage(exportReqVO).getList();
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.logger;
|
package cn.iocoder.yudao.module.system.controller.admin.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.framework.translate.core.TranslateUtils;
|
import cn.iocoder.yudao.framework.translate.core.TranslateUtils;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
|
||||||
@ -25,8 +25,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 操作日志")
|
@Tag(name = "管理后台 - 操作日志")
|
||||||
@RestController
|
@RestController
|
||||||
@ -48,7 +48,7 @@ public class OperateLogController {
|
|||||||
@Operation(summary = "导出操作日志")
|
@Operation(summary = "导出操作日志")
|
||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@PreAuthorize("@ss.hasPermission('system:operate-log:export')")
|
@PreAuthorize("@ss.hasPermission('system:operate-log:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportOperateLog(HttpServletResponse response, @Valid OperateLogPageReqVO exportReqVO) throws IOException {
|
public void exportOperateLog(HttpServletResponse response, @Valid OperateLogPageReqVO exportReqVO) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
List<OperateLogDO> list = operateLogService.getOperateLogPage(exportReqVO).getList();
|
List<OperateLogDO> list = operateLogService.getOperateLogPage(exportReqVO).getList();
|
||||||
|
@ -13,20 +13,23 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
|
|||||||
@Data
|
@Data
|
||||||
public class OperateLogPageReqVO extends PageParam {
|
public class OperateLogPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@Schema(description = "用户编号", example = "芋道")
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
@Schema(description = "操作模块业务编号", example = "1")
|
||||||
|
private Long bizId;
|
||||||
|
|
||||||
@Schema(description = "操作模块,模拟匹配", example = "订单")
|
@Schema(description = "操作模块,模拟匹配", example = "订单")
|
||||||
private String module;
|
private String type;
|
||||||
|
|
||||||
@Schema(description = "用户昵称,模拟匹配", example = "芋道")
|
@Schema(description = "操作名,模拟匹配", example = "创建订单")
|
||||||
private String userNickname;
|
private String subType;
|
||||||
|
|
||||||
@Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", example = "1")
|
@Schema(description = "操作明细,模拟匹配", example = "修改编号为 1 的用户信息")
|
||||||
private Integer type;
|
private String action;
|
||||||
|
|
||||||
@Schema(description = "操作状态", example = "true")
|
|
||||||
private Boolean success;
|
|
||||||
|
|
||||||
@Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
|
@Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] startTime;
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog;
|
package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
|
||||||
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||||
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
|
|
||||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import com.fhs.core.trans.anno.Trans;
|
import com.fhs.core.trans.anno.Trans;
|
||||||
@ -14,7 +11,6 @@ import lombok.Data;
|
|||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 操作日志 Response VO")
|
@Schema(description = "管理后台 - 操作日志 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@ -29,31 +25,29 @@ public class OperateLogRespVO implements VO {
|
|||||||
private String traceId;
|
private String traceId;
|
||||||
|
|
||||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
@Trans(type = TransType.SIMPLE, target = AdminUserDO.class, fields = "nickname", ref = "userNickname")
|
@Trans(type = TransType.SIMPLE, target = AdminUserDO.class, fields = "nickname", ref = "userName")
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
|
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
|
||||||
@ExcelProperty("操作人")
|
@ExcelProperty("操作人")
|
||||||
private String userNickname;
|
private String userName;
|
||||||
|
|
||||||
@Schema(description = "操作模块", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单")
|
@Schema(description = "操作模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单")
|
||||||
@ExcelProperty("操作模块")
|
@ExcelProperty("操作模块类型")
|
||||||
private String module;
|
private String type;
|
||||||
|
|
||||||
@Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单")
|
@Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单")
|
||||||
@ExcelProperty("操作名")
|
@ExcelProperty("操作名")
|
||||||
private String name;
|
private String subType;
|
||||||
|
|
||||||
@Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "操作模块业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@ExcelProperty(value = "操作类型", converter = DictConvert.class)
|
@ExcelProperty("操作模块业务编号")
|
||||||
@DictFormat(DictTypeConstants.OPERATE_TYPE)
|
private Long bizId;
|
||||||
private Integer type;
|
|
||||||
|
|
||||||
@Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。")
|
@Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。")
|
||||||
private String content;
|
private String action;
|
||||||
|
|
||||||
@Schema(description = "拓展字段", example = "{'orderId': 1}")
|
@Schema(description = "拓展字段", example = "{'orderId': 1}")
|
||||||
private Map<String, Object> exts;
|
private String extra;
|
||||||
|
|
||||||
@Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET")
|
@Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET")
|
||||||
@NotEmpty(message = "请求方法名不能为空")
|
@NotEmpty(message = "请求方法名不能为空")
|
||||||
@ -68,28 +62,7 @@ public class OperateLogRespVO implements VO {
|
|||||||
@Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0")
|
@Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0")
|
||||||
private String userAgent;
|
private String userAgent;
|
||||||
|
|
||||||
@Schema(description = "Java 方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "cn.iocoder.yudao.adminserver.UserController.save(...)")
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private String javaMethod;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
@Schema(description = "Java 方法的参数")
|
|
||||||
private String javaMethodArgs;
|
|
||||||
|
|
||||||
@Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
|
||||||
@ExcelProperty("操作日志")
|
|
||||||
private LocalDateTime startTime;
|
|
||||||
|
|
||||||
@Schema(description = "执行时长,单位:毫秒", requiredMode = Schema.RequiredMode.REQUIRED)
|
|
||||||
@ExcelProperty("执行时长")
|
|
||||||
private Integer duration;
|
|
||||||
|
|
||||||
@Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED)
|
|
||||||
@ExcelProperty(value = "结果码")
|
|
||||||
private Integer resultCode;
|
|
||||||
|
|
||||||
@Schema(description = "结果提示")
|
|
||||||
private String resultMsg;
|
|
||||||
|
|
||||||
@Schema(description = "结果数据")
|
|
||||||
private String resultData;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.notify;
|
package cn.iocoder.yudao.module.system.controller.admin.notify;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
@ -88,6 +89,7 @@ public class NotifyMessageController {
|
|||||||
|
|
||||||
@GetMapping("/get-unread-count")
|
@GetMapping("/get-unread-count")
|
||||||
@Operation(summary = "获得当前用户的未读站内信数量")
|
@Operation(summary = "获得当前用户的未读站内信数量")
|
||||||
|
@ApiAccessLog(enable = false) // 由于前端会不断轮询该接口,记录日志没有意义
|
||||||
public CommonResult<Long> getUnreadNotifyMessageCount() {
|
public CommonResult<Long> getUnreadNotifyMessageCount() {
|
||||||
return success(notifyMessageService.getUnreadNotifyMessageCount(
|
return success(notifyMessageService.getUnreadNotifyMessageCount(
|
||||||
getLoginUserId(), UserTypeEnum.ADMIN.getValue()));
|
getLoginUserId(), UserTypeEnum.ADMIN.getValue()));
|
||||||
|
@ -8,7 +8,6 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
|
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO;
|
||||||
@ -95,7 +94,6 @@ public class OAuth2OpenController {
|
|||||||
@Parameter(name = "scope", example = "user_info"),
|
@Parameter(name = "scope", example = "user_info"),
|
||||||
@Parameter(name = "refresh_token", example = "123424233"),
|
@Parameter(name = "refresh_token", example = "123424233"),
|
||||||
})
|
})
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<OAuth2OpenAccessTokenRespVO> postAccessToken(HttpServletRequest request,
|
public CommonResult<OAuth2OpenAccessTokenRespVO> postAccessToken(HttpServletRequest request,
|
||||||
@RequestParam("grant_type") String grantType,
|
@RequestParam("grant_type") String grantType,
|
||||||
@RequestParam(value = "code", required = false) String code, // 授权码模式
|
@RequestParam(value = "code", required = false) String code, // 授权码模式
|
||||||
@ -146,7 +144,6 @@ public class OAuth2OpenController {
|
|||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "删除访问令牌")
|
@Operation(summary = "删除访问令牌")
|
||||||
@Parameter(name = "token", required = true, description = "访问令牌", example = "biu")
|
@Parameter(name = "token", required = true, description = "访问令牌", example = "biu")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<Boolean> revokeToken(HttpServletRequest request,
|
public CommonResult<Boolean> revokeToken(HttpServletRequest request,
|
||||||
@RequestParam("token") String token) {
|
@RequestParam("token") String token) {
|
||||||
// 校验客户端
|
// 校验客户端
|
||||||
@ -165,7 +162,6 @@ public class OAuth2OpenController {
|
|||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "校验访问令牌")
|
@Operation(summary = "校验访问令牌")
|
||||||
@Parameter(name = "token", required = true, description = "访问令牌", example = "biu")
|
@Parameter(name = "token", required = true, description = "访问令牌", example = "biu")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<OAuth2OpenCheckTokenRespVO> checkToken(HttpServletRequest request,
|
public CommonResult<OAuth2OpenCheckTokenRespVO> checkToken(HttpServletRequest request,
|
||||||
@RequestParam("token") String token) {
|
@RequestParam("token") String token) {
|
||||||
// 校验客户端
|
// 校验客户端
|
||||||
@ -216,7 +212,6 @@ public class OAuth2OpenController {
|
|||||||
@Parameter(name = "auto_approve", required = true, description = "用户是否接受", example = "true"),
|
@Parameter(name = "auto_approve", required = true, description = "用户是否接受", example = "true"),
|
||||||
@Parameter(name = "state", example = "1")
|
@Parameter(name = "state", example = "1")
|
||||||
})
|
})
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<String> approveOrDeny(@RequestParam("response_type") String responseType,
|
public CommonResult<String> approveOrDeny(@RequestParam("response_type") String responseType,
|
||||||
@RequestParam("client_id") String clientId,
|
@RequestParam("client_id") String clientId,
|
||||||
@RequestParam(value = "scope", required = false) String scope,
|
@RequestParam(value = "scope", required = false) String scope,
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.permission;
|
package cn.iocoder.yudao.module.system.controller.admin.permission;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*;
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
||||||
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
||||||
@ -24,8 +24,8 @@ import java.io.IOException;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
import static java.util.Collections.singleton;
|
import static java.util.Collections.singleton;
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 角色")
|
@Tag(name = "管理后台 - 角色")
|
||||||
@ -95,7 +95,7 @@ public class RoleController {
|
|||||||
|
|
||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出角色 Excel")
|
@Operation(summary = "导出角色 Excel")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
@PreAuthorize("@ss.hasPermission('system:role:export')")
|
@PreAuthorize("@ss.hasPermission('system:role:export')")
|
||||||
public void export(HttpServletResponse response, @Validated RolePageReqVO exportReqVO) throws IOException {
|
public void export(HttpServletResponse response, @Validated RolePageReqVO exportReqVO) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.sensitiveword;
|
package cn.iocoder.yudao.module.system.controller.admin.sensitiveword;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordSaveVO;
|
import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordSaveVO;
|
||||||
@ -25,8 +25,8 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 敏感词")
|
@Tag(name = "管理后台 - 敏感词")
|
||||||
@RestController
|
@RestController
|
||||||
@ -81,7 +81,7 @@ public class SensitiveWordController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出敏感词 Excel")
|
@Operation(summary = "导出敏感词 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:sensitive-word:export')")
|
@PreAuthorize("@ss.hasPermission('system:sensitive-word:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportSensitiveWordExcel(@Valid SensitiveWordPageReqVO exportReqVO,
|
public void exportSensitiveWordExcel(@Valid SensitiveWordPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.controller.admin.sms;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsChannelEnum;
|
import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsChannelEnum;
|
||||||
import cn.iocoder.yudao.module.system.service.sms.SmsSendService;
|
import cn.iocoder.yudao.module.system.service.sms.SmsSendService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
@ -28,7 +27,6 @@ public class SmsCallbackController {
|
|||||||
@PostMapping("/aliyun")
|
@PostMapping("/aliyun")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "阿里云短信的回调", description = "参见 https://help.aliyun.com/document_detail/120998.html 文档")
|
@Operation(summary = "阿里云短信的回调", description = "参见 https://help.aliyun.com/document_detail/120998.html 文档")
|
||||||
@OperateLog(enable = false)
|
|
||||||
public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
|
public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
|
||||||
String text = ServletUtils.getBody(request);
|
String text = ServletUtils.getBody(request);
|
||||||
smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
|
smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
|
||||||
@ -38,7 +36,6 @@ public class SmsCallbackController {
|
|||||||
@PostMapping("/tencent")
|
@PostMapping("/tencent")
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档")
|
@Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档")
|
||||||
@OperateLog(enable = false)
|
|
||||||
public CommonResult<Boolean> receiveTencentSmsStatus(HttpServletRequest request) throws Throwable {
|
public CommonResult<Boolean> receiveTencentSmsStatus(HttpServletRequest request) throws Throwable {
|
||||||
String text = ServletUtils.getBody(request);
|
String text = ServletUtils.getBody(request);
|
||||||
smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text);
|
smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.sms;
|
package cn.iocoder.yudao.module.system.controller.admin.sms;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogRespVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO;
|
||||||
@ -24,8 +24,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 短信日志")
|
@Tag(name = "管理后台 - 短信日志")
|
||||||
@RestController
|
@RestController
|
||||||
@ -47,7 +47,7 @@ public class SmsLogController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出短信日志 Excel")
|
@Operation(summary = "导出短信日志 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:sms-log:export')")
|
@PreAuthorize("@ss.hasPermission('system:sms-log:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportSmsLogExcel(@Valid SmsLogPageReqVO exportReqVO,
|
public void exportSmsLogExcel(@Valid SmsLogPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.sms;
|
package cn.iocoder.yudao.module.system.controller.admin.sms;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*;
|
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.*;
|
||||||
@ -9,7 +10,6 @@ import cn.iocoder.yudao.module.system.service.sms.SmsSendService;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
@ -22,8 +22,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 短信模板")
|
@Tag(name = "管理后台 - 短信模板")
|
||||||
@RestController
|
@RestController
|
||||||
@ -79,7 +79,7 @@ public class SmsTemplateController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出短信模板 Excel")
|
@Operation(summary = "导出短信模板 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:sms-template:export')")
|
@PreAuthorize("@ss.hasPermission('system:sms-template:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportSmsTemplateExcel(@Valid SmsTemplatePageReqVO exportReqVO,
|
public void exportSmsTemplateExcel(@Valid SmsTemplatePageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.tenant;
|
package cn.iocoder.yudao.module.system.controller.admin.tenant;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
|
||||||
@ -25,8 +25,8 @@ import javax.validation.Valid;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 租户")
|
@Tag(name = "管理后台 - 租户")
|
||||||
@RestController
|
@RestController
|
||||||
@ -98,7 +98,7 @@ public class TenantController {
|
|||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出租户 Excel")
|
@Operation(summary = "导出租户 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('system:tenant:export')")
|
@PreAuthorize("@ss.hasPermission('system:tenant:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportTenantExcel(@Valid TenantPageReqVO exportReqVO,
|
public void exportTenantExcel(@Valid TenantPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.user;
|
package cn.iocoder.yudao.module.system.controller.admin.user;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.framework.apilog.core.annotations.ApiAccessLog;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
|
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
|
||||||
import cn.iocoder.yudao.module.system.convert.user.UserConvert;
|
import cn.iocoder.yudao.module.system.convert.user.UserConvert;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
|
||||||
@ -31,9 +31,9 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 用户")
|
@Tag(name = "管理后台 - 用户")
|
||||||
@RestController
|
@RestController
|
||||||
@ -127,7 +127,7 @@ public class UserController {
|
|||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
@Operation(summary = "导出用户")
|
@Operation(summary = "导出用户")
|
||||||
@PreAuthorize("@ss.hasPermission('system:user:export')")
|
@PreAuthorize("@ss.hasPermission('system:user:export')")
|
||||||
@OperateLog(type = EXPORT)
|
@ApiAccessLog(operateType = EXPORT)
|
||||||
public void exportUserList(@Validated UserPageReqVO exportReqVO,
|
public void exportUserList(@Validated UserPageReqVO exportReqVO,
|
||||||
HttpServletResponse response) throws IOException {
|
HttpServletResponse response) throws IOException {
|
||||||
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||||
|
@ -1,19 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.dal.dataobject.logger;
|
package cn.iocoder.yudao.module.system.dal.dataobject.logger;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
|
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志表
|
* 操作日志表
|
||||||
@ -23,19 +15,8 @@ import java.util.Map;
|
|||||||
@TableName(value = "system_operate_log", autoResultMap = true)
|
@TableName(value = "system_operate_log", autoResultMap = true)
|
||||||
@KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
@KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class OperateLogDO extends BaseDO {
|
public class OperateLogDO extends BaseDO {
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link #javaMethodArgs} 的最大长度
|
|
||||||
*/
|
|
||||||
public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link #resultData} 的最大长度
|
|
||||||
*/
|
|
||||||
public static final Integer RESULT_MAX_LENGTH = 4000;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 日志主键
|
* 日志主键
|
||||||
*/
|
*/
|
||||||
@ -60,30 +41,29 @@ public class OperateLogDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Integer userType;
|
private Integer userType;
|
||||||
/**
|
/**
|
||||||
* 操作模块
|
* 操作模块类型
|
||||||
*/
|
*/
|
||||||
private String module;
|
private String type;
|
||||||
/**
|
/**
|
||||||
* 操作名
|
* 操作名
|
||||||
*/
|
*/
|
||||||
private String name;
|
private String subType;
|
||||||
/**
|
/**
|
||||||
* 操作分类
|
* 操作模块业务编号
|
||||||
*
|
|
||||||
* 枚举 {@link OperateTypeEnum}
|
|
||||||
*/
|
*/
|
||||||
private Integer type;
|
private Long bizId;
|
||||||
/**
|
/**
|
||||||
* 操作内容,记录整个操作的明细
|
* 日志内容,记录整个操作的明细
|
||||||
|
*
|
||||||
* 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
|
* 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
|
||||||
*/
|
*/
|
||||||
private String content;
|
private String action;
|
||||||
/**
|
/**
|
||||||
* 拓展字段,有些复杂的业务,需要记录一些字段
|
* 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
|
||||||
* 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号
|
*
|
||||||
|
* 例如说,记录订单编号,{ orderId: "1"}
|
||||||
*/
|
*/
|
||||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
private String extra;
|
||||||
private Map<String, Object> exts;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求方法名
|
* 请求方法名
|
||||||
@ -102,43 +82,4 @@ public class OperateLogDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private String userAgent;
|
private String userAgent;
|
||||||
|
|
||||||
/**
|
|
||||||
* Java 方法名
|
|
||||||
*/
|
|
||||||
private String javaMethod;
|
|
||||||
/**
|
|
||||||
* Java 方法的参数
|
|
||||||
*
|
|
||||||
* 实际格式为 Map<String, Object>
|
|
||||||
* 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败
|
|
||||||
* 其中,key 为参数名,value 为参数值
|
|
||||||
*/
|
|
||||||
private String javaMethodArgs;
|
|
||||||
/**
|
|
||||||
* 开始时间
|
|
||||||
*/
|
|
||||||
private LocalDateTime startTime;
|
|
||||||
/**
|
|
||||||
* 执行时长,单位:毫秒
|
|
||||||
*/
|
|
||||||
private Integer duration;
|
|
||||||
/**
|
|
||||||
* 结果码
|
|
||||||
*
|
|
||||||
* 目前使用的 {@link CommonResult#getCode()} 属性
|
|
||||||
*/
|
|
||||||
private Integer resultCode;
|
|
||||||
/**
|
|
||||||
* 结果提示
|
|
||||||
*
|
|
||||||
* 目前使用的 {@link CommonResult#getMsg()} 属性
|
|
||||||
*/
|
|
||||||
private String resultMsg;
|
|
||||||
/**
|
|
||||||
* 结果数据
|
|
||||||
*
|
|
||||||
* 如果是对象,则使用 JSON 格式化
|
|
||||||
*/
|
|
||||||
private String resultData;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.system.dal.dataobject.logger;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作日志表 V2
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@TableName(value = "system_operate_log_v2", autoResultMap = true)
|
|
||||||
@KeySequence("system_operate_log_seq_v2") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class OperateLogV2DO extends BaseDO {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 日志主键
|
|
||||||
*/
|
|
||||||
@TableId
|
|
||||||
private Long id;
|
|
||||||
/**
|
|
||||||
* 链路追踪编号
|
|
||||||
*
|
|
||||||
* 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
|
|
||||||
*/
|
|
||||||
private String traceId;
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*
|
|
||||||
* 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
|
|
||||||
*/
|
|
||||||
private Long userId;
|
|
||||||
/**
|
|
||||||
* 用户类型
|
|
||||||
*
|
|
||||||
* 关联 {@link UserTypeEnum}
|
|
||||||
*/
|
|
||||||
private Integer userType;
|
|
||||||
/**
|
|
||||||
* 操作模块类型
|
|
||||||
*/
|
|
||||||
private String type;
|
|
||||||
/**
|
|
||||||
* 操作名
|
|
||||||
*/
|
|
||||||
private String subType;
|
|
||||||
/**
|
|
||||||
* 操作模块业务编号
|
|
||||||
*/
|
|
||||||
private Long bizId;
|
|
||||||
/**
|
|
||||||
* 日志内容,记录整个操作的明细
|
|
||||||
*
|
|
||||||
* 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
|
|
||||||
*/
|
|
||||||
private String action;
|
|
||||||
/**
|
|
||||||
* 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 )
|
|
||||||
*
|
|
||||||
* 例如说,记录订单编号,{ orderId: "1"}
|
|
||||||
*/
|
|
||||||
private String extra;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求方法名
|
|
||||||
*/
|
|
||||||
private String requestMethod;
|
|
||||||
/**
|
|
||||||
* 请求地址
|
|
||||||
*/
|
|
||||||
private String requestUrl;
|
|
||||||
/**
|
|
||||||
* 用户 IP
|
|
||||||
*/
|
|
||||||
private String userIp;
|
|
||||||
/**
|
|
||||||
* 浏览器 UA
|
|
||||||
*/
|
|
||||||
private String userAgent;
|
|
||||||
|
|
||||||
}
|
|
@ -1,31 +1,33 @@
|
|||||||
package cn.iocoder.yudao.module.system.dal.mysql.logger;
|
package cn.iocoder.yudao.module.system.dal.mysql.logger;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface OperateLogMapper extends BaseMapperX<OperateLogDO> {
|
public interface OperateLogMapper extends BaseMapperX<OperateLogDO> {
|
||||||
|
|
||||||
default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) {
|
default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO pageReqDTO) {
|
||||||
LambdaQueryWrapperX<OperateLogDO> query = new LambdaQueryWrapperX<OperateLogDO>()
|
return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogDO>()
|
||||||
.likeIfPresent(OperateLogDO::getModule, reqVO.getModule())
|
.eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId())
|
||||||
.inIfPresent(OperateLogDO::getUserId, userIds)
|
.eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId())
|
||||||
.eqIfPresent(OperateLogDO::getType, reqVO.getType())
|
.likeIfPresent(OperateLogDO::getType, pageReqDTO.getType())
|
||||||
.betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime());
|
.likeIfPresent(OperateLogDO::getSubType, pageReqDTO.getSubType())
|
||||||
if (Boolean.TRUE.equals(reqVO.getSuccess())) {
|
.likeIfPresent(OperateLogDO::getAction, pageReqDTO.getAction())
|
||||||
query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());
|
.betweenIfPresent(OperateLogDO::getCreateTime, pageReqDTO.getCreateTime())
|
||||||
} else if (Boolean.FALSE.equals(reqVO.getSuccess())) {
|
.orderByDesc(OperateLogDO::getId));
|
||||||
query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode());
|
}
|
||||||
}
|
|
||||||
query.orderByDesc(OperateLogDO::getId); // 降序
|
default PageResult<OperateLogDO> selectPage(OperateLogPageReqDTO pageReqDTO) {
|
||||||
return selectPage(reqVO, query);
|
return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogDO>()
|
||||||
|
.eqIfPresent(OperateLogDO::getType, pageReqDTO.getType())
|
||||||
|
.eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId())
|
||||||
|
.eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId())
|
||||||
|
.orderByDesc(OperateLogDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.system.dal.mysql.logger;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface OperateLogV2Mapper extends BaseMapperX<OperateLogV2DO> {
|
|
||||||
|
|
||||||
default PageResult<OperateLogV2DO> selectPage(OperateLogV2PageReqDTO pageReqDTO) {
|
|
||||||
return selectPage(pageReqDTO, new LambdaQueryWrapperX<OperateLogV2DO>()
|
|
||||||
.eqIfPresent(OperateLogV2DO::getType, pageReqDTO.getBizType())
|
|
||||||
.eqIfPresent(OperateLogV2DO::getBizId, pageReqDTO.getBizId())
|
|
||||||
.eqIfPresent(OperateLogV2DO::getUserId, pageReqDTO.getUserId())
|
|
||||||
.orderByDesc(OperateLogV2DO::getId));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.system.service.logger;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志 Service 接口
|
* 操作日志 Service 接口
|
||||||
@ -18,7 +16,7 @@ public interface OperateLogService {
|
|||||||
/**
|
/**
|
||||||
* 记录操作日志
|
* 记录操作日志
|
||||||
*
|
*
|
||||||
* @param createReqDTO 操作日志请求
|
* @param createReqDTO 创建请求
|
||||||
*/
|
*/
|
||||||
void createOperateLog(OperateLogCreateReqDTO createReqDTO);
|
void createOperateLog(OperateLogCreateReqDTO createReqDTO);
|
||||||
|
|
||||||
@ -30,21 +28,12 @@ public interface OperateLogService {
|
|||||||
*/
|
*/
|
||||||
PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO);
|
PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO);
|
||||||
|
|
||||||
// ======================= LOG V2 =======================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 记录操作日志 V2
|
|
||||||
*
|
|
||||||
* @param createReqDTO 创建请求
|
|
||||||
*/
|
|
||||||
void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得操作日志分页列表
|
* 获得操作日志分页列表
|
||||||
*
|
*
|
||||||
* @param pageReqVO 分页条件
|
* @param pageReqVO 分页条件
|
||||||
* @return 操作日志分页列表
|
* @return 操作日志分页列表
|
||||||
*/
|
*/
|
||||||
PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO);
|
PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqDTO pageReqVO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,30 +1,17 @@
|
|||||||
package cn.iocoder.yudao.module.system.service.logger;
|
package cn.iocoder.yudao.module.system.service.logger;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.string.StrUtils;
|
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
|
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper;
|
|
||||||
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
||||||
import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH;
|
|
||||||
import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.RESULT_MAX_LENGTH;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志 Service 实现类
|
* 操作日志 Service 实现类
|
||||||
@ -38,45 +25,21 @@ public class OperateLogServiceImpl implements OperateLogService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private OperateLogMapper operateLogMapper;
|
private OperateLogMapper operateLogMapper;
|
||||||
@Resource
|
|
||||||
private OperateLogV2Mapper operateLogV2Mapper;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private AdminUserService userService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
|
public void createOperateLog(OperateLogCreateReqDTO createReqDTO) {
|
||||||
OperateLogDO log = BeanUtils.toBean(createReqDTO, OperateLogDO.class);
|
OperateLogDO log = BeanUtils.toBean(createReqDTO, OperateLogDO.class);
|
||||||
log.setJavaMethodArgs(StrUtils.maxLength(log.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH));
|
|
||||||
log.setResultData(StrUtils.maxLength(log.getResultData(), RESULT_MAX_LENGTH));
|
|
||||||
operateLogMapper.insert(log);
|
operateLogMapper.insert(log);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) {
|
public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) {
|
||||||
// 处理基于用户昵称的查询
|
return operateLogMapper.selectPage(pageReqVO);
|
||||||
Collection<Long> userIds = null;
|
|
||||||
if (StrUtil.isNotEmpty(pageReqVO.getUserNickname())) {
|
|
||||||
userIds = convertSet(userService.getUserListByNickname(pageReqVO.getUserNickname()), AdminUserDO::getId);
|
|
||||||
if (CollUtil.isEmpty(userIds)) {
|
|
||||||
return PageResult.empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 查询分页
|
|
||||||
return operateLogMapper.selectPage(pageReqVO, userIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ======================= LOG V2 =======================
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO) {
|
|
||||||
OperateLogV2DO log = BeanUtils.toBean(createReqDTO, OperateLogV2DO.class);
|
|
||||||
operateLogV2Mapper.insert(log);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqDTO) {
|
public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqDTO pageReqDTO) {
|
||||||
return operateLogV2Mapper.selectPage(pageReqDTO);
|
return operateLogMapper.selectPage(pageReqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user