Commit 7c79aae2b42a05ea743e8353a0b9d5497cd21708
Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/iot
# Conflicts: # yudao-server/src/main/resources/application-local.yaml
Showing
334 changed files
with
6166 additions
and
2646 deletions
Too many changes.
To preserve performance only 100 of 334 files are displayed.
pom.xml
| @@ -32,7 +32,7 @@ | @@ -32,7 +32,7 @@ | ||
| 32 | <url>https://github.com/YunaiV/ruoyi-vue-pro</url> | 32 | <url>https://github.com/YunaiV/ruoyi-vue-pro</url> |
| 33 | 33 | ||
| 34 | <properties> | 34 | <properties> |
| 35 | - <revision>2.1.0-snapshot</revision> | 35 | + <revision>2.2.0-snapshot</revision> |
| 36 | <!-- Maven 相关 --> | 36 | <!-- Maven 相关 --> |
| 37 | <java.version>17</java.version> | 37 | <java.version>17</java.version> |
| 38 | <maven.compiler.source>${java.version}</maven.compiler.source> | 38 | <maven.compiler.source>${java.version}</maven.compiler.source> |
sql/mysql/ruoyi-vue-pro.sql
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | Target Server Version : 80200 (8.2.0) | 11 | Target Server Version : 80200 (8.2.0) |
| 12 | File Encoding : 65001 | 12 | File Encoding : 65001 |
| 13 | 13 | ||
| 14 | - Date: 07/07/2024 18:29:17 | 14 | + Date: 31/08/2024 09:22:45 |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | SET NAMES utf8mb4; | 17 | SET NAMES utf8mb4; |
| @@ -49,7 +49,7 @@ CREATE TABLE `infra_api_access_log` ( | @@ -49,7 +49,7 @@ CREATE TABLE `infra_api_access_log` ( | ||
| 49 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 49 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 50 | PRIMARY KEY (`id`) USING BTREE, | 50 | PRIMARY KEY (`id`) USING BTREE, |
| 51 | INDEX `idx_create_time`(`create_time` ASC) USING BTREE | 51 | INDEX `idx_create_time`(`create_time` ASC) USING BTREE |
| 52 | -) ENGINE = InnoDB AUTO_INCREMENT = 35940 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表'; | 52 | +) ENGINE = InnoDB AUTO_INCREMENT = 35942 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表'; |
| 53 | 53 | ||
| 54 | -- ---------------------------- | 54 | -- ---------------------------- |
| 55 | -- Records of infra_api_access_log | 55 | -- Records of infra_api_access_log |
| @@ -62,7 +62,7 @@ COMMIT; | @@ -62,7 +62,7 @@ COMMIT; | ||
| 62 | -- ---------------------------- | 62 | -- ---------------------------- |
| 63 | DROP TABLE IF EXISTS `infra_api_error_log`; | 63 | DROP TABLE IF EXISTS `infra_api_error_log`; |
| 64 | CREATE TABLE `infra_api_error_log` ( | 64 | CREATE TABLE `infra_api_error_log` ( |
| 65 | - `id` int NOT NULL AUTO_INCREMENT COMMENT '编号', | 65 | + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', |
| 66 | `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号', | 66 | `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号', |
| 67 | `user_id` int NOT NULL DEFAULT 0 COMMENT '用户编号', | 67 | `user_id` int NOT NULL DEFAULT 0 COMMENT '用户编号', |
| 68 | `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', | 68 | `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', |
| @@ -91,7 +91,7 @@ CREATE TABLE `infra_api_error_log` ( | @@ -91,7 +91,7 @@ CREATE TABLE `infra_api_error_log` ( | ||
| 91 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 91 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 92 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 92 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 93 | PRIMARY KEY (`id`) USING BTREE | 93 | PRIMARY KEY (`id`) USING BTREE |
| 94 | -) ENGINE = InnoDB AUTO_INCREMENT = 17761 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志'; | 94 | +) ENGINE = InnoDB AUTO_INCREMENT = 20014 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志'; |
| 95 | 95 | ||
| 96 | -- ---------------------------- | 96 | -- ---------------------------- |
| 97 | -- Records of infra_api_error_log | 97 | -- Records of infra_api_error_log |
| @@ -128,7 +128,7 @@ CREATE TABLE `infra_codegen_column` ( | @@ -128,7 +128,7 @@ CREATE TABLE `infra_codegen_column` ( | ||
| 128 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 128 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 129 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 129 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 130 | PRIMARY KEY (`id`) USING BTREE | 130 | PRIMARY KEY (`id`) USING BTREE |
| 131 | -) ENGINE = InnoDB AUTO_INCREMENT = 2440 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义'; | 131 | +) ENGINE = InnoDB AUTO_INCREMENT = 2483 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义'; |
| 132 | 132 | ||
| 133 | -- ---------------------------- | 133 | -- ---------------------------- |
| 134 | -- Records of infra_codegen_column | 134 | -- Records of infra_codegen_column |
| @@ -166,7 +166,7 @@ CREATE TABLE `infra_codegen_table` ( | @@ -166,7 +166,7 @@ CREATE TABLE `infra_codegen_table` ( | ||
| 166 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 166 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 167 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 167 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 168 | PRIMARY KEY (`id`) USING BTREE | 168 | PRIMARY KEY (`id`) USING BTREE |
| 169 | -) ENGINE = InnoDB AUTO_INCREMENT = 184 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表定义'; | 169 | +) ENGINE = InnoDB AUTO_INCREMENT = 187 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表定义'; |
| 170 | 170 | ||
| 171 | -- ---------------------------- | 171 | -- ---------------------------- |
| 172 | -- Records of infra_codegen_table | 172 | -- Records of infra_codegen_table |
| @@ -179,7 +179,7 @@ COMMIT; | @@ -179,7 +179,7 @@ COMMIT; | ||
| 179 | -- ---------------------------- | 179 | -- ---------------------------- |
| 180 | DROP TABLE IF EXISTS `infra_config`; | 180 | DROP TABLE IF EXISTS `infra_config`; |
| 181 | CREATE TABLE `infra_config` ( | 181 | CREATE TABLE `infra_config` ( |
| 182 | - `id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键', | 182 | + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数主键', |
| 183 | `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', | 183 | `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', |
| 184 | `type` tinyint NOT NULL COMMENT '参数类型', | 184 | `type` tinyint NOT NULL COMMENT '参数类型', |
| 185 | `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', | 185 | `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', |
| @@ -199,7 +199,7 @@ CREATE TABLE `infra_config` ( | @@ -199,7 +199,7 @@ CREATE TABLE `infra_config` ( | ||
| 199 | -- Records of infra_config | 199 | -- Records of infra_config |
| 200 | -- ---------------------------- | 200 | -- ---------------------------- |
| 201 | BEGIN; | 201 | BEGIN; |
| 202 | -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'); | 202 | +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'system.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-07-20 17:22:47', b'0'); |
| 203 | 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'); | 203 | 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'); |
| 204 | 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'); | 204 | 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'); |
| 205 | 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'); | 205 | 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'); |
| @@ -250,7 +250,7 @@ CREATE TABLE `infra_file` ( | @@ -250,7 +250,7 @@ CREATE TABLE `infra_file` ( | ||
| 250 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 250 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 251 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 251 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 252 | PRIMARY KEY (`id`) USING BTREE | 252 | PRIMARY KEY (`id`) USING BTREE |
| 253 | -) ENGINE = InnoDB AUTO_INCREMENT = 1397 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; | 253 | +) ENGINE = InnoDB AUTO_INCREMENT = 1472 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; |
| 254 | 254 | ||
| 255 | -- ---------------------------- | 255 | -- ---------------------------- |
| 256 | -- Records of infra_file | 256 | -- Records of infra_file |
| @@ -438,7 +438,7 @@ CREATE TABLE `system_dict_data` ( | @@ -438,7 +438,7 @@ CREATE TABLE `system_dict_data` ( | ||
| 438 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 438 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 439 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 439 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 440 | PRIMARY KEY (`id`) USING BTREE | 440 | PRIMARY KEY (`id`) USING BTREE |
| 441 | -) ENGINE = InnoDB AUTO_INCREMENT = 1555 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表'; | 441 | +) ENGINE = InnoDB AUTO_INCREMENT = 1592 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表'; |
| 442 | 442 | ||
| 443 | -- ---------------------------- | 443 | -- ---------------------------- |
| 444 | -- Records of system_dict_data | 444 | -- Records of system_dict_data |
| @@ -490,7 +490,7 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | @@ -490,7 +490,7 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | ||
| 490 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', b'0'); | 490 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', b'0'); |
| 491 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', b'0'); | 491 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', b'0'); |
| 492 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', b'0'); | 492 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', b'0'); |
| 493 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-16 10:09:52', b'0'); | 493 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (66, 1, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2024-07-22 22:23:25', b'0'); |
| 494 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', b'0'); | 494 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', b'0'); |
| 495 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', b'0'); | 495 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', b'0'); |
| 496 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', b'0'); | 496 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', b'0'); |
| @@ -605,8 +605,8 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | @@ -605,8 +605,8 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | ||
| 605 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', b'0'); | 605 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', b'0'); |
| 606 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', b'0'); | 606 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', b'0'); |
| 607 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', b'0'); | 607 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', b'0'); |
| 608 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2022-12-10 20:59:21', b'0'); | ||
| 609 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2022-12-10 20:59:46', b'0'); | 608 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, 10, '售后中', '10', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2024-07-21 17:01:24', b'0'); |
| 609 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, 20, '已退款', '20', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2024-07-21 17:01:35', b'0'); | ||
| 610 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', b'0'); | 610 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', b'0'); |
| 611 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', b'0'); | 611 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', b'0'); |
| 612 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', b'0'); | 612 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', b'0'); |
| @@ -741,7 +741,6 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | @@ -741,7 +741,6 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | ||
| 741 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', b'0'); | 741 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', b'0'); |
| 742 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', b'0'); | 742 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', b'0'); |
| 743 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', b'0'); | 743 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', b'0'); |
| 744 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1460, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', b'0'); | ||
| 745 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', b'0'); | 744 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', b'0'); |
| 746 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', b'0'); | 745 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', b'0'); |
| 747 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', b'0'); | 746 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', b'0'); |
| @@ -827,6 +826,42 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | @@ -827,6 +826,42 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | ||
| 827 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1552, 8, 'Suno', 'Suno', 'ai_platform', 0, '', '', '', '1', '2024-06-29 09:13:36', '1', '2024-06-29 09:13:41', b'0'); | 826 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1552, 8, 'Suno', 'Suno', 'ai_platform', 0, '', '', '', '1', '2024-06-29 09:13:36', '1', '2024-06-29 09:13:41', b'0'); |
| 828 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1553, 9, 'DeepSeek', 'DeepSeek', 'ai_platform', 0, '', '', '', '1', '2024-07-06 12:04:30', '1', '2024-07-06 12:05:20', b'0'); | 827 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1553, 9, 'DeepSeek', 'DeepSeek', 'ai_platform', 0, '', '', '', '1', '2024-07-06 12:04:30', '1', '2024-07-06 12:05:20', b'0'); |
| 829 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1554, 10, '智谱', 'ZhiPu', 'ai_platform', 0, '', '', '', '1', '2024-07-06 18:00:35', '1', '2024-07-06 18:00:35', b'0'); | 828 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1554, 10, '智谱', 'ZhiPu', 'ai_platform', 0, '', '', '', '1', '2024-07-06 18:00:35', '1', '2024-07-06 18:00:35', b'0'); |
| 829 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1555, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', b'0'); | ||
| 830 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1556, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', b'0'); | ||
| 831 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1557, 6, '文章', '6', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:05', '1', '2024-07-07 15:50:05', b'0'); | ||
| 832 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1558, 7, '博客文章', '7', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:23', '1', '2024-07-07 15:50:23', b'0'); | ||
| 833 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1559, 8, '想法', '8', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:31', '1', '2024-07-07 15:50:31', b'0'); | ||
| 834 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1560, 9, '大纲', '9', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:37', '1', '2024-07-07 15:50:37', b'0'); | ||
| 835 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1561, 1, '自动', '1', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:06', '1', '2024-07-07 15:51:06', b'0'); | ||
| 836 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1562, 2, '友善', '2', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:19', '1', '2024-07-07 15:51:19', b'0'); | ||
| 837 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1563, 3, '随意', '3', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:27', '1', '2024-07-07 15:51:27', b'0'); | ||
| 838 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1564, 4, '友好', '4', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:37', '1', '2024-07-07 15:51:37', b'0'); | ||
| 839 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1565, 5, '专业', '5', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:49', '1', '2024-07-07 15:52:02', b'0'); | ||
| 840 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1566, 6, '诙谐', '6', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:15', '1', '2024-07-07 15:52:15', b'0'); | ||
| 841 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1567, 7, '有趣', '7', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:24', '1', '2024-07-07 15:52:24', b'0'); | ||
| 842 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1568, 8, '正式', '8', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:54:33', '1', '2024-07-07 15:54:33', b'0'); | ||
| 843 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1569, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', b'0'); | ||
| 844 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1570, 1, '自动', '1', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:34', '1', '2024-07-07 15:19:34', b'0'); | ||
| 845 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1571, 2, '电子邮件', '2', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:50', '1', '2024-07-07 15:49:30', b'0'); | ||
| 846 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1572, 3, '消息', '3', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:01', '1', '2024-07-07 15:49:38', b'0'); | ||
| 847 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1573, 4, '评论', '4', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:13', '1', '2024-07-07 15:49:45', b'0'); | ||
| 848 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1574, 1, '自动', '1', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:18', '1', '2024-07-07 15:44:18', b'0'); | ||
| 849 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1575, 2, '中文', '2', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:28', '1', '2024-07-07 15:44:28', b'0'); | ||
| 850 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1576, 3, '英文', '3', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:37', '1', '2024-07-07 15:44:37', b'0'); | ||
| 851 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1577, 4, '韩语', '4', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:28', '1', '2024-07-07 15:46:28', b'0'); | ||
| 852 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1578, 5, '日语', '5', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:44', '1', '2024-07-07 15:46:44', b'0'); | ||
| 853 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1579, 1, '自动', '1', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:34', '1', '2024-07-07 15:48:34', b'0'); | ||
| 854 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1580, 2, '短', '2', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:44', '1', '2024-07-07 15:48:44', b'0'); | ||
| 855 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1581, 3, '中等', '3', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:52', '1', '2024-07-07 15:48:52', b'0'); | ||
| 856 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1582, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', b'0'); | ||
| 857 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1584, 1, '撰写', '1', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:00', '1', '2024-07-10 21:26:00', b'0'); | ||
| 858 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1585, 2, '回复', '2', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:06', '1', '2024-07-10 21:26:06', b'0'); | ||
| 859 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1586, 2, '腾讯云', 'TENCENT', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:16', '1', '2024-07-22 22:23:16', b'0'); | ||
| 860 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1587, 3, '华为云', 'HUAWEI', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:46', '1', '2024-07-22 22:23:53', b'0'); | ||
| 861 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1588, 1, 'OpenAI 微软', 'AzureOpenAI', 'ai_platform', 0, '', '', '', '1', '2024-08-10 14:07:41', '1', '2024-08-10 14:07:41', b'0'); | ||
| 862 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1589, 10, 'BPMN 设计器', '10', 'bpm_model_type', 0, 'primary', '', '', '1', '2024-08-26 15:22:17', '1', '2024-08-26 16:46:02', b'0'); | ||
| 863 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1590, 20, 'SIMPLE 设计器', '20', 'bpm_model_type', 0, 'success', '', '', '1', '2024-08-26 15:22:27', '1', '2024-08-26 16:45:58', b'0'); | ||
| 864 | +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1591, 4, '七牛云', 'QINIU', 'system_sms_channel_code', 0, '', '', '', '1', '2024-08-31 08:45:03', '1', '2024-08-31 08:45:24', b'0'); | ||
| 830 | COMMIT; | 865 | COMMIT; |
| 831 | 866 | ||
| 832 | -- ---------------------------- | 867 | -- ---------------------------- |
| @@ -846,7 +881,7 @@ CREATE TABLE `system_dict_type` ( | @@ -846,7 +881,7 @@ CREATE TABLE `system_dict_type` ( | ||
| 846 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 881 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 847 | `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', | 882 | `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', |
| 848 | PRIMARY KEY (`id`) USING BTREE | 883 | PRIMARY KEY (`id`) USING BTREE |
| 849 | -) ENGINE = InnoDB AUTO_INCREMENT = 624 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; | 884 | +) ENGINE = InnoDB AUTO_INCREMENT = 630 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; |
| 850 | 885 | ||
| 851 | -- ---------------------------- | 886 | -- ---------------------------- |
| 852 | -- Records of system_dict_type | 887 | -- Records of system_dict_type |
| @@ -939,6 +974,12 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat | @@ -939,6 +974,12 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat | ||
| 939 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (621, 'AI 绘画状态', 'ai_image_status', 0, '', '1', '2024-06-26 20:51:23', '1', '2024-06-26 20:51:23', b'0', '1970-01-01 00:00:00'); | 974 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (621, 'AI 绘画状态', 'ai_image_status', 0, '', '1', '2024-06-26 20:51:23', '1', '2024-06-26 20:51:23', b'0', '1970-01-01 00:00:00'); |
| 940 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (622, 'AI 音乐状态', 'ai_music_status', 0, '', '1', '2024-06-27 22:45:07', '1', '2024-06-28 00:56:27', b'0', '1970-01-01 00:00:00'); | 975 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (622, 'AI 音乐状态', 'ai_music_status', 0, '', '1', '2024-06-27 22:45:07', '1', '2024-06-28 00:56:27', b'0', '1970-01-01 00:00:00'); |
| 941 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (623, 'AI 音乐生成模式', 'ai_generate_mode', 0, '', '1', '2024-06-27 22:46:21', '1', '2024-06-28 01:22:29', b'0', '1970-01-01 00:00:00'); | 976 | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (623, 'AI 音乐生成模式', 'ai_generate_mode', 0, '', '1', '2024-06-27 22:46:21', '1', '2024-06-28 01:22:29', b'0', '1970-01-01 00:00:00'); |
| 977 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (624, '写作语气', 'ai_write_tone', 0, '', '1', '2024-07-07 15:19:02', '1', '2024-07-07 15:19:02', b'0', '1970-01-01 00:00:00'); | ||
| 978 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (625, '写作语言', 'ai_write_language', 0, '', '1', '2024-07-07 15:18:52', '1', '2024-07-07 15:18:52', b'0', '1970-01-01 00:00:00'); | ||
| 979 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (626, '写作长度', 'ai_write_length', 0, '', '1', '2024-07-07 15:18:41', '1', '2024-07-07 15:18:41', b'0', '1970-01-01 00:00:00'); | ||
| 980 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (627, '写作格式', 'ai_write_format', 0, '', '1', '2024-07-07 15:14:34', '1', '2024-07-07 15:14:34', b'0', '1970-01-01 00:00:00'); | ||
| 981 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (628, 'AI 写作类型', 'ai_write_type', 0, '', '1', '2024-07-10 21:25:29', '1', '2024-07-10 21:25:29', b'0', '1970-01-01 00:00:00'); | ||
| 982 | +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (629, 'BPM 流程模型类型', 'bpm_model_type', 0, '', '1', '2024-08-26 15:21:43', '1', '2024-08-26 15:21:43', b'0', '1970-01-01 00:00:00'); | ||
| 942 | COMMIT; | 983 | COMMIT; |
| 943 | 984 | ||
| 944 | -- ---------------------------- | 985 | -- ---------------------------- |
| @@ -962,7 +1003,7 @@ CREATE TABLE `system_login_log` ( | @@ -962,7 +1003,7 @@ CREATE TABLE `system_login_log` ( | ||
| 962 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 1003 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 963 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 1004 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 964 | PRIMARY KEY (`id`) USING BTREE | 1005 | PRIMARY KEY (`id`) USING BTREE |
| 965 | -) ENGINE = InnoDB AUTO_INCREMENT = 3177 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; | 1006 | +) ENGINE = InnoDB AUTO_INCREMENT = 3289 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; |
| 966 | 1007 | ||
| 967 | -- ---------------------------- | 1008 | -- ---------------------------- |
| 968 | -- Records of system_login_log | 1009 | -- Records of system_login_log |
| @@ -995,7 +1036,7 @@ CREATE TABLE `system_mail_account` ( | @@ -995,7 +1036,7 @@ CREATE TABLE `system_mail_account` ( | ||
| 995 | -- Records of system_mail_account | 1036 | -- Records of system_mail_account |
| 996 | -- ---------------------------- | 1037 | -- ---------------------------- |
| 997 | BEGIN; | 1038 | BEGIN; |
| 998 | -INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, b'0', b'0', '1', '2023-01-25 17:39:52', '1', '2024-04-24 09:13:56', b'0'); | 1039 | +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, b'0', b'0', '1', '2023-01-25 17:39:52', '1', '2024-07-27 22:39:12', b'0'); |
| 999 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, b'1', b'0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', b'0'); | 1040 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, b'1', b'0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', b'0'); |
| 1000 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, b'0', b'0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', b'1'); | 1041 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, b'0', b'0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', b'1'); |
| 1001 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, b'1', b'0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', b'1'); | 1042 | INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, b'1', b'0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', b'1'); |
| @@ -1093,7 +1134,7 @@ CREATE TABLE `system_menu` ( | @@ -1093,7 +1134,7 @@ CREATE TABLE `system_menu` ( | ||
| 1093 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 1134 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 1094 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 1135 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 1095 | PRIMARY KEY (`id`) USING BTREE | 1136 | PRIMARY KEY (`id`) USING BTREE |
| 1096 | -) ENGINE = InnoDB AUTO_INCREMENT = 2792 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; | 1137 | +) ENGINE = InnoDB AUTO_INCREMENT = 2808 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; |
| 1097 | 1138 | ||
| 1098 | -- ---------------------------- | 1139 | -- ---------------------------- |
| 1099 | -- Records of system_menu | 1140 | -- Records of system_menu |
| @@ -1257,7 +1298,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | @@ -1257,7 +1298,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | ||
| 1257 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, b'1', b'1', b'1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', b'0'); | 1298 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, b'1', b'1', b'1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', b'0'); |
| 1258 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0'); | 1299 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0'); |
| 1259 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0'); | 1300 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0'); |
| 1260 | -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', b'0'); | ||
| 1261 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0'); | 1301 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0'); |
| 1262 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0'); | 1302 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0'); |
| 1263 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0'); | 1303 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0'); |
| @@ -1445,7 +1485,7 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | @@ -1445,7 +1485,7 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | ||
| 1445 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', b'0'); | 1485 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', b'0'); |
| 1446 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', b'0'); | 1486 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', b'0'); |
| 1447 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', b'0'); | 1487 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', b'0'); |
| 1448 | -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:46:28', '1', '2023-12-02 21:32:20', b'0'); | 1488 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:46:28', '1', '2024-07-28 11:36:48', b'0'); |
| 1449 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', b'0'); | 1489 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', b'0'); |
| 1450 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, b'1', b'1', b'1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', b'0'); | 1490 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, b'1', b'1', b'1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', b'0'); |
| 1451 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); | 1491 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); |
| @@ -1916,11 +1956,27 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | @@ -1916,11 +1956,27 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i | ||
| 1916 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2784, '绘画管理', '', 2, 11, 2760, 'image', 'fa:file-image-o', 'ai/image/manager/index.vue', 'AiImageManager', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 21:37:13', b'0'); | 1956 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2784, '绘画管理', '', 2, 11, 2760, 'image', 'fa:file-image-o', 'ai/image/manager/index.vue', 'AiImageManager', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 21:37:13', b'0'); |
| 1917 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2785, '绘画查询', 'ai:image:query', 3, 1, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:21:57', b'0'); | 1957 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2785, '绘画查询', 'ai:image:query', 3, 1, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:21:57', b'0'); |
| 1918 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2786, '绘画删除', 'ai:image:delete', 3, 4, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:22:08', b'0'); | 1958 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2786, '绘画删除', 'ai:image:delete', 3, 4, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:22:08', b'0'); |
| 1919 | -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2787, '会话更新公开状态', 'ai:image:update-public-status', 3, 2, 2784, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-06-26 22:47:56', '1', '2024-06-26 22:47:56', b'0'); | 1959 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2787, '绘图更新', 'ai:image:update', 3, 2, 2784, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-06-26 22:47:56', '1', '2024-08-31 09:21:35', b'0'); |
| 1920 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2788, '音乐管理', '', 2, 12, 2760, 'music', 'fa:music', 'ai/music/manager/index.vue', 'AiMusicManager', 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '1', '2024-06-27 23:04:19', b'0'); | 1960 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2788, '音乐管理', '', 2, 12, 2760, 'music', 'fa:music', 'ai/music/manager/index.vue', 'AiMusicManager', 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '1', '2024-06-27 23:04:19', b'0'); |
| 1921 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2789, '音乐查询', 'ai:music:query', 3, 1, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); | 1961 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2789, '音乐查询', 'ai:music:query', 3, 1, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); |
| 1922 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2790, '音乐更新', 'ai:music:update', 3, 3, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); | 1962 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2790, '音乐更新', 'ai:music:update', 3, 3, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); |
| 1923 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2791, '音乐删除', 'ai:music:delete', 3, 4, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); | 1963 | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2791, '音乐删除', 'ai:music:delete', 3, 4, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); |
| 1964 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2792, 'AI 写作', '', 2, 3, 2758, 'write', 'fa-solid:book-reader', 'ai/write/index/index.vue', 'AiWrite', 0, b'1', b'1', b'1', '1', '2024-07-08 09:26:44', '1', '2024-07-16 13:03:06', b'0'); | ||
| 1965 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2793, '写作管理', '', 2, 13, 2760, 'write', 'fa:bookmark-o', 'ai/write/manager/index.vue', 'AiWriteManager', 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '1', '2024-07-10 21:31:59', b'0'); | ||
| 1966 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2794, 'AI 写作查询', 'ai:write:query', 3, 1, 2793, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', b'0'); | ||
| 1967 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2795, 'AI 写作删除', 'ai:write:delete', 3, 4, 2793, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', b'0'); | ||
| 1968 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2796, 'AI 音乐', '', 2, 4, 2758, 'music', 'fa:music', 'ai/music/index/index.vue', 'AiMusic', 0, b'1', b'1', b'1', '1', '2024-07-17 09:21:12', '1', '2024-07-29 21:11:52', b'0'); | ||
| 1969 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2797, '客服中心', '', 2, 100, 2362, 'kefu', 'fa-solid:user-alt', 'mall/promotion/kefu/index', 'KeFu', 0, b'1', b'1', b'1', '1', '2024-07-17 23:49:05', '1', '2024-07-17 23:49:16', b'0'); | ||
| 1970 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2798, 'AI 思维导图', '', 2, 5, 2758, 'mind-map', 'fa:sitemap', 'ai/mindmap/index/index.vue', 'AiMindMap', 0, b'1', b'1', b'1', '1', '2024-07-29 21:31:59', '1', '2024-07-29 21:33:20', b'0'); | ||
| 1971 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2799, '导图管理', '', 2, 14, 2760, 'mind-map', 'fa:map', 'ai/mindmap/manager/index', 'AiMindMapManager', 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '1', '2024-08-10 17:24:28', b'0'); | ||
| 1972 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2800, '思维导图查询', 'ai:mind-map:query', 3, 1, 2799, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', b'0'); | ||
| 1973 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2801, '思维导图删除', 'ai:mind-map:delete', 3, 4, 2799, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', b'0'); | ||
| 1974 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2802, '会话查询', 'promotion:kefu-conversation:query', 3, 1, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:17:52', '1', '2024-08-31 09:18:52', b'0'); | ||
| 1975 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2803, '会话更新', 'promotion:kefu-conversation:update', 3, 2, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:18:15', '1', '2024-08-31 09:19:29', b'0'); | ||
| 1976 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2804, '消息查询', 'promotion:kefu-message:query', 3, 10, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:18:42', '1', '2024-08-31 09:18:42', b'0'); | ||
| 1977 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2805, '会话删除', 'promotion:kefu-conversation:delete', 3, 3, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:19:51', '1', '2024-08-31 09:20:32', b'0'); | ||
| 1978 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2806, '消息发送', 'promotion:kefu-message:send', 3, 12, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:20:06', '1', '2024-08-31 09:20:06', b'0'); | ||
| 1979 | +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2807, '消息更新', 'promotion:kefu-message:update', 3, 11, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:20:22', '1', '2024-08-31 09:20:22', b'0'); | ||
| 1924 | COMMIT; | 1980 | COMMIT; |
| 1925 | 1981 | ||
| 1926 | -- ---------------------------- | 1982 | -- ---------------------------- |
| @@ -2042,7 +2098,7 @@ CREATE TABLE `system_oauth2_access_token` ( | @@ -2042,7 +2098,7 @@ CREATE TABLE `system_oauth2_access_token` ( | ||
| 2042 | PRIMARY KEY (`id`) USING BTREE, | 2098 | PRIMARY KEY (`id`) USING BTREE, |
| 2043 | INDEX `idx_access_token`(`access_token` ASC) USING BTREE, | 2099 | INDEX `idx_access_token`(`access_token` ASC) USING BTREE, |
| 2044 | INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE | 2100 | INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE |
| 2045 | -) ENGINE = InnoDB AUTO_INCREMENT = 7699 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; | 2101 | +) ENGINE = InnoDB AUTO_INCREMENT = 9563 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; |
| 2046 | 2102 | ||
| 2047 | -- ---------------------------- | 2103 | -- ---------------------------- |
| 2048 | -- Records of system_oauth2_access_token | 2104 | -- Records of system_oauth2_access_token |
| @@ -2164,7 +2220,7 @@ CREATE TABLE `system_oauth2_refresh_token` ( | @@ -2164,7 +2220,7 @@ CREATE TABLE `system_oauth2_refresh_token` ( | ||
| 2164 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 2220 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2165 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 2221 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2166 | PRIMARY KEY (`id`) USING BTREE | 2222 | PRIMARY KEY (`id`) USING BTREE |
| 2167 | -) ENGINE = InnoDB AUTO_INCREMENT = 1539 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; | 2223 | +) ENGINE = InnoDB AUTO_INCREMENT = 1620 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; |
| 2168 | 2224 | ||
| 2169 | -- ---------------------------- | 2225 | -- ---------------------------- |
| 2170 | -- Records of system_oauth2_refresh_token | 2226 | -- Records of system_oauth2_refresh_token |
| @@ -2197,7 +2253,7 @@ CREATE TABLE `system_operate_log` ( | @@ -2197,7 +2253,7 @@ CREATE TABLE `system_operate_log` ( | ||
| 2197 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 2253 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2198 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 2254 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2199 | PRIMARY KEY (`id`) USING BTREE | 2255 | PRIMARY KEY (`id`) USING BTREE |
| 2200 | -) ENGINE = InnoDB AUTO_INCREMENT = 9038 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; | 2256 | +) ENGINE = InnoDB AUTO_INCREMENT = 9056 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; |
| 2201 | 2257 | ||
| 2202 | -- ---------------------------- | 2258 | -- ---------------------------- |
| 2203 | -- Records of system_operate_log | 2259 | -- Records of system_operate_log |
| @@ -2256,7 +2312,7 @@ CREATE TABLE `system_role` ( | @@ -2256,7 +2312,7 @@ CREATE TABLE `system_role` ( | ||
| 2256 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 2312 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2257 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 2313 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2258 | PRIMARY KEY (`id`) USING BTREE | 2314 | PRIMARY KEY (`id`) USING BTREE |
| 2259 | -) ENGINE = InnoDB AUTO_INCREMENT = 153 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表'; | 2315 | +) ENGINE = InnoDB AUTO_INCREMENT = 154 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表'; |
| 2260 | 2316 | ||
| 2261 | -- ---------------------------- | 2317 | -- ---------------------------- |
| 2262 | -- Records of system_role | 2318 | -- Records of system_role |
| @@ -2265,9 +2321,10 @@ BEGIN; | @@ -2265,9 +2321,10 @@ BEGIN; | ||
| 2265 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', b'0', 1); | 2321 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', b'0', 1); |
| 2266 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', b'0', 1); | 2322 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', b'0', 1); |
| 2267 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', b'0', 1); | 2323 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', b'0', 1); |
| 2268 | -INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '我想测试', '', '2021-01-06 13:49:35', '1', '2024-03-24 22:22:45', b'0', 1); | 2324 | +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '', '', '2021-01-06 13:49:35', '1', '2024-08-11 10:41:10', b'0', 1); |
| 2269 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); | 2325 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); |
| 2270 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); | 2326 | INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); |
| 2327 | +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (153, '某角色', 'tt', 4, 1, '', 0, 2, '', '1', '2024-08-17 14:09:35', '1', '2024-08-17 14:09:35', b'0', 1); | ||
| 2271 | COMMIT; | 2328 | COMMIT; |
| 2272 | 2329 | ||
| 2273 | -- ---------------------------- | 2330 | -- ---------------------------- |
| @@ -2285,7 +2342,7 @@ CREATE TABLE `system_role_menu` ( | @@ -2285,7 +2342,7 @@ CREATE TABLE `system_role_menu` ( | ||
| 2285 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 2342 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2286 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 2343 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2287 | PRIMARY KEY (`id`) USING BTREE | 2344 | PRIMARY KEY (`id`) USING BTREE |
| 2288 | -) ENGINE = InnoDB AUTO_INCREMENT = 5779 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; | 2345 | +) ENGINE = InnoDB AUTO_INCREMENT = 5793 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; |
| 2289 | 2346 | ||
| 2290 | -- ---------------------------- | 2347 | -- ---------------------------- |
| 2291 | -- Records of system_role_menu | 2348 | -- Records of system_role_menu |
| @@ -2348,7 +2405,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | @@ -2348,7 +2405,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | ||
| 2348 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2405 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| 2349 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2406 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| 2350 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2407 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| 2351 | -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | ||
| 2352 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2408 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| 2353 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2409 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| 2354 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); | 2410 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); |
| @@ -2852,7 +2908,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | @@ -2852,7 +2908,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | ||
| 2852 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2908 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| 2853 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2909 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| 2854 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2910 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| 2855 | -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3013, 109, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | ||
| 2856 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2911 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| 2857 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2912 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| 2858 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); | 2913 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); |
| @@ -2928,7 +2983,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | @@ -2928,7 +2983,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | ||
| 2928 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2983 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| 2929 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2984 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| 2930 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2985 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| 2931 | -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3089, 111, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | ||
| 2932 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2986 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| 2933 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2987 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| 2934 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); | 2988 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); |
| @@ -3114,6 +3168,20 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | @@ -3114,6 +3168,20 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t | ||
| 3114 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); | 3168 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); |
| 3115 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); | 3169 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); |
| 3116 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); | 3170 | INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); |
| 3171 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5779, 2, 2739, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3172 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5780, 2, 2740, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3173 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5781, 2, 2758, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3174 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5782, 2, 2759, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3175 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5783, 2, 2362, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3176 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5784, 2, 2387, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3177 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5785, 2, 2030, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); | ||
| 3178 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5786, 101, 2758, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); | ||
| 3179 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5787, 101, 2759, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); | ||
| 3180 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5788, 101, 2783, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); | ||
| 3181 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5789, 109, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 121); | ||
| 3182 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5790, 109, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 121); | ||
| 3183 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5791, 111, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 122); | ||
| 3184 | +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5792, 111, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 122); | ||
| 3117 | COMMIT; | 3185 | COMMIT; |
| 3118 | 3186 | ||
| 3119 | -- ---------------------------- | 3187 | -- ---------------------------- |
| @@ -3141,9 +3209,8 @@ CREATE TABLE `system_sms_channel` ( | @@ -3141,9 +3209,8 @@ CREATE TABLE `system_sms_channel` ( | ||
| 3141 | -- Records of system_sms_channel | 3209 | -- Records of system_sms_channel |
| 3142 | -- ---------------------------- | 3210 | -- ---------------------------- |
| 3143 | BEGIN; | 3211 | BEGIN; |
| 3144 | -INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2023-12-02 22:10:17', b'0'); | 3212 | +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2024-08-04 08:53:26', b'0'); |
| 3145 | INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', b'0'); | 3213 | INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', b'0'); |
| 3146 | -INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, '仅测试', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', '2023-12-02 22:10:08', b'0'); | ||
| 3147 | COMMIT; | 3214 | COMMIT; |
| 3148 | 3215 | ||
| 3149 | -- ---------------------------- | 3216 | -- ---------------------------- |
| @@ -3168,7 +3235,7 @@ CREATE TABLE `system_sms_code` ( | @@ -3168,7 +3235,7 @@ CREATE TABLE `system_sms_code` ( | ||
| 3168 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 3235 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3169 | PRIMARY KEY (`id`) USING BTREE, | 3236 | PRIMARY KEY (`id`) USING BTREE, |
| 3170 | INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' | 3237 | INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' |
| 3171 | -) ENGINE = InnoDB AUTO_INCREMENT = 615 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; | 3238 | +) ENGINE = InnoDB AUTO_INCREMENT = 632 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; |
| 3172 | 3239 | ||
| 3173 | -- ---------------------------- | 3240 | -- ---------------------------- |
| 3174 | -- Records of system_sms_code | 3241 | -- Records of system_sms_code |
| @@ -3209,7 +3276,7 @@ CREATE TABLE `system_sms_log` ( | @@ -3209,7 +3276,7 @@ CREATE TABLE `system_sms_log` ( | ||
| 3209 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 3276 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 3210 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 3277 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3211 | PRIMARY KEY (`id`) USING BTREE | 3278 | PRIMARY KEY (`id`) USING BTREE |
| 3212 | -) ENGINE = InnoDB AUTO_INCREMENT = 972 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; | 3279 | +) ENGINE = InnoDB AUTO_INCREMENT = 1088 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; |
| 3213 | 3280 | ||
| 3214 | -- ---------------------------- | 3281 | -- ---------------------------- |
| 3215 | -- Records of system_sms_log | 3282 | -- Records of system_sms_log |
| @@ -3239,24 +3306,25 @@ CREATE TABLE `system_sms_template` ( | @@ -3239,24 +3306,25 @@ CREATE TABLE `system_sms_template` ( | ||
| 3239 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | 3306 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 3240 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 3307 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3241 | PRIMARY KEY (`id`) USING BTREE | 3308 | PRIMARY KEY (`id`) USING BTREE |
| 3242 | -) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信模板'; | 3309 | +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信模板'; |
| 3243 | 3310 | ||
| 3244 | -- ---------------------------- | 3311 | -- ---------------------------- |
| 3245 | -- Records of system_sms_template | 3312 | -- Records of system_sms_template |
| 3246 | -- ---------------------------- | 3313 | -- ---------------------------- |
| 3247 | BEGIN; | 3314 | BEGIN; |
| 3248 | -INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', '测试备注', '4383920', 6, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2023-12-02 22:32:47', b'0'); | 3315 | +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', '测试备注', '4383920', 4, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2024-08-18 11:57:18', b'0'); |
| 3249 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); | 3316 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); |
| 3250 | -INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2022-12-10 21:26:09', b'0'); | 3317 | +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 4, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2024-08-18 11:57:07', b'0'); |
| 3251 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', b'0'); | 3318 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', b'0'); |
| 3252 | -INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2022-12-10 21:25:59', b'0'); | 3319 | +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 4, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2024-08-18 11:57:06', b'0'); |
| 3253 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); | 3320 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); |
| 3254 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '[\"processInstanceName\",\"reason\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', b'0'); | 3321 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '[\"processInstanceName\",\"reason\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', b'0'); |
| 3255 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', b'0'); | 3322 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', b'0'); |
| 3256 | -INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2023-03-24 23:45:07', b'0'); | 3323 | +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 4, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2024-08-18 11:57:04', b'0'); |
| 3257 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', b'0'); | 3324 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', b'0'); |
| 3258 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', b'0'); | 3325 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', b'0'); |
| 3259 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', b'0'); | 3326 | INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', b'0'); |
| 3327 | +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, 2, 0, 'bpm_task_timeout', '【工作流】任务审批超时', '您收到了一条超时的待办任务:{processInstanceName}-{taskName},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"detailUrl\"]', '', 'X', 4, 'DEBUG_DING_TALK', '1', '2024-08-16 21:59:15', '1', '2024-08-16 21:59:34', b'0'); | ||
| 3260 | COMMIT; | 3328 | COMMIT; |
| 3261 | 3329 | ||
| 3262 | -- ---------------------------- | 3330 | -- ---------------------------- |
| @@ -3313,7 +3381,7 @@ CREATE TABLE `system_social_user` ( | @@ -3313,7 +3381,7 @@ CREATE TABLE `system_social_user` ( | ||
| 3313 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 3381 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3314 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 3382 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3315 | PRIMARY KEY (`id`) USING BTREE | 3383 | PRIMARY KEY (`id`) USING BTREE |
| 3316 | -) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交用户表'; | 3384 | +) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交用户表'; |
| 3317 | 3385 | ||
| 3318 | -- ---------------------------- | 3386 | -- ---------------------------- |
| 3319 | -- Records of system_social_user | 3387 | -- Records of system_social_user |
| @@ -3338,7 +3406,7 @@ CREATE TABLE `system_social_user_bind` ( | @@ -3338,7 +3406,7 @@ CREATE TABLE `system_social_user_bind` ( | ||
| 3338 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 3406 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3339 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 3407 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3340 | PRIMARY KEY (`id`) USING BTREE | 3408 | PRIMARY KEY (`id`) USING BTREE |
| 3341 | -) ENGINE = InnoDB AUTO_INCREMENT = 119 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交绑定表'; | 3409 | +) ENGINE = InnoDB AUTO_INCREMENT = 120 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交绑定表'; |
| 3342 | 3410 | ||
| 3343 | -- ---------------------------- | 3411 | -- ---------------------------- |
| 3344 | -- Records of system_social_user_bind | 3412 | -- Records of system_social_user_bind |
| @@ -3374,8 +3442,8 @@ CREATE TABLE `system_tenant` ( | @@ -3374,8 +3442,8 @@ CREATE TABLE `system_tenant` ( | ||
| 3374 | -- ---------------------------- | 3442 | -- ---------------------------- |
| 3375 | BEGIN; | 3443 | BEGIN; |
| 3376 | 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 (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', b'0'); | 3444 | 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 (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', b'0'); |
| 3377 | -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 (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2024-05-04 22:37:03', b'0'); | ||
| 3378 | -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 (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-29 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2024-05-04 22:36:09', b'0'); | 3445 | +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 (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2025-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2024-07-20 22:21:53', b'0'); |
| 3446 | +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 (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-29 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2024-07-20 15:51:18', b'0'); | ||
| 3379 | COMMIT; | 3447 | COMMIT; |
| 3380 | 3448 | ||
| 3381 | -- ---------------------------- | 3449 | -- ---------------------------- |
| @@ -3400,7 +3468,7 @@ CREATE TABLE `system_tenant_package` ( | @@ -3400,7 +3468,7 @@ CREATE TABLE `system_tenant_package` ( | ||
| 3400 | -- Records of system_tenant_package | 3468 | -- Records of system_tenant_package |
| 3401 | -- ---------------------------- | 3469 | -- ---------------------------- |
| 3402 | BEGIN; | 3470 | BEGIN; |
| 3403 | -INSERT INTO `system_tenant_package` (`id`, `name`, `status`, `remark`, `menu_ids`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-03-30 17:53:17', b'0'); | 3471 | +INSERT INTO `system_tenant_package` (`id`, `name`, `status`, `remark`, `menu_ids`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2739,2484,2740,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-07-13 22:37:24', b'0'); |
| 3404 | COMMIT; | 3472 | COMMIT; |
| 3405 | 3473 | ||
| 3406 | -- ---------------------------- | 3474 | -- ---------------------------- |
| @@ -3418,7 +3486,7 @@ CREATE TABLE `system_user_post` ( | @@ -3418,7 +3486,7 @@ CREATE TABLE `system_user_post` ( | ||
| 3418 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | 3486 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3419 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | 3487 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3420 | PRIMARY KEY (`id`) USING BTREE | 3488 | PRIMARY KEY (`id`) USING BTREE |
| 3421 | -) ENGINE = InnoDB AUTO_INCREMENT = 125 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户岗位表'; | 3489 | +) ENGINE = InnoDB AUTO_INCREMENT = 126 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户岗位表'; |
| 3422 | 3490 | ||
| 3423 | -- ---------------------------- | 3491 | -- ---------------------------- |
| 3424 | -- Records of system_user_post | 3492 | -- Records of system_user_post |
| @@ -3432,6 +3500,7 @@ INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_t | @@ -3432,6 +3500,7 @@ INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_t | ||
| 3432 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', b'0', 1); | 3500 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', b'0', 1); |
| 3433 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); | 3501 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); |
| 3434 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); | 3502 | INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); |
| 3503 | +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (125, 1, 2, '1', '2024-07-13 22:31:39', '1', '2024-07-13 22:31:39', b'0', 1); | ||
| 3435 | COMMIT; | 3504 | COMMIT; |
| 3436 | 3505 | ||
| 3437 | -- ---------------------------- | 3506 | -- ---------------------------- |
| @@ -3504,20 +3573,20 @@ CREATE TABLE `system_users` ( | @@ -3504,20 +3573,20 @@ CREATE TABLE `system_users` ( | ||
| 3504 | -- Records of system_users | 3573 | -- Records of system_users |
| 3505 | -- ---------------------------- | 3574 | -- ---------------------------- |
| 3506 | BEGIN; | 3575 | BEGIN; |
| 3507 | -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-07-07 17:15:51', 'admin', '2021-01-05 17:03:47', NULL, '2024-07-07 17:15:51', b'0', 1); | ||
| 3508 | -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); | ||
| 3509 | -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); | ||
| 3510 | -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-06-17 14:23:23', '', '2021-01-21 02:13:53', NULL, '2024-06-17 14:23:23', b'0', 1); | 3576 | +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,2]', 'aoteman@126.com', '18818260277', 2, 'http://test.yudao.iocoder.cn/bf2002b38950c904243be7c825d3f82e29f25a44526583c3fde2ebdff3a87f75.png', 0, '0:0:0:0:0:0:0:1', '2024-08-26 16:54:00', 'admin', '2021-01-05 17:03:47', NULL, '2024-08-26 16:54:00', b'0', 1); |
| 3577 | +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, '', 0, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', '1', '2024-08-17 11:06:13', b'0', 1); | ||
| 3578 | +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$04$fUBSmjKCPYAUmnMzOb6qE.eZCGPhHi1JmAKclODbfS/O7fHOl2bH6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-08-11 17:48:12', '', '2021-01-13 23:50:35', NULL, '2024-08-11 17:48:12', b'0', 1); | ||
| 3579 | +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$jDFLttgfik0QqJKAbfhMa.2A9xXoZmAIxakdFJUzkX.MgBKT6ddo6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-08-11 09:38:08', '', '2021-01-21 02:13:53', NULL, '2024-08-11 09:38:08', b'0', 1); | ||
| 3511 | 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 (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', b'0', 118); | 3580 | 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 (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', b'0', 118); |
| 3512 | 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 (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', b'0', 119); | 3581 | 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 (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', b'0', 119); |
| 3513 | 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 (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', b'0', 120); | 3582 | 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 (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', b'0', 120); |
| 3514 | -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 (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-09-25 22:47:33', '1', '2022-02-22 00:56:14', NULL, '2022-09-25 22:47:33', b'0', 121); | 3583 | +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 (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-07-20 22:23:17', '1', '2022-02-22 00:56:14', NULL, '2024-07-20 22:23:17', b'0', 121); |
| 3515 | 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 (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', b'0', 121); | 3584 | 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 (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', b'0', 121); |
| 3516 | 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 (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', b'0', 1); | 3585 | 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 (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', b'0', 1); |
| 3517 | 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 (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', b'0', 122); | 3586 | 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 (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', b'0', 122); |
| 3518 | 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 (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', b'0', 1); | 3587 | 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 (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', b'0', 1); |
| 3519 | 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 (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', b'0', 1); | 3588 | 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 (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', b'0', 1); |
| 3520 | -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 (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', b'0', 1); | 3589 | +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 (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号02', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2024-08-11 10:12:03', b'0', 1); |
| 3521 | 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 (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', b'0', 1); | 3590 | 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 (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', b'0', 1); |
| 3522 | 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 (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', b'0', 1); | 3591 | 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 (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', b'0', 1); |
| 3523 | COMMIT; | 3592 | COMMIT; |
yudao-dependencies/pom.xml
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | <url>https://github.com/YunaiV/ruoyi-vue-pro</url> | 14 | <url>https://github.com/YunaiV/ruoyi-vue-pro</url> |
| 15 | 15 | ||
| 16 | <properties> | 16 | <properties> |
| 17 | - <revision>2.1.0-snapshot</revision> | 17 | + <revision>2.2.0-snapshot</revision> |
| 18 | <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version> | 18 | <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version> |
| 19 | <!-- 统一依赖管理 --> | 19 | <!-- 统一依赖管理 --> |
| 20 | <spring.boot.version>3.3.1</spring.boot.version> | 20 | <spring.boot.version>3.3.1</spring.boot.version> |
| @@ -70,9 +70,6 @@ | @@ -70,9 +70,6 @@ | ||
| 70 | <okhttp3.version>4.11.0</okhttp3.version> | 70 | <okhttp3.version>4.11.0</okhttp3.version> |
| 71 | <commons-io.version>2.15.1</commons-io.version> | 71 | <commons-io.version>2.15.1</commons-io.version> |
| 72 | <minio.version>8.5.7</minio.version> | 72 | <minio.version>8.5.7</minio.version> |
| 73 | - <aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version> | ||
| 74 | - <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version> | ||
| 75 | - <tencentcloud-sdk-java.version>3.1.880</tencentcloud-sdk-java.version> | ||
| 76 | <justauth.version>2.0.5</justauth.version> | 73 | <justauth.version>2.0.5</justauth.version> |
| 77 | <jimureport.version>1.7.8</jimureport.version> | 74 | <jimureport.version>1.7.8</jimureport.version> |
| 78 | <xercesImpl.version>2.12.2</xercesImpl.version> | 75 | <xercesImpl.version>2.12.2</xercesImpl.version> |
| @@ -548,34 +545,6 @@ | @@ -548,34 +545,6 @@ | ||
| 548 | <version>${minio.version}</version> | 545 | <version>${minio.version}</version> |
| 549 | </dependency> | 546 | </dependency> |
| 550 | 547 | ||
| 551 | - <!-- SMS SDK begin --> | ||
| 552 | - <dependency> | ||
| 553 | - <groupId>com.aliyun</groupId> | ||
| 554 | - <artifactId>aliyun-java-sdk-core</artifactId> | ||
| 555 | - <version>${aliyun-java-sdk-core.version}</version> | ||
| 556 | - <exclusions> | ||
| 557 | - <exclusion> | ||
| 558 | - <artifactId>opentracing-api</artifactId> | ||
| 559 | - <groupId>io.opentracing</groupId> | ||
| 560 | - </exclusion> | ||
| 561 | - <exclusion> | ||
| 562 | - <artifactId>opentracing-util</artifactId> | ||
| 563 | - <groupId>io.opentracing</groupId> | ||
| 564 | - </exclusion> | ||
| 565 | - </exclusions> | ||
| 566 | - </dependency> | ||
| 567 | - <dependency> | ||
| 568 | - <groupId>com.aliyun</groupId> | ||
| 569 | - <artifactId>aliyun-java-sdk-dysmsapi</artifactId> | ||
| 570 | - <version>${aliyun-java-sdk-dysmsapi.version}</version> | ||
| 571 | - </dependency> | ||
| 572 | - <dependency> | ||
| 573 | - <groupId>com.tencentcloudapi</groupId> | ||
| 574 | - <artifactId>tencentcloud-sdk-java-sms</artifactId> | ||
| 575 | - <version>${tencentcloud-sdk-java.version}</version> | ||
| 576 | - </dependency> | ||
| 577 | - <!-- SMS SDK end --> | ||
| 578 | - | ||
| 579 | <dependency> | 548 | <dependency> |
| 580 | <groupId>com.xingyuv</groupId> | 549 | <groupId>com.xingyuv</groupId> |
| 581 | <artifactId>spring-boot-starter-justauth</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) --> | 550 | <artifactId>spring-boot-starter-justauth</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) --> |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java
| @@ -5,6 +5,8 @@ import cn.hutool.core.map.TableMap; | @@ -5,6 +5,8 @@ import cn.hutool.core.map.TableMap; | ||
| 5 | import cn.hutool.core.net.url.UrlBuilder; | 5 | import cn.hutool.core.net.url.UrlBuilder; |
| 6 | import cn.hutool.core.util.ReflectUtil; | 6 | import cn.hutool.core.util.ReflectUtil; |
| 7 | import cn.hutool.core.util.StrUtil; | 7 | import cn.hutool.core.util.StrUtil; |
| 8 | +import cn.hutool.http.HttpRequest; | ||
| 9 | +import cn.hutool.http.HttpResponse; | ||
| 8 | import org.springframework.util.StringUtils; | 10 | import org.springframework.util.StringUtils; |
| 9 | import org.springframework.web.util.UriComponents; | 11 | import org.springframework.web.util.UriComponents; |
| 10 | import org.springframework.web.util.UriComponentsBuilder; | 12 | import org.springframework.web.util.UriComponentsBuilder; |
| @@ -109,7 +111,7 @@ public class HttpUtils { | @@ -109,7 +111,7 @@ public class HttpUtils { | ||
| 109 | authorization = Base64.decodeStr(authorization); | 111 | authorization = Base64.decodeStr(authorization); |
| 110 | clientId = StrUtil.subBefore(authorization, ":", false); | 112 | clientId = StrUtil.subBefore(authorization, ":", false); |
| 111 | clientSecret = StrUtil.subAfter(authorization, ":", false); | 113 | clientSecret = StrUtil.subAfter(authorization, ":", false); |
| 112 | - // 再从 Param 中获取 | 114 | + // 再从 Param 中获取 |
| 113 | } else { | 115 | } else { |
| 114 | clientId = request.getParameter("client_id"); | 116 | clientId = request.getParameter("client_id"); |
| 115 | clientSecret = request.getParameter("client_secret"); | 117 | clientSecret = request.getParameter("client_secret"); |
| @@ -122,5 +124,40 @@ public class HttpUtils { | @@ -122,5 +124,40 @@ public class HttpUtils { | ||
| 122 | return null; | 124 | return null; |
| 123 | } | 125 | } |
| 124 | 126 | ||
| 127 | + /** | ||
| 128 | + * HTTP post 请求,基于 {@link cn.hutool.http.HttpUtil} 实现 | ||
| 129 | + * | ||
| 130 | + * 为什么要封装该方法,因为 HttpUtil 默认封装的方法,没有允许传递 headers 参数 | ||
| 131 | + * | ||
| 132 | + * @param url URL | ||
| 133 | + * @param headers 请求头 | ||
| 134 | + * @param requestBody 请求体 | ||
| 135 | + * @return 请求结果 | ||
| 136 | + */ | ||
| 137 | + public static String post(String url, Map<String, String> headers, String requestBody) { | ||
| 138 | + try (HttpResponse response = HttpRequest.post(url) | ||
| 139 | + .addHeaders(headers) | ||
| 140 | + .body(requestBody) | ||
| 141 | + .execute()) { | ||
| 142 | + return response.body(); | ||
| 143 | + } | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + /** | ||
| 147 | + * HTTP get 请求,基于 {@link cn.hutool.http.HttpUtil} 实现 | ||
| 148 | + * | ||
| 149 | + * 为什么要封装该方法,因为 HttpUtil 默认封装的方法,没有允许传递 headers 参数 | ||
| 150 | + * | ||
| 151 | + * @param url URL | ||
| 152 | + * @param headers 请求头 | ||
| 153 | + * @return 请求结果 | ||
| 154 | + */ | ||
| 155 | + public static String get(String url, Map<String, String> headers) { | ||
| 156 | + try (HttpResponse response = HttpRequest.get(url) | ||
| 157 | + .addHeaders(headers) | ||
| 158 | + .execute()) { | ||
| 159 | + return response.body(); | ||
| 160 | + } | ||
| 161 | + } | ||
| 125 | 162 | ||
| 126 | } | 163 | } |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java
| @@ -3,11 +3,15 @@ package cn.iocoder.yudao.framework.common.util.spring; | @@ -3,11 +3,15 @@ package cn.iocoder.yudao.framework.common.util.spring; | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | import cn.hutool.core.util.ArrayUtil; | 5 | import cn.hutool.core.util.ArrayUtil; |
| 6 | +import cn.hutool.core.util.StrUtil; | ||
| 7 | +import cn.hutool.extra.spring.SpringUtil; | ||
| 6 | import org.aspectj.lang.JoinPoint; | 8 | import org.aspectj.lang.JoinPoint; |
| 7 | import org.aspectj.lang.reflect.MethodSignature; | 9 | import org.aspectj.lang.reflect.MethodSignature; |
| 10 | +import org.springframework.context.expression.BeanFactoryResolver; | ||
| 8 | import org.springframework.core.DefaultParameterNameDiscoverer; | 11 | import org.springframework.core.DefaultParameterNameDiscoverer; |
| 9 | import org.springframework.core.ParameterNameDiscoverer; | 12 | import org.springframework.core.ParameterNameDiscoverer; |
| 10 | import org.springframework.expression.EvaluationContext; | 13 | import org.springframework.expression.EvaluationContext; |
| 14 | +import org.springframework.expression.Expression; | ||
| 11 | import org.springframework.expression.ExpressionParser; | 15 | import org.springframework.expression.ExpressionParser; |
| 12 | import org.springframework.expression.spel.standard.SpelExpressionParser; | 16 | import org.springframework.expression.spel.standard.SpelExpressionParser; |
| 13 | import org.springframework.expression.spel.support.StandardEvaluationContext; | 17 | import org.springframework.expression.spel.support.StandardEvaluationContext; |
| @@ -86,4 +90,20 @@ public class SpringExpressionUtils { | @@ -86,4 +90,20 @@ public class SpringExpressionUtils { | ||
| 86 | return result; | 90 | return result; |
| 87 | } | 91 | } |
| 88 | 92 | ||
| 93 | + /** | ||
| 94 | + * 从 Bean 工厂,解析 EL 表达式的结果 | ||
| 95 | + * | ||
| 96 | + * @param expressionString EL 表达式 | ||
| 97 | + * @return 执行界面 | ||
| 98 | + */ | ||
| 99 | + public static Object parseExpression(String expressionString) { | ||
| 100 | + if (StrUtil.isBlank(expressionString)) { | ||
| 101 | + return null; | ||
| 102 | + } | ||
| 103 | + Expression expression = EXPRESSION_PARSER.parseExpression(expressionString); | ||
| 104 | + StandardEvaluationContext context = new StandardEvaluationContext(); | ||
| 105 | + context.setBeanResolver(new BeanFactoryResolver(SpringUtil.getApplicationContext())); | ||
| 106 | + return expression.getValue(context); | ||
| 107 | + } | ||
| 108 | + | ||
| 89 | } | 109 | } |
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java
| 1 | package cn.iocoder.yudao.framework.ip.core; | 1 | package cn.iocoder.yudao.framework.ip.core; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; | 3 | import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; |
| 4 | +import com.fasterxml.jackson.annotation.JsonBackReference; | ||
| 5 | +import com.fasterxml.jackson.annotation.JsonManagedReference; | ||
| 4 | import lombok.AllArgsConstructor; | 6 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Data; | 7 | import lombok.Data; |
| 6 | import lombok.NoArgsConstructor; | 8 | import lombok.NoArgsConstructor; |
| 9 | +import lombok.ToString; | ||
| 7 | 10 | ||
| 8 | import java.util.List; | 11 | import java.util.List; |
| 9 | 12 | ||
| @@ -17,6 +20,7 @@ import java.util.List; | @@ -17,6 +20,7 @@ import java.util.List; | ||
| 17 | @Data | 20 | @Data |
| 18 | @AllArgsConstructor | 21 | @AllArgsConstructor |
| 19 | @NoArgsConstructor | 22 | @NoArgsConstructor |
| 23 | +@ToString(exclude = {"parent"}) // 参见 https://gitee.com/yudaocode/yudao-cloud-mini/pulls/2 原因 | ||
| 20 | public class Area { | 24 | public class Area { |
| 21 | 25 | ||
| 22 | /** | 26 | /** |
| @@ -46,10 +50,12 @@ public class Area { | @@ -46,10 +50,12 @@ public class Area { | ||
| 46 | /** | 50 | /** |
| 47 | * 父节点 | 51 | * 父节点 |
| 48 | */ | 52 | */ |
| 53 | + @JsonManagedReference | ||
| 49 | private Area parent; | 54 | private Area parent; |
| 50 | /** | 55 | /** |
| 51 | * 子节点 | 56 | * 子节点 |
| 52 | */ | 57 | */ |
| 58 | + @JsonBackReference | ||
| 53 | private List<Area> children; | 59 | private List<Area> children; |
| 54 | 60 | ||
| 55 | } | 61 | } |
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/job/TenantJobAspect.java
| @@ -46,6 +46,7 @@ public class TenantJobAspect { | @@ -46,6 +46,7 @@ public class TenantJobAspect { | ||
| 46 | try { | 46 | try { |
| 47 | joinPoint.proceed(); | 47 | joinPoint.proceed(); |
| 48 | } catch (Throwable e) { | 48 | } catch (Throwable e) { |
| 49 | + log.error("[execute][租户({}) 执行 Job 发生异常", tenantId, e); | ||
| 49 | results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); | 50 | results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); |
| 50 | } | 51 | } |
| 51 | }); | 52 | }); |
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java
| @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 7 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; | 7 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| 8 | import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; | 8 | import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; |
| 9 | import com.baomidou.mybatisplus.extension.incrementer.*; | 9 | import com.baomidou.mybatisplus.extension.incrementer.*; |
| 10 | +import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; | ||
| 11 | +import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; | ||
| 10 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; | 12 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
| 11 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; | 13 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
| 12 | import org.apache.ibatis.annotations.Mapper; | 14 | import org.apache.ibatis.annotations.Mapper; |
| @@ -16,6 +18,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | @@ -16,6 +18,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
| 16 | import org.springframework.context.annotation.Bean; | 18 | import org.springframework.context.annotation.Bean; |
| 17 | import org.springframework.core.env.ConfigurableEnvironment; | 19 | import org.springframework.core.env.ConfigurableEnvironment; |
| 18 | 20 | ||
| 21 | +import java.util.concurrent.TimeUnit; | ||
| 22 | + | ||
| 19 | /** | 23 | /** |
| 20 | * MyBaits 配置类 | 24 | * MyBaits 配置类 |
| 21 | * | 25 | * |
| @@ -26,6 +30,14 @@ import org.springframework.core.env.ConfigurableEnvironment; | @@ -26,6 +30,14 @@ import org.springframework.core.env.ConfigurableEnvironment; | ||
| 26 | lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 | 30 | lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 |
| 27 | public class YudaoMybatisAutoConfiguration { | 31 | public class YudaoMybatisAutoConfiguration { |
| 28 | 32 | ||
| 33 | + static { | ||
| 34 | + // 动态 SQL 智能优化支持本地缓存加速解析,更完善的租户复杂 XML 动态 SQL 支持,静态注入缓存 | ||
| 35 | + JsqlParserGlobal.setJsqlParseCache(new JdkSerialCaffeineJsqlParseCache( | ||
| 36 | + (cache) -> cache.maximumSize(1024) | ||
| 37 | + .expireAfterWrite(5, TimeUnit.SECONDS)) | ||
| 38 | + ); | ||
| 39 | + } | ||
| 40 | + | ||
| 29 | @Bean | 41 | @Bean |
| 30 | public MybatisPlusInterceptor mybatisPlusInterceptor() { | 42 | public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| 31 | MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); | 43 | MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); |
| @@ -34,7 +46,7 @@ public class YudaoMybatisAutoConfiguration { | @@ -34,7 +46,7 @@ public class YudaoMybatisAutoConfiguration { | ||
| 34 | } | 46 | } |
| 35 | 47 | ||
| 36 | @Bean | 48 | @Bean |
| 37 | - public MetaObjectHandler defaultMetaObjectHandler(){ | 49 | + public MetaObjectHandler defaultMetaObjectHandler() { |
| 38 | return new DefaultDBFieldHandler(); // 自动填充参数类 | 50 | return new DefaultDBFieldHandler(); // 自动填充参数类 |
| 39 | } | 51 | } |
| 40 | 52 |
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
| @@ -185,10 +185,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> { | @@ -185,10 +185,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> { | ||
| 185 | return Db.updateBatchById(entities, size); | 185 | return Db.updateBatchById(entities, size); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | - default boolean insertOrUpdate(T entity) { | ||
| 189 | - return Db.saveOrUpdate(entity); | ||
| 190 | - } | ||
| 191 | - | ||
| 192 | default Boolean insertOrUpdateBatch(Collection<T> collection) { | 188 | default Boolean insertOrUpdateBatch(Collection<T> collection) { |
| 193 | return Db.saveOrUpdateBatch(collection); | 189 | return Db.saveOrUpdateBatch(collection); |
| 194 | } | 190 | } |
yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/aop/ApiSignatureAspect.java
| @@ -69,7 +69,7 @@ public class ApiSignatureAspect { | @@ -69,7 +69,7 @@ public class ApiSignatureAspect { | ||
| 69 | 69 | ||
| 70 | // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) | 70 | // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) |
| 71 | String nonce = request.getHeader(signature.nonce()); | 71 | String nonce = request.getHeader(signature.nonce()); |
| 72 | - signatureRedisDAO.setNonce(nonce, signature.timeout() * 2, signature.timeUnit()); | 72 | + signatureRedisDAO.setNonce(appId, nonce, signature.timeout() * 2, signature.timeUnit()); |
| 73 | return true; | 73 | return true; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| @@ -113,7 +113,7 @@ public class ApiSignatureAspect { | @@ -113,7 +113,7 @@ public class ApiSignatureAspect { | ||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | // 3. 检查 nonce 是否存在,有且仅能使用一次 | 115 | // 3. 检查 nonce 是否存在,有且仅能使用一次 |
| 116 | - return signatureRedisDAO.getNonce(nonce) == null; | 116 | + return signatureRedisDAO.getNonce(appId, nonce) == null; |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /** | 119 | /** |
| @@ -165,5 +165,4 @@ public class ApiSignatureAspect { | @@ -165,5 +165,4 @@ public class ApiSignatureAspect { | ||
| 165 | return sortedMap; | 165 | return sortedMap; |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | -} | ||
| 169 | - | 168 | +} |
| 170 | \ No newline at end of file | 169 | \ No newline at end of file |
yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/redis/ApiSignatureRedisDAO.java
| @@ -22,7 +22,7 @@ public class ApiSignatureRedisDAO { | @@ -22,7 +22,7 @@ public class ApiSignatureRedisDAO { | ||
| 22 | * VALUE 格式:String | 22 | * VALUE 格式:String |
| 23 | * 过期时间:不固定 | 23 | * 过期时间:不固定 |
| 24 | */ | 24 | */ |
| 25 | - private static final String SIGNATURE_NONCE = "api_signature_nonce:%s"; | 25 | + private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s"; |
| 26 | 26 | ||
| 27 | /** | 27 | /** |
| 28 | * 签名密钥 | 28 | * 签名密钥 |
| @@ -36,16 +36,16 @@ public class ApiSignatureRedisDAO { | @@ -36,16 +36,16 @@ public class ApiSignatureRedisDAO { | ||
| 36 | 36 | ||
| 37 | // ========== 验签随机数 ========== | 37 | // ========== 验签随机数 ========== |
| 38 | 38 | ||
| 39 | - public String getNonce(String nonce) { | ||
| 40 | - return stringRedisTemplate.opsForValue().get(formatNonceKey(nonce)); | 39 | + public String getNonce(String appId, String nonce) { |
| 40 | + return stringRedisTemplate.opsForValue().get(formatNonceKey(appId, nonce)); | ||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | - public void setNonce(String nonce, int time, TimeUnit timeUnit) { | ||
| 44 | - stringRedisTemplate.opsForValue().set(formatNonceKey(nonce), "", time, timeUnit); | 43 | + public void setNonce(String appId, String nonce, int time, TimeUnit timeUnit) { |
| 44 | + stringRedisTemplate.opsForValue().set(formatNonceKey(appId, nonce), "", time, timeUnit); | ||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | - private static String formatNonceKey(String key) { | ||
| 48 | - return String.format(SIGNATURE_NONCE, key); | 47 | + private static String formatNonceKey(String appId, String nonce) { |
| 48 | + return String.format(SIGNATURE_NONCE, appId, nonce); | ||
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | // ========== 签名密钥 ========== | 51 | // ========== 签名密钥 ========== |
yudao-framework/yudao-spring-boot-starter-protection/src/test/java/cn/iocoder/yudao/framework/signature/core/ApiSignatureTest.java
| @@ -69,7 +69,7 @@ public class ApiSignatureTest { | @@ -69,7 +69,7 @@ public class ApiSignatureTest { | ||
| 69 | // 断言结果 | 69 | // 断言结果 |
| 70 | assertTrue(result); | 70 | assertTrue(result); |
| 71 | // 断言调用 | 71 | // 断言调用 |
| 72 | - verify(signatureRedisDAO).setNonce(eq(nonce), eq(120), eq(TimeUnit.SECONDS)); | 72 | + verify(signatureRedisDAO).setNonce(eq(appId), eq(nonce), eq(120), eq(TimeUnit.SECONDS)); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | -} | 75 | -} |
| 76 | +} | ||
| 76 | \ No newline at end of file | 77 | \ No newline at end of file |
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
| @@ -29,18 +29,22 @@ public class LogRecordServiceImpl implements ILogRecordService { | @@ -29,18 +29,22 @@ public class LogRecordServiceImpl implements ILogRecordService { | ||
| 29 | 29 | ||
| 30 | @Override | 30 | @Override |
| 31 | public void record(LogRecord logRecord) { | 31 | public void record(LogRecord logRecord) { |
| 32 | - // 1. 补全通用字段 | ||
| 33 | OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); | 32 | OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); |
| 34 | - reqDTO.setTraceId(TracerUtils.getTraceId()); | ||
| 35 | - // 补充用户信息 | ||
| 36 | - fillUserFields(reqDTO); | ||
| 37 | - // 补全模块信息 | ||
| 38 | - fillModuleFields(reqDTO, logRecord); | ||
| 39 | - // 补全请求信息 | ||
| 40 | - fillRequestFields(reqDTO); | 33 | + try { |
| 34 | + reqDTO.setTraceId(TracerUtils.getTraceId()); | ||
| 35 | + // 补充用户信息 | ||
| 36 | + fillUserFields(reqDTO); | ||
| 37 | + // 补全模块信息 | ||
| 38 | + fillModuleFields(reqDTO, logRecord); | ||
| 39 | + // 补全请求信息 | ||
| 40 | + fillRequestFields(reqDTO); | ||
| 41 | 41 | ||
| 42 | - // 2. 异步记录日志 | ||
| 43 | - operateLogApi.createOperateLog(reqDTO); | 42 | + // 2. 异步记录日志 |
| 43 | + operateLogApi.createOperateLogAsync(reqDTO); | ||
| 44 | + } catch (Throwable ex) { | ||
| 45 | + // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||
| 46 | + log.error("[record][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||
| 47 | + } | ||
| 44 | } | 48 | } |
| 45 | 49 | ||
| 46 | private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { | 50 | private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { |
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
| @@ -103,6 +103,10 @@ public class RandomUtils { | @@ -103,6 +103,10 @@ public class RandomUtils { | ||
| 103 | return randomString() + "@qq.com"; | 103 | return randomString() + "@qq.com"; |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | + public static String randomMobile() { | ||
| 107 | + return "13800138" + RandomUtil.randomNumbers(3); | ||
| 108 | + } | ||
| 109 | + | ||
| 106 | public static String randomURL() { | 110 | public static String randomURL() { |
| 107 | return "https://www.iocoder.cn/" + randomString(); | 111 | return "https://www.iocoder.cn/" + randomString(); |
| 108 | } | 112 | } |
yudao-framework/yudao-spring-boot-starter-web/pom.xml
| @@ -32,6 +32,11 @@ | @@ -32,6 +32,11 @@ | ||
| 32 | <artifactId>spring-boot-configuration-processor</artifactId> | 32 | <artifactId>spring-boot-configuration-processor</artifactId> |
| 33 | <optional>true</optional> | 33 | <optional>true</optional> |
| 34 | </dependency> | 34 | </dependency> |
| 35 | + <dependency> | ||
| 36 | + <groupId>org.aspectj</groupId> | ||
| 37 | + <artifactId>aspectjweaver</artifactId> | ||
| 38 | + <scope>provided</scope> <!-- 解决工具类 SpringExpressionUtils 加载的时候访问不到 org.aspectj.lang.JoinPoint 问题 --> | ||
| 39 | + </dependency> | ||
| 35 | 40 | ||
| 36 | <dependency> | 41 | <dependency> |
| 37 | <groupId>com.github.xiaoymin</groupId> | 42 | <groupId>com.github.xiaoymin</groupId> |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java
| @@ -2,15 +2,10 @@ package cn.iocoder.yudao.framework.apilog.config; | @@ -2,15 +2,10 @@ package cn.iocoder.yudao.framework.apilog.config; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter; | 3 | import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter; |
| 4 | import cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor; | 4 | import cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor; |
| 5 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; | ||
| 6 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; | ||
| 7 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | ||
| 8 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; | ||
| 9 | import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | 5 | import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; |
| 10 | import cn.iocoder.yudao.framework.web.config.WebProperties; | 6 | import cn.iocoder.yudao.framework.web.config.WebProperties; |
| 11 | import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration; | 7 | import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration; |
| 12 | import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | 8 | import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; |
| 13 | -import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||
| 14 | import jakarta.servlet.Filter; | 9 | import jakarta.servlet.Filter; |
| 15 | import org.springframework.beans.factory.annotation.Value; | 10 | import org.springframework.beans.factory.annotation.Value; |
| 16 | import org.springframework.boot.autoconfigure.AutoConfiguration; | 11 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| @@ -23,18 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | @@ -23,18 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
| 23 | @AutoConfiguration(after = YudaoWebAutoConfiguration.class) | 18 | @AutoConfiguration(after = YudaoWebAutoConfiguration.class) |
| 24 | public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { | 19 | public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { |
| 25 | 20 | ||
| 26 | - @Bean | ||
| 27 | - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||
| 28 | - public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) { | ||
| 29 | - return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi); | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - @Bean | ||
| 33 | - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | ||
| 34 | - public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) { | ||
| 35 | - return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); | ||
| 36 | - } | ||
| 37 | - | ||
| 38 | /** | 21 | /** |
| 39 | * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 | 22 | * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 |
| 40 | */ | 23 | */ |
| @@ -42,8 +25,8 @@ public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { | @@ -42,8 +25,8 @@ public class YudaoApiLogAutoConfiguration implements WebMvcConfigurer { | ||
| 42 | @ConditionalOnProperty(prefix = "yudao.access-log", value = "enable", matchIfMissing = true) // 允许使用 yudao.access-log.enable=false 禁用访问日志 | 25 | @ConditionalOnProperty(prefix = "yudao.access-log", value = "enable", matchIfMissing = true) // 允许使用 yudao.access-log.enable=false 禁用访问日志 |
| 43 | public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties, | 26 | public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties, |
| 44 | @Value("${spring.application.name}") String applicationName, | 27 | @Value("${spring.application.name}") String applicationName, |
| 45 | - ApiAccessLogFrameworkService apiAccessLogFrameworkService) { | ||
| 46 | - ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService); | 28 | + ApiAccessLogApi apiAccessLogApi) { |
| 29 | + ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogApi); | ||
| 47 | return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); | 30 | return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); |
| 48 | } | 31 | } |
| 49 | 32 |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
| @@ -9,7 +9,6 @@ import cn.hutool.core.util.BooleanUtil; | @@ -9,7 +9,6 @@ import cn.hutool.core.util.BooleanUtil; | ||
| 9 | import cn.hutool.core.util.StrUtil; | 9 | import cn.hutool.core.util.StrUtil; |
| 10 | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; | 10 | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| 11 | import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum; | 11 | import cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum; |
| 12 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; | ||
| 13 | import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | 12 | import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; |
| 14 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 13 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 15 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 14 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| @@ -18,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | @@ -18,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||
| 18 | import cn.iocoder.yudao.framework.web.config.WebProperties; | 17 | import cn.iocoder.yudao.framework.web.config.WebProperties; |
| 19 | import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter; | 18 | import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter; |
| 20 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | 19 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 20 | +import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | ||
| 21 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | 21 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; |
| 22 | import com.fasterxml.jackson.databind.JsonNode; | 22 | import com.fasterxml.jackson.databind.JsonNode; |
| 23 | import io.swagger.v3.oas.annotations.Operation; | 23 | import io.swagger.v3.oas.annotations.Operation; |
| @@ -36,7 +36,7 @@ import java.time.temporal.ChronoUnit; | @@ -36,7 +36,7 @@ import java.time.temporal.ChronoUnit; | ||
| 36 | import java.util.Iterator; | 36 | import java.util.Iterator; |
| 37 | import java.util.Map; | 37 | import java.util.Map; |
| 38 | 38 | ||
| 39 | -import static cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor.*; | 39 | +import static cn.iocoder.yudao.framework.apilog.core.interceptor.ApiAccessLogInterceptor.ATTRIBUTE_HANDLER_METHOD; |
| 40 | import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; | 40 | import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; |
| 41 | 41 | ||
| 42 | /** | 42 | /** |
| @@ -53,12 +53,12 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | @@ -53,12 +53,12 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | ||
| 53 | 53 | ||
| 54 | private final String applicationName; | 54 | private final String applicationName; |
| 55 | 55 | ||
| 56 | - private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; | 56 | + private final ApiAccessLogApi apiAccessLogApi; |
| 57 | 57 | ||
| 58 | - public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { | 58 | + public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogApi apiAccessLogApi) { |
| 59 | super(webProperties); | 59 | super(webProperties); |
| 60 | this.applicationName = applicationName; | 60 | this.applicationName = applicationName; |
| 61 | - this.apiAccessLogFrameworkService = apiAccessLogFrameworkService; | 61 | + this.apiAccessLogApi = apiAccessLogApi; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | @Override | 64 | @Override |
| @@ -91,7 +91,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | @@ -91,7 +91,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | ||
| 91 | if (!enable) { | 91 | if (!enable) { |
| 92 | return; | 92 | return; |
| 93 | } | 93 | } |
| 94 | - apiAccessLogFrameworkService.createApiAccessLog(accessLog); | 94 | + apiAccessLogApi.createApiAccessLogAsync(accessLog); |
| 95 | } catch (Throwable th) { | 95 | } catch (Throwable th) { |
| 96 | log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); | 96 | log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); |
| 97 | } | 97 | } |
| @@ -181,7 +181,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | @@ -181,7 +181,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter { | ||
| 181 | // ========== 请求和响应的脱敏逻辑,移除类似 password、token 等敏感字段 ========== | 181 | // ========== 请求和响应的脱敏逻辑,移除类似 password、token 等敏感字段 ========== |
| 182 | 182 | ||
| 183 | private static String sanitizeMap(Map<String, ?> map, String[] sanitizeKeys) { | 183 | private static String sanitizeMap(Map<String, ?> map, String[] sanitizeKeys) { |
| 184 | - if (CollUtil.isNotEmpty(map)) { | 184 | + if (CollUtil.isEmpty(map)) { |
| 185 | return null; | 185 | return null; |
| 186 | } | 186 | } |
| 187 | if (sanitizeKeys != null) { | 187 | if (sanitizeKeys != null) { |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java deleted
| 1 | -package cn.iocoder.yudao.framework.apilog.core.service; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | - * API 访问日志 Framework Service 接口 | ||
| 7 | - * | ||
| 8 | - * @author 芋道源码 | ||
| 9 | - */ | ||
| 10 | -public interface ApiAccessLogFrameworkService { | ||
| 11 | - | ||
| 12 | - /** | ||
| 13 | - * 创建 API 访问日志 | ||
| 14 | - * | ||
| 15 | - * @param reqDTO API 访问日志 | ||
| 16 | - */ | ||
| 17 | - void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO); | ||
| 18 | - | ||
| 19 | -} |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java deleted
| 1 | -package cn.iocoder.yudao.framework.apilog.core.service; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; | ||
| 4 | -import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; | ||
| 5 | -import lombok.RequiredArgsConstructor; | ||
| 6 | -import lombok.extern.slf4j.Slf4j; | ||
| 7 | -import org.springframework.scheduling.annotation.Async; | ||
| 8 | - | ||
| 9 | -/** | ||
| 10 | - * API 访问日志 Framework Service 实现类 | ||
| 11 | - * | ||
| 12 | - * 基于 {@link ApiAccessLogApi} 服务,记录访问日志 | ||
| 13 | - * | ||
| 14 | - * @author 芋道源码 | ||
| 15 | - */ | ||
| 16 | -@RequiredArgsConstructor | ||
| 17 | -@Slf4j | ||
| 18 | -public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { | ||
| 19 | - | ||
| 20 | - private final ApiAccessLogApi apiAccessLogApi; | ||
| 21 | - | ||
| 22 | - @Override | ||
| 23 | - @Async | ||
| 24 | - public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) { | ||
| 25 | - try { | ||
| 26 | - apiAccessLogApi.createApiAccessLog(reqDTO); | ||
| 27 | - } catch (Throwable ex) { | ||
| 28 | - // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||
| 29 | - log.error("[createApiAccessLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||
| 30 | - } | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | -} |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java deleted
| 1 | -package cn.iocoder.yudao.framework.apilog.core.service; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | - * API 错误日志 Framework Service 接口 | ||
| 7 | - * | ||
| 8 | - * @author 芋道源码 | ||
| 9 | - */ | ||
| 10 | -public interface ApiErrorLogFrameworkService { | ||
| 11 | - | ||
| 12 | - /** | ||
| 13 | - * 创建 API 错误日志 | ||
| 14 | - * | ||
| 15 | - * @param reqDTO API 错误日志 | ||
| 16 | - */ | ||
| 17 | - void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO); | ||
| 18 | - | ||
| 19 | -} |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java deleted
| 1 | -package cn.iocoder.yudao.framework.apilog.core.service; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||
| 4 | -import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | ||
| 5 | -import lombok.RequiredArgsConstructor; | ||
| 6 | -import lombok.extern.slf4j.Slf4j; | ||
| 7 | -import org.springframework.scheduling.annotation.Async; | ||
| 8 | - | ||
| 9 | -/** | ||
| 10 | - * API 错误日志 Framework Service 实现类 | ||
| 11 | - * | ||
| 12 | - * 基于 {@link ApiErrorLogApi} 服务,记录错误日志 | ||
| 13 | - * | ||
| 14 | - * @author 芋道源码 | ||
| 15 | - */ | ||
| 16 | -@RequiredArgsConstructor | ||
| 17 | -@Slf4j | ||
| 18 | -public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { | ||
| 19 | - | ||
| 20 | - private final ApiErrorLogApi apiErrorLogApi; | ||
| 21 | - | ||
| 22 | - @Override | ||
| 23 | - @Async | ||
| 24 | - public void createApiErrorLog(ApiErrorLogCreateReqDTO reqDTO) { | ||
| 25 | - try { | ||
| 26 | - apiErrorLogApi.createApiErrorLog(reqDTO); | ||
| 27 | - } catch (Throwable ex) { | ||
| 28 | - // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||
| 29 | - log.error("[createApiErrorLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||
| 30 | - } | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | -} |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/handler/DesensitizationHandler.java
| 1 | package cn.iocoder.yudao.framework.desensitize.core.base.handler; | 1 | package cn.iocoder.yudao.framework.desensitize.core.base.handler; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.ReflectUtil; | ||
| 4 | + | ||
| 3 | import java.lang.annotation.Annotation; | 5 | import java.lang.annotation.Annotation; |
| 4 | 6 | ||
| 5 | /** | 7 | /** |
| @@ -18,4 +20,21 @@ public interface DesensitizationHandler<T extends Annotation> { | @@ -18,4 +20,21 @@ public interface DesensitizationHandler<T extends Annotation> { | ||
| 18 | */ | 20 | */ |
| 19 | String desensitize(String origin, T annotation); | 21 | String desensitize(String origin, T annotation); |
| 20 | 22 | ||
| 23 | + /** | ||
| 24 | + * 是否禁用脱敏的 Spring EL 表达式 | ||
| 25 | + * | ||
| 26 | + * 如果返回 true 则跳过脱敏 | ||
| 27 | + * | ||
| 28 | + * @param annotation 注解信息 | ||
| 29 | + * @return 是否禁用脱敏的 Spring EL 表达式 | ||
| 30 | + */ | ||
| 31 | + default String getDisable(T annotation) { | ||
| 32 | + // 约定:默认就是 enable() 属性。如果不符合,子类重写 | ||
| 33 | + try { | ||
| 34 | + return (String) ReflectUtil.invoke(annotation, "disable"); | ||
| 35 | + } catch (Exception ex) { | ||
| 36 | + return ""; | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + | ||
| 21 | } | 40 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/EmailDesensitize.java
| @@ -33,4 +33,12 @@ public @interface EmailDesensitize { | @@ -33,4 +33,12 @@ public @interface EmailDesensitize { | ||
| 33 | * 比如:example@gmail.com 脱敏之后为 e****@gmail.com | 33 | * 比如:example@gmail.com 脱敏之后为 e****@gmail.com |
| 34 | */ | 34 | */ |
| 35 | String replacer() default "$1****$2"; | 35 | String replacer() default "$1****$2"; |
| 36 | + | ||
| 37 | + /** | ||
| 38 | + * 是否禁用脱敏 | ||
| 39 | + * | ||
| 40 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 41 | + */ | ||
| 42 | + String disable() default ""; | ||
| 43 | + | ||
| 36 | } | 44 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/RegexDesensitize.java
| @@ -35,4 +35,12 @@ public @interface RegexDesensitize { | @@ -35,4 +35,12 @@ public @interface RegexDesensitize { | ||
| 35 | * 脱敏后字符串 ******456789 | 35 | * 脱敏后字符串 ******456789 |
| 36 | */ | 36 | */ |
| 37 | String replacer() default "******"; | 37 | String replacer() default "******"; |
| 38 | + | ||
| 39 | + /** | ||
| 40 | + * 是否禁用脱敏 | ||
| 41 | + * | ||
| 42 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 43 | + */ | ||
| 44 | + String disable() default ""; | ||
| 45 | + | ||
| 38 | } | 46 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java
| 1 | package cn.iocoder.yudao.framework.desensitize.core.regex.handler; | 1 | package cn.iocoder.yudao.framework.desensitize.core.regex.handler; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; | ||
| 3 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | 4 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; |
| 4 | 5 | ||
| 5 | import java.lang.annotation.Annotation; | 6 | import java.lang.annotation.Annotation; |
| @@ -14,6 +15,13 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> | @@ -14,6 +15,13 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> | ||
| 14 | 15 | ||
| 15 | @Override | 16 | @Override |
| 16 | public String desensitize(String origin, T annotation) { | 17 | public String desensitize(String origin, T annotation) { |
| 18 | + // 1. 判断是否禁用脱敏 | ||
| 19 | + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); | ||
| 20 | + if (Boolean.TRUE.equals(disable)) { | ||
| 21 | + return origin; | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + // 2. 执行脱敏 | ||
| 17 | String regex = getRegex(annotation); | 25 | String regex = getRegex(annotation); |
| 18 | String replacer = getReplacer(annotation); | 26 | String replacer = getReplacer(annotation); |
| 19 | return origin.replaceAll(regex, replacer); | 27 | return origin.replaceAll(regex, replacer); |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java
| @@ -18,4 +18,10 @@ public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitiza | @@ -18,4 +18,10 @@ public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitiza | ||
| 18 | String getReplacer(RegexDesensitize annotation) { | 18 | String getReplacer(RegexDesensitize annotation) { |
| 19 | return annotation.replacer(); | 19 | return annotation.replacer(); |
| 20 | } | 20 | } |
| 21 | + | ||
| 22 | + @Override | ||
| 23 | + public String getDisable(RegexDesensitize annotation) { | ||
| 24 | + return annotation.disable(); | ||
| 25 | + } | ||
| 26 | + | ||
| 21 | } | 27 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/BankCardDesensitize.java
| @@ -37,4 +37,11 @@ public @interface BankCardDesensitize { | @@ -37,4 +37,11 @@ public @interface BankCardDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java
| @@ -37,4 +37,11 @@ public @interface CarLicenseDesensitize { | @@ -37,4 +37,11 @@ public @interface CarLicenseDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java
| @@ -37,4 +37,11 @@ public @interface ChineseNameDesensitize { | @@ -37,4 +37,11 @@ public @interface ChineseNameDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java
| @@ -37,4 +37,11 @@ public @interface FixedPhoneDesensitize { | @@ -37,4 +37,11 @@ public @interface FixedPhoneDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/IdCardDesensitize.java
| @@ -37,4 +37,11 @@ public @interface IdCardDesensitize { | @@ -37,4 +37,11 @@ public @interface IdCardDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/MobileDesensitize.java
| @@ -37,4 +37,11 @@ public @interface MobileDesensitize { | @@ -37,4 +37,11 @@ public @interface MobileDesensitize { | ||
| 37 | */ | 37 | */ |
| 38 | String replacer() default "*"; | 38 | String replacer() default "*"; |
| 39 | 39 | ||
| 40 | + /** | ||
| 41 | + * 是否禁用脱敏 | ||
| 42 | + * | ||
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 44 | + */ | ||
| 45 | + String disable() default ""; | ||
| 46 | + | ||
| 40 | } | 47 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/PasswordDesensitize.java
| @@ -39,4 +39,11 @@ public @interface PasswordDesensitize { | @@ -39,4 +39,11 @@ public @interface PasswordDesensitize { | ||
| 39 | */ | 39 | */ |
| 40 | String replacer() default "*"; | 40 | String replacer() default "*"; |
| 41 | 41 | ||
| 42 | + /** | ||
| 43 | + * 是否禁用脱敏 | ||
| 44 | + * | ||
| 45 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 46 | + */ | ||
| 47 | + String disable() default ""; | ||
| 48 | + | ||
| 42 | } | 49 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/SliderDesensitize.java
| @@ -40,4 +40,12 @@ public @interface SliderDesensitize { | @@ -40,4 +40,12 @@ public @interface SliderDesensitize { | ||
| 40 | * 前缀保留长度 | 40 | * 前缀保留长度 |
| 41 | */ | 41 | */ |
| 42 | int prefixKeep() default 0; | 42 | int prefixKeep() default 0; |
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * 是否禁用脱敏 | ||
| 46 | + * | ||
| 47 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | ||
| 48 | + */ | ||
| 49 | + String disable() default ""; | ||
| 50 | + | ||
| 43 | } | 51 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java
| 1 | package cn.iocoder.yudao.framework.desensitize.core.slider.handler; | 1 | package cn.iocoder.yudao.framework.desensitize.core.slider.handler; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; | ||
| 3 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | 4 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; |
| 4 | 5 | ||
| 5 | import java.lang.annotation.Annotation; | 6 | import java.lang.annotation.Annotation; |
| @@ -14,6 +15,13 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> | @@ -14,6 +15,13 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> | ||
| 14 | 15 | ||
| 15 | @Override | 16 | @Override |
| 16 | public String desensitize(String origin, T annotation) { | 17 | public String desensitize(String origin, T annotation) { |
| 18 | + // 1. 判断是否禁用脱敏 | ||
| 19 | + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); | ||
| 20 | + if (Boolean.FALSE.equals(disable)) { | ||
| 21 | + return origin; | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + // 2. 执行脱敏 | ||
| 17 | int prefixKeep = getPrefixKeep(annotation); | 25 | int prefixKeep = getPrefixKeep(annotation); |
| 18 | int suffixKeep = getSuffixKeep(annotation); | 26 | int suffixKeep = getSuffixKeep(annotation); |
| 19 | String replacer = getReplacer(annotation); | 27 | String replacer = getReplacer(annotation); |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/BankCardDesensitization.java
| @@ -24,4 +24,9 @@ public class BankCardDesensitization extends AbstractSliderDesensitizationHandle | @@ -24,4 +24,9 @@ public class BankCardDesensitization extends AbstractSliderDesensitizationHandle | ||
| 24 | return annotation.replacer(); | 24 | return annotation.replacer(); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | + @Override | ||
| 28 | + public String getDisable(BankCardDesensitize annotation) { | ||
| 29 | + return ""; | ||
| 30 | + } | ||
| 31 | + | ||
| 27 | } | 32 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java
| @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.CarLicenseD | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.CarLicenseD | ||
| 8 | * @author gaibu | 8 | * @author gaibu |
| 9 | */ | 9 | */ |
| 10 | public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler<CarLicenseDesensitize> { | 10 | public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler<CarLicenseDesensitize> { |
| 11 | + | ||
| 11 | @Override | 12 | @Override |
| 12 | Integer getPrefixKeep(CarLicenseDesensitize annotation) { | 13 | Integer getPrefixKeep(CarLicenseDesensitize annotation) { |
| 13 | return annotation.prefixKeep(); | 14 | return annotation.prefixKeep(); |
| @@ -22,4 +23,10 @@ public class CarLicenseDesensitization extends AbstractSliderDesensitizationHand | @@ -22,4 +23,10 @@ public class CarLicenseDesensitization extends AbstractSliderDesensitizationHand | ||
| 22 | String getReplacer(CarLicenseDesensitize annotation) { | 23 | String getReplacer(CarLicenseDesensitize annotation) { |
| 23 | return annotation.replacer(); | 24 | return annotation.replacer(); |
| 24 | } | 25 | } |
| 26 | + | ||
| 27 | + @Override | ||
| 28 | + public String getDisable(CarLicenseDesensitize annotation) { | ||
| 29 | + return annotation.disable(); | ||
| 30 | + } | ||
| 31 | + | ||
| 25 | } | 32 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java
| @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.SliderDesen | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.SliderDesen | ||
| 8 | * @author gaibu | 8 | * @author gaibu |
| 9 | */ | 9 | */ |
| 10 | public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler<SliderDesensitize> { | 10 | public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler<SliderDesensitize> { |
| 11 | + | ||
| 11 | @Override | 12 | @Override |
| 12 | Integer getPrefixKeep(SliderDesensitize annotation) { | 13 | Integer getPrefixKeep(SliderDesensitize annotation) { |
| 13 | return annotation.prefixKeep(); | 14 | return annotation.prefixKeep(); |
| @@ -22,4 +23,5 @@ public class DefaultDesensitizationHandler extends AbstractSliderDesensitization | @@ -22,4 +23,5 @@ public class DefaultDesensitizationHandler extends AbstractSliderDesensitization | ||
| 22 | String getReplacer(SliderDesensitize annotation) { | 23 | String getReplacer(SliderDesensitize annotation) { |
| 23 | return annotation.replacer(); | 24 | return annotation.replacer(); |
| 24 | } | 25 | } |
| 26 | + | ||
| 25 | } | 27 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java
| @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.FixedPhoneD | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.FixedPhoneD | ||
| 8 | * @author gaibu | 8 | * @author gaibu |
| 9 | */ | 9 | */ |
| 10 | public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler<FixedPhoneDesensitize> { | 10 | public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler<FixedPhoneDesensitize> { |
| 11 | + | ||
| 11 | @Override | 12 | @Override |
| 12 | Integer getPrefixKeep(FixedPhoneDesensitize annotation) { | 13 | Integer getPrefixKeep(FixedPhoneDesensitize annotation) { |
| 13 | return annotation.prefixKeep(); | 14 | return annotation.prefixKeep(); |
| @@ -22,4 +23,5 @@ public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHand | @@ -22,4 +23,5 @@ public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHand | ||
| 22 | String getReplacer(FixedPhoneDesensitize annotation) { | 23 | String getReplacer(FixedPhoneDesensitize annotation) { |
| 23 | return annotation.replacer(); | 24 | return annotation.replacer(); |
| 24 | } | 25 | } |
| 26 | + | ||
| 25 | } | 27 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/IdCardDesensitization.java
| @@ -22,4 +22,5 @@ public class IdCardDesensitization extends AbstractSliderDesensitizationHandler< | @@ -22,4 +22,5 @@ public class IdCardDesensitization extends AbstractSliderDesensitizationHandler< | ||
| 22 | String getReplacer(IdCardDesensitize annotation) { | 22 | String getReplacer(IdCardDesensitize annotation) { |
| 23 | return annotation.replacer(); | 23 | return annotation.replacer(); |
| 24 | } | 24 | } |
| 25 | + | ||
| 25 | } | 26 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/MobileDesensitization.java
| @@ -23,4 +23,5 @@ public class MobileDesensitization extends AbstractSliderDesensitizationHandler< | @@ -23,4 +23,5 @@ public class MobileDesensitization extends AbstractSliderDesensitizationHandler< | ||
| 23 | String getReplacer(MobileDesensitize annotation) { | 23 | String getReplacer(MobileDesensitize annotation) { |
| 24 | return annotation.replacer(); | 24 | return annotation.replacer(); |
| 25 | } | 25 | } |
| 26 | + | ||
| 26 | } | 27 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/PasswordDesensitization.java
| @@ -22,4 +22,5 @@ public class PasswordDesensitization extends AbstractSliderDesensitizationHandle | @@ -22,4 +22,5 @@ public class PasswordDesensitization extends AbstractSliderDesensitizationHandle | ||
| 22 | String getReplacer(PasswordDesensitize annotation) { | 22 | String getReplacer(PasswordDesensitize annotation) { |
| 23 | return annotation.replacer(); | 23 | return annotation.replacer(); |
| 24 | } | 24 | } |
| 25 | + | ||
| 25 | } | 26 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
| 1 | package cn.iocoder.yudao.framework.web.config; | 1 | package cn.iocoder.yudao.framework.web.config; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | ||
| 4 | import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; |
| 5 | import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter; | 4 | import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter; |
| 6 | import cn.iocoder.yudao.framework.web.core.filter.DemoFilter; | 5 | import cn.iocoder.yudao.framework.web.core.filter.DemoFilter; |
| 7 | import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; | 6 | import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; |
| 8 | import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler; | 7 | import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler; |
| 9 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | 8 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 9 | +import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||
| 10 | +import jakarta.annotation.Resource; | ||
| 11 | +import jakarta.servlet.Filter; | ||
| 10 | import org.springframework.beans.factory.annotation.Value; | 12 | import org.springframework.beans.factory.annotation.Value; |
| 11 | import org.springframework.boot.autoconfigure.AutoConfiguration; | 13 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| 12 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | 14 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
| @@ -25,9 +27,6 @@ import org.springframework.web.filter.CorsFilter; | @@ -25,9 +27,6 @@ import org.springframework.web.filter.CorsFilter; | ||
| 25 | import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; | 27 | import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; |
| 26 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | 28 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
| 27 | 29 | ||
| 28 | -import jakarta.annotation.Resource; | ||
| 29 | -import jakarta.servlet.Filter; | ||
| 30 | - | ||
| 31 | @AutoConfiguration | 30 | @AutoConfiguration |
| 32 | @EnableConfigurationProperties(WebProperties.class) | 31 | @EnableConfigurationProperties(WebProperties.class) |
| 33 | public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | 32 | public class YudaoWebAutoConfiguration implements WebMvcConfigurer { |
| @@ -59,8 +58,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | @@ -59,8 +58,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | ||
| 59 | } | 58 | } |
| 60 | 59 | ||
| 61 | @Bean | 60 | @Bean |
| 62 | - public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService ApiErrorLogFrameworkService) { | ||
| 63 | - return new GlobalExceptionHandler(applicationName, ApiErrorLogFrameworkService); | 61 | + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") |
| 62 | + public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogApi apiErrorLogApi) { | ||
| 63 | + return new GlobalExceptionHandler(applicationName, apiErrorLogApi); | ||
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | @Bean | 66 | @Bean |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
| @@ -4,7 +4,7 @@ import cn.hutool.core.exceptions.ExceptionUtil; | @@ -4,7 +4,7 @@ import cn.hutool.core.exceptions.ExceptionUtil; | ||
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | import cn.hutool.core.util.ObjUtil; | 5 | import cn.hutool.core.util.ObjUtil; |
| 6 | import cn.hutool.core.util.StrUtil; | 6 | import cn.hutool.core.util.StrUtil; |
| 7 | -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; | 7 | +import cn.hutool.extra.servlet.JakartaServletUtil; |
| 8 | import cn.iocoder.yudao.framework.common.exception.ServiceException; | 8 | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| 9 | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | 9 | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| 10 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 10 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| @@ -13,14 +13,16 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | @@ -13,14 +13,16 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 13 | import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | 13 | import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; |
| 14 | import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | 14 | import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; |
| 15 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | 15 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 16 | +import cn.iocoder.yudao.module.infra.api.logger.ApiErrorLogApi; | ||
| 16 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; | 17 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; |
| 18 | +import com.fasterxml.jackson.databind.exc.InvalidFormatException; | ||
| 17 | import jakarta.servlet.http.HttpServletRequest; | 19 | import jakarta.servlet.http.HttpServletRequest; |
| 18 | import jakarta.validation.ConstraintViolation; | 20 | import jakarta.validation.ConstraintViolation; |
| 19 | import jakarta.validation.ConstraintViolationException; | 21 | import jakarta.validation.ConstraintViolationException; |
| 20 | import jakarta.validation.ValidationException; | 22 | import jakarta.validation.ValidationException; |
| 21 | import lombok.AllArgsConstructor; | 23 | import lombok.AllArgsConstructor; |
| 22 | import lombok.extern.slf4j.Slf4j; | 24 | import lombok.extern.slf4j.Slf4j; |
| 23 | -import org.apache.commons.lang3.exception.ExceptionUtils; | 25 | +import org.springframework.http.converter.HttpMessageNotReadableException; |
| 24 | import org.springframework.security.access.AccessDeniedException; | 26 | import org.springframework.security.access.AccessDeniedException; |
| 25 | import org.springframework.util.Assert; | 27 | import org.springframework.util.Assert; |
| 26 | import org.springframework.validation.BindException; | 28 | import org.springframework.validation.BindException; |
| @@ -58,7 +60,7 @@ public class GlobalExceptionHandler { | @@ -58,7 +60,7 @@ public class GlobalExceptionHandler { | ||
| 58 | @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") | 60 | @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") |
| 59 | private final String applicationName; | 61 | private final String applicationName; |
| 60 | 62 | ||
| 61 | - private final ApiErrorLogFrameworkService apiErrorLogFrameworkService; | 63 | + private final ApiErrorLogApi apiErrorLogApi; |
| 62 | 64 | ||
| 63 | /** | 65 | /** |
| 64 | * 处理所有异常,主要是提供给 Filter 使用 | 66 | * 处理所有异常,主要是提供给 Filter 使用 |
| @@ -88,7 +90,7 @@ public class GlobalExceptionHandler { | @@ -88,7 +90,7 @@ public class GlobalExceptionHandler { | ||
| 88 | return validationException((ValidationException) ex); | 90 | return validationException((ValidationException) ex); |
| 89 | } | 91 | } |
| 90 | if (ex instanceof NoHandlerFoundException) { | 92 | if (ex instanceof NoHandlerFoundException) { |
| 91 | - return noHandlerFoundExceptionHandler(request, (NoHandlerFoundException) ex); | 93 | + return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex); |
| 92 | } | 94 | } |
| 93 | if (ex instanceof NoResourceFoundException) { | 95 | if (ex instanceof NoResourceFoundException) { |
| 94 | return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex); | 96 | return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex); |
| @@ -123,7 +125,7 @@ public class GlobalExceptionHandler { | @@ -123,7 +125,7 @@ public class GlobalExceptionHandler { | ||
| 123 | */ | 125 | */ |
| 124 | @ExceptionHandler(MethodArgumentTypeMismatchException.class) | 126 | @ExceptionHandler(MethodArgumentTypeMismatchException.class) |
| 125 | public CommonResult<?> methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { | 127 | public CommonResult<?> methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { |
| 126 | - log.warn("[missingServletRequestParameterExceptionHandler]", ex); | 128 | + log.warn("[methodArgumentTypeMismatchExceptionHandler]", ex); |
| 127 | return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); | 129 | return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); |
| 128 | } | 130 | } |
| 129 | 131 | ||
| @@ -150,6 +152,22 @@ public class GlobalExceptionHandler { | @@ -150,6 +152,22 @@ public class GlobalExceptionHandler { | ||
| 150 | } | 152 | } |
| 151 | 153 | ||
| 152 | /** | 154 | /** |
| 155 | + * 处理 SpringMVC 请求参数类型错误 | ||
| 156 | + * | ||
| 157 | + * 例如说,接口上设置了 @RequestBody实体中 xx 属性类型为 Integer,结果传递 xx 参数类型为 String | ||
| 158 | + */ | ||
| 159 | + @ExceptionHandler(HttpMessageNotReadableException.class) | ||
| 160 | + public CommonResult<?> methodArgumentTypeInvalidFormatExceptionHandler(HttpMessageNotReadableException ex) { | ||
| 161 | + log.warn("[methodArgumentTypeInvalidFormatExceptionHandler]", ex); | ||
| 162 | + if(ex.getCause() instanceof InvalidFormatException) { | ||
| 163 | + InvalidFormatException invalidFormatException = (InvalidFormatException) ex.getCause(); | ||
| 164 | + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", invalidFormatException.getValue())); | ||
| 165 | + }else { | ||
| 166 | + return defaultExceptionHandler(ServletUtils.getRequest(), ex); | ||
| 167 | + } | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + /** | ||
| 153 | * 处理 Validator 校验不通过产生的异常 | 171 | * 处理 Validator 校验不通过产生的异常 |
| 154 | */ | 172 | */ |
| 155 | @ExceptionHandler(value = ConstraintViolationException.class) | 173 | @ExceptionHandler(value = ConstraintViolationException.class) |
| @@ -177,7 +195,7 @@ public class GlobalExceptionHandler { | @@ -177,7 +195,7 @@ public class GlobalExceptionHandler { | ||
| 177 | * 2. spring.mvc.static-path-pattern 为 /statics/** | 195 | * 2. spring.mvc.static-path-pattern 为 /statics/** |
| 178 | */ | 196 | */ |
| 179 | @ExceptionHandler(NoHandlerFoundException.class) | 197 | @ExceptionHandler(NoHandlerFoundException.class) |
| 180 | - public CommonResult<?> noHandlerFoundExceptionHandler(HttpServletRequest req, NoHandlerFoundException ex) { | 198 | + public CommonResult<?> noHandlerFoundExceptionHandler(NoHandlerFoundException ex) { |
| 181 | log.warn("[noHandlerFoundExceptionHandler]", ex); | 199 | log.warn("[noHandlerFoundExceptionHandler]", ex); |
| 182 | return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); | 200 | return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); |
| 183 | } | 201 | } |
| @@ -253,7 +271,7 @@ public class GlobalExceptionHandler { | @@ -253,7 +271,7 @@ public class GlobalExceptionHandler { | ||
| 253 | // 情况二:处理异常 | 271 | // 情况二:处理异常 |
| 254 | log.error("[defaultExceptionHandler]", ex); | 272 | log.error("[defaultExceptionHandler]", ex); |
| 255 | // 插入异常日志 | 273 | // 插入异常日志 |
| 256 | - this.createExceptionLog(req, ex); | 274 | + createExceptionLog(req, ex); |
| 257 | // 返回 ERROR CommonResult | 275 | // 返回 ERROR CommonResult |
| 258 | return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); | 276 | return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); |
| 259 | } | 277 | } |
| @@ -265,7 +283,7 @@ public class GlobalExceptionHandler { | @@ -265,7 +283,7 @@ public class GlobalExceptionHandler { | ||
| 265 | // 初始化 errorLog | 283 | // 初始化 errorLog |
| 266 | buildExceptionLog(errorLog, req, e); | 284 | buildExceptionLog(errorLog, req, e); |
| 267 | // 执行插入 errorLog | 285 | // 执行插入 errorLog |
| 268 | - apiErrorLogFrameworkService.createApiErrorLog(errorLog); | 286 | + apiErrorLogApi.createApiErrorLogAsync(errorLog); |
| 269 | } catch (Throwable th) { | 287 | } catch (Throwable th) { |
| 270 | log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(), JsonUtils.toJsonString(errorLog), th); | 288 | log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(), JsonUtils.toJsonString(errorLog), th); |
| 271 | } | 289 | } |
| @@ -279,7 +297,7 @@ public class GlobalExceptionHandler { | @@ -279,7 +297,7 @@ public class GlobalExceptionHandler { | ||
| 279 | errorLog.setExceptionName(e.getClass().getName()); | 297 | errorLog.setExceptionName(e.getClass().getName()); |
| 280 | errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); | 298 | errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); |
| 281 | errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); | 299 | errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); |
| 282 | - errorLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(e)); | 300 | + errorLog.setExceptionStackTrace(ExceptionUtil.stacktraceToString(e)); |
| 283 | StackTraceElement[] stackTraceElements = e.getStackTrace(); | 301 | StackTraceElement[] stackTraceElements = e.getStackTrace(); |
| 284 | Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); | 302 | Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); |
| 285 | StackTraceElement stackTraceElement = stackTraceElements[0]; | 303 | StackTraceElement stackTraceElement = stackTraceElements[0]; |
| @@ -292,12 +310,12 @@ public class GlobalExceptionHandler { | @@ -292,12 +310,12 @@ public class GlobalExceptionHandler { | ||
| 292 | errorLog.setApplicationName(applicationName); | 310 | errorLog.setApplicationName(applicationName); |
| 293 | errorLog.setRequestUrl(request.getRequestURI()); | 311 | errorLog.setRequestUrl(request.getRequestURI()); |
| 294 | Map<String, Object> requestParams = MapUtil.<String, Object>builder() | 312 | Map<String, Object> requestParams = MapUtil.<String, Object>builder() |
| 295 | - .put("query", ServletUtils.getParamMap(request)) | ||
| 296 | - .put("body", ServletUtils.getBody(request)).build(); | 313 | + .put("query", JakartaServletUtil.getParamMap(request)) |
| 314 | + .put("body", JakartaServletUtil.getBody(request)).build(); | ||
| 297 | errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); | 315 | errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); |
| 298 | errorLog.setRequestMethod(request.getMethod()); | 316 | errorLog.setRequestMethod(request.getMethod()); |
| 299 | errorLog.setUserAgent(ServletUtils.getUserAgent(request)); | 317 | errorLog.setUserAgent(ServletUtils.getUserAgent(request)); |
| 300 | - errorLog.setUserIp(ServletUtils.getClientIP(request)); | 318 | + errorLog.setUserIp(JakartaServletUtil.getClientIP(request)); |
| 301 | errorLog.setExceptionTime(LocalDateTime.now()); | 319 | errorLog.setExceptionTime(LocalDateTime.now()); |
| 302 | } | 320 | } |
| 303 | 321 | ||
| @@ -314,51 +332,51 @@ public class GlobalExceptionHandler { | @@ -314,51 +332,51 @@ public class GlobalExceptionHandler { | ||
| 314 | } | 332 | } |
| 315 | // 1. 数据报表 | 333 | // 1. 数据报表 |
| 316 | if (message.contains("report_")) { | 334 | if (message.contains("report_")) { |
| 317 | - log.error("[报表模块 yudao-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); | 335 | + log.error("[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); |
| 318 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 336 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 319 | - "[报表模块 yudao-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); | 337 | + "[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); |
| 320 | } | 338 | } |
| 321 | // 2. 工作流 | 339 | // 2. 工作流 |
| 322 | if (message.contains("bpm_")) { | 340 | if (message.contains("bpm_")) { |
| 323 | - log.error("[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); | 341 | + log.error("[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); |
| 324 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 342 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 325 | - "[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); | 343 | + "[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); |
| 326 | } | 344 | } |
| 327 | // 3. 微信公众号 | 345 | // 3. 微信公众号 |
| 328 | if (message.contains("mp_")) { | 346 | if (message.contains("mp_")) { |
| 329 | - log.error("[微信公众号 yudao-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); | 347 | + log.error("[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); |
| 330 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 348 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 331 | - "[微信公众号 yudao-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); | 349 | + "[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); |
| 332 | } | 350 | } |
| 333 | // 4. 商城系统 | 351 | // 4. 商城系统 |
| 334 | if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { | 352 | if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { |
| 335 | - log.error("[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); | 353 | + log.error("[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); |
| 336 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 354 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 337 | - "[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); | 355 | + "[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); |
| 338 | } | 356 | } |
| 339 | // 5. ERP 系统 | 357 | // 5. ERP 系统 |
| 340 | if (message.contains("erp_")) { | 358 | if (message.contains("erp_")) { |
| 341 | - log.error("[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); | 359 | + log.error("[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); |
| 342 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 360 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 343 | - "[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); | 361 | + "[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); |
| 344 | } | 362 | } |
| 345 | // 6. CRM 系统 | 363 | // 6. CRM 系统 |
| 346 | if (message.contains("crm_")) { | 364 | if (message.contains("crm_")) { |
| 347 | - log.error("[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); | 365 | + log.error("[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); |
| 348 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 366 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 349 | - "[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); | 367 | + "[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); |
| 350 | } | 368 | } |
| 351 | // 7. 支付平台 | 369 | // 7. 支付平台 |
| 352 | if (message.contains("pay_")) { | 370 | if (message.contains("pay_")) { |
| 353 | - log.error("[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); | 371 | + log.error("[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); |
| 354 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 372 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 355 | - "[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); | 373 | + "[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); |
| 356 | } | 374 | } |
| 357 | // 8. AI 大模型 | 375 | // 8. AI 大模型 |
| 358 | if (message.contains("ai_")) { | 376 | if (message.contains("ai_")) { |
| 359 | - log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | 377 | + log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); |
| 360 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), | 378 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 361 | - "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | 379 | + "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); |
| 362 | } | 380 | } |
| 363 | // 9. IOT 物联网 | 381 | // 9. IOT 物联网 |
| 364 | if (message.contains("iot_")) { | 382 | if (message.contains("iot_")) { |
yudao-module-ai/pom.xml
| @@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
| 18 | 18 | ||
| 19 | <name>${project.artifactId}</name> | 19 | <name>${project.artifactId}</name> |
| 20 | <description> | 20 | <description> |
| 21 | - ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维脑图等功能。 | 21 | + ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维导图等功能。 |
| 22 | 目前已接入各种模型,不限于: | 22 | 目前已接入各种模型,不限于: |
| 23 | 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek | 23 | 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek |
| 24 | 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno | 24 | 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno |
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleEnum.java
| 1 | package cn.iocoder.yudao.module.ai.enums; | 1 | package cn.iocoder.yudao.module.ai.enums; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | ||
| 4 | import lombok.AllArgsConstructor; | 3 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Getter; | 4 | import lombok.Getter; |
| 6 | 5 | ||
| 7 | -import java.util.Arrays; | ||
| 8 | - | ||
| 9 | /** | 6 | /** |
| 10 | * AI 内置聊天角色的枚举 | 7 | * AI 内置聊天角色的枚举 |
| 11 | * | 8 | * |
| @@ -13,16 +10,16 @@ import java.util.Arrays; | @@ -13,16 +10,16 @@ import java.util.Arrays; | ||
| 13 | */ | 10 | */ |
| 14 | @AllArgsConstructor | 11 | @AllArgsConstructor |
| 15 | @Getter | 12 | @Getter |
| 16 | -public enum AiChatRoleEnum implements IntArrayValuable { | 13 | +public enum AiChatRoleEnum { |
| 17 | 14 | ||
| 18 | - AI_WRITE_ROLE(1, "写作助手", """ | 15 | + AI_WRITE_ROLE("写作助手", """ |
| 19 | 你是一位出色的写作助手,能够帮助用户生成创意和灵感,并在用户提供场景和提示词时生成对应的回复。你的任务包括: | 16 | 你是一位出色的写作助手,能够帮助用户生成创意和灵感,并在用户提供场景和提示词时生成对应的回复。你的任务包括: |
| 20 | 1. 撰写建议:根据用户提供的主题或问题,提供详细的写作建议、情节发展方向、角色设定以及背景描写,确保内容结构清晰、有逻辑。 | 17 | 1. 撰写建议:根据用户提供的主题或问题,提供详细的写作建议、情节发展方向、角色设定以及背景描写,确保内容结构清晰、有逻辑。 |
| 21 | 2. 回复生成:根据用户提供的场景和提示词,生成合适的对话或文字回复,确保语气和风格符合场景需求。 | 18 | 2. 回复生成:根据用户提供的场景和提示词,生成合适的对话或文字回复,确保语气和风格符合场景需求。 |
| 22 | 除此之外不需要除了正文内容外的其他回复,如标题、开头、任何解释性语句或道歉。 | 19 | 除此之外不需要除了正文内容外的其他回复,如标题、开头、任何解释性语句或道歉。 |
| 23 | """), | 20 | """), |
| 24 | 21 | ||
| 25 | - AI_MIND_MAP_ROLE(2, "脑图助手", """ | 22 | + AI_MIND_MAP_ROLE("导图助手", """ |
| 26 | 你是一位非常优秀的思维导图助手,你会把用户的所有提问都总结成思维导图,然后以 Markdown 格式输出。markdown 只需要输出一级标题,二级标题,三级标题,四级标题,最多输出四级,除此之外不要输出任何其他 markdown 标记。下面是一个合格的例子: | 23 | 你是一位非常优秀的思维导图助手,你会把用户的所有提问都总结成思维导图,然后以 Markdown 格式输出。markdown 只需要输出一级标题,二级标题,三级标题,四级标题,最多输出四级,除此之外不要输出任何其他 markdown 标记。下面是一个合格的例子: |
| 27 | # Geek-AI 助手 | 24 | # Geek-AI 助手 |
| 28 | ## 完整的开源系统 | 25 | ## 完整的开源系统 |
| @@ -39,11 +36,6 @@ public enum AiChatRoleEnum implements IntArrayValuable { | @@ -39,11 +36,6 @@ public enum AiChatRoleEnum implements IntArrayValuable { | ||
| 39 | 除此之外不要任何解释性语句。 | 36 | 除此之外不要任何解释性语句。 |
| 40 | """); | 37 | """); |
| 41 | 38 | ||
| 42 | - // TODO @xin:这个 role 是不是删除掉好点哈。= = 目前主要是没做角色枚举。这里多了 role 反倒容易误解哈 | ||
| 43 | - /** | ||
| 44 | - * 角色 | ||
| 45 | - */ | ||
| 46 | - private final Integer role; | ||
| 47 | /** | 39 | /** |
| 48 | * 角色名 | 40 | * 角色名 |
| 49 | */ | 41 | */ |
| @@ -54,11 +46,4 @@ public enum AiChatRoleEnum implements IntArrayValuable { | @@ -54,11 +46,4 @@ public enum AiChatRoleEnum implements IntArrayValuable { | ||
| 54 | */ | 46 | */ |
| 55 | private final String systemMessage; | 47 | private final String systemMessage; |
| 56 | 48 | ||
| 57 | - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiChatRoleEnum::getRole).toArray(); | ||
| 58 | - | ||
| 59 | - @Override | ||
| 60 | - public int[] array() { | ||
| 61 | - return ARRAYS; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | } | 49 | } |
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ErrorCodeConstants.java
| @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; | @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; | ||
| 4 | 4 | ||
| 5 | /** | 5 | /** |
| 6 | * AI 错误码枚举类 | 6 | * AI 错误码枚举类 |
| 7 | - * | 7 | + * <p> |
| 8 | * ai 系统,使用 1-040-000-000 段 | 8 | * ai 系统,使用 1-040-000-000 段 |
| 9 | */ | 9 | */ |
| 10 | public interface ErrorCodeConstants { | 10 | public interface ErrorCodeConstants { |
| @@ -45,9 +45,16 @@ public interface ErrorCodeConstants { | @@ -45,9 +45,16 @@ public interface ErrorCodeConstants { | ||
| 45 | // ========== API 音乐 1-040-006-000 ========== | 45 | // ========== API 音乐 1-040-006-000 ========== |
| 46 | ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_022_006_000, "音乐不存在!"); | 46 | ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_022_006_000, "音乐不存在!"); |
| 47 | 47 | ||
| 48 | - | ||
| 49 | // ========== API 写作 1-022-007-000 ========== | 48 | // ========== API 写作 1-022-007-000 ========== |
| 50 | ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_022_007_000, "作文不存在!"); | 49 | ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_022_007_000, "作文不存在!"); |
| 51 | ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_022_07_001, "写作生成异常!"); | 50 | ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_022_07_001, "写作生成异常!"); |
| 52 | 51 | ||
| 52 | + // ========== API 思维导图 1-040-008-000 ========== | ||
| 53 | + ErrorCode MIND_MAP_NOT_EXISTS = new ErrorCode(1_040_008_000, "思维导图不存在!"); | ||
| 54 | + | ||
| 55 | + // ========== API 知识库 1-022-008-000 ========== | ||
| 56 | + ErrorCode KNOWLEDGE_NOT_EXISTS = new ErrorCode(1_022_008_000, "知识库不存在!"); | ||
| 57 | + ErrorCode KNOWLEDGE_DOCUMENT_NOT_EXISTS = new ErrorCode(1_022_008_001, "文档不存在!"); | ||
| 58 | + ErrorCode KNOWLEDGE_SEGMENT_NOT_EXISTS = new ErrorCode(1_022_008_002, "段落不存在!"); | ||
| 59 | + | ||
| 53 | } | 60 | } |
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/knowledge/AiKnowledgeDocumentStatusEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.enums.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | ||
| 4 | +import lombok.AllArgsConstructor; | ||
| 5 | +import lombok.Getter; | ||
| 6 | + | ||
| 7 | +import java.util.Arrays; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * AI 知识库-文档状态的枚举 | ||
| 11 | + * | ||
| 12 | + * @author xiaoxin | ||
| 13 | + */ | ||
| 14 | +@AllArgsConstructor | ||
| 15 | +@Getter | ||
| 16 | +public enum AiKnowledgeDocumentStatusEnum implements IntArrayValuable { | ||
| 17 | + | ||
| 18 | + IN_PROGRESS(10, "索引中"), | ||
| 19 | + SUCCESS(20, "可用"), | ||
| 20 | + FAIL(30, "失败"); | ||
| 21 | + | ||
| 22 | + /** | ||
| 23 | + * 状态 | ||
| 24 | + */ | ||
| 25 | + private final Integer status; | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * 状态名 | ||
| 29 | + */ | ||
| 30 | + private final String name; | ||
| 31 | + | ||
| 32 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiKnowledgeDocumentStatusEnum::getStatus).toArray(); | ||
| 33 | + | ||
| 34 | + @Override | ||
| 35 | + public int[] array() { | ||
| 36 | + return ARRAYS; | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | +} |
yudao-module-ai/yudao-module-ai-biz/pom.xml
| @@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
| 12 | 12 | ||
| 13 | <name>${project.artifactId}</name> | 13 | <name>${project.artifactId}</name> |
| 14 | <description> | 14 | <description> |
| 15 | - ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维脑图等功能。 | 15 | + ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维导图等功能。 |
| 16 | 目前已接入各种模型,不限于: | 16 | 目前已接入各种模型,不限于: |
| 17 | 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek | 17 | 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek |
| 18 | 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno | 18 | 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
| @@ -3,13 +3,9 @@ package cn.iocoder.yudao.module.ai.controller.admin.image; | @@ -3,13 +3,9 @@ package cn.iocoder.yudao.module.ai.controller.admin.image; | ||
| 3 | import cn.hutool.core.util.ObjUtil; | 3 | import cn.hutool.core.util.ObjUtil; |
| 4 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 4 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 6 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 9 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; | ||
| 10 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; | ||
| 11 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageRespVO; | ||
| 12 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageUpdateReqVO; | 8 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; |
| 13 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; | 9 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; |
| 14 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; | 10 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; |
| 15 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | 11 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| @@ -41,11 +37,18 @@ public class AiImageController { | @@ -41,11 +37,18 @@ public class AiImageController { | ||
| 41 | 37 | ||
| 42 | @GetMapping("/my-page") | 38 | @GetMapping("/my-page") |
| 43 | @Operation(summary = "获取【我的】绘图分页") | 39 | @Operation(summary = "获取【我的】绘图分页") |
| 44 | - public CommonResult<PageResult<AiImageRespVO>> getImagePageMy(@Validated PageParam pageReqVO) { | 40 | + public CommonResult<PageResult<AiImageRespVO>> getImagePageMy(@Validated AiImagePageReqVO pageReqVO) { |
| 45 | PageResult<AiImageDO> pageResult = imageService.getImagePageMy(getLoginUserId(), pageReqVO); | 41 | PageResult<AiImageDO> pageResult = imageService.getImagePageMy(getLoginUserId(), pageReqVO); |
| 46 | return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); | 42 | return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); |
| 47 | } | 43 | } |
| 48 | 44 | ||
| 45 | + @GetMapping("/public-page") | ||
| 46 | + @Operation(summary = "获取公开的绘图分页") | ||
| 47 | + public CommonResult<PageResult<AiImageRespVO>> getImagePagePublic(AiImagePublicPageReqVO pageReqVO) { | ||
| 48 | + PageResult<AiImageDO> pageResult = imageService.getImagePagePublic(pageReqVO); | ||
| 49 | + return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); | ||
| 50 | + } | ||
| 51 | + | ||
| 49 | @GetMapping("/get-my") | 52 | @GetMapping("/get-my") |
| 50 | @Operation(summary = "获取【我的】绘图记录") | 53 | @Operation(summary = "获取【我的】绘图记录") |
| 51 | @Parameter(name = "id", required = true, description = "绘画编号", example = "1024") | 54 | @Parameter(name = "id", required = true, description = "绘画编号", example = "1024") |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java
| @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.ai.controller.admin.image.vo; | @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.ai.controller.admin.image.vo; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | -import lombok.EqualsAndHashCode; | ||
| 7 | -import lombok.ToString; | ||
| 8 | import org.springframework.format.annotation.DateTimeFormat; | 6 | import org.springframework.format.annotation.DateTimeFormat; |
| 9 | 7 | ||
| 10 | import java.time.LocalDateTime; | 8 | import java.time.LocalDateTime; |
| @@ -21,6 +19,9 @@ public class AiImagePageReqVO extends PageParam { | @@ -21,6 +19,9 @@ public class AiImagePageReqVO extends PageParam { | ||
| 21 | @Schema(description = "平台", example = "OpenAI") | 19 | @Schema(description = "平台", example = "OpenAI") |
| 22 | private String platform; | 20 | private String platform; |
| 23 | 21 | ||
| 22 | + @Schema(description = "提示词", example = "1") | ||
| 23 | + private String prompt; | ||
| 24 | + | ||
| 24 | @Schema(description = "绘画状态", example = "1") | 25 | @Schema(description = "绘画状态", example = "1") |
| 25 | private Integer status; | 26 | private Integer status; |
| 26 | 27 |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePublicPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.image.vo; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 绘画公开的分页 Request VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiImagePublicPageReqVO extends PageParam { | ||
| 10 | + | ||
| 11 | + @Schema(description = "提示词") | ||
| 12 | + private String prompt; | ||
| 13 | + | ||
| 14 | +} | ||
| 0 | \ No newline at end of file | 15 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeCreateMyReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeRespVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeUpdateMyReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; | ||
| 11 | +import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService; | ||
| 12 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 14 | +import jakarta.annotation.Resource; | ||
| 15 | +import jakarta.validation.Valid; | ||
| 16 | +import org.springframework.validation.annotation.Validated; | ||
| 17 | +import org.springframework.web.bind.annotation.*; | ||
| 18 | + | ||
| 19 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 20 | +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | ||
| 21 | + | ||
| 22 | +@Tag(name = "管理后台 - AI 知识库") | ||
| 23 | +@RestController | ||
| 24 | +@RequestMapping("/ai/knowledge") | ||
| 25 | +@Validated | ||
| 26 | +public class AiKnowledgeController { | ||
| 27 | + | ||
| 28 | + @Resource | ||
| 29 | + private AiKnowledgeService knowledgeService; | ||
| 30 | + | ||
| 31 | + @GetMapping("/my-page") | ||
| 32 | + @Operation(summary = "获取【我的】知识库分页") | ||
| 33 | + public CommonResult<PageResult<AiKnowledgeRespVO>> getKnowledgePageMy(@Validated PageParam pageReqVO) { | ||
| 34 | + PageResult<AiKnowledgeDO> pageResult = knowledgeService.getKnowledgePageMy(getLoginUserId(), pageReqVO); | ||
| 35 | + return success(BeanUtils.toBean(pageResult, AiKnowledgeRespVO.class)); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + @PostMapping("/create-my") | ||
| 39 | + @Operation(summary = "创建【我的】知识库") | ||
| 40 | + public CommonResult<Long> createKnowledgeMy(@RequestBody @Valid AiKnowledgeCreateMyReqVO createReqVO) { | ||
| 41 | + return success(knowledgeService.createKnowledgeMy(createReqVO, getLoginUserId())); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @PutMapping("/update-my") | ||
| 45 | + @Operation(summary = "更新【我的】知识库") | ||
| 46 | + public CommonResult<Boolean> updateKnowledgeMy(@RequestBody @Valid AiKnowledgeUpdateMyReqVO updateReqVO) { | ||
| 47 | + knowledgeService.updateKnowledgeMy(updateReqVO, getLoginUserId()); | ||
| 48 | + return success(true); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentRespVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; | ||
| 11 | +import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService; | ||
| 12 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 14 | +import jakarta.annotation.Resource; | ||
| 15 | +import jakarta.validation.Valid; | ||
| 16 | +import org.springframework.validation.annotation.Validated; | ||
| 17 | +import org.springframework.web.bind.annotation.*; | ||
| 18 | + | ||
| 19 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 20 | + | ||
| 21 | +@Tag(name = "管理后台 - AI 知识库文档") | ||
| 22 | +@RestController | ||
| 23 | +@RequestMapping("/ai/knowledge/document") | ||
| 24 | +@Validated | ||
| 25 | +public class AiKnowledgeDocumentController { | ||
| 26 | + | ||
| 27 | + @Resource | ||
| 28 | + private AiKnowledgeDocumentService documentService; | ||
| 29 | + | ||
| 30 | + @PostMapping("/create") | ||
| 31 | + @Operation(summary = "新建文档") | ||
| 32 | + public CommonResult<Long> createKnowledgeDocument(@Valid AiKnowledgeDocumentCreateReqVO reqVO) { | ||
| 33 | + Long knowledgeDocumentId = documentService.createKnowledgeDocument(reqVO); | ||
| 34 | + return success(knowledgeDocumentId); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @GetMapping("/page") | ||
| 38 | + @Operation(summary = "获取文档分页") | ||
| 39 | + public CommonResult<PageResult<AiKnowledgeDocumentRespVO>> getKnowledgeDocumentPageMy(@Valid AiKnowledgeDocumentPageReqVO pageReqVO) { | ||
| 40 | + PageResult<AiKnowledgeDocumentDO> pageResult = documentService.getKnowledgeDocumentPage(pageReqVO); | ||
| 41 | + return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class)); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @PutMapping("/update") | ||
| 45 | + @Operation(summary = "更新文档") | ||
| 46 | + public CommonResult<Boolean> updateKnowledgeDocument(@Valid @RequestBody AiKnowledgeDocumentUpdateReqVO reqVO) { | ||
| 47 | + documentService.updateKnowledgeDocument(reqVO); | ||
| 48 | + return success(true); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentRespVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateStatusReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO; | ||
| 11 | +import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService; | ||
| 12 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 14 | +import jakarta.annotation.Resource; | ||
| 15 | +import jakarta.validation.Valid; | ||
| 16 | +import org.springframework.validation.annotation.Validated; | ||
| 17 | +import org.springframework.web.bind.annotation.*; | ||
| 18 | + | ||
| 19 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 20 | + | ||
| 21 | +@Tag(name = "管理后台 - AI 知识库段落") | ||
| 22 | +@RestController | ||
| 23 | +@RequestMapping("/ai/knowledge/segment") | ||
| 24 | +@Validated | ||
| 25 | +public class AiKnowledgeSegmentController { | ||
| 26 | + | ||
| 27 | + @Resource | ||
| 28 | + private AiKnowledgeSegmentService segmentService; | ||
| 29 | + | ||
| 30 | + @GetMapping("/page") | ||
| 31 | + @Operation(summary = "获取段落分页") | ||
| 32 | + public CommonResult<PageResult<AiKnowledgeSegmentRespVO>> getKnowledgeSegmentPageMy(@Valid AiKnowledgeSegmentPageReqVO pageReqVO) { | ||
| 33 | + PageResult<AiKnowledgeSegmentDO> pageResult = segmentService.getKnowledgeSegmentPage(pageReqVO); | ||
| 34 | + return success(BeanUtils.toBean(pageResult, AiKnowledgeSegmentRespVO.class)); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @PutMapping("/update") | ||
| 38 | + @Operation(summary = "更新段落内容") | ||
| 39 | + public CommonResult<Boolean> updateKnowledgeSegment(@Valid @RequestBody AiKnowledgeSegmentUpdateReqVO reqVO) { | ||
| 40 | + segmentService.updateKnowledgeSegment(reqVO); | ||
| 41 | + return success(true); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @PutMapping("/update-status") | ||
| 45 | + @Operation(summary = "启禁用段落内容") | ||
| 46 | + public CommonResult<Boolean> updateKnowledgeSegmentStatus(@Valid @RequestBody AiKnowledgeSegmentUpdateStatusReqVO reqVO) { | ||
| 47 | + segmentService.updateKnowledgeSegmentStatus(reqVO); | ||
| 48 | + return success(true); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 知识库文档的分页 Request VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiKnowledgeDocumentPageReqVO extends PageParam { | ||
| 10 | + | ||
| 11 | + @Schema(description = "文档名称", example = "Java 开发手册") | ||
| 12 | + private String name; | ||
| 13 | + | ||
| 14 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 知识库-文档 Response VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiKnowledgeDocumentRespVO extends PageParam { | ||
| 10 | + | ||
| 11 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 12 | + private Long id; | ||
| 13 | + | ||
| 14 | + @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 15 | + private Long knowledgeId; | ||
| 16 | + | ||
| 17 | + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册") | ||
| 18 | + private String name; | ||
| 19 | + | ||
| 20 | + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 是一门面向对象的语言.....") | ||
| 21 | + private String content; | ||
| 22 | + | ||
| 23 | + @Schema(description = "文档 url", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn") | ||
| 24 | + private String url; | ||
| 25 | + | ||
| 26 | + @Schema(description = "token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 27 | + private Integer tokens; | ||
| 28 | + | ||
| 29 | + @Schema(description = "字符数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1008") | ||
| 30 | + private Integer wordCount; | ||
| 31 | + | ||
| 32 | + @Schema(description = "切片状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 33 | + private Integer sliceStatus; | ||
| 34 | + | ||
| 35 | + @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 36 | + private Integer status; | ||
| 37 | + | ||
| 38 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 5 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 6 | +import jakarta.validation.constraints.NotNull; | ||
| 7 | +import lombok.Data; | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - AI 更新 知识库-文档 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class AiKnowledgeDocumentUpdateReqVO { | ||
| 13 | + | ||
| 14 | + | ||
| 15 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15583") | ||
| 16 | + @NotNull(message = "编号不能为空") | ||
| 17 | + private Long id; | ||
| 18 | + | ||
| 19 | + @Schema(description = "是否启用", example = "1") | ||
| 20 | + @InEnum(CommonStatusEnum.class) | ||
| 21 | + private Integer status; | ||
| 22 | + | ||
| 23 | + @Schema(description = "名称", example = "Java 开发手册") | ||
| 24 | + private String name; | ||
| 25 | + | ||
| 26 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeCreateMyReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import jakarta.validation.constraints.NotBlank; | ||
| 5 | +import jakarta.validation.constraints.NotNull; | ||
| 6 | +import lombok.Data; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - AI 知识库创建【我的】 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class AiKnowledgeCreateMyReqVO { | ||
| 13 | + | ||
| 14 | + @Schema(description = "知识库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ruoyi-vue-pro 用户指南") | ||
| 15 | + @NotBlank(message = "知识库名称不能为空") | ||
| 16 | + private String name; | ||
| 17 | + | ||
| 18 | + @Schema(description = "知识库描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "存储 ruoyi-vue-pro 操作文档") | ||
| 19 | + private String description; | ||
| 20 | + | ||
| 21 | + @Schema(description = "可见权限,只能选择哪些人可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1]") | ||
| 22 | + private List<Long> visibilityPermissions; | ||
| 23 | + | ||
| 24 | + @Schema(description = "嵌入模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 25 | + @NotNull(message = "嵌入模型不能为空") | ||
| 26 | + private Long modelId; | ||
| 27 | + | ||
| 28 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeDocumentCreateReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import jakarta.validation.constraints.NotBlank; | ||
| 5 | +import jakarta.validation.constraints.NotNull; | ||
| 6 | +import lombok.Data; | ||
| 7 | +import org.hibernate.validator.constraints.URL; | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - AI 知识库文档的创建 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class AiKnowledgeDocumentCreateReqVO { | ||
| 13 | + | ||
| 14 | + @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1204") | ||
| 15 | + @NotNull(message = "知识库编号不能为空") | ||
| 16 | + private Long knowledgeId; | ||
| 17 | + | ||
| 18 | + @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "三方登陆") | ||
| 19 | + @NotBlank(message = "文档名称不能为空") | ||
| 20 | + private String name; | ||
| 21 | + | ||
| 22 | + @Schema(description = "文档 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn") | ||
| 23 | + @URL(message = "文档 URL 格式不正确") | ||
| 24 | + private String url; | ||
| 25 | + | ||
| 26 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 知识库 Response VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiKnowledgeRespVO { | ||
| 10 | + | ||
| 11 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 12 | + private Long id; | ||
| 13 | + | ||
| 14 | + @Schema(description = "知识库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ruoyi-vue-pro 用户指南") | ||
| 15 | + private String name; | ||
| 16 | + | ||
| 17 | + @Schema(description = "知识库描述", example = "帮助你快速构建系统") | ||
| 18 | + private String description; | ||
| 19 | + | ||
| 20 | + @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "14") | ||
| 21 | + private Long modelId; | ||
| 22 | + | ||
| 23 | + @Schema(description = "模型标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "qwen-72b-chat") | ||
| 24 | + private String model; | ||
| 25 | + | ||
| 26 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeUpdateMyReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import jakarta.validation.constraints.NotBlank; | ||
| 5 | +import jakarta.validation.constraints.NotNull; | ||
| 6 | +import lombok.Data; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - AI 知识库更新【我的】 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class AiKnowledgeUpdateMyReqVO { | ||
| 13 | + | ||
| 14 | + @Schema(description = "对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1204") | ||
| 15 | + @NotNull(message = "知识库编号不能为空") | ||
| 16 | + private Long id; | ||
| 17 | + | ||
| 18 | + @Schema(description = "知识库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "") | ||
| 19 | + @NotBlank(message = "知识库名称不能为空") | ||
| 20 | + private String name; | ||
| 21 | + | ||
| 22 | + @Schema(description = "知识库描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "") | ||
| 23 | + private String description; | ||
| 24 | + | ||
| 25 | + @Schema(description = "可见权限,只能选择哪些人可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1]") | ||
| 26 | + private List<Long> visibilityPermissions; | ||
| 27 | + | ||
| 28 | + @Schema(description = "嵌入模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 29 | + @NotNull(message = "嵌入模型不能为空") | ||
| 30 | + private Long modelId; | ||
| 31 | + | ||
| 32 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 知识库分段的分页 Request VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiKnowledgeSegmentPageReqVO extends PageParam { | ||
| 10 | + | ||
| 11 | + @Schema(description = "分段状态", example = "1") | ||
| 12 | + private Integer status; | ||
| 13 | + | ||
| 14 | + @Schema(description = "文档编号", example = "1") | ||
| 15 | + private Integer documentId; | ||
| 16 | + | ||
| 17 | + @Schema(description = "分段内容关键字", example = "Java 开发") | ||
| 18 | + private String keyword; | ||
| 19 | + | ||
| 20 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | +@Schema(description = "管理后台 - AI 知识库-文档 Response VO") | ||
| 7 | +@Data | ||
| 8 | +public class AiKnowledgeSegmentRespVO { | ||
| 9 | + | ||
| 10 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 11 | + private Long id; | ||
| 12 | + | ||
| 13 | + @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 14 | + private Long documentId; | ||
| 15 | + | ||
| 16 | + @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 17 | + private Long knowledgeId; | ||
| 18 | + | ||
| 19 | + @Schema(description = "向量库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1858496a-1dde-4edf-a43e-0aed08f37f8c") | ||
| 20 | + private String vectorId; | ||
| 21 | + | ||
| 22 | + @Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册") | ||
| 23 | + private String content; | ||
| 24 | + | ||
| 25 | + @Schema(description = "token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 26 | + private Integer tokens; | ||
| 27 | + | ||
| 28 | + @Schema(description = "字符数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1008") | ||
| 29 | + private Integer wordCount; | ||
| 30 | + | ||
| 31 | + @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 32 | + private Integer status; | ||
| 33 | + | ||
| 34 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentUpdateReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - AI 更新 知识库-段落 request VO") | ||
| 8 | +@Data | ||
| 9 | +public class AiKnowledgeSegmentUpdateReqVO { | ||
| 10 | + | ||
| 11 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 12 | + private Long id; | ||
| 13 | + | ||
| 14 | + @Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册") | ||
| 15 | + private String content; | ||
| 16 | + | ||
| 17 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentUpdateStatusReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 5 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 6 | +import jakarta.validation.constraints.NotNull; | ||
| 7 | +import lombok.Data; | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - AI 知识库段落的更新状态 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class AiKnowledgeSegmentUpdateStatusReqVO { | ||
| 13 | + | ||
| 14 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") | ||
| 15 | + private Long id; | ||
| 16 | + | ||
| 17 | + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 18 | + @NotNull(message = "是否启用不能为空") | ||
| 19 | + @InEnum(CommonStatusEnum.class) | ||
| 20 | + private Integer status; | ||
| 21 | + | ||
| 22 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/AiMindMapController.java
| 1 | package cn.iocoder.yudao.module.ai.controller.admin.mindmap; | 1 | package cn.iocoder.yudao.module.ai.controller.admin.mindmap; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 4 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; | 6 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapRespVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | ||
| 5 | import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService; | 10 | import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService; |
| 6 | import io.swagger.v3.oas.annotations.Operation; | 11 | import io.swagger.v3.oas.annotations.Operation; |
| 12 | +import io.swagger.v3.oas.annotations.Parameter; | ||
| 7 | import io.swagger.v3.oas.annotations.tags.Tag; | 13 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 8 | import jakarta.annotation.Resource; | 14 | import jakarta.annotation.Resource; |
| 9 | import jakarta.annotation.security.PermitAll; | 15 | import jakarta.annotation.security.PermitAll; |
| 10 | import jakarta.validation.Valid; | 16 | import jakarta.validation.Valid; |
| 11 | import org.springframework.http.MediaType; | 17 | import org.springframework.http.MediaType; |
| 12 | -import org.springframework.web.bind.annotation.PostMapping; | ||
| 13 | -import org.springframework.web.bind.annotation.RequestBody; | ||
| 14 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 15 | -import org.springframework.web.bind.annotation.RestController; | 18 | +import org.springframework.security.access.prepost.PreAuthorize; |
| 19 | +import org.springframework.web.bind.annotation.*; | ||
| 16 | import reactor.core.publisher.Flux; | 20 | import reactor.core.publisher.Flux; |
| 17 | 21 | ||
| 22 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 18 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 23 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 19 | 24 | ||
| 20 | @Tag(name = "管理后台 - AI 思维导图") | 25 | @Tag(name = "管理后台 - AI 思维导图") |
| @@ -26,10 +31,29 @@ public class AiMindMapController { | @@ -26,10 +31,29 @@ public class AiMindMapController { | ||
| 26 | private AiMindMapService mindMapService; | 31 | private AiMindMapService mindMapService; |
| 27 | 32 | ||
| 28 | @PostMapping(value = "/generate-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) | 33 | @PostMapping(value = "/generate-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) |
| 29 | - @Operation(summary = "脑图生成(流式)", description = "流式返回,响应较快") | 34 | + @Operation(summary = "导图生成(流式)", description = "流式返回,响应较快") |
| 30 | @PermitAll // 解决 SSE 最终响应的时候,会被 Access Denied 拦截的问题 | 35 | @PermitAll // 解决 SSE 最终响应的时候,会被 Access Denied 拦截的问题 |
| 31 | public Flux<CommonResult<String>> generateMindMap(@RequestBody @Valid AiMindMapGenerateReqVO generateReqVO) { | 36 | public Flux<CommonResult<String>> generateMindMap(@RequestBody @Valid AiMindMapGenerateReqVO generateReqVO) { |
| 32 | return mindMapService.generateMindMap(generateReqVO, getLoginUserId()); | 37 | return mindMapService.generateMindMap(generateReqVO, getLoginUserId()); |
| 33 | } | 38 | } |
| 34 | 39 | ||
| 40 | + // ================ 导图管理 ================ | ||
| 41 | + | ||
| 42 | + @DeleteMapping("/delete") | ||
| 43 | + @Operation(summary = "删除思维导图") | ||
| 44 | + @Parameter(name = "id", description = "编号", required = true) | ||
| 45 | + @PreAuthorize("@ss.hasPermission('ai:mind-map:delete')") | ||
| 46 | + public CommonResult<Boolean> deleteMindMap(@RequestParam("id") Long id) { | ||
| 47 | + mindMapService.deleteMindMap(id); | ||
| 48 | + return success(true); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @GetMapping("/page") | ||
| 52 | + @Operation(summary = "获得思维导图分页") | ||
| 53 | + @PreAuthorize("@ss.hasPermission('ai:mind-map:query')") | ||
| 54 | + public CommonResult<PageResult<AiMindMapRespVO>> getMindMapPage(@Valid AiMindMapPageReqVO pageReqVO) { | ||
| 55 | + PageResult<AiMindMapDO> pageResult = mindMapService.getMindMapPage(pageReqVO); | ||
| 56 | + return success(BeanUtils.toBean(pageResult, AiMindMapRespVO.class)); | ||
| 57 | + } | ||
| 58 | + | ||
| 35 | } | 59 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import lombok.EqualsAndHashCode; | ||
| 7 | +import lombok.ToString; | ||
| 8 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 9 | + | ||
| 10 | +import java.time.LocalDateTime; | ||
| 11 | + | ||
| 12 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 13 | + | ||
| 14 | +@Schema(description = "管理后台 - AI 思维导图分页 Request VO") | ||
| 15 | +@Data | ||
| 16 | +@EqualsAndHashCode(callSuper = true) | ||
| 17 | +@ToString(callSuper = true) | ||
| 18 | +public class AiMindMapPageReqVO extends PageParam { | ||
| 19 | + | ||
| 20 | + @Schema(description = "用户编号", example = "4325") | ||
| 21 | + private Long userId; | ||
| 22 | + | ||
| 23 | + @Schema(description = "生成内容提示", example = "Java 学习路线") | ||
| 24 | + private String prompt; | ||
| 25 | + | ||
| 26 | + @Schema(description = "创建时间") | ||
| 27 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 28 | + private LocalDateTime[] createTime; | ||
| 29 | + | ||
| 30 | +} | ||
| 0 | \ No newline at end of file | 31 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | +import java.time.LocalDateTime; | ||
| 7 | + | ||
| 8 | +@Schema(description = "管理后台 - AI 思维导图 Response VO") | ||
| 9 | +@Data | ||
| 10 | +public class AiMindMapRespVO { | ||
| 11 | + | ||
| 12 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3373") | ||
| 13 | + private Long id; | ||
| 14 | + | ||
| 15 | + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4325") | ||
| 16 | + private Long userId; | ||
| 17 | + | ||
| 18 | + @Schema(description = "生成内容提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 学习路线") | ||
| 19 | + private String prompt; | ||
| 20 | + | ||
| 21 | + @Schema(description = "生成的思维导图内容") | ||
| 22 | + private String generatedContent; | ||
| 23 | + | ||
| 24 | + @Schema(description = "平台", requiredMode = Schema.RequiredMode.REQUIRED, example = "OpenAI") | ||
| 25 | + private String platform; | ||
| 26 | + | ||
| 27 | + @Schema(description = "模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "gpt-3.5-turbo-0125") | ||
| 28 | + private String model; | ||
| 29 | + | ||
| 30 | + @Schema(description = "错误信息") | ||
| 31 | + private String errorMessage; | ||
| 32 | + | ||
| 33 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 34 | + private LocalDateTime createTime; | ||
| 35 | + | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 7 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 8 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 9 | +import lombok.Data; | ||
| 10 | + | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * AI 知识库 DO | ||
| 15 | + * | ||
| 16 | + * @author xiaoxin | ||
| 17 | + */ | ||
| 18 | +@TableName(value = "ai_knowledge", autoResultMap = true) | ||
| 19 | +@Data | ||
| 20 | +public class AiKnowledgeDO extends BaseDO { | ||
| 21 | + | ||
| 22 | + /** | ||
| 23 | + * 编号 | ||
| 24 | + */ | ||
| 25 | + @TableId | ||
| 26 | + private Long id; | ||
| 27 | + /** | ||
| 28 | + * 用户编号 | ||
| 29 | + * <p> | ||
| 30 | + * 关联 AdminUserDO 的 userId 字段 | ||
| 31 | + */ | ||
| 32 | + private Long userId; | ||
| 33 | + /** | ||
| 34 | + * 知识库名称 | ||
| 35 | + */ | ||
| 36 | + private String name; | ||
| 37 | + /** | ||
| 38 | + * 知识库描述 | ||
| 39 | + */ | ||
| 40 | + private String description; | ||
| 41 | + // TODO @新:如果全部可见,需要怎么设置? | ||
| 42 | + /** | ||
| 43 | + * 可见权限,只能选择哪些人可见 | ||
| 44 | + */ | ||
| 45 | + @TableField(typeHandler = JacksonTypeHandler.class) | ||
| 46 | + private List<Long> visibilityPermissions; | ||
| 47 | + /** | ||
| 48 | + * 嵌入模型编号 | ||
| 49 | + */ | ||
| 50 | + private Long modelId; | ||
| 51 | + /** | ||
| 52 | + * 模型标识 | ||
| 53 | + */ | ||
| 54 | + private String model; | ||
| 55 | + /** | ||
| 56 | + * 状态 | ||
| 57 | + * <p> | ||
| 58 | + * 枚举 {@link CommonStatusEnum} | ||
| 59 | + */ | ||
| 60 | + private Integer status; | ||
| 61 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDocumentDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 5 | +import cn.iocoder.yudao.module.ai.enums.knowledge.AiKnowledgeDocumentStatusEnum; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 7 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 8 | +import lombok.Data; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * AI 知识库-文档 DO | ||
| 12 | + * | ||
| 13 | + * @author xiaoxin | ||
| 14 | + */ | ||
| 15 | +@TableName(value = "ai_knowledge_document") | ||
| 16 | +@Data | ||
| 17 | +public class AiKnowledgeDocumentDO extends BaseDO { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 编号 | ||
| 21 | + */ | ||
| 22 | + @TableId | ||
| 23 | + private Long id; | ||
| 24 | + /** | ||
| 25 | + * 知识库编号 | ||
| 26 | + * | ||
| 27 | + * 关联 {@link AiKnowledgeDO#getId()} | ||
| 28 | + */ | ||
| 29 | + private Long knowledgeId; | ||
| 30 | + /** | ||
| 31 | + * 文件名称 | ||
| 32 | + */ | ||
| 33 | + private String name; | ||
| 34 | + /** | ||
| 35 | + * 内容 | ||
| 36 | + */ | ||
| 37 | + private String content; | ||
| 38 | + /** | ||
| 39 | + * 文件 URL | ||
| 40 | + */ | ||
| 41 | + private String url; | ||
| 42 | + /** | ||
| 43 | + * token 数量 | ||
| 44 | + */ | ||
| 45 | + private Integer tokens; | ||
| 46 | + /** | ||
| 47 | + * 字符数 | ||
| 48 | + */ | ||
| 49 | + private Integer wordCount; | ||
| 50 | + /** | ||
| 51 | + * 切片状态 | ||
| 52 | + * <p> | ||
| 53 | + * 枚举 {@link AiKnowledgeDocumentStatusEnum} | ||
| 54 | + */ | ||
| 55 | + private Integer sliceStatus; | ||
| 56 | + | ||
| 57 | + /** | ||
| 58 | + * 状态 | ||
| 59 | + * <p> | ||
| 60 | + * 枚举 {@link CommonStatusEnum} | ||
| 61 | + */ | ||
| 62 | + private Integer status; | ||
| 63 | + | ||
| 64 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 7 | +import lombok.Data; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * AI 知识库-文档分段 DO | ||
| 11 | + * | ||
| 12 | + * @author xiaoxin | ||
| 13 | + */ | ||
| 14 | +@TableName(value = "ai_knowledge_segment") | ||
| 15 | +@Data | ||
| 16 | +public class AiKnowledgeSegmentDO extends BaseDO { | ||
| 17 | + | ||
| 18 | + public static final String FIELD_KNOWLEDGE_ID = "knowledgeId"; | ||
| 19 | + | ||
| 20 | + /** | ||
| 21 | + * 编号 | ||
| 22 | + */ | ||
| 23 | + @TableId | ||
| 24 | + private Long id; | ||
| 25 | + /** | ||
| 26 | + * 向量库的编号 | ||
| 27 | + */ | ||
| 28 | + private String vectorId; | ||
| 29 | + /** | ||
| 30 | + * 知识库编号 | ||
| 31 | + * | ||
| 32 | + * 关联 {@link AiKnowledgeDO#getId()} | ||
| 33 | + */ | ||
| 34 | + private Long knowledgeId; | ||
| 35 | + /** | ||
| 36 | + * 文档编号 | ||
| 37 | + * | ||
| 38 | + * 关联 {@link AiKnowledgeDocumentDO#getId()} | ||
| 39 | + */ | ||
| 40 | + private Long documentId; | ||
| 41 | + /** | ||
| 42 | + * 切片内容 | ||
| 43 | + */ | ||
| 44 | + private String content; | ||
| 45 | + /** | ||
| 46 | + * 字符数 | ||
| 47 | + */ | ||
| 48 | + private Integer wordCount; | ||
| 49 | + /** | ||
| 50 | + * token 数量 | ||
| 51 | + */ | ||
| 52 | + private Integer tokens; | ||
| 53 | + /** | ||
| 54 | + * 状态 | ||
| 55 | + * | ||
| 56 | + * 枚举 {@link CommonStatusEnum} | ||
| 57 | + */ | ||
| 58 | + private Integer status; | ||
| 59 | + | ||
| 60 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/mindmap/AiMindMapDO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/music/AiMusicDO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java
| 1 | package cn.iocoder.yudao.module.ai.dal.mysql.image; | 1 | package cn.iocoder.yudao.module.ai.dal.mysql.image; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 6 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 7 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; | 6 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; |
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePublicPageReqVO; | ||
| 8 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | 8 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| 9 | import org.apache.ibatis.annotations.Mapper; | 9 | import org.apache.ibatis.annotations.Mapper; |
| 10 | 10 | ||
| @@ -19,7 +19,7 @@ import java.util.List; | @@ -19,7 +19,7 @@ import java.util.List; | ||
| 19 | public interface AiImageMapper extends BaseMapperX<AiImageDO> { | 19 | public interface AiImageMapper extends BaseMapperX<AiImageDO> { |
| 20 | 20 | ||
| 21 | default AiImageDO selectByTaskId(String taskId) { | 21 | default AiImageDO selectByTaskId(String taskId) { |
| 22 | - return this.selectOne(AiImageDO::getTaskId, taskId); | 22 | + return selectOne(AiImageDO::getTaskId, taskId); |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | default PageResult<AiImageDO> selectPage(AiImagePageReqVO reqVO) { | 25 | default PageResult<AiImageDO> selectPage(AiImagePageReqVO reqVO) { |
| @@ -32,9 +32,20 @@ public interface AiImageMapper extends BaseMapperX<AiImageDO> { | @@ -32,9 +32,20 @@ public interface AiImageMapper extends BaseMapperX<AiImageDO> { | ||
| 32 | .orderByDesc(AiImageDO::getId)); | 32 | .orderByDesc(AiImageDO::getId)); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | - default PageResult<AiImageDO> selectPage(Long userId, PageParam pageReqVO) { | 35 | + default PageResult<AiImageDO> selectPageMy(Long userId, AiImagePageReqVO reqVO) { |
| 36 | + return selectPage(reqVO, new LambdaQueryWrapperX<AiImageDO>() | ||
| 37 | + .likeIfPresent(AiImageDO::getPrompt, reqVO.getPrompt()) | ||
| 38 | + // 情况一:公开 | ||
| 39 | + .eq(Boolean.TRUE.equals(reqVO.getPublicStatus()), AiImageDO::getPublicStatus, reqVO.getPublicStatus()) | ||
| 40 | + // 情况二:私有 | ||
| 41 | + .eq(Boolean.FALSE.equals(reqVO.getPublicStatus()), AiImageDO::getUserId, userId) | ||
| 42 | + .orderByDesc(AiImageDO::getId)); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + default PageResult<AiImageDO> selectPage(AiImagePublicPageReqVO pageReqVO) { | ||
| 36 | return selectPage(pageReqVO, new LambdaQueryWrapperX<AiImageDO>() | 46 | return selectPage(pageReqVO, new LambdaQueryWrapperX<AiImageDO>() |
| 37 | - .eq(AiImageDO::getUserId, userId) | 47 | + .eqIfPresent(AiImageDO::getPublicStatus, Boolean.TRUE) |
| 48 | + .likeIfPresent(AiImageDO::getPrompt, pageReqVO.getPrompt()) | ||
| 38 | .orderByDesc(AiImageDO::getId)); | 49 | .orderByDesc(AiImageDO::getId)); |
| 39 | } | 50 | } |
| 40 | 51 |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeDocumentMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.mysql.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; | ||
| 8 | +import org.apache.ibatis.annotations.Mapper; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * AI 知识库-文档 Mapper | ||
| 12 | + * | ||
| 13 | + * @author xiaoxin | ||
| 14 | + */ | ||
| 15 | +@Mapper | ||
| 16 | +public interface AiKnowledgeDocumentMapper extends BaseMapperX<AiKnowledgeDocumentDO> { | ||
| 17 | + | ||
| 18 | + default PageResult<AiKnowledgeDocumentDO> selectPage(AiKnowledgeDocumentPageReqVO reqVO) { | ||
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<AiKnowledgeDocumentDO>() | ||
| 20 | + .likeIfPresent(AiKnowledgeDocumentDO::getName, reqVO.getName()) | ||
| 21 | + .orderByDesc(AiKnowledgeDocumentDO::getId)); | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.mysql.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 6 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||
| 7 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 8 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; | ||
| 9 | +import org.apache.ibatis.annotations.Mapper; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * AI 知识库基础信息 Mapper | ||
| 13 | + * | ||
| 14 | + * @author xiaoxin | ||
| 15 | + */ | ||
| 16 | +@Mapper | ||
| 17 | +public interface AiKnowledgeMapper extends BaseMapperX<AiKnowledgeDO> { | ||
| 18 | + | ||
| 19 | + default PageResult<AiKnowledgeDO> selectPageByMy(Long userId, PageParam pageReqVO) { | ||
| 20 | + return selectPage(pageReqVO, new LambdaQueryWrapperX<AiKnowledgeDO>() | ||
| 21 | + .eq(AiKnowledgeDO::getUserId, userId) | ||
| 22 | + .eq(AiKnowledgeDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) | ||
| 23 | + .orderByDesc(AiKnowledgeDO::getId)); | ||
| 24 | + } | ||
| 25 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeSegmentMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.dal.mysql.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO; | ||
| 8 | +import org.apache.ibatis.annotations.Mapper; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * AI 知识库-分片 Mapper | ||
| 12 | + * | ||
| 13 | + * @author xiaoxin | ||
| 14 | + */ | ||
| 15 | +@Mapper | ||
| 16 | +public interface AiKnowledgeSegmentMapper extends BaseMapperX<AiKnowledgeSegmentDO> { | ||
| 17 | + | ||
| 18 | + default PageResult<AiKnowledgeSegmentDO> selectPage(AiKnowledgeSegmentPageReqVO reqVO) { | ||
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<AiKnowledgeSegmentDO>() | ||
| 20 | + .eq(AiKnowledgeSegmentDO::getDocumentId, reqVO.getDocumentId()) | ||
| 21 | + .eqIfPresent(AiKnowledgeSegmentDO::getStatus, reqVO.getStatus()) | ||
| 22 | + .likeIfPresent(AiKnowledgeSegmentDO::getContent, reqVO.getKeyword()) | ||
| 23 | + .orderByDesc(AiKnowledgeSegmentDO::getId)); | ||
| 24 | + } | ||
| 25 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/mindmap/AiMindMapMapper.java
| 1 | package cn.iocoder.yudao.module.ai.dal.mysql.mindmap; | 1 | package cn.iocoder.yudao.module.ai.dal.mysql.mindmap; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 4 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | 7 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; |
| 5 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 9 | ||
| @@ -11,4 +14,13 @@ import org.apache.ibatis.annotations.Mapper; | @@ -11,4 +14,13 @@ import org.apache.ibatis.annotations.Mapper; | ||
| 11 | */ | 14 | */ |
| 12 | @Mapper | 15 | @Mapper |
| 13 | public interface AiMindMapMapper extends BaseMapperX<AiMindMapDO> { | 16 | public interface AiMindMapMapper extends BaseMapperX<AiMindMapDO> { |
| 17 | + | ||
| 18 | + default PageResult<AiMindMapDO> selectPage(AiMindMapPageReqVO reqVO) { | ||
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<AiMindMapDO>() | ||
| 20 | + .eqIfPresent(AiMindMapDO::getUserId, reqVO.getUserId()) | ||
| 21 | + .eqIfPresent(AiMindMapDO::getPrompt, reqVO.getPrompt()) | ||
| 22 | + .betweenIfPresent(AiMindMapDO::getCreateTime, reqVO.getCreateTime()) | ||
| 23 | + .orderByDesc(AiMindMapDO::getId)); | ||
| 24 | + } | ||
| 25 | + | ||
| 14 | } | 26 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java
| 1 | package cn.iocoder.yudao.module.ai.service.image; | 1 | package cn.iocoder.yudao.module.ai.service.image; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 3 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageUpdateReqVO; | 5 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; |
| 9 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; | 6 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; |
| 10 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; | 7 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; |
| 11 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | 8 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| @@ -27,7 +24,15 @@ public interface AiImageService { | @@ -27,7 +24,15 @@ public interface AiImageService { | ||
| 27 | * @param pageReqVO 分页条件 | 24 | * @param pageReqVO 分页条件 |
| 28 | * @return 绘图分页 | 25 | * @return 绘图分页 |
| 29 | */ | 26 | */ |
| 30 | - PageResult<AiImageDO> getImagePageMy(Long userId, PageParam pageReqVO); | 27 | + PageResult<AiImageDO> getImagePageMy(Long userId, AiImagePageReqVO pageReqVO); |
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * 获取公开的绘图分页 | ||
| 31 | + * | ||
| 32 | + * @param pageReqVO 分页条件 | ||
| 33 | + * @return 绘图分页 | ||
| 34 | + */ | ||
| 35 | + PageResult<AiImageDO> getImagePagePublic(AiImagePublicPageReqVO pageReqVO); | ||
| 31 | 36 | ||
| 32 | /** | 37 | /** |
| 33 | * 获得绘图记录 | 38 | * 获得绘图记录 |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java
| @@ -10,12 +10,9 @@ import cn.hutool.extra.spring.SpringUtil; | @@ -10,12 +10,9 @@ import cn.hutool.extra.spring.SpringUtil; | ||
| 10 | import cn.hutool.http.HttpUtil; | 10 | import cn.hutool.http.HttpUtil; |
| 11 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | 11 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 12 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 12 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 13 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 14 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 13 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 15 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 14 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 16 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; | ||
| 17 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; | ||
| 18 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageUpdateReqVO; | 15 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; |
| 19 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; | 16 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; |
| 20 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; | 17 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; |
| 21 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; | 18 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| @@ -67,8 +64,13 @@ public class AiImageServiceImpl implements AiImageService { | @@ -67,8 +64,13 @@ public class AiImageServiceImpl implements AiImageService { | ||
| 67 | private AiApiKeyService apiKeyService; | 64 | private AiApiKeyService apiKeyService; |
| 68 | 65 | ||
| 69 | @Override | 66 | @Override |
| 70 | - public PageResult<AiImageDO> getImagePageMy(Long userId, PageParam pageReqVO) { | ||
| 71 | - return imageMapper.selectPage(userId, pageReqVO); | 67 | + public PageResult<AiImageDO> getImagePageMy(Long userId, AiImagePageReqVO pageReqVO) { |
| 68 | + return imageMapper.selectPageMy(userId, pageReqVO); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + @Override | ||
| 72 | + public PageResult<AiImageDO> getImagePagePublic(AiImagePublicPageReqVO pageReqVO) { | ||
| 73 | + return imageMapper.selectPage(pageReqVO); | ||
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | @Override | 76 | @Override |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * AI 知识库-文档 Service 接口 | ||
| 11 | + * | ||
| 12 | + * @author xiaoxin | ||
| 13 | + */ | ||
| 14 | +public interface AiKnowledgeDocumentService { | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 创建文档 | ||
| 18 | + * | ||
| 19 | + * @param createReqVO 文档创建 Request VO | ||
| 20 | + * @return 文档编号 | ||
| 21 | + */ | ||
| 22 | + Long createKnowledgeDocument(AiKnowledgeDocumentCreateReqVO createReqVO); | ||
| 23 | + | ||
| 24 | + | ||
| 25 | + /** | ||
| 26 | + * 获取文档分页 | ||
| 27 | + * | ||
| 28 | + * @param pageReqVO 分页参数 | ||
| 29 | + * @return 文档分页 | ||
| 30 | + */ | ||
| 31 | + PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage(AiKnowledgeDocumentPageReqVO pageReqVO); | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 更新文档 | ||
| 35 | + * | ||
| 36 | + * @param reqVO 更新信息 | ||
| 37 | + */ | ||
| 38 | + void updateKnowledgeDocument(AiKnowledgeDocumentUpdateReqVO reqVO); | ||
| 39 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.http.HttpUtil; | ||
| 5 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 6 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 7 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 8 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 9 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; | ||
| 11 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; | ||
| 12 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; | ||
| 13 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; | ||
| 14 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO; | ||
| 15 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | ||
| 16 | +import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeDocumentMapper; | ||
| 17 | +import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeSegmentMapper; | ||
| 18 | +import cn.iocoder.yudao.module.ai.enums.knowledge.AiKnowledgeDocumentStatusEnum; | ||
| 19 | +import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService; | ||
| 20 | +import cn.iocoder.yudao.module.ai.service.model.AiChatModelService; | ||
| 21 | +import jakarta.annotation.Resource; | ||
| 22 | +import lombok.extern.slf4j.Slf4j; | ||
| 23 | +import org.springframework.ai.document.Document; | ||
| 24 | +import org.springframework.ai.reader.tika.TikaDocumentReader; | ||
| 25 | +import org.springframework.ai.tokenizer.TokenCountEstimator; | ||
| 26 | +import org.springframework.ai.transformer.splitter.TokenTextSplitter; | ||
| 27 | +import org.springframework.ai.vectorstore.VectorStore; | ||
| 28 | +import org.springframework.core.io.ByteArrayResource; | ||
| 29 | +import org.springframework.stereotype.Service; | ||
| 30 | +import org.springframework.transaction.annotation.Transactional; | ||
| 31 | + | ||
| 32 | +import java.util.List; | ||
| 33 | + | ||
| 34 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 35 | +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.KNOWLEDGE_DOCUMENT_NOT_EXISTS; | ||
| 36 | + | ||
| 37 | +/** | ||
| 38 | + * AI 知识库文档 Service 实现类 | ||
| 39 | + * | ||
| 40 | + * @author xiaoxin | ||
| 41 | + */ | ||
| 42 | +@Service | ||
| 43 | +@Slf4j | ||
| 44 | +public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentService { | ||
| 45 | + | ||
| 46 | + @Resource | ||
| 47 | + private AiKnowledgeDocumentMapper documentMapper; | ||
| 48 | + @Resource | ||
| 49 | + private AiKnowledgeSegmentMapper segmentMapper; | ||
| 50 | + | ||
| 51 | + @Resource | ||
| 52 | + private TokenTextSplitter tokenTextSplitter; | ||
| 53 | + @Resource | ||
| 54 | + private TokenCountEstimator tokenCountEstimator; | ||
| 55 | + | ||
| 56 | + @Resource | ||
| 57 | + private AiApiKeyService apiKeyService; | ||
| 58 | + @Resource | ||
| 59 | + private AiKnowledgeService knowledgeService; | ||
| 60 | + @Resource | ||
| 61 | + private AiChatModelService chatModelService; | ||
| 62 | + | ||
| 63 | + @Override | ||
| 64 | + @Transactional(rollbackFor = Exception.class) | ||
| 65 | + public Long createKnowledgeDocument(AiKnowledgeDocumentCreateReqVO createReqVO) { | ||
| 66 | + // 0. 校验 | ||
| 67 | + AiKnowledgeDO knowledge = knowledgeService.validateKnowledgeExists(createReqVO.getKnowledgeId()); | ||
| 68 | + AiChatModelDO model = chatModelService.validateChatModel(knowledge.getModelId()); | ||
| 69 | + | ||
| 70 | + // 1.1 下载文档 | ||
| 71 | + TikaDocumentReader loader = new TikaDocumentReader(downloadFile(createReqVO.getUrl())); | ||
| 72 | + List<Document> documents = loader.get(); | ||
| 73 | + Document document = CollUtil.getFirst(documents); | ||
| 74 | + // 1.2 文档记录入库 | ||
| 75 | + String content = document.getContent(); | ||
| 76 | + AiKnowledgeDocumentDO documentDO = BeanUtils.toBean(createReqVO, AiKnowledgeDocumentDO.class) | ||
| 77 | + .setTokens(tokenCountEstimator.estimate(content)).setWordCount(content.length()) | ||
| 78 | + .setStatus(CommonStatusEnum.ENABLE.getStatus()).setSliceStatus(AiKnowledgeDocumentStatusEnum.SUCCESS.getStatus()); | ||
| 79 | + documentMapper.insert(documentDO); | ||
| 80 | + Long documentId = documentDO.getId(); | ||
| 81 | + if (CollUtil.isEmpty(documents)) { | ||
| 82 | + return documentId; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + // 2.1 文档分段 | ||
| 86 | + List<Document> segments = tokenTextSplitter.apply(documents); | ||
| 87 | + // 2.2 分段内容入库 | ||
| 88 | + List<AiKnowledgeSegmentDO> segmentDOList = CollectionUtils.convertList(segments, | ||
| 89 | + segment -> new AiKnowledgeSegmentDO().setContent(segment.getContent()).setDocumentId(documentId) | ||
| 90 | + .setKnowledgeId(createReqVO.getKnowledgeId()).setVectorId(segment.getId()) | ||
| 91 | + .setTokens(tokenCountEstimator.estimate(segment.getContent())).setWordCount(segment.getContent().length()) | ||
| 92 | + .setStatus(CommonStatusEnum.ENABLE.getStatus())); | ||
| 93 | + segmentMapper.insertBatch(segmentDOList); | ||
| 94 | + | ||
| 95 | + // 3.1 获取向量存储实例 | ||
| 96 | + VectorStore vectorStore = apiKeyService.getOrCreateVectorStore(model.getKeyId()); | ||
| 97 | + // 3.2 向量化并存储 | ||
| 98 | + segments.forEach(segment -> segment.getMetadata().put(AiKnowledgeSegmentDO.FIELD_KNOWLEDGE_ID, createReqVO.getKnowledgeId())); | ||
| 99 | + vectorStore.add(segments); | ||
| 100 | + return documentId; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + @Override | ||
| 104 | + public PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage(AiKnowledgeDocumentPageReqVO pageReqVO) { | ||
| 105 | + return documentMapper.selectPage(pageReqVO); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + @Override | ||
| 109 | + public void updateKnowledgeDocument(AiKnowledgeDocumentUpdateReqVO reqVO) { | ||
| 110 | + // 1. 校验文档是否存在 | ||
| 111 | + validateKnowledgeDocumentExists(reqVO.getId()); | ||
| 112 | + // 2. 更新文档 | ||
| 113 | + AiKnowledgeDocumentDO document = BeanUtils.toBean(reqVO, AiKnowledgeDocumentDO.class); | ||
| 114 | + documentMapper.updateById(document); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + /** | ||
| 118 | + * 校验文档是否存在 | ||
| 119 | + * | ||
| 120 | + * @param id 文档编号 | ||
| 121 | + * @return 文档信息 | ||
| 122 | + */ | ||
| 123 | + private AiKnowledgeDocumentDO validateKnowledgeDocumentExists(Long id) { | ||
| 124 | + AiKnowledgeDocumentDO knowledgeDocument = documentMapper.selectById(id); | ||
| 125 | + if (knowledgeDocument == null) { | ||
| 126 | + throw exception(KNOWLEDGE_DOCUMENT_NOT_EXISTS); | ||
| 127 | + } | ||
| 128 | + return knowledgeDocument; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + private org.springframework.core.io.Resource downloadFile(String url) { | ||
| 132 | + try { | ||
| 133 | + byte[] bytes = HttpUtil.downloadBytes(url); | ||
| 134 | + return new ByteArrayResource(bytes); | ||
| 135 | + } catch (Exception e) { | ||
| 136 | + log.error("[downloadFile][url({}) 下载失败]", url, e); | ||
| 137 | + throw new RuntimeException(e); | ||
| 138 | + } | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeSegmentService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentPageReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateStatusReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * AI 知识库段落 Service 接口 | ||
| 11 | + * | ||
| 12 | + * @author xiaoxin | ||
| 13 | + */ | ||
| 14 | +public interface AiKnowledgeSegmentService { | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 获取段落分页 | ||
| 18 | + * | ||
| 19 | + * @param pageReqVO 分页查询 | ||
| 20 | + * @return 文档分页 | ||
| 21 | + */ | ||
| 22 | + PageResult<AiKnowledgeSegmentDO> getKnowledgeSegmentPage(AiKnowledgeSegmentPageReqVO pageReqVO); | ||
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * 更新段落的内容 | ||
| 26 | + * | ||
| 27 | + * @param reqVO 更新内容 | ||
| 28 | + */ | ||
| 29 | + void updateKnowledgeSegment(AiKnowledgeSegmentUpdateReqVO reqVO); | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * 更新段落的状态 | ||
| 33 | + * | ||
| 34 | + * @param reqVO 更新内容 | ||
| 35 | + */ | ||
| 36 | + void updateKnowledgeSegmentStatus(AiKnowledgeSegmentUpdateStatusReqVO reqVO); | ||
| 37 | + | ||
| 38 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeSegmentServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 5 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentPageReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.AiKnowledgeSegmentUpdateStatusReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeSegmentMapper; | ||
| 10 | +import jakarta.annotation.Resource; | ||
| 11 | +import lombok.extern.slf4j.Slf4j; | ||
| 12 | +import org.springframework.stereotype.Service; | ||
| 13 | + | ||
| 14 | +/** | ||
| 15 | + * AI 知识库分片 Service 实现类 | ||
| 16 | + * | ||
| 17 | + * @author xiaoxin | ||
| 18 | + */ | ||
| 19 | +@Service | ||
| 20 | +@Slf4j | ||
| 21 | +public class AiKnowledgeSegmentServiceImpl implements AiKnowledgeSegmentService { | ||
| 22 | + | ||
| 23 | + @Resource | ||
| 24 | + private AiKnowledgeSegmentMapper segmentMapper; | ||
| 25 | + | ||
| 26 | + @Override | ||
| 27 | + public PageResult<AiKnowledgeSegmentDO> getKnowledgeSegmentPage(AiKnowledgeSegmentPageReqVO pageReqVO) { | ||
| 28 | + return segmentMapper.selectPage(pageReqVO); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + @Override | ||
| 32 | + public void updateKnowledgeSegment(AiKnowledgeSegmentUpdateReqVO reqVO) { | ||
| 33 | + segmentMapper.updateById(BeanUtils.toBean(reqVO, AiKnowledgeSegmentDO.class)); | ||
| 34 | + // TODO @xin 重新向量化 | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @Override | ||
| 38 | + public void updateKnowledgeSegmentStatus(AiKnowledgeSegmentUpdateStatusReqVO reqVO) { | ||
| 39 | + segmentMapper.updateById(BeanUtils.toBean(reqVO, AiKnowledgeSegmentDO.class)); | ||
| 40 | + // TODO @xin 1.禁用删除向量 2.启用重新向量化 | ||
| 41 | + } | ||
| 42 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeCreateMyReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeUpdateMyReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * AI 知识库-基础信息 Service 接口 | ||
| 11 | + * | ||
| 12 | + * @author xiaoxin | ||
| 13 | + */ | ||
| 14 | +public interface AiKnowledgeService { | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 创建【我的】知识库 | ||
| 18 | + * | ||
| 19 | + * @param createReqVO 创建信息 | ||
| 20 | + * @param userId 用户编号 | ||
| 21 | + * @return 编号 | ||
| 22 | + */ | ||
| 23 | + Long createKnowledgeMy(AiKnowledgeCreateMyReqVO createReqVO, Long userId); | ||
| 24 | + | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * 创建【我的】知识库 | ||
| 28 | + * | ||
| 29 | + * @param updateReqVO 更新信息 | ||
| 30 | + * @param userId 用户编号 | ||
| 31 | + */ | ||
| 32 | + void updateKnowledgeMy(AiKnowledgeUpdateMyReqVO updateReqVO, Long userId); | ||
| 33 | + | ||
| 34 | + | ||
| 35 | + /** | ||
| 36 | + * 校验知识库是否存在 | ||
| 37 | + * | ||
| 38 | + * @param id 记录编号 | ||
| 39 | + */ | ||
| 40 | + AiKnowledgeDO validateKnowledgeExists(Long id); | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * 获得【我的】知识库分页 | ||
| 44 | + * | ||
| 45 | + * @param userId 用户编号 | ||
| 46 | + * @param pageReqVO 分页查询 | ||
| 47 | + * @return 知识库分页 | ||
| 48 | + */ | ||
| 49 | + PageResult<AiKnowledgeDO> getKnowledgePageMy(Long userId, PageParam pageReqVO); | ||
| 50 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.service.knowledge; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.util.ObjUtil; | ||
| 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 6 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 7 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeCreateMyReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeUpdateMyReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; | ||
| 11 | +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | ||
| 12 | +import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeMapper; | ||
| 13 | +import cn.iocoder.yudao.module.ai.service.model.AiChatModelService; | ||
| 14 | +import jakarta.annotation.Resource; | ||
| 15 | +import lombok.extern.slf4j.Slf4j; | ||
| 16 | +import org.springframework.stereotype.Service; | ||
| 17 | + | ||
| 18 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 19 | +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.KNOWLEDGE_NOT_EXISTS; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * AI 知识库-基础信息 Service 实现类 | ||
| 23 | + * | ||
| 24 | + * @author xiaoxin | ||
| 25 | + */ | ||
| 26 | +@Service | ||
| 27 | +@Slf4j | ||
| 28 | +public class AiKnowledgeServiceImpl implements AiKnowledgeService { | ||
| 29 | + | ||
| 30 | + @Resource | ||
| 31 | + private AiChatModelService chatModalService; | ||
| 32 | + | ||
| 33 | + @Resource | ||
| 34 | + private AiKnowledgeMapper knowledgeMapper; | ||
| 35 | + | ||
| 36 | + @Override | ||
| 37 | + public Long createKnowledgeMy(AiKnowledgeCreateMyReqVO createReqVO, Long userId) { | ||
| 38 | + // 1. 校验模型配置 | ||
| 39 | + AiChatModelDO model = chatModalService.validateChatModel(createReqVO.getModelId()); | ||
| 40 | + | ||
| 41 | + // 2. 插入知识库 | ||
| 42 | + AiKnowledgeDO knowledgeBase = BeanUtils.toBean(createReqVO, AiKnowledgeDO.class) | ||
| 43 | + .setModel(model.getModel()).setUserId(userId).setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||
| 44 | + knowledgeMapper.insert(knowledgeBase); | ||
| 45 | + return knowledgeBase.getId(); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public void updateKnowledgeMy(AiKnowledgeUpdateMyReqVO updateReqVO, Long userId) { | ||
| 50 | + // 1.1 校验知识库存在 | ||
| 51 | + AiKnowledgeDO knowledgeBaseDO = validateKnowledgeExists(updateReqVO.getId()); | ||
| 52 | + if (ObjUtil.notEqual(knowledgeBaseDO.getUserId(), userId)) { | ||
| 53 | + throw exception(KNOWLEDGE_NOT_EXISTS); | ||
| 54 | + } | ||
| 55 | + // 1.2 校验模型配置 | ||
| 56 | + AiChatModelDO model = chatModalService.validateChatModel(updateReqVO.getModelId()); | ||
| 57 | + | ||
| 58 | + // 2. 更新知识库 | ||
| 59 | + AiKnowledgeDO updateDO = BeanUtils.toBean(updateReqVO, AiKnowledgeDO.class); | ||
| 60 | + updateDO.setModel(model.getModel()); | ||
| 61 | + knowledgeMapper.updateById(updateDO); | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + @Override | ||
| 65 | + public AiKnowledgeDO validateKnowledgeExists(Long id) { | ||
| 66 | + AiKnowledgeDO knowledgeBase = knowledgeMapper.selectById(id); | ||
| 67 | + if (knowledgeBase == null) { | ||
| 68 | + throw exception(KNOWLEDGE_NOT_EXISTS); | ||
| 69 | + } | ||
| 70 | + return knowledgeBase; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + @Override | ||
| 74 | + public PageResult<AiKnowledgeDO> getKnowledgePageMy(Long userId, PageParam pageReqVO) { | ||
| 75 | + return knowledgeMapper.selectPageByMy(userId, pageReqVO); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapService.java
| 1 | package cn.iocoder.yudao.module.ai.service.mindmap; | 1 | package cn.iocoder.yudao.module.ai.service.mindmap; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; | 5 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | ||
| 5 | import reactor.core.publisher.Flux; | 8 | import reactor.core.publisher.Flux; |
| 6 | 9 | ||
| 7 | /** | 10 | /** |
| @@ -20,4 +23,19 @@ public interface AiMindMapService { | @@ -20,4 +23,19 @@ public interface AiMindMapService { | ||
| 20 | */ | 23 | */ |
| 21 | Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId); | 24 | Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId); |
| 22 | 25 | ||
| 26 | + /** | ||
| 27 | + * 删除思维导图 | ||
| 28 | + * | ||
| 29 | + * @param id 编号 | ||
| 30 | + */ | ||
| 31 | + void deleteMindMap(Long id); | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 获得思维导图分页 | ||
| 35 | + * | ||
| 36 | + * @param pageReqVO 分页查询 | ||
| 37 | + * @return 思维导图分页 | ||
| 38 | + */ | ||
| 39 | + PageResult<AiMindMapDO> getMindMapPage(AiMindMapPageReqVO pageReqVO); | ||
| 40 | + | ||
| 23 | } | 41 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java
| @@ -6,9 +6,11 @@ import cn.hutool.core.util.StrUtil; | @@ -6,9 +6,11 @@ import cn.hutool.core.util.StrUtil; | ||
| 6 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | 6 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 7 | import cn.iocoder.yudao.framework.ai.core.util.AiUtils; | 7 | import cn.iocoder.yudao.framework.ai.core.util.AiUtils; |
| 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 9 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 9 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 10 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | 11 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; |
| 11 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; | 12 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 13 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 12 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | 14 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; |
| 13 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | 15 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; |
| 14 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | 16 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; |
| @@ -33,8 +35,10 @@ import reactor.core.publisher.Flux; | @@ -33,8 +35,10 @@ import reactor.core.publisher.Flux; | ||
| 33 | import java.util.ArrayList; | 35 | import java.util.ArrayList; |
| 34 | import java.util.List; | 36 | import java.util.List; |
| 35 | 37 | ||
| 38 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 36 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; | 39 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; |
| 37 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 40 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 41 | +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.MIND_MAP_NOT_EXISTS; | ||
| 38 | 42 | ||
| 39 | /** | 43 | /** |
| 40 | * AI 思维导图 Service 实现类 | 44 | * AI 思维导图 Service 实现类 |
| @@ -57,10 +61,10 @@ public class AiMindMapServiceImpl implements AiMindMapService { | @@ -57,10 +61,10 @@ public class AiMindMapServiceImpl implements AiMindMapService { | ||
| 57 | 61 | ||
| 58 | @Override | 62 | @Override |
| 59 | public Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId) { | 63 | public Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId) { |
| 60 | - // 1. 获取脑图模型。尝试获取思维导图助手角色,如果没有则使用默认模型 | 64 | + // 1. 获取导图模型。尝试获取思维导图助手角色,如果没有则使用默认模型 |
| 61 | AiChatRoleDO role = CollUtil.getFirst( | 65 | AiChatRoleDO role = CollUtil.getFirst( |
| 62 | chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_MIND_MAP_ROLE.getName())); | 66 | chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_MIND_MAP_ROLE.getName())); |
| 63 | - // 1.1 获取脑图执行模型 | 67 | + // 1.1 获取导图执行模型 |
| 64 | AiChatModelDO model = getModel(role); | 68 | AiChatModelDO model = getModel(role); |
| 65 | // 1.2 获取角色设定消息 | 69 | // 1.2 获取角色设定消息 |
| 66 | String systemMessage = role != null && StrUtil.isNotBlank(role.getSystemMessage()) | 70 | String systemMessage = role != null && StrUtil.isNotBlank(role.getSystemMessage()) |
| @@ -124,11 +128,30 @@ public class AiMindMapServiceImpl implements AiMindMapService { | @@ -124,11 +128,30 @@ public class AiMindMapServiceImpl implements AiMindMapService { | ||
| 124 | if (role != null && role.getModelId() != null) { | 128 | if (role != null && role.getModelId() != null) { |
| 125 | model = chatModalService.getChatModel(role.getModelId()); | 129 | model = chatModalService.getChatModel(role.getModelId()); |
| 126 | } | 130 | } |
| 127 | - if (model != null) { | 131 | + if (model == null) { |
| 128 | model = chatModalService.getRequiredDefaultChatModel(); | 132 | model = chatModalService.getRequiredDefaultChatModel(); |
| 129 | } | 133 | } |
| 130 | Assert.notNull(model, "[AI] 获取不到模型"); | 134 | Assert.notNull(model, "[AI] 获取不到模型"); |
| 131 | return model; | 135 | return model; |
| 132 | } | 136 | } |
| 133 | 137 | ||
| 138 | + @Override | ||
| 139 | + public void deleteMindMap(Long id) { | ||
| 140 | + // 校验存在 | ||
| 141 | + validateMindMapExists(id); | ||
| 142 | + // 删除 | ||
| 143 | + mindMapMapper.deleteById(id); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + private void validateMindMapExists(Long id) { | ||
| 147 | + if (mindMapMapper.selectById(id) == null) { | ||
| 148 | + throw exception(MIND_MAP_NOT_EXISTS); | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + @Override | ||
| 153 | + public PageResult<AiMindMapDO> getMindMapPage(AiMindMapPageReqVO pageReqVO) { | ||
| 154 | + return mindMapMapper.selectPage(pageReqVO); | ||
| 155 | + } | ||
| 156 | + | ||
| 134 | } | 157 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiApiKeyService.java
| @@ -9,7 +9,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeySaveR | @@ -9,7 +9,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeySaveR | ||
| 9 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; | 9 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; |
| 10 | import jakarta.validation.Valid; | 10 | import jakarta.validation.Valid; |
| 11 | import org.springframework.ai.chat.model.ChatModel; | 11 | import org.springframework.ai.chat.model.ChatModel; |
| 12 | +import org.springframework.ai.embedding.EmbeddingModel; | ||
| 12 | import org.springframework.ai.image.ImageModel; | 13 | import org.springframework.ai.image.ImageModel; |
| 14 | +import org.springframework.ai.vectorstore.VectorStore; | ||
| 13 | 15 | ||
| 14 | import java.util.List; | 16 | import java.util.List; |
| 15 | 17 | ||
| @@ -111,4 +113,20 @@ public interface AiApiKeyService { | @@ -111,4 +113,20 @@ public interface AiApiKeyService { | ||
| 111 | */ | 113 | */ |
| 112 | SunoApi getSunoApi(); | 114 | SunoApi getSunoApi(); |
| 113 | 115 | ||
| 116 | + /** | ||
| 117 | + * 获得 EmbeddingModel 对象 | ||
| 118 | + * | ||
| 119 | + * @param id 编号 | ||
| 120 | + * @return EmbeddingModel 对象 | ||
| 121 | + */ | ||
| 122 | + EmbeddingModel getEmbeddingModel(Long id); | ||
| 123 | + | ||
| 124 | + /** | ||
| 125 | + * 获得 VectorStore 对象 | ||
| 126 | + * | ||
| 127 | + * @param id 编号 | ||
| 128 | + * @return VectorStore 对象 | ||
| 129 | + */ | ||
| 130 | + VectorStore getOrCreateVectorStore(Long id); | ||
| 131 | + | ||
| 114 | } | 132 | } |
| 115 | \ No newline at end of file | 133 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiApiKeyServiceImpl.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.ai.service.model; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.ai.service.model; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | 3 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 4 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; | 4 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; |
| 5 | +import cn.iocoder.yudao.framework.ai.core.factory.AiVectorStoreFactory; | ||
| 5 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 6 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 6 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | 7 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; |
| 7 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 8 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| @@ -13,7 +14,9 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; | @@ -13,7 +14,9 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; | ||
| 13 | import cn.iocoder.yudao.module.ai.dal.mysql.model.AiApiKeyMapper; | 14 | import cn.iocoder.yudao.module.ai.dal.mysql.model.AiApiKeyMapper; |
| 14 | import jakarta.annotation.Resource; | 15 | import jakarta.annotation.Resource; |
| 15 | import org.springframework.ai.chat.model.ChatModel; | 16 | import org.springframework.ai.chat.model.ChatModel; |
| 17 | +import org.springframework.ai.embedding.EmbeddingModel; | ||
| 16 | import org.springframework.ai.image.ImageModel; | 18 | import org.springframework.ai.image.ImageModel; |
| 19 | +import org.springframework.ai.vectorstore.VectorStore; | ||
| 17 | import org.springframework.stereotype.Service; | 20 | import org.springframework.stereotype.Service; |
| 18 | import org.springframework.validation.annotation.Validated; | 21 | import org.springframework.validation.annotation.Validated; |
| 19 | 22 | ||
| @@ -36,6 +39,8 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { | @@ -36,6 +39,8 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { | ||
| 36 | 39 | ||
| 37 | @Resource | 40 | @Resource |
| 38 | private AiModelFactory modelFactory; | 41 | private AiModelFactory modelFactory; |
| 42 | + @Resource | ||
| 43 | + private AiVectorStoreFactory vectorFactory; | ||
| 39 | 44 | ||
| 40 | @Override | 45 | @Override |
| 41 | public Long createApiKey(AiApiKeySaveReqVO createReqVO) { | 46 | public Long createApiKey(AiApiKeySaveReqVO createReqVO) { |
| @@ -132,4 +137,19 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { | @@ -132,4 +137,19 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { | ||
| 132 | } | 137 | } |
| 133 | return modelFactory.getOrCreateSunoApi(apiKey.getApiKey(), apiKey.getUrl()); | 138 | return modelFactory.getOrCreateSunoApi(apiKey.getApiKey(), apiKey.getUrl()); |
| 134 | } | 139 | } |
| 140 | + | ||
| 141 | + @Override | ||
| 142 | + public EmbeddingModel getEmbeddingModel(Long id) { | ||
| 143 | + AiApiKeyDO apiKey = validateApiKey(id); | ||
| 144 | + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform()); | ||
| 145 | + return modelFactory.getOrCreateEmbeddingModel(platform, apiKey.getApiKey(), apiKey.getUrl()); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + @Override | ||
| 149 | + public VectorStore getOrCreateVectorStore(Long id) { | ||
| 150 | + AiApiKeyDO apiKey = validateApiKey(id); | ||
| 151 | + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform()); | ||
| 152 | + return vectorFactory.getOrCreateVectorStore(getEmbeddingModel(id), platform, apiKey.getApiKey(), apiKey.getUrl()); | ||
| 153 | + } | ||
| 154 | + | ||
| 135 | } | 155 | } |
| 136 | \ No newline at end of file | 156 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
| @@ -114,7 +114,7 @@ public class AiWriteServiceImpl implements AiWriteService { | @@ -114,7 +114,7 @@ public class AiWriteServiceImpl implements AiWriteService { | ||
| 114 | if (Objects.nonNull(writeRole) && Objects.nonNull(writeRole.getModelId())) { | 114 | if (Objects.nonNull(writeRole) && Objects.nonNull(writeRole.getModelId())) { |
| 115 | model = chatModalService.getChatModel(writeRole.getModelId()); | 115 | model = chatModalService.getChatModel(writeRole.getModelId()); |
| 116 | } | 116 | } |
| 117 | - if (Objects.isNull(model)) { | 117 | + if (model == null) { |
| 118 | model = chatModalService.getRequiredDefaultChatModel(); | 118 | model = chatModalService.getRequiredDefaultChatModel(); |
| 119 | } | 119 | } |
| 120 | Assert.notNull(model, "[AI] 获取不到模型"); | 120 | Assert.notNull(model, "[AI] 获取不到模型"); |
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
| @@ -14,42 +14,68 @@ | @@ -14,42 +14,68 @@ | ||
| 14 | <name>${project.artifactId}</name> | 14 | <name>${project.artifactId}</name> |
| 15 | <description>AI 大模型拓展,接入国内外大模型</description> | 15 | <description>AI 大模型拓展,接入国内外大模型</description> |
| 16 | <properties> | 16 | <properties> |
| 17 | - <spring-ai.version>1.0.0-M1</spring-ai.version> | 17 | + <spring-ai.groupId>group.springframework.ai</spring-ai.groupId> |
| 18 | + <spring-ai.version>1.1.0</spring-ai.version> | ||
| 18 | </properties> | 19 | </properties> |
| 19 | 20 | ||
| 20 | <dependencies> | 21 | <dependencies> |
| 21 | <dependency> | 22 | <dependency> |
| 22 | - <groupId>org.springframework.ai</groupId> | 23 | + <groupId>${spring-ai.groupId}</groupId> |
| 23 | <artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId> | 24 | <artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId> |
| 24 | <version>${spring-ai.version}</version> | 25 | <version>${spring-ai.version}</version> |
| 25 | </dependency> | 26 | </dependency> |
| 26 | - | ||
| 27 | <dependency> | 27 | <dependency> |
| 28 | - <groupId>org.springframework.ai</groupId> | 28 | + <groupId>${spring-ai.groupId}</groupId> |
| 29 | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> | 29 | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> |
| 30 | <version>${spring-ai.version}</version> | 30 | <version>${spring-ai.version}</version> |
| 31 | </dependency> | 31 | </dependency> |
| 32 | <dependency> | 32 | <dependency> |
| 33 | - <groupId>org.springframework.ai</groupId> | 33 | + <groupId>${spring-ai.groupId}</groupId> |
| 34 | + <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> | ||
| 35 | + <version>${spring-ai.version}</version> | ||
| 36 | + </dependency> | ||
| 37 | + <dependency> | ||
| 38 | + <groupId>${spring-ai.groupId}</groupId> | ||
| 34 | <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> | 39 | <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> |
| 35 | <version>${spring-ai.version}</version> | 40 | <version>${spring-ai.version}</version> |
| 36 | </dependency> | 41 | </dependency> |
| 37 | <dependency> | 42 | <dependency> |
| 38 | - <groupId>org.springframework.ai</groupId> | 43 | + <groupId>${spring-ai.groupId}</groupId> |
| 39 | <artifactId>spring-ai-stability-ai-spring-boot-starter</artifactId> | 44 | <artifactId>spring-ai-stability-ai-spring-boot-starter</artifactId> |
| 40 | <version>${spring-ai.version}</version> | 45 | <version>${spring-ai.version}</version> |
| 41 | </dependency> | 46 | </dependency> |
| 42 | 47 | ||
| 48 | + <!-- 向量化,基于 Redis 存储,Tika 解析内容 --> | ||
| 49 | + <dependency> | ||
| 50 | + <groupId>${spring-ai.groupId}</groupId> | ||
| 51 | + <artifactId>spring-ai-transformers-spring-boot-starter</artifactId> | ||
| 52 | + <version>${spring-ai.version}</version> | ||
| 53 | + </dependency> | ||
| 54 | + <dependency> | ||
| 55 | + <groupId>${spring-ai.groupId}</groupId> | ||
| 56 | + <artifactId>spring-ai-tika-document-reader</artifactId> | ||
| 57 | + <version>${spring-ai.version}</version> | ||
| 58 | + </dependency> | ||
| 59 | + <dependency> | ||
| 60 | + <groupId>${spring-ai.groupId}</groupId> | ||
| 61 | + <artifactId>spring-ai-redis-store</artifactId> | ||
| 62 | + <version>${spring-ai.version}</version> | ||
| 63 | + </dependency> | ||
| 64 | + | ||
| 65 | + <dependency> | ||
| 66 | + <groupId>cn.iocoder.boot</groupId> | ||
| 67 | + <artifactId>yudao-spring-boot-starter-redis</artifactId> | ||
| 68 | + </dependency> | ||
| 69 | + | ||
| 43 | <dependency> | 70 | <dependency> |
| 44 | <groupId>cn.iocoder.boot</groupId> | 71 | <groupId>cn.iocoder.boot</groupId> |
| 45 | <artifactId>yudao-common</artifactId> | 72 | <artifactId>yudao-common</artifactId> |
| 46 | </dependency> | 73 | </dependency> |
| 47 | 74 | ||
| 48 | - <!-- TODO 芋艿:等 spring-ai 官方发布后,需要把 groupId 改下 --> | ||
| 49 | <dependency> | 75 | <dependency> |
| 50 | - <groupId>group.springframework.ai</groupId> | 76 | + <groupId>${spring-ai.groupId}</groupId> |
| 51 | <artifactId>spring-ai-qianfan-spring-boot-starter</artifactId> | 77 | <artifactId>spring-ai-qianfan-spring-boot-starter</artifactId> |
| 52 | - <version>1.1.0</version> | 78 | + <version>${spring-ai.version}</version> |
| 53 | </dependency> | 79 | </dependency> |
| 54 | 80 | ||
| 55 | <!-- 阿里云 通义千问 --> | 81 | <!-- 阿里云 通义千问 --> |
| @@ -58,6 +84,12 @@ | @@ -58,6 +84,12 @@ | ||
| 58 | <groupId>com.alibaba</groupId> | 84 | <groupId>com.alibaba</groupId> |
| 59 | <artifactId>dashscope-sdk-java</artifactId> | 85 | <artifactId>dashscope-sdk-java</artifactId> |
| 60 | <version>2.14.0</version> | 86 | <version>2.14.0</version> |
| 87 | + <exclusions> | ||
| 88 | + <exclusion> | ||
| 89 | + <groupId>org.slf4j</groupId> | ||
| 90 | + <artifactId>slf4j-simple</artifactId> | ||
| 91 | + </exclusion> | ||
| 92 | + </exclusions> | ||
| 61 | </dependency> | 93 | </dependency> |
| 62 | 94 | ||
| 63 | <!-- Test 测试相关 --> | 95 | <!-- Test 测试相关 --> |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java
| @@ -2,6 +2,8 @@ package cn.iocoder.yudao.framework.ai.config; | @@ -2,6 +2,8 @@ package cn.iocoder.yudao.framework.ai.config; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; | 3 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; |
| 4 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactoryImpl; | 4 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactoryImpl; |
| 5 | +import cn.iocoder.yudao.framework.ai.core.factory.AiVectorStoreFactory; | ||
| 6 | +import cn.iocoder.yudao.framework.ai.core.factory.AiVectorStoreFactoryImpl; | ||
| 5 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatModel; | 7 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatModel; |
| 6 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatOptions; | 8 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatOptions; |
| 7 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 9 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| @@ -10,11 +12,15 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel; | @@ -10,11 +12,15 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel; | ||
| 10 | import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatOptions; | 12 | import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatOptions; |
| 11 | import com.alibaba.cloud.ai.tongyi.TongYiAutoConfiguration; | 13 | import com.alibaba.cloud.ai.tongyi.TongYiAutoConfiguration; |
| 12 | import lombok.extern.slf4j.Slf4j; | 14 | import lombok.extern.slf4j.Slf4j; |
| 15 | +import org.springframework.ai.tokenizer.JTokkitTokenCountEstimator; | ||
| 16 | +import org.springframework.ai.tokenizer.TokenCountEstimator; | ||
| 17 | +import org.springframework.ai.transformer.splitter.TokenTextSplitter; | ||
| 13 | import org.springframework.boot.autoconfigure.AutoConfiguration; | 18 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| 14 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | 19 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| 15 | import org.springframework.boot.context.properties.EnableConfigurationProperties; | 20 | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| 16 | import org.springframework.context.annotation.Bean; | 21 | import org.springframework.context.annotation.Bean; |
| 17 | import org.springframework.context.annotation.Import; | 22 | import org.springframework.context.annotation.Import; |
| 23 | +import org.springframework.context.annotation.Lazy; | ||
| 18 | 24 | ||
| 19 | /** | 25 | /** |
| 20 | * 芋道 AI 自动配置 | 26 | * 芋道 AI 自动配置 |
| @@ -32,6 +38,12 @@ public class YudaoAiAutoConfiguration { | @@ -32,6 +38,12 @@ public class YudaoAiAutoConfiguration { | ||
| 32 | return new AiModelFactoryImpl(); | 38 | return new AiModelFactoryImpl(); |
| 33 | } | 39 | } |
| 34 | 40 | ||
| 41 | + @Bean | ||
| 42 | + public AiVectorStoreFactory aiVectorFactory() { | ||
| 43 | + return new AiVectorStoreFactoryImpl(); | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + | ||
| 35 | // ========== 各种 AI Client 创建 ========== | 47 | // ========== 各种 AI Client 创建 ========== |
| 36 | 48 | ||
| 37 | @Bean | 49 | @Bean |
| @@ -73,4 +85,43 @@ public class YudaoAiAutoConfiguration { | @@ -73,4 +85,43 @@ public class YudaoAiAutoConfiguration { | ||
| 73 | return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl()); | 85 | return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl()); |
| 74 | } | 86 | } |
| 75 | 87 | ||
| 88 | + // ========== rag 相关 ========== | ||
| 89 | + // TODO @xin 免费版本 | ||
| 90 | +// @Bean | ||
| 91 | +// @Lazy // TODO 芋艿:临时注释,避免无法启动」 | ||
| 92 | +// public EmbeddingModel transformersEmbeddingClient() { | ||
| 93 | +// return new TransformersEmbeddingModel(MetadataMode.EMBED); | ||
| 94 | +// } | ||
| 95 | + | ||
| 96 | + /** | ||
| 97 | + * TODO @xin 默认版本先不弄,目前都先取对应的 EmbeddingModel | ||
| 98 | + */ | ||
| 99 | +// @Bean | ||
| 100 | +// @Lazy // TODO 芋艿:临时注释,避免无法启动 | ||
| 101 | +// public RedisVectorStore vectorStore(TongYiTextEmbeddingModel tongYiTextEmbeddingModel, RedisVectorStoreProperties properties, | ||
| 102 | +// RedisProperties redisProperties) { | ||
| 103 | +// var config = RedisVectorStore.RedisVectorStoreConfig.builder() | ||
| 104 | +// .withIndexName(properties.getIndex()) | ||
| 105 | +// .withPrefix(properties.getPrefix()) | ||
| 106 | +// .build(); | ||
| 107 | +// | ||
| 108 | +// RedisVectorStore redisVectorStore = new RedisVectorStore(config, tongYiTextEmbeddingModel, | ||
| 109 | +// new JedisPooled(redisProperties.getHost(), redisProperties.getPort()), | ||
| 110 | +// properties.isInitializeSchema()); | ||
| 111 | +// redisVectorStore.afterPropertiesSet(); | ||
| 112 | +// return redisVectorStore; | ||
| 113 | +// } | ||
| 114 | + | ||
| 115 | + @Bean | ||
| 116 | + @Lazy // TODO 芋艿:临时注释,避免无法启动 | ||
| 117 | + public TokenTextSplitter tokenTextSplitter() { | ||
| 118 | + return new TokenTextSplitter(500, 100, 5, 10000, true); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + @Bean | ||
| 122 | + @Lazy // TODO 芋艿:临时注释,避免无法启动 | ||
| 123 | + public TokenCountEstimator tokenCountEstimator() { | ||
| 124 | + return new JTokkitTokenCountEstimator(); | ||
| 125 | + } | ||
| 126 | + | ||
| 76 | } | 127 | } |
| 77 | \ No newline at end of file | 128 | \ No newline at end of file |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/enums/AiPlatformEnum.java
| @@ -22,7 +22,8 @@ public enum AiPlatformEnum { | @@ -22,7 +22,8 @@ public enum AiPlatformEnum { | ||
| 22 | 22 | ||
| 23 | // ========== 国外平台 ========== | 23 | // ========== 国外平台 ========== |
| 24 | 24 | ||
| 25 | - OPENAI("OpenAI", "OpenAI"), | 25 | + OPENAI("OpenAI", "OpenAI"), // OpenAI 官方 |
| 26 | + AZURE_OPENAI("AzureOpenAI", "AzureOpenAI"), // OpenAI 微软 | ||
| 26 | OLLAMA("Ollama", "Ollama"), | 27 | OLLAMA("Ollama", "Ollama"), |
| 27 | 28 | ||
| 28 | STABLE_DIFFUSION("StableDiffusion", "StableDiffusion"), // Stability AI | 29 | STABLE_DIFFUSION("StableDiffusion", "StableDiffusion"), // Stability AI |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiModelFactory.java
| @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | ||
| 4 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; | 4 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 5 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | 5 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; |
| 6 | import org.springframework.ai.chat.model.ChatModel; | 6 | import org.springframework.ai.chat.model.ChatModel; |
| 7 | +import org.springframework.ai.embedding.EmbeddingModel; | ||
| 7 | import org.springframework.ai.image.ImageModel; | 8 | import org.springframework.ai.image.ImageModel; |
| 8 | 9 | ||
| 9 | /** | 10 | /** |
| @@ -79,4 +80,16 @@ public interface AiModelFactory { | @@ -79,4 +80,16 @@ public interface AiModelFactory { | ||
| 79 | */ | 80 | */ |
| 80 | SunoApi getOrCreateSunoApi(String apiKey, String url); | 81 | SunoApi getOrCreateSunoApi(String apiKey, String url); |
| 81 | 82 | ||
| 83 | + /** | ||
| 84 | + * 基于指定配置,获得 EmbeddingModel 对象 | ||
| 85 | + * | ||
| 86 | + * 如果不存在,则进行创建 | ||
| 87 | + * | ||
| 88 | + * @param platform 平台 | ||
| 89 | + * @param apiKey API KEY | ||
| 90 | + * @param url API URL | ||
| 91 | + * @return ChatModel 对象 | ||
| 92 | + */ | ||
| 93 | + EmbeddingModel getOrCreateEmbeddingModel(AiPlatformEnum platform, String apiKey, String url); | ||
| 94 | + | ||
| 82 | } | 95 | } |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiModelFactoryImpl.java
| @@ -21,6 +21,11 @@ import com.alibaba.cloud.ai.tongyi.image.TongYiImagesModel; | @@ -21,6 +21,11 @@ import com.alibaba.cloud.ai.tongyi.image.TongYiImagesModel; | ||
| 21 | import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties; | 21 | import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties; |
| 22 | import com.alibaba.dashscope.aigc.generation.Generation; | 22 | import com.alibaba.dashscope.aigc.generation.Generation; |
| 23 | import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; | 23 | import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; |
| 24 | +import com.alibaba.dashscope.embeddings.TextEmbedding; | ||
| 25 | +import com.azure.ai.openai.OpenAIClient; | ||
| 26 | +import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; | ||
| 27 | +import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiChatProperties; | ||
| 28 | +import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiConnectionProperties; | ||
| 24 | import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration; | 29 | import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration; |
| 25 | import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; | 30 | import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; |
| 26 | import org.springframework.ai.autoconfigure.qianfan.QianFanAutoConfiguration; | 31 | import org.springframework.ai.autoconfigure.qianfan.QianFanAutoConfiguration; |
| @@ -31,7 +36,9 @@ import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiAutoConfiguration; | @@ -31,7 +36,9 @@ import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiAutoConfiguration; | ||
| 31 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiChatProperties; | 36 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiChatProperties; |
| 32 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiConnectionProperties; | 37 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiConnectionProperties; |
| 33 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiImageProperties; | 38 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiImageProperties; |
| 39 | +import org.springframework.ai.azure.openai.AzureOpenAiChatModel; | ||
| 34 | import org.springframework.ai.chat.model.ChatModel; | 40 | import org.springframework.ai.chat.model.ChatModel; |
| 41 | +import org.springframework.ai.embedding.EmbeddingModel; | ||
| 35 | import org.springframework.ai.image.ImageModel; | 42 | import org.springframework.ai.image.ImageModel; |
| 36 | import org.springframework.ai.model.function.FunctionCallbackContext; | 43 | import org.springframework.ai.model.function.FunctionCallbackContext; |
| 37 | import org.springframework.ai.ollama.OllamaChatModel; | 44 | import org.springframework.ai.ollama.OllamaChatModel; |
| @@ -82,6 +89,8 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -82,6 +89,8 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 82 | return buildXingHuoChatModel(apiKey); | 89 | return buildXingHuoChatModel(apiKey); |
| 83 | case OPENAI: | 90 | case OPENAI: |
| 84 | return buildOpenAiChatModel(apiKey, url); | 91 | return buildOpenAiChatModel(apiKey, url); |
| 92 | + case AZURE_OPENAI: | ||
| 93 | + return buildAzureOpenAiChatModel(apiKey, url); | ||
| 85 | case OLLAMA: | 94 | case OLLAMA: |
| 86 | return buildOllamaChatModel(url); | 95 | return buildOllamaChatModel(url); |
| 87 | default: | 96 | default: |
| @@ -106,6 +115,8 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -106,6 +115,8 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 106 | return SpringUtil.getBean(XingHuoChatModel.class); | 115 | return SpringUtil.getBean(XingHuoChatModel.class); |
| 107 | case OPENAI: | 116 | case OPENAI: |
| 108 | return SpringUtil.getBean(OpenAiChatModel.class); | 117 | return SpringUtil.getBean(OpenAiChatModel.class); |
| 118 | + case AZURE_OPENAI: | ||
| 119 | + return SpringUtil.getBean(AzureOpenAiChatModel.class); | ||
| 109 | case OLLAMA: | 120 | case OLLAMA: |
| 110 | return SpringUtil.getBean(OllamaChatModel.class); | 121 | return SpringUtil.getBean(OllamaChatModel.class); |
| 111 | default: | 122 | default: |
| @@ -166,6 +177,20 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -166,6 +177,20 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 166 | return Singleton.get(cacheKey, (Func0<SunoApi>) () -> new SunoApi(url)); | 177 | return Singleton.get(cacheKey, (Func0<SunoApi>) () -> new SunoApi(url)); |
| 167 | } | 178 | } |
| 168 | 179 | ||
| 180 | + @Override | ||
| 181 | + public EmbeddingModel getOrCreateEmbeddingModel(AiPlatformEnum platform, String apiKey, String url) { | ||
| 182 | + String cacheKey = buildClientCacheKey(EmbeddingModel.class, platform, apiKey, url); | ||
| 183 | + return Singleton.get(cacheKey, (Func0<EmbeddingModel>) () -> { | ||
| 184 | + // TODO @xin 先测试一个 | ||
| 185 | + switch (platform) { | ||
| 186 | + case TONG_YI: | ||
| 187 | + return buildTongYiEmbeddingModel(apiKey); | ||
| 188 | + default: | ||
| 189 | + throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); | ||
| 190 | + } | ||
| 191 | + }); | ||
| 192 | + } | ||
| 193 | + | ||
| 169 | private static String buildClientCacheKey(Class<?> clazz, Object... params) { | 194 | private static String buildClientCacheKey(Class<?> clazz, Object... params) { |
| 170 | if (ArrayUtil.isEmpty(params)) { | 195 | if (ArrayUtil.isEmpty(params)) { |
| 171 | return clazz.getName(); | 196 | return clazz.getName(); |
| @@ -229,8 +254,7 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -229,8 +254,7 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 229 | } | 254 | } |
| 230 | 255 | ||
| 231 | /** | 256 | /** |
| 232 | - * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiChatModel( | ||
| 233 | - * ZhiPuAiConnectionProperties, ZhiPuAiChatProperties, RestClient.Builder, List, FunctionCallbackContext, RetryTemplate, ResponseErrorHandler)} | 257 | + * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiChatModel(ZhiPuAiConnectionProperties, ZhiPuAiChatProperties, RestClient.Builder, List, FunctionCallbackContext, RetryTemplate, ResponseErrorHandler)} |
| 234 | */ | 258 | */ |
| 235 | private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) { | 259 | private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) { |
| 236 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); | 260 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); |
| @@ -239,8 +263,7 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -239,8 +263,7 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 239 | } | 263 | } |
| 240 | 264 | ||
| 241 | /** | 265 | /** |
| 242 | - * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiImageModel( | ||
| 243 | - * ZhiPuAiConnectionProperties, ZhiPuAiImageProperties, RestClient.Builder, RetryTemplate, ResponseErrorHandler)} | 266 | + * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiImageModel(ZhiPuAiConnectionProperties, ZhiPuAiImageProperties, RestClient.Builder, RetryTemplate, ResponseErrorHandler)} |
| 244 | */ | 267 | */ |
| 245 | private ZhiPuAiImageModel buildZhiPuAiImageModel(String apiKey, String url) { | 268 | private ZhiPuAiImageModel buildZhiPuAiImageModel(String apiKey, String url) { |
| 246 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); | 269 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); |
| @@ -269,6 +292,21 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -269,6 +292,21 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 269 | } | 292 | } |
| 270 | 293 | ||
| 271 | /** | 294 | /** |
| 295 | + * 可参考 {@link AzureOpenAiAutoConfiguration} | ||
| 296 | + */ | ||
| 297 | + private static AzureOpenAiChatModel buildAzureOpenAiChatModel(String apiKey, String url) { | ||
| 298 | + AzureOpenAiAutoConfiguration azureOpenAiAutoConfiguration = new AzureOpenAiAutoConfiguration(); | ||
| 299 | + // 创建 OpenAIClient 对象 | ||
| 300 | + AzureOpenAiConnectionProperties connectionProperties = new AzureOpenAiConnectionProperties(); | ||
| 301 | + connectionProperties.setApiKey(apiKey); | ||
| 302 | + connectionProperties.setEndpoint(url); | ||
| 303 | + OpenAIClient openAIClient = azureOpenAiAutoConfiguration.openAIClient(connectionProperties); | ||
| 304 | + // 获取 AzureOpenAiChatProperties 对象 | ||
| 305 | + AzureOpenAiChatProperties chatProperties = SpringUtil.getBean(AzureOpenAiChatProperties.class); | ||
| 306 | + return azureOpenAiAutoConfiguration.azureOpenAiChatModel(openAIClient, chatProperties, null, null); | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + /** | ||
| 272 | * 可参考 {@link OpenAiAutoConfiguration} | 310 | * 可参考 {@link OpenAiAutoConfiguration} |
| 273 | */ | 311 | */ |
| 274 | private OpenAiImageModel buildOpenAiImageModel(String openAiToken, String url) { | 312 | private OpenAiImageModel buildOpenAiImageModel(String openAiToken, String url) { |
| @@ -291,4 +329,15 @@ public class AiModelFactoryImpl implements AiModelFactory { | @@ -291,4 +329,15 @@ public class AiModelFactoryImpl implements AiModelFactory { | ||
| 291 | return new StabilityAiImageModel(stabilityAiApi); | 329 | return new StabilityAiImageModel(stabilityAiApi); |
| 292 | } | 330 | } |
| 293 | 331 | ||
| 332 | + // ========== 各种创建 EmbeddingModel 的方法 ========== | ||
| 333 | + | ||
| 334 | + /** | ||
| 335 | + * 可参考 {@link TongYiAutoConfiguration#tongYiTextEmbeddingClient(TextEmbedding, TongYiConnectionProperties)} | ||
| 336 | + */ | ||
| 337 | + private EmbeddingModel buildTongYiEmbeddingModel(String apiKey) { | ||
| 338 | + TongYiConnectionProperties connectionProperties = new TongYiConnectionProperties(); | ||
| 339 | + connectionProperties.setApiKey(apiKey); | ||
| 340 | + return new TongYiAutoConfiguration().tongYiTextEmbeddingClient(SpringUtil.getBean(TextEmbedding.class), connectionProperties); | ||
| 341 | + } | ||
| 342 | + | ||
| 294 | } | 343 | } |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiVectorStoreFactory.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.ai.core.factory; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | ||
| 4 | +import org.springframework.ai.embedding.EmbeddingModel; | ||
| 5 | +import org.springframework.ai.vectorstore.VectorStore; | ||
| 6 | + | ||
| 7 | +// TODO @xin:也放到 AiModelFactory 里面好了,后续改成 AiFactory | ||
| 8 | +/** | ||
| 9 | + * AI Vector 模型工厂的接口类 | ||
| 10 | + * | ||
| 11 | + * @author xiaoxin | ||
| 12 | + */ | ||
| 13 | +public interface AiVectorStoreFactory { | ||
| 14 | + | ||
| 15 | + /** | ||
| 16 | + * 基于指定配置,获得 VectorStore 对象 | ||
| 17 | + * <p> | ||
| 18 | + * 如果不存在,则进行创建 | ||
| 19 | + * | ||
| 20 | + * @param embeddingModel 嵌入模型 | ||
| 21 | + * @param platform 平台 | ||
| 22 | + * @param apiKey API KEY | ||
| 23 | + * @param url API URL | ||
| 24 | + * @return VectorStore 对象 | ||
| 25 | + */ | ||
| 26 | + VectorStore getOrCreateVectorStore(EmbeddingModel embeddingModel, AiPlatformEnum platform, String apiKey, String url); | ||
| 27 | + | ||
| 28 | +} |