Commit 39f71168ebff3ffbb605583626be42506eb32176
Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into develop
Showing
70 changed files
with
1553 additions
and
267 deletions
sql/mysql/ruoyi-vue-pro.sql
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | Target Server Version : 80200 (8.2.0) |
| 12 | 12 | File Encoding : 65001 |
| 13 | 13 | |
| 14 | - Date: 28/07/2024 23:20:28 | |
| 14 | + Date: 31/08/2024 09:22:45 | |
| 15 | 15 | */ |
| 16 | 16 | |
| 17 | 17 | SET NAMES utf8mb4; |
| ... | ... | @@ -62,7 +62,7 @@ COMMIT; |
| 62 | 62 | -- ---------------------------- |
| 63 | 63 | DROP TABLE IF EXISTS `infra_api_error_log`; |
| 64 | 64 | CREATE TABLE `infra_api_error_log` ( |
| 65 | - `id` int NOT NULL AUTO_INCREMENT COMMENT '编号', | |
| 65 | + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', | |
| 66 | 66 | `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号', |
| 67 | 67 | `user_id` int NOT NULL DEFAULT 0 COMMENT '用户编号', |
| 68 | 68 | `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', |
| ... | ... | @@ -91,7 +91,7 @@ CREATE TABLE `infra_api_error_log` ( |
| 91 | 91 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 92 | 92 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 93 | 93 | PRIMARY KEY (`id`) USING BTREE |
| 94 | -) ENGINE = InnoDB AUTO_INCREMENT = 19166 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 | 97 | -- Records of infra_api_error_log |
| ... | ... | @@ -128,7 +128,7 @@ CREATE TABLE `infra_codegen_column` ( |
| 128 | 128 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 129 | 129 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 130 | 130 | PRIMARY KEY (`id`) USING BTREE |
| 131 | -) ENGINE = InnoDB AUTO_INCREMENT = 2470 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 | 134 | -- Records of infra_codegen_column |
| ... | ... | @@ -166,7 +166,7 @@ CREATE TABLE `infra_codegen_table` ( |
| 166 | 166 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 167 | 167 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 168 | 168 | PRIMARY KEY (`id`) USING BTREE |
| 169 | -) ENGINE = InnoDB AUTO_INCREMENT = 186 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 | 172 | -- Records of infra_codegen_table |
| ... | ... | @@ -179,7 +179,7 @@ COMMIT; |
| 179 | 179 | -- ---------------------------- |
| 180 | 180 | DROP TABLE IF EXISTS `infra_config`; |
| 181 | 181 | CREATE TABLE `infra_config` ( |
| 182 | - `id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键', | |
| 182 | + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数主键', | |
| 183 | 183 | `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', |
| 184 | 184 | `type` tinyint NOT NULL COMMENT '参数类型', |
| 185 | 185 | `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', |
| ... | ... | @@ -250,7 +250,7 @@ CREATE TABLE `infra_file` ( |
| 250 | 250 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 251 | 251 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 252 | 252 | PRIMARY KEY (`id`) USING BTREE |
| 253 | -) ENGINE = InnoDB AUTO_INCREMENT = 1447 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 | 256 | -- Records of infra_file |
| ... | ... | @@ -438,7 +438,7 @@ CREATE TABLE `system_dict_data` ( |
| 438 | 438 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 439 | 439 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 440 | 440 | PRIMARY KEY (`id`) USING BTREE |
| 441 | -) ENGINE = InnoDB AUTO_INCREMENT = 1588 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 | 444 | -- Records of system_dict_data |
| ... | ... | @@ -858,6 +858,10 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st |
| 858 | 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 | 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 | 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'); | |
| 861 | 865 | COMMIT; |
| 862 | 866 | |
| 863 | 867 | -- ---------------------------- |
| ... | ... | @@ -877,7 +881,7 @@ CREATE TABLE `system_dict_type` ( |
| 877 | 881 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 878 | 882 | `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', |
| 879 | 883 | PRIMARY KEY (`id`) USING BTREE |
| 880 | -) ENGINE = InnoDB AUTO_INCREMENT = 629 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; | |
| 884 | +) ENGINE = InnoDB AUTO_INCREMENT = 630 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; | |
| 881 | 885 | |
| 882 | 886 | -- ---------------------------- |
| 883 | 887 | -- Records of system_dict_type |
| ... | ... | @@ -975,6 +979,7 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat |
| 975 | 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'); |
| 976 | 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'); |
| 977 | 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'); | |
| 978 | 983 | COMMIT; |
| 979 | 984 | |
| 980 | 985 | -- ---------------------------- |
| ... | ... | @@ -998,7 +1003,7 @@ CREATE TABLE `system_login_log` ( |
| 998 | 1003 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 999 | 1004 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 1000 | 1005 | PRIMARY KEY (`id`) USING BTREE |
| 1001 | -) ENGINE = InnoDB AUTO_INCREMENT = 3261 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; | |
| 1006 | +) ENGINE = InnoDB AUTO_INCREMENT = 3289 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; | |
| 1002 | 1007 | |
| 1003 | 1008 | -- ---------------------------- |
| 1004 | 1009 | -- Records of system_login_log |
| ... | ... | @@ -1129,7 +1134,7 @@ CREATE TABLE `system_menu` ( |
| 1129 | 1134 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 1130 | 1135 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 1131 | 1136 | PRIMARY KEY (`id`) USING BTREE |
| 1132 | -) ENGINE = InnoDB AUTO_INCREMENT = 2798 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; | |
| 1137 | +) ENGINE = InnoDB AUTO_INCREMENT = 2808 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; | |
| 1133 | 1138 | |
| 1134 | 1139 | -- ---------------------------- |
| 1135 | 1140 | -- Records of system_menu |
| ... | ... | @@ -1293,7 +1298,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i |
| 1293 | 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'); |
| 1294 | 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'); |
| 1295 | 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'); |
| 1296 | -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'); | |
| 1297 | 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'); |
| 1298 | 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'); |
| 1299 | 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'); |
| ... | ... | @@ -1952,7 +1956,7 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i |
| 1952 | 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'); |
| 1953 | 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'); |
| 1954 | 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'); |
| 1955 | -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'); | |
| 1956 | 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'); |
| 1957 | 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'); |
| 1958 | 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'); |
| ... | ... | @@ -1961,8 +1965,18 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i |
| 1961 | 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'); |
| 1962 | 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'); |
| 1963 | 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'); |
| 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 (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-17 09:36:12', 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'); | |
| 1965 | 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'); | |
| 1966 | 1980 | COMMIT; |
| 1967 | 1981 | |
| 1968 | 1982 | -- ---------------------------- |
| ... | ... | @@ -2084,7 +2098,7 @@ CREATE TABLE `system_oauth2_access_token` ( |
| 2084 | 2098 | PRIMARY KEY (`id`) USING BTREE, |
| 2085 | 2099 | INDEX `idx_access_token`(`access_token` ASC) USING BTREE, |
| 2086 | 2100 | INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE |
| 2087 | -) ENGINE = InnoDB AUTO_INCREMENT = 8784 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; | |
| 2101 | +) ENGINE = InnoDB AUTO_INCREMENT = 9563 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; | |
| 2088 | 2102 | |
| 2089 | 2103 | -- ---------------------------- |
| 2090 | 2104 | -- Records of system_oauth2_access_token |
| ... | ... | @@ -2206,7 +2220,7 @@ CREATE TABLE `system_oauth2_refresh_token` ( |
| 2206 | 2220 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2207 | 2221 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2208 | 2222 | PRIMARY KEY (`id`) USING BTREE |
| 2209 | -) ENGINE = InnoDB AUTO_INCREMENT = 1598 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; | |
| 2223 | +) ENGINE = InnoDB AUTO_INCREMENT = 1620 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; | |
| 2210 | 2224 | |
| 2211 | 2225 | -- ---------------------------- |
| 2212 | 2226 | -- Records of system_oauth2_refresh_token |
| ... | ... | @@ -2239,7 +2253,7 @@ CREATE TABLE `system_operate_log` ( |
| 2239 | 2253 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2240 | 2254 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2241 | 2255 | PRIMARY KEY (`id`) USING BTREE |
| 2242 | -) ENGINE = InnoDB AUTO_INCREMENT = 9053 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; | |
| 2256 | +) ENGINE = InnoDB AUTO_INCREMENT = 9056 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; | |
| 2243 | 2257 | |
| 2244 | 2258 | -- ---------------------------- |
| 2245 | 2259 | -- Records of system_operate_log |
| ... | ... | @@ -2298,7 +2312,7 @@ CREATE TABLE `system_role` ( |
| 2298 | 2312 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 2299 | 2313 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 2300 | 2314 | PRIMARY KEY (`id`) USING BTREE |
| 2301 | -) 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 = '角色信息表'; | |
| 2302 | 2316 | |
| 2303 | 2317 | -- ---------------------------- |
| 2304 | 2318 | -- Records of system_role |
| ... | ... | @@ -2307,9 +2321,10 @@ BEGIN; |
| 2307 | 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); |
| 2308 | 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); |
| 2309 | 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); |
| 2310 | -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, 2, '[105,106,107]', 0, 2, '', '', '2021-01-06 13:49:35', '1', '2024-07-27 23:30:47', 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); | |
| 2311 | 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); |
| 2312 | 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); | |
| 2313 | 2328 | COMMIT; |
| 2314 | 2329 | |
| 2315 | 2330 | -- ---------------------------- |
| ... | ... | @@ -2390,7 +2405,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t |
| 2390 | 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); |
| 2391 | 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); |
| 2392 | 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); |
| 2393 | -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); | |
| 2394 | 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); |
| 2395 | 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); |
| 2396 | 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); |
| ... | ... | @@ -3195,9 +3209,8 @@ CREATE TABLE `system_sms_channel` ( |
| 3195 | 3209 | -- Records of system_sms_channel |
| 3196 | 3210 | -- ---------------------------- |
| 3197 | 3211 | BEGIN; |
| 3198 | -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'); | |
| 3199 | 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'); |
| 3200 | -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'); | |
| 3201 | 3214 | COMMIT; |
| 3202 | 3215 | |
| 3203 | 3216 | -- ---------------------------- |
| ... | ... | @@ -3222,7 +3235,7 @@ CREATE TABLE `system_sms_code` ( |
| 3222 | 3235 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3223 | 3236 | PRIMARY KEY (`id`) USING BTREE, |
| 3224 | 3237 | INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' |
| 3225 | -) ENGINE = InnoDB AUTO_INCREMENT = 628 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; | |
| 3238 | +) ENGINE = InnoDB AUTO_INCREMENT = 632 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; | |
| 3226 | 3239 | |
| 3227 | 3240 | -- ---------------------------- |
| 3228 | 3241 | -- Records of system_sms_code |
| ... | ... | @@ -3263,7 +3276,7 @@ CREATE TABLE `system_sms_log` ( |
| 3263 | 3276 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 3264 | 3277 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3265 | 3278 | PRIMARY KEY (`id`) USING BTREE |
| 3266 | -) ENGINE = InnoDB AUTO_INCREMENT = 987 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; | |
| 3279 | +) ENGINE = InnoDB AUTO_INCREMENT = 1088 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; | |
| 3267 | 3280 | |
| 3268 | 3281 | -- ---------------------------- |
| 3269 | 3282 | -- Records of system_sms_log |
| ... | ... | @@ -3293,24 +3306,25 @@ CREATE TABLE `system_sms_template` ( |
| 3293 | 3306 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
| 3294 | 3307 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3295 | 3308 | PRIMARY KEY (`id`) USING BTREE |
| 3296 | -) 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 = '短信模板'; | |
| 3297 | 3310 | |
| 3298 | 3311 | -- ---------------------------- |
| 3299 | 3312 | -- Records of system_sms_template |
| 3300 | 3313 | -- ---------------------------- |
| 3301 | 3314 | BEGIN; |
| 3302 | -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'); | |
| 3303 | 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'); |
| 3304 | -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'); | |
| 3305 | 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'); |
| 3306 | -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'); | |
| 3307 | 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'); |
| 3308 | 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'); |
| 3309 | 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'); |
| 3310 | -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'); | |
| 3311 | 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'); |
| 3312 | 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'); |
| 3313 | 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'); | |
| 3314 | 3328 | COMMIT; |
| 3315 | 3329 | |
| 3316 | 3330 | -- ---------------------------- |
| ... | ... | @@ -3367,7 +3381,7 @@ CREATE TABLE `system_social_user` ( |
| 3367 | 3381 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3368 | 3382 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3369 | 3383 | PRIMARY KEY (`id`) USING BTREE |
| 3370 | -) 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 = '社交用户表'; | |
| 3371 | 3385 | |
| 3372 | 3386 | -- ---------------------------- |
| 3373 | 3387 | -- Records of system_social_user |
| ... | ... | @@ -3392,7 +3406,7 @@ CREATE TABLE `system_social_user_bind` ( |
| 3392 | 3406 | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |
| 3393 | 3407 | `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', |
| 3394 | 3408 | PRIMARY KEY (`id`) USING BTREE |
| 3395 | -) 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 = '社交绑定表'; | |
| 3396 | 3410 | |
| 3397 | 3411 | -- ---------------------------- |
| 3398 | 3412 | -- Records of system_social_user_bind |
| ... | ... | @@ -3559,10 +3573,10 @@ CREATE TABLE `system_users` ( |
| 3559 | 3573 | -- Records of system_users |
| 3560 | 3574 | -- ---------------------------- |
| 3561 | 3575 | BEGIN; |
| 3562 | -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-07-28 11:35:00', 'admin', '2021-01-05 17:03:47', NULL, '2024-07-28 11:35:00', b'0', 1); | |
| 3563 | -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); | |
| 3564 | -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); | |
| 3565 | -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-07-13 23:13:16', '', '2021-01-21 02:13:53', NULL, '2024-07-13 23:13:16', 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); | |
| 3566 | 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); |
| 3567 | 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); |
| 3568 | 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); |
| ... | ... | @@ -3572,7 +3586,7 @@ INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, |
| 3572 | 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); |
| 3573 | 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); |
| 3574 | 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); |
| 3575 | -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); | |
| 3576 | 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); |
| 3577 | 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); |
| 3578 | 3592 | COMMIT; | ... | ... |
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 | 7 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| 8 | 8 | import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; |
| 9 | 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 | 12 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
| 11 | 13 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
| 12 | 14 | import org.apache.ibatis.annotations.Mapper; |
| ... | ... | @@ -16,6 +18,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| 16 | 18 | import org.springframework.context.annotation.Bean; |
| 17 | 19 | import org.springframework.core.env.ConfigurableEnvironment; |
| 18 | 20 | |
| 21 | +import java.util.concurrent.TimeUnit; | |
| 22 | + | |
| 19 | 23 | /** |
| 20 | 24 | * MyBaits 配置类 |
| 21 | 25 | * |
| ... | ... | @@ -26,6 +30,14 @@ import org.springframework.core.env.ConfigurableEnvironment; |
| 26 | 30 | lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 |
| 27 | 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 | 41 | @Bean |
| 30 | 42 | public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| 31 | 43 | MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); |
| ... | ... | @@ -34,7 +46,7 @@ public class YudaoMybatisAutoConfiguration { |
| 34 | 46 | } |
| 35 | 47 | |
| 36 | 48 | @Bean |
| 37 | - public MetaObjectHandler defaultMetaObjectHandler(){ | |
| 49 | + public MetaObjectHandler defaultMetaObjectHandler() { | |
| 38 | 50 | return new DefaultDBFieldHandler(); // 自动填充参数类 |
| 39 | 51 | } |
| 40 | 52 | ... | ... |
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 | 69 | |
| 70 | 70 | // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) |
| 71 | 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 | 73 | return true; |
| 74 | 74 | } |
| 75 | 75 | |
| ... | ... | @@ -113,7 +113,7 @@ public class ApiSignatureAspect { |
| 113 | 113 | } |
| 114 | 114 | |
| 115 | 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 | 165 | return sortedMap; |
| 166 | 166 | } |
| 167 | 167 | |
| 168 | -} | |
| 169 | - | |
| 168 | +} | |
| 170 | 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 | 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 | 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 | 69 | // 断言结果 |
| 70 | 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 | 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
| ... | ... | @@ -11,6 +11,7 @@ import com.mzt.logapi.service.ILogRecordService; |
| 11 | 11 | import jakarta.annotation.Resource; |
| 12 | 12 | import jakarta.servlet.http.HttpServletRequest; |
| 13 | 13 | import lombok.extern.slf4j.Slf4j; |
| 14 | +import org.springframework.scheduling.annotation.Async; | |
| 14 | 15 | |
| 15 | 16 | import java.util.List; |
| 16 | 17 | |
| ... | ... | @@ -28,19 +29,24 @@ public class LogRecordServiceImpl implements ILogRecordService { |
| 28 | 29 | private OperateLogApi operateLogApi; |
| 29 | 30 | |
| 30 | 31 | @Override |
| 32 | + @Async | |
| 31 | 33 | public void record(LogRecord logRecord) { |
| 32 | - // 1. 补全通用字段 | |
| 33 | 34 | OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); |
| 34 | - reqDTO.setTraceId(TracerUtils.getTraceId()); | |
| 35 | - // 补充用户信息 | |
| 36 | - fillUserFields(reqDTO); | |
| 37 | - // 补全模块信息 | |
| 38 | - fillModuleFields(reqDTO, logRecord); | |
| 39 | - // 补全请求信息 | |
| 40 | - fillRequestFields(reqDTO); | |
| 35 | + try { | |
| 36 | + reqDTO.setTraceId(TracerUtils.getTraceId()); | |
| 37 | + // 补充用户信息 | |
| 38 | + fillUserFields(reqDTO); | |
| 39 | + // 补全模块信息 | |
| 40 | + fillModuleFields(reqDTO, logRecord); | |
| 41 | + // 补全请求信息 | |
| 42 | + fillRequestFields(reqDTO); | |
| 41 | 43 | |
| 42 | - // 2. 异步记录日志 | |
| 43 | - operateLogApi.createOperateLog(reqDTO); | |
| 44 | + // 2. 异步记录日志 | |
| 45 | + operateLogApi.createOperateLog(reqDTO); | |
| 46 | + } catch (Throwable ex) { | |
| 47 | + // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | |
| 48 | + log.error("[record][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | |
| 49 | + } | |
| 44 | 50 | } |
| 45 | 51 | |
| 46 | 52 | private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
| ... | ... | @@ -4,6 +4,7 @@ import cn.hutool.core.exceptions.ExceptionUtil; |
| 4 | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | 5 | import cn.hutool.core.util.ObjUtil; |
| 6 | 6 | import cn.hutool.core.util.StrUtil; |
| 7 | +import cn.hutool.extra.servlet.JakartaServletUtil; | |
| 7 | 8 | import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; |
| 8 | 9 | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| 9 | 10 | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| ... | ... | @@ -14,13 +15,14 @@ import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; |
| 14 | 15 | import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; |
| 15 | 16 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 16 | 17 | import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; |
| 18 | +import com.fasterxml.jackson.databind.exc.InvalidFormatException; | |
| 17 | 19 | import jakarta.servlet.http.HttpServletRequest; |
| 18 | 20 | import jakarta.validation.ConstraintViolation; |
| 19 | 21 | import jakarta.validation.ConstraintViolationException; |
| 20 | 22 | import jakarta.validation.ValidationException; |
| 21 | 23 | import lombok.AllArgsConstructor; |
| 22 | 24 | import lombok.extern.slf4j.Slf4j; |
| 23 | -import org.apache.commons.lang3.exception.ExceptionUtils; | |
| 25 | +import org.springframework.http.converter.HttpMessageNotReadableException; | |
| 24 | 26 | import org.springframework.security.access.AccessDeniedException; |
| 25 | 27 | import org.springframework.util.Assert; |
| 26 | 28 | import org.springframework.validation.BindException; |
| ... | ... | @@ -38,7 +40,12 @@ import java.time.LocalDateTime; |
| 38 | 40 | import java.util.Map; |
| 39 | 41 | import java.util.Set; |
| 40 | 42 | |
| 41 | -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.*; | |
| 43 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; | |
| 44 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; | |
| 45 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; | |
| 46 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.METHOD_NOT_ALLOWED; | |
| 47 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_FOUND; | |
| 48 | +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; | |
| 42 | 49 | |
| 43 | 50 | /** |
| 44 | 51 | * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 |
| ... | ... | @@ -88,7 +95,7 @@ public class GlobalExceptionHandler { |
| 88 | 95 | return validationException((ValidationException) ex); |
| 89 | 96 | } |
| 90 | 97 | if (ex instanceof NoHandlerFoundException) { |
| 91 | - return noHandlerFoundExceptionHandler(request, (NoHandlerFoundException) ex); | |
| 98 | + return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex); | |
| 92 | 99 | } |
| 93 | 100 | if (ex instanceof NoResourceFoundException) { |
| 94 | 101 | return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex); |
| ... | ... | @@ -123,7 +130,7 @@ public class GlobalExceptionHandler { |
| 123 | 130 | */ |
| 124 | 131 | @ExceptionHandler(MethodArgumentTypeMismatchException.class) |
| 125 | 132 | public CommonResult<?> methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { |
| 126 | - log.warn("[missingServletRequestParameterExceptionHandler]", ex); | |
| 133 | + log.warn("[methodArgumentTypeMismatchExceptionHandler]", ex); | |
| 127 | 134 | return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); |
| 128 | 135 | } |
| 129 | 136 | |
| ... | ... | @@ -150,6 +157,22 @@ public class GlobalExceptionHandler { |
| 150 | 157 | } |
| 151 | 158 | |
| 152 | 159 | /** |
| 160 | + * 处理 SpringMVC 请求参数类型错误 | |
| 161 | + * | |
| 162 | + * 例如说,接口上设置了 @RequestBody实体中 xx 属性类型为 Integer,结果传递 xx 参数类型为 String | |
| 163 | + */ | |
| 164 | + @ExceptionHandler(HttpMessageNotReadableException.class) | |
| 165 | + public CommonResult<?> methodArgumentTypeInvalidFormatExceptionHandler(HttpMessageNotReadableException ex) { | |
| 166 | + log.warn("[methodArgumentTypeInvalidFormatExceptionHandler]", ex); | |
| 167 | + if(ex.getCause() instanceof InvalidFormatException) { | |
| 168 | + InvalidFormatException invalidFormatException = (InvalidFormatException) ex.getCause(); | |
| 169 | + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", invalidFormatException.getValue())); | |
| 170 | + }else { | |
| 171 | + return defaultExceptionHandler(ServletUtils.getRequest(), ex); | |
| 172 | + } | |
| 173 | + } | |
| 174 | + | |
| 175 | + /** | |
| 153 | 176 | * 处理 Validator 校验不通过产生的异常 |
| 154 | 177 | */ |
| 155 | 178 | @ExceptionHandler(value = ConstraintViolationException.class) |
| ... | ... | @@ -177,7 +200,7 @@ public class GlobalExceptionHandler { |
| 177 | 200 | * 2. spring.mvc.static-path-pattern 为 /statics/** |
| 178 | 201 | */ |
| 179 | 202 | @ExceptionHandler(NoHandlerFoundException.class) |
| 180 | - public CommonResult<?> noHandlerFoundExceptionHandler(HttpServletRequest req, NoHandlerFoundException ex) { | |
| 203 | + public CommonResult<?> noHandlerFoundExceptionHandler(NoHandlerFoundException ex) { | |
| 181 | 204 | log.warn("[noHandlerFoundExceptionHandler]", ex); |
| 182 | 205 | return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); |
| 183 | 206 | } |
| ... | ... | @@ -253,7 +276,7 @@ public class GlobalExceptionHandler { |
| 253 | 276 | // 情况二:处理异常 |
| 254 | 277 | log.error("[defaultExceptionHandler]", ex); |
| 255 | 278 | // 插入异常日志 |
| 256 | - this.createExceptionLog(req, ex); | |
| 279 | + createExceptionLog(req, ex); | |
| 257 | 280 | // 返回 ERROR CommonResult |
| 258 | 281 | return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); |
| 259 | 282 | } |
| ... | ... | @@ -279,7 +302,7 @@ public class GlobalExceptionHandler { |
| 279 | 302 | errorLog.setExceptionName(e.getClass().getName()); |
| 280 | 303 | errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); |
| 281 | 304 | errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); |
| 282 | - errorLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(e)); | |
| 305 | + errorLog.setExceptionStackTrace(ExceptionUtil.stacktraceToString(e)); | |
| 283 | 306 | StackTraceElement[] stackTraceElements = e.getStackTrace(); |
| 284 | 307 | Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); |
| 285 | 308 | StackTraceElement stackTraceElement = stackTraceElements[0]; |
| ... | ... | @@ -292,12 +315,12 @@ public class GlobalExceptionHandler { |
| 292 | 315 | errorLog.setApplicationName(applicationName); |
| 293 | 316 | errorLog.setRequestUrl(request.getRequestURI()); |
| 294 | 317 | Map<String, Object> requestParams = MapUtil.<String, Object>builder() |
| 295 | - .put("query", ServletUtils.getParamMap(request)) | |
| 296 | - .put("body", ServletUtils.getBody(request)).build(); | |
| 318 | + .put("query", JakartaServletUtil.getParamMap(request)) | |
| 319 | + .put("body", JakartaServletUtil.getBody(request)).build(); | |
| 297 | 320 | errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); |
| 298 | 321 | errorLog.setRequestMethod(request.getMethod()); |
| 299 | 322 | errorLog.setUserAgent(ServletUtils.getUserAgent(request)); |
| 300 | - errorLog.setUserIp(ServletUtils.getClientIP(request)); | |
| 323 | + errorLog.setUserIp(JakartaServletUtil.getClientIP(request)); | |
| 301 | 324 | errorLog.setExceptionTime(LocalDateTime.now()); |
| 302 | 325 | } |
| 303 | 326 | |
| ... | ... | @@ -314,51 +337,51 @@ public class GlobalExceptionHandler { |
| 314 | 337 | } |
| 315 | 338 | // 1. 数据报表 |
| 316 | 339 | if (message.contains("report_")) { |
| 317 | - log.error("[报表模块 yudao-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); | |
| 340 | + log.error("[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); | |
| 318 | 341 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 319 | - "[报表模块 yudao-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); | |
| 342 | + "[报表模块 yudao-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); | |
| 320 | 343 | } |
| 321 | 344 | // 2. 工作流 |
| 322 | 345 | if (message.contains("bpm_")) { |
| 323 | - log.error("[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); | |
| 346 | + log.error("[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); | |
| 324 | 347 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 325 | - "[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); | |
| 348 | + "[工作流模块 yudao-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); | |
| 326 | 349 | } |
| 327 | 350 | // 3. 微信公众号 |
| 328 | 351 | if (message.contains("mp_")) { |
| 329 | - log.error("[微信公众号 yudao-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); | |
| 352 | + log.error("[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); | |
| 330 | 353 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 331 | - "[微信公众号 yudao-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); | |
| 354 | + "[微信公众号 yudao-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); | |
| 332 | 355 | } |
| 333 | 356 | // 4. 商城系统 |
| 334 | 357 | if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { |
| 335 | - log.error("[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); | |
| 358 | + log.error("[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); | |
| 336 | 359 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 337 | - "[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); | |
| 360 | + "[商城系统 yudao-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); | |
| 338 | 361 | } |
| 339 | 362 | // 5. ERP 系统 |
| 340 | 363 | if (message.contains("erp_")) { |
| 341 | - log.error("[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); | |
| 364 | + log.error("[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); | |
| 342 | 365 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 343 | - "[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); | |
| 366 | + "[ERP 系统 yudao-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); | |
| 344 | 367 | } |
| 345 | 368 | // 6. CRM 系统 |
| 346 | 369 | if (message.contains("crm_")) { |
| 347 | - log.error("[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); | |
| 370 | + log.error("[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); | |
| 348 | 371 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 349 | - "[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://doc.iocoder.cn/crm/build/ 开启]"); | |
| 372 | + "[CRM 系统 yudao-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); | |
| 350 | 373 | } |
| 351 | 374 | // 7. 支付平台 |
| 352 | 375 | if (message.contains("pay_")) { |
| 353 | - log.error("[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); | |
| 376 | + log.error("[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); | |
| 354 | 377 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 355 | - "[支付模块 yudao-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); | |
| 378 | + "[支付模块 yudao-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); | |
| 356 | 379 | } |
| 357 | 380 | // 8. AI 大模型 |
| 358 | 381 | if (message.contains("ai_")) { |
| 359 | - log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | |
| 382 | + log.error("[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); | |
| 360 | 383 | return CommonResult.error(NOT_IMPLEMENTED.getCode(), |
| 361 | - "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://doc.iocoder.cn/ai/build/ 开启]"); | |
| 384 | + "[AI 大模型 yudao-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); | |
| 362 | 385 | } |
| 363 | 386 | return null; |
| 364 | 387 | } | ... | ... |
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleEnum.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.enums; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | |
| 4 | 3 | import lombok.AllArgsConstructor; |
| 5 | 4 | import lombok.Getter; |
| 6 | 5 | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | 6 | /** |
| 10 | 7 | * AI 内置聊天角色的枚举 |
| 11 | 8 | * |
| ... | ... | @@ -13,16 +10,16 @@ import java.util.Arrays; |
| 13 | 10 | */ |
| 14 | 11 | @AllArgsConstructor |
| 15 | 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 | 17 | 1. 撰写建议:根据用户提供的主题或问题,提供详细的写作建议、情节发展方向、角色设定以及背景描写,确保内容结构清晰、有逻辑。 |
| 21 | 18 | 2. 回复生成:根据用户提供的场景和提示词,生成合适的对话或文字回复,确保语气和风格符合场景需求。 |
| 22 | 19 | 除此之外不需要除了正文内容外的其他回复,如标题、开头、任何解释性语句或道歉。 |
| 23 | 20 | """), |
| 24 | 21 | |
| 25 | - AI_MIND_MAP_ROLE(2, "导图助手", """ | |
| 22 | + AI_MIND_MAP_ROLE("导图助手", """ | |
| 26 | 23 | 你是一位非常优秀的思维导图助手,你会把用户的所有提问都总结成思维导图,然后以 Markdown 格式输出。markdown 只需要输出一级标题,二级标题,三级标题,四级标题,最多输出四级,除此之外不要输出任何其他 markdown 标记。下面是一个合格的例子: |
| 27 | 24 | # Geek-AI 助手 |
| 28 | 25 | ## 完整的开源系统 |
| ... | ... | @@ -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 | 46 | */ |
| 55 | 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 | 4 | |
| 5 | 5 | /** |
| 6 | 6 | * AI 错误码枚举类 |
| 7 | - * | |
| 7 | + * <p> | |
| 8 | 8 | * ai 系统,使用 1-040-000-000 段 |
| 9 | 9 | */ |
| 10 | 10 | public interface ErrorCodeConstants { |
| ... | ... | @@ -52,4 +52,9 @@ public interface ErrorCodeConstants { |
| 52 | 52 | // ========== API 思维导图 1-040-008-000 ========== |
| 53 | 53 | ErrorCode MIND_MAP_NOT_EXISTS = new ErrorCode(1_040_008_000, "思维导图不存在!"); |
| 54 | 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 | + | |
| 55 | 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/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/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/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/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/knowledge/DocService.java deleted
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/DocServiceImpl.java deleted
| 1 | -package cn.iocoder.yudao.module.ai.service.knowledge; | |
| 2 | - | |
| 3 | -import jakarta.annotation.Resource; | |
| 4 | -import lombok.extern.slf4j.Slf4j; | |
| 5 | -import org.springframework.ai.document.Document; | |
| 6 | -import org.springframework.ai.reader.tika.TikaDocumentReader; | |
| 7 | -import org.springframework.ai.transformer.splitter.TokenTextSplitter; | |
| 8 | -import org.springframework.ai.vectorstore.RedisVectorStore; | |
| 9 | -import org.springframework.beans.factory.annotation.Value; | |
| 10 | - | |
| 11 | -import java.util.List; | |
| 12 | - | |
| 13 | -/** | |
| 14 | - * AI 知识库 Service 实现类 | |
| 15 | - * | |
| 16 | - * @author xiaoxin | |
| 17 | - */ | |
| 18 | -//@Service // TODO 芋艿:临时注释,避免无法启动 | |
| 19 | -@Slf4j | |
| 20 | -public class DocServiceImpl implements DocService { | |
| 21 | - | |
| 22 | - @Resource | |
| 23 | - private RedisVectorStore vectorStore; | |
| 24 | - @Resource | |
| 25 | - private TokenTextSplitter tokenTextSplitter; | |
| 26 | - | |
| 27 | - // TODO @xin 临时测试用,后续删 | |
| 28 | - @Value("classpath:/webapp/test/Fel.pdf") | |
| 29 | - private org.springframework.core.io.Resource data; | |
| 30 | - | |
| 31 | - @Override | |
| 32 | - public void embeddingDoc() { | |
| 33 | - // 读取文件 | |
| 34 | - TikaDocumentReader loader = new TikaDocumentReader(data); | |
| 35 | - List<Document> documents = loader.get(); | |
| 36 | - // 文档分段 | |
| 37 | - List<Document> segments = tokenTextSplitter.apply(documents); | |
| 38 | - // 向量化并存储 | |
| 39 | - vectorStore.add(segments); | |
| 40 | - } | |
| 41 | - | |
| 42 | -} |
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 | 9 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; |
| 10 | 10 | import jakarta.validation.Valid; |
| 11 | 11 | import org.springframework.ai.chat.model.ChatModel; |
| 12 | +import org.springframework.ai.embedding.EmbeddingModel; | |
| 12 | 13 | import org.springframework.ai.image.ImageModel; |
| 14 | +import org.springframework.ai.vectorstore.VectorStore; | |
| 13 | 15 | |
| 14 | 16 | import java.util.List; |
| 15 | 17 | |
| ... | ... | @@ -111,4 +113,20 @@ public interface AiApiKeyService { |
| 111 | 113 | */ |
| 112 | 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 | 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 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 4 | 4 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; |
| 5 | +import cn.iocoder.yudao.framework.ai.core.factory.AiVectorStoreFactory; | |
| 5 | 6 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 6 | 7 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; |
| 7 | 8 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| ... | ... | @@ -13,7 +14,9 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; |
| 13 | 14 | import cn.iocoder.yudao.module.ai.dal.mysql.model.AiApiKeyMapper; |
| 14 | 15 | import jakarta.annotation.Resource; |
| 15 | 16 | import org.springframework.ai.chat.model.ChatModel; |
| 17 | +import org.springframework.ai.embedding.EmbeddingModel; | |
| 16 | 18 | import org.springframework.ai.image.ImageModel; |
| 19 | +import org.springframework.ai.vectorstore.VectorStore; | |
| 17 | 20 | import org.springframework.stereotype.Service; |
| 18 | 21 | import org.springframework.validation.annotation.Validated; |
| 19 | 22 | |
| ... | ... | @@ -36,6 +39,8 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { |
| 36 | 39 | |
| 37 | 40 | @Resource |
| 38 | 41 | private AiModelFactory modelFactory; |
| 42 | + @Resource | |
| 43 | + private AiVectorStoreFactory vectorFactory; | |
| 39 | 44 | |
| 40 | 45 | @Override |
| 41 | 46 | public Long createApiKey(AiApiKeySaveReqVO createReqVO) { |
| ... | ... | @@ -132,4 +137,19 @@ public class AiApiKeyServiceImpl implements AiApiKeyService { |
| 132 | 137 | } |
| 133 | 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 | 156 | \ No newline at end of file | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
| ... | ... | @@ -14,58 +14,57 @@ |
| 14 | 14 | <name>${project.artifactId}</name> |
| 15 | 15 | <description>AI 大模型拓展,接入国内外大模型</description> |
| 16 | 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 | 19 | </properties> |
| 19 | 20 | |
| 20 | 21 | <dependencies> |
| 21 | 22 | <dependency> |
| 22 | - <groupId>org.springframework.ai</groupId> | |
| 23 | + <groupId>${spring-ai.groupId}</groupId> | |
| 23 | 24 | <artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId> |
| 24 | 25 | <version>${spring-ai.version}</version> |
| 25 | 26 | </dependency> |
| 26 | 27 | <dependency> |
| 27 | - <groupId>org.springframework.ai</groupId> | |
| 28 | + <groupId>${spring-ai.groupId}</groupId> | |
| 28 | 29 | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> |
| 29 | 30 | <version>${spring-ai.version}</version> |
| 30 | 31 | </dependency> |
| 31 | 32 | <dependency> |
| 32 | - <groupId>org.springframework.ai</groupId> | |
| 33 | + <groupId>${spring-ai.groupId}</groupId> | |
| 33 | 34 | <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> |
| 34 | 35 | <version>${spring-ai.version}</version> |
| 35 | 36 | </dependency> |
| 36 | 37 | <dependency> |
| 37 | - <groupId>org.springframework.ai</groupId> | |
| 38 | + <groupId>${spring-ai.groupId}</groupId> | |
| 38 | 39 | <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> |
| 39 | 40 | <version>${spring-ai.version}</version> |
| 40 | 41 | </dependency> |
| 41 | 42 | <dependency> |
| 42 | - <groupId>org.springframework.ai</groupId> | |
| 43 | + <groupId>${spring-ai.groupId}</groupId> | |
| 43 | 44 | <artifactId>spring-ai-stability-ai-spring-boot-starter</artifactId> |
| 44 | 45 | <version>${spring-ai.version}</version> |
| 45 | 46 | </dependency> |
| 46 | 47 | |
| 47 | 48 | <!-- 向量化,基于 Redis 存储,Tika 解析内容 --> |
| 48 | 49 | <dependency> |
| 49 | - <groupId>org.springframework.ai</groupId> | |
| 50 | + <groupId>${spring-ai.groupId}</groupId> | |
| 50 | 51 | <artifactId>spring-ai-transformers-spring-boot-starter</artifactId> |
| 51 | 52 | <version>${spring-ai.version}</version> |
| 52 | 53 | </dependency> |
| 53 | 54 | <dependency> |
| 54 | - <groupId>org.springframework.ai</groupId> | |
| 55 | + <groupId>${spring-ai.groupId}</groupId> | |
| 55 | 56 | <artifactId>spring-ai-tika-document-reader</artifactId> |
| 56 | 57 | <version>${spring-ai.version}</version> |
| 57 | 58 | </dependency> |
| 58 | 59 | <dependency> |
| 59 | - <groupId>org.springframework.ai</groupId> | |
| 60 | + <groupId>${spring-ai.groupId}</groupId> | |
| 60 | 61 | <artifactId>spring-ai-redis-store</artifactId> |
| 61 | 62 | <version>${spring-ai.version}</version> |
| 62 | 63 | </dependency> |
| 63 | 64 | |
| 64 | - <!-- TODO @xin:引入我们项目的 starter --> | |
| 65 | 65 | <dependency> |
| 66 | - <groupId>org.springframework.data</groupId> | |
| 67 | - <artifactId>spring-data-redis</artifactId> | |
| 68 | - <optional>true</optional> | |
| 66 | + <groupId>cn.iocoder.boot</groupId> | |
| 67 | + <artifactId>yudao-spring-boot-starter-redis</artifactId> | |
| 69 | 68 | </dependency> |
| 70 | 69 | |
| 71 | 70 | <dependency> |
| ... | ... | @@ -73,11 +72,10 @@ |
| 73 | 72 | <artifactId>yudao-common</artifactId> |
| 74 | 73 | </dependency> |
| 75 | 74 | |
| 76 | - <!-- TODO 芋艿:等 spring-ai 官方发布后,需要把 groupId 改下 --> | |
| 77 | 75 | <dependency> |
| 78 | - <groupId>group.springframework.ai</groupId> | |
| 76 | + <groupId>${spring-ai.groupId}</groupId> | |
| 79 | 77 | <artifactId>spring-ai-qianfan-spring-boot-starter</artifactId> |
| 80 | - <version>1.1.0</version> | |
| 78 | + <version>${spring-ai.version}</version> | |
| 81 | 79 | </dependency> |
| 82 | 80 | |
| 83 | 81 | <!-- 阿里云 通义千问 --> | ... | ... |
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 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.ai.core.factory.AiModelFactory; |
| 4 | 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 | 7 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatModel; |
| 6 | 8 | import cn.iocoder.yudao.framework.ai.core.model.deepseek.DeepSeekChatOptions; |
| 7 | 9 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| ... | ... | @@ -10,20 +12,15 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel; |
| 10 | 12 | import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatOptions; |
| 11 | 13 | import com.alibaba.cloud.ai.tongyi.TongYiAutoConfiguration; |
| 12 | 14 | import lombok.extern.slf4j.Slf4j; |
| 13 | -import org.springframework.ai.autoconfigure.vectorstore.redis.RedisVectorStoreProperties; | |
| 14 | -import org.springframework.ai.document.MetadataMode; | |
| 15 | -import org.springframework.ai.embedding.EmbeddingModel; | |
| 15 | +import org.springframework.ai.tokenizer.JTokkitTokenCountEstimator; | |
| 16 | +import org.springframework.ai.tokenizer.TokenCountEstimator; | |
| 16 | 17 | import org.springframework.ai.transformer.splitter.TokenTextSplitter; |
| 17 | -import org.springframework.ai.transformers.TransformersEmbeddingModel; | |
| 18 | -import org.springframework.ai.vectorstore.RedisVectorStore; | |
| 19 | 18 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| 20 | 19 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| 21 | -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; | |
| 22 | 20 | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| 23 | 21 | import org.springframework.context.annotation.Bean; |
| 24 | 22 | import org.springframework.context.annotation.Import; |
| 25 | 23 | import org.springframework.context.annotation.Lazy; |
| 26 | -import redis.clients.jedis.JedisPooled; | |
| 27 | 24 | |
| 28 | 25 | /** |
| 29 | 26 | * 芋道 AI 自动配置 |
| ... | ... | @@ -41,6 +38,12 @@ public class YudaoAiAutoConfiguration { |
| 41 | 38 | return new AiModelFactoryImpl(); |
| 42 | 39 | } |
| 43 | 40 | |
| 41 | + @Bean | |
| 42 | + public AiVectorStoreFactory aiVectorFactory() { | |
| 43 | + return new AiVectorStoreFactoryImpl(); | |
| 44 | + } | |
| 45 | + | |
| 46 | + | |
| 44 | 47 | // ========== 各种 AI Client 创建 ========== |
| 45 | 48 | |
| 46 | 49 | @Bean |
| ... | ... | @@ -83,35 +86,42 @@ public class YudaoAiAutoConfiguration { |
| 83 | 86 | } |
| 84 | 87 | |
| 85 | 88 | // ========== rag 相关 ========== |
| 86 | - @Bean | |
| 87 | - @Lazy // TODO 芋艿:临时注释,避免无法启动 | |
| 88 | - public EmbeddingModel transformersEmbeddingClient() { | |
| 89 | - return new TransformersEmbeddingModel(MetadataMode.EMBED); | |
| 90 | - } | |
| 89 | + // TODO @xin 免费版本 | |
| 90 | +// @Bean | |
| 91 | +// @Lazy // TODO 芋艿:临时注释,避免无法启动」 | |
| 92 | +// public EmbeddingModel transformersEmbeddingClient() { | |
| 93 | +// return new TransformersEmbeddingModel(MetadataMode.EMBED); | |
| 94 | +// } | |
| 91 | 95 | |
| 92 | 96 | /** |
| 93 | - * 我们启动有加载很多 Embedding 模型,不晓得取哪个好,先 new 个 TransformersEmbeddingModel 跑 | |
| 97 | + * TODO @xin 默认版本先不弄,目前都先取对应的 EmbeddingModel | |
| 94 | 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 | + | |
| 95 | 115 | @Bean |
| 96 | 116 | @Lazy // TODO 芋艿:临时注释,避免无法启动 |
| 97 | - public RedisVectorStore vectorStore(TransformersEmbeddingModel transformersEmbeddingModel, RedisVectorStoreProperties properties, | |
| 98 | - RedisProperties redisProperties) { | |
| 99 | - var config = RedisVectorStore.RedisVectorStoreConfig.builder() | |
| 100 | - .withIndexName(properties.getIndex()) | |
| 101 | - .withPrefix(properties.getPrefix()) | |
| 102 | - .build(); | |
| 103 | - | |
| 104 | - RedisVectorStore redisVectorStore = new RedisVectorStore(config, transformersEmbeddingModel, | |
| 105 | - new JedisPooled(redisProperties.getHost(), redisProperties.getPort()), | |
| 106 | - properties.isInitializeSchema()); | |
| 107 | - redisVectorStore.afterPropertiesSet(); | |
| 108 | - return redisVectorStore; | |
| 117 | + public TokenTextSplitter tokenTextSplitter() { | |
| 118 | + return new TokenTextSplitter(500, 100, 5, 10000, true); | |
| 109 | 119 | } |
| 110 | 120 | |
| 111 | 121 | @Bean |
| 112 | 122 | @Lazy // TODO 芋艿:临时注释,避免无法启动 |
| 113 | - public TokenTextSplitter tokenTextSplitter() { | |
| 114 | - return new TokenTextSplitter(500, 100, 5, 10000, true); | |
| 123 | + public TokenCountEstimator tokenCountEstimator() { | |
| 124 | + return new JTokkitTokenCountEstimator(); | |
| 115 | 125 | } |
| 116 | 126 | |
| 117 | 127 | } |
| 118 | 128 | \ No newline at end of file | ... | ... |
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 | 4 | import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; |
| 5 | 5 | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; |
| 6 | 6 | import org.springframework.ai.chat.model.ChatModel; |
| 7 | +import org.springframework.ai.embedding.EmbeddingModel; | |
| 7 | 8 | import org.springframework.ai.image.ImageModel; |
| 8 | 9 | |
| 9 | 10 | /** |
| ... | ... | @@ -79,4 +80,16 @@ public interface AiModelFactory { |
| 79 | 80 | */ |
| 80 | 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,7 @@ import com.alibaba.cloud.ai.tongyi.image.TongYiImagesModel; |
| 21 | 21 | import com.alibaba.cloud.ai.tongyi.image.TongYiImagesProperties; |
| 22 | 22 | import com.alibaba.dashscope.aigc.generation.Generation; |
| 23 | 23 | import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; |
| 24 | +import com.alibaba.dashscope.embeddings.TextEmbedding; | |
| 24 | 25 | import com.azure.ai.openai.OpenAIClient; |
| 25 | 26 | import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; |
| 26 | 27 | import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiChatProperties; |
| ... | ... | @@ -37,6 +38,7 @@ import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiConnectionProperties; |
| 37 | 38 | import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiImageProperties; |
| 38 | 39 | import org.springframework.ai.azure.openai.AzureOpenAiChatModel; |
| 39 | 40 | import org.springframework.ai.chat.model.ChatModel; |
| 41 | +import org.springframework.ai.embedding.EmbeddingModel; | |
| 40 | 42 | import org.springframework.ai.image.ImageModel; |
| 41 | 43 | import org.springframework.ai.model.function.FunctionCallbackContext; |
| 42 | 44 | import org.springframework.ai.ollama.OllamaChatModel; |
| ... | ... | @@ -175,6 +177,20 @@ public class AiModelFactoryImpl implements AiModelFactory { |
| 175 | 177 | return Singleton.get(cacheKey, (Func0<SunoApi>) () -> new SunoApi(url)); |
| 176 | 178 | } |
| 177 | 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 | + | |
| 178 | 194 | private static String buildClientCacheKey(Class<?> clazz, Object... params) { |
| 179 | 195 | if (ArrayUtil.isEmpty(params)) { |
| 180 | 196 | return clazz.getName(); |
| ... | ... | @@ -238,8 +254,7 @@ public class AiModelFactoryImpl implements AiModelFactory { |
| 238 | 254 | } |
| 239 | 255 | |
| 240 | 256 | /** |
| 241 | - * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiChatModel( | |
| 242 | - * ZhiPuAiConnectionProperties, ZhiPuAiChatProperties, RestClient.Builder, List, FunctionCallbackContext, RetryTemplate, ResponseErrorHandler)} | |
| 257 | + * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiChatModel(ZhiPuAiConnectionProperties, ZhiPuAiChatProperties, RestClient.Builder, List, FunctionCallbackContext, RetryTemplate, ResponseErrorHandler)} | |
| 243 | 258 | */ |
| 244 | 259 | private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) { |
| 245 | 260 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); |
| ... | ... | @@ -248,8 +263,7 @@ public class AiModelFactoryImpl implements AiModelFactory { |
| 248 | 263 | } |
| 249 | 264 | |
| 250 | 265 | /** |
| 251 | - * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiImageModel( | |
| 252 | - * ZhiPuAiConnectionProperties, ZhiPuAiImageProperties, RestClient.Builder, RetryTemplate, ResponseErrorHandler)} | |
| 266 | + * 可参考 {@link ZhiPuAiAutoConfiguration#zhiPuAiImageModel(ZhiPuAiConnectionProperties, ZhiPuAiImageProperties, RestClient.Builder, RetryTemplate, ResponseErrorHandler)} | |
| 253 | 267 | */ |
| 254 | 268 | private ZhiPuAiImageModel buildZhiPuAiImageModel(String apiKey, String url) { |
| 255 | 269 | url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); |
| ... | ... | @@ -315,4 +329,15 @@ public class AiModelFactoryImpl implements AiModelFactory { |
| 315 | 329 | return new StabilityAiImageModel(stabilityAiApi); |
| 316 | 330 | } |
| 317 | 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 | + | |
| 318 | 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 | +} | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiVectorStoreFactoryImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.ai.core.factory; | |
| 2 | + | |
| 3 | +import cn.hutool.core.lang.Singleton; | |
| 4 | +import cn.hutool.core.lang.func.Func0; | |
| 5 | +import cn.hutool.core.util.ArrayUtil; | |
| 6 | +import cn.hutool.core.util.StrUtil; | |
| 7 | +import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | |
| 8 | +import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; | |
| 9 | +import org.springframework.ai.embedding.EmbeddingModel; | |
| 10 | +import org.springframework.ai.vectorstore.RedisVectorStore; | |
| 11 | +import org.springframework.ai.vectorstore.VectorStore; | |
| 12 | +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; | |
| 13 | +import redis.clients.jedis.JedisPooled; | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * AI Vector 模型工厂的实现类 | |
| 17 | + * 使用 redisVectorStore 实现 VectorStore | |
| 18 | + * | |
| 19 | + * @author xiaoxin | |
| 20 | + */ | |
| 21 | +public class AiVectorStoreFactoryImpl implements AiVectorStoreFactory { | |
| 22 | + | |
| 23 | + @Override | |
| 24 | + public VectorStore getOrCreateVectorStore(EmbeddingModel embeddingModel, AiPlatformEnum platform, String apiKey, String url) { | |
| 25 | + String cacheKey = buildClientCacheKey(VectorStore.class, platform, apiKey, url); | |
| 26 | + return Singleton.get(cacheKey, (Func0<VectorStore>) () -> { | |
| 27 | + // TODO 芋艿 @xin 这两个配置取哪好呢 | |
| 28 | + // TODO 不同模型的向量维度可能会不一样,目前看貌似是以 index 来做区分的,维度不一样存不到一个 index 上 | |
| 29 | + // TODO 回复:好的哈 | |
| 30 | + String index = "default-index"; | |
| 31 | + String prefix = "default:"; | |
| 32 | + var config = RedisVectorStore.RedisVectorStoreConfig.builder() | |
| 33 | + .withIndexName(index) | |
| 34 | + .withPrefix(prefix) | |
| 35 | + .build(); | |
| 36 | + RedisProperties redisProperties = SpringUtils.getBean(RedisProperties.class); | |
| 37 | + RedisVectorStore redisVectorStore = new RedisVectorStore(config, embeddingModel, | |
| 38 | + new JedisPooled(redisProperties.getHost(), redisProperties.getPort()), | |
| 39 | + true); | |
| 40 | + redisVectorStore.afterPropertiesSet(); | |
| 41 | + return redisVectorStore; | |
| 42 | + }); | |
| 43 | + } | |
| 44 | + | |
| 45 | + private static String buildClientCacheKey(Class<?> clazz, Object... params) { | |
| 46 | + if (ArrayUtil.isEmpty(params)) { | |
| 47 | + return clazz.getName(); | |
| 48 | + } | |
| 49 | + return StrUtil.format("{}#{}", clazz.getName(), ArrayUtil.join(params, "_")); | |
| 50 | + } | |
| 51 | + | |
| 52 | +} | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/autoconfigure/vectorstore/redis/RedisVectorStoreAutoConfiguration.java
| ... | ... | @@ -19,6 +19,7 @@ import org.springframework.ai.embedding.EmbeddingModel; |
| 19 | 19 | import org.springframework.ai.vectorstore.RedisVectorStore; |
| 20 | 20 | import org.springframework.ai.vectorstore.RedisVectorStore.RedisVectorStoreConfig; |
| 21 | 21 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| 22 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; | |
| 22 | 23 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
| 23 | 24 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
| 24 | 25 | import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; |
| ... | ... | @@ -31,13 +32,14 @@ import redis.clients.jedis.JedisPooled; |
| 31 | 32 | * TODO @xin 先拿 spring-ai 最新代码覆盖,1.0.0-M1 跟 redis 自动配置会冲突 |
| 32 | 33 | * |
| 33 | 34 | * TODO 这个官方,有说啥时候 fix 哇? |
| 35 | + * TODO 看着是列在1.0.0-M2版本 | |
| 34 | 36 | * |
| 35 | 37 | * @author Christian Tzolov |
| 36 | 38 | * @author Eddú Meléndez |
| 37 | 39 | */ |
| 38 | 40 | @AutoConfiguration(after = RedisAutoConfiguration.class) |
| 39 | 41 | @ConditionalOnClass({JedisPooled.class, JedisConnectionFactory.class, RedisVectorStore.class, EmbeddingModel.class}) |
| 40 | -//@ConditionalOnBean(JedisConnectionFactory.class) | |
| 42 | +@ConditionalOnBean(JedisConnectionFactory.class) | |
| 41 | 43 | @EnableConfigurationProperties(RedisVectorStoreProperties.class) |
| 42 | 44 | public class RedisVectorStoreAutoConfiguration { |
| 43 | 45 | ... | ... |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/resources/webapp/test/Fel.pdf deleted
No preview for this file type
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
| ... | ... | @@ -63,6 +63,7 @@ public class BpmModelServiceImpl implements BpmModelService { |
| 63 | 63 | @Override |
| 64 | 64 | public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) { |
| 65 | 65 | ModelQuery modelQuery = repositoryService.createModelQuery(); |
| 66 | + modelQuery.modelTenantId(FlowableUtils.getTenantId()); | |
| 66 | 67 | if (StrUtil.isNotBlank(pageVO.getKey())) { |
| 67 | 68 | modelQuery.modelKey(pageVO.getKey()); |
| 68 | 69 | } |
| ... | ... | @@ -78,7 +79,6 @@ public class BpmModelServiceImpl implements BpmModelService { |
| 78 | 79 | return PageResult.empty(count); |
| 79 | 80 | } |
| 80 | 81 | List<Model> models = modelQuery |
| 81 | - .modelTenantId(FlowableUtils.getTenantId()) | |
| 82 | 82 | .orderByCreateTime().desc() |
| 83 | 83 | .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); |
| 84 | 84 | return new PageResult<>(models, count); | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -97,7 +97,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 97 | 97 | } |
| 98 | 98 | if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |
| 99 | 99 | taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |
| 100 | - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 100 | + taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 101 | 101 | } |
| 102 | 102 | long count = taskQuery.count(); |
| 103 | 103 | if (count == 0) { |
| ... | ... | @@ -119,7 +119,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 119 | 119 | } |
| 120 | 120 | if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |
| 121 | 121 | taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |
| 122 | - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 122 | + taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 123 | 123 | } |
| 124 | 124 | // 执行查询 |
| 125 | 125 | long count = taskQuery.count(); |
| ... | ... | @@ -141,7 +141,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 141 | 141 | } |
| 142 | 142 | if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |
| 143 | 143 | taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |
| 144 | - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 144 | + taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | |
| 145 | 145 | } |
| 146 | 146 | // 执行查询 |
| 147 | 147 | long count = taskQuery.count(); | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java
| ... | ... | @@ -33,6 +33,9 @@ public class CouponTemplateBaseVO { |
| 33 | 33 | @NotNull(message = "优惠劵名不能为空") |
| 34 | 34 | private String name; |
| 35 | 35 | |
| 36 | + @Schema(description = "优惠券说明", example = "优惠券使用说明") | |
| 37 | + private String description; | |
| 38 | + | |
| 36 | 39 | @Schema(description = "发行总量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // -1 - 则表示不限制发放数量 |
| 37 | 40 | @NotNull(message = "发行总量不能为空") |
| 38 | 41 | private Integer totalCount; | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.template; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; | |
| 4 | -import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | |
| 5 | -import com.baomidou.mybatisplus.annotation.TableField; | |
| 6 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 7 | 4 | import lombok.Data; |
| 8 | 5 | |
| ... | ... | @@ -20,6 +17,9 @@ public class AppCouponTemplateRespVO { |
| 20 | 17 | @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送") |
| 21 | 18 | private String name; |
| 22 | 19 | |
| 20 | + @Schema(description = "优惠券说明", example = "优惠券使用说明") | |
| 21 | + private String description; | |
| 22 | + | |
| 23 | 23 | @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 |
| 24 | 24 | private Integer takeLimitCount; |
| 25 | 25 | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/coupon/CouponTemplateDO.java
| ... | ... | @@ -41,6 +41,10 @@ public class CouponTemplateDO extends BaseDO { |
| 41 | 41 | */ |
| 42 | 42 | private String name; |
| 43 | 43 | /** |
| 44 | + * 优惠券说明 | |
| 45 | + */ | |
| 46 | + private String description; | |
| 47 | + /** | |
| 44 | 48 | * 状态 |
| 45 | 49 | * |
| 46 | 50 | * 枚举 {@link CommonStatusEnum} |
| ... | ... | @@ -158,9 +162,9 @@ public class CouponTemplateDO extends BaseDO { |
| 158 | 162 | * 使用优惠券的次数 |
| 159 | 163 | */ |
| 160 | 164 | private Integer useCount; |
| 165 | + | |
| 161 | 166 | // ========== 统计信息 END ========== |
| 162 | 167 | |
| 163 | 168 | // TODO 芋艿:领取开始时间、领取结束时间 |
| 164 | 169 | |
| 165 | - // TODO 芋艿:要不要加描述 | |
| 166 | 170 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleController.java
| ... | ... | @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.trade.controller.app.aftersale; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.AfterSaleLogRespVO; | |
| 6 | +import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; | |
| 7 | 7 | import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO; |
| 8 | 8 | import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO; |
| 9 | 9 | import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleRespVO; |
| ... | ... | @@ -12,14 +12,11 @@ import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService; |
| 12 | 12 | import io.swagger.v3.oas.annotations.Operation; |
| 13 | 13 | import io.swagger.v3.oas.annotations.Parameter; |
| 14 | 14 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 15 | +import jakarta.annotation.Resource; | |
| 15 | 16 | import lombok.extern.slf4j.Slf4j; |
| 16 | 17 | import org.springframework.validation.annotation.Validated; |
| 17 | 18 | import org.springframework.web.bind.annotation.*; |
| 18 | 19 | |
| 19 | -import jakarta.annotation.Resource; | |
| 20 | - | |
| 21 | -import java.util.List; | |
| 22 | - | |
| 23 | 20 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 24 | 21 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 25 | 22 | |
| ... | ... | @@ -35,6 +32,7 @@ public class AppAfterSaleController { |
| 35 | 32 | |
| 36 | 33 | @GetMapping(value = "/page") |
| 37 | 34 | @Operation(summary = "获得售后分页") |
| 35 | + @PreAuthenticated | |
| 38 | 36 | public CommonResult<PageResult<AppAfterSaleRespVO>> getAfterSalePage(PageParam pageParam) { |
| 39 | 37 | return success(AfterSaleConvert.INSTANCE.convertPage02( |
| 40 | 38 | afterSaleService.getAfterSalePage(getLoginUserId(), pageParam))); |
| ... | ... | @@ -43,18 +41,21 @@ public class AppAfterSaleController { |
| 43 | 41 | @GetMapping(value = "/get") |
| 44 | 42 | @Operation(summary = "获得售后订单") |
| 45 | 43 | @Parameter(name = "id", description = "售后编号", required = true, example = "1") |
| 44 | + @PreAuthenticated | |
| 46 | 45 | public CommonResult<AppAfterSaleRespVO> getAfterSale(@RequestParam("id") Long id) { |
| 47 | 46 | return success(AfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id))); |
| 48 | 47 | } |
| 49 | 48 | |
| 50 | 49 | @PostMapping(value = "/create") |
| 51 | 50 | @Operation(summary = "申请售后") |
| 51 | + @PreAuthenticated | |
| 52 | 52 | public CommonResult<Long> createAfterSale(@RequestBody AppAfterSaleCreateReqVO createReqVO) { |
| 53 | 53 | return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO)); |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | @PutMapping(value = "/delivery") |
| 57 | 57 | @Operation(summary = "退回货物") |
| 58 | + @PreAuthenticated | |
| 58 | 59 | public CommonResult<Boolean> deliveryAfterSale(@RequestBody AppAfterSaleDeliveryReqVO deliveryReqVO) { |
| 59 | 60 | afterSaleService.deliveryAfterSale(getLoginUserId(), deliveryReqVO); |
| 60 | 61 | return success(true); |
| ... | ... | @@ -63,6 +64,7 @@ public class AppAfterSaleController { |
| 63 | 64 | @DeleteMapping(value = "/cancel") |
| 64 | 65 | @Operation(summary = "取消售后") |
| 65 | 66 | @Parameter(name = "id", description = "售后编号", required = true, example = "1") |
| 67 | + @PreAuthenticated | |
| 66 | 68 | public CommonResult<Boolean> cancelAfterSale(@RequestParam("id") Long id) { |
| 67 | 69 | afterSaleService.cancelAfterSale(getLoginUserId(), id); |
| 68 | 70 | return success(true); | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleLogController.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.controller.app.aftersale; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | +import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; | |
| 5 | 6 | import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.log.AppAfterSaleLogRespVO; |
| 6 | 7 | import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO; |
| 7 | 8 | import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleLogService; |
| ... | ... | @@ -33,6 +34,7 @@ public class AppAfterSaleLogController { |
| 33 | 34 | @GetMapping("/list") |
| 34 | 35 | @Operation(summary = "获得售后日志列表") |
| 35 | 36 | @Parameter(name = "afterSaleId", description = "售后编号", required = true, example = "1") |
| 37 | + @PreAuthenticated | |
| 36 | 38 | public CommonResult<List<AppAfterSaleLogRespVO>> getAfterSaleLogList( |
| 37 | 39 | @RequestParam("afterSaleId") Long afterSaleId) { |
| 38 | 40 | List<AfterSaleLogDO> logs = afterSaleLogService.getAfterSaleLogList(afterSaleId); | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageRecordController.java
| ... | ... | @@ -45,6 +45,7 @@ public class AppBrokerageRecordController { |
| 45 | 45 | |
| 46 | 46 | @GetMapping("/get-product-brokerage-price") |
| 47 | 47 | @Operation(summary = "获得商品的分销金额") |
| 48 | + @PreAuthenticated | |
| 48 | 49 | public CommonResult<AppBrokerageProductPriceRespVO> getProductBrokeragePrice(@RequestParam("spuId") Long spuId) { |
| 49 | 50 | return success(brokerageRecordService.calculateProductBrokeragePrice(getLoginUserId(), spuId)); |
| 50 | 51 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java
| ... | ... | @@ -133,6 +133,7 @@ public class AppBrokerageUserController { |
| 133 | 133 | @GetMapping("/get-rank-by-price") |
| 134 | 134 | @Operation(summary = "获得分销用户排行(基于佣金)") |
| 135 | 135 | @Parameter(name = "times", description = "时间段", required = true) |
| 136 | + @PreAuthenticated | |
| 136 | 137 | public CommonResult<Integer> getRankByPrice( |
| 137 | 138 | @RequestParam("times") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] times) { |
| 138 | 139 | return success(brokerageRecordService.getUserRankByPrice(getLoginUserId(), times)); | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverConfigController.java deleted
| 1 | -package cn.iocoder.yudao.module.trade.controller.app.delivery; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.module.trade.controller.app.delivery.vo.config.AppDeliveryConfigRespVO; | |
| 5 | -import io.swagger.v3.oas.annotations.Operation; | |
| 6 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 7 | -import org.springframework.validation.annotation.Validated; | |
| 8 | -import org.springframework.web.bind.annotation.GetMapping; | |
| 9 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 10 | -import org.springframework.web.bind.annotation.RestController; | |
| 11 | - | |
| 12 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 13 | - | |
| 14 | -@Tag(name = "用户 App - 配送配置") | |
| 15 | -@RestController | |
| 16 | -@RequestMapping("/trade/delivery/config") | |
| 17 | -@Validated | |
| 18 | -public class AppDeliverConfigController { | |
| 19 | - | |
| 20 | - // TODO @芋艿:这里后面干掉,合并到 AppTradeConfigController 中 | |
| 21 | - @GetMapping("/get") | |
| 22 | - @Operation(summary = "获得配送配置") | |
| 23 | - public CommonResult<AppDeliveryConfigRespVO> getDeliveryConfig() { | |
| 24 | - return success(new AppDeliveryConfigRespVO().setPickUpEnable(true).setTencentLbsKey("123456")); | |
| 25 | - } | |
| 26 | - | |
| 27 | -} |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
| ... | ... | @@ -80,6 +80,7 @@ public class AppTradeOrderController { |
| 80 | 80 | @GetMapping("/get-detail") |
| 81 | 81 | @Operation(summary = "获得交易订单") |
| 82 | 82 | @Parameter(name = "id", description = "交易订单编号") |
| 83 | + @PreAuthenticated | |
| 83 | 84 | public CommonResult<AppTradeOrderDetailRespVO> getOrder(@RequestParam("id") Long id) { |
| 84 | 85 | // 查询订单 |
| 85 | 86 | TradeOrderDO order = tradeOrderQueryService.getOrder(getLoginUserId(), id); |
| ... | ... | @@ -99,6 +100,7 @@ public class AppTradeOrderController { |
| 99 | 100 | @GetMapping("/get-express-track-list") |
| 100 | 101 | @Operation(summary = "获得交易订单的物流轨迹") |
| 101 | 102 | @Parameter(name = "id", description = "交易订单编号") |
| 103 | + @PreAuthenticated | |
| 102 | 104 | public CommonResult<List<AppOrderExpressTrackRespDTO>> getOrderExpressTrackList(@RequestParam("id") Long id) { |
| 103 | 105 | return success(TradeOrderConvert.INSTANCE.convertList02( |
| 104 | 106 | tradeOrderQueryService.getExpressTrackList(id, getLoginUserId()))); |
| ... | ... | @@ -106,6 +108,7 @@ public class AppTradeOrderController { |
| 106 | 108 | |
| 107 | 109 | @GetMapping("/page") |
| 108 | 110 | @Operation(summary = "获得交易订单分页") |
| 111 | + @PreAuthenticated | |
| 109 | 112 | public CommonResult<PageResult<AppTradeOrderPageItemRespVO>> getOrderPage(AppTradeOrderPageReqVO reqVO) { |
| 110 | 113 | // 查询订单 |
| 111 | 114 | PageResult<TradeOrderDO> pageResult = tradeOrderQueryService.getOrderPage(getLoginUserId(), reqVO); |
| ... | ... | @@ -118,6 +121,7 @@ public class AppTradeOrderController { |
| 118 | 121 | |
| 119 | 122 | @GetMapping("/get-count") |
| 120 | 123 | @Operation(summary = "获得交易订单数量") |
| 124 | + @PreAuthenticated | |
| 121 | 125 | public CommonResult<Map<String, Long>> getOrderCount() { |
| 122 | 126 | Map<String, Long> orderCount = Maps.newLinkedHashMapWithExpectedSize(5); |
| 123 | 127 | // 全部 |
| ... | ... | @@ -142,6 +146,7 @@ public class AppTradeOrderController { |
| 142 | 146 | @PutMapping("/receive") |
| 143 | 147 | @Operation(summary = "确认交易订单收货") |
| 144 | 148 | @Parameter(name = "id", description = "交易订单编号") |
| 149 | + @PreAuthenticated | |
| 145 | 150 | public CommonResult<Boolean> receiveOrder(@RequestParam("id") Long id) { |
| 146 | 151 | tradeOrderUpdateService.receiveOrderByMember(getLoginUserId(), id); |
| 147 | 152 | return success(true); |
| ... | ... | @@ -150,6 +155,7 @@ public class AppTradeOrderController { |
| 150 | 155 | @DeleteMapping("/cancel") |
| 151 | 156 | @Operation(summary = "取消交易订单") |
| 152 | 157 | @Parameter(name = "id", description = "交易订单编号") |
| 158 | + @PreAuthenticated | |
| 153 | 159 | public CommonResult<Boolean> cancelOrder(@RequestParam("id") Long id) { |
| 154 | 160 | tradeOrderUpdateService.cancelOrderByMember(getLoginUserId(), id); |
| 155 | 161 | return success(true); |
| ... | ... | @@ -158,6 +164,7 @@ public class AppTradeOrderController { |
| 158 | 164 | @DeleteMapping("/delete") |
| 159 | 165 | @Operation(summary = "删除交易订单") |
| 160 | 166 | @Parameter(name = "id", description = "交易订单编号") |
| 167 | + @PreAuthenticated | |
| 161 | 168 | public CommonResult<Boolean> deleteOrder(@RequestParam("id") Long id) { |
| 162 | 169 | tradeOrderUpdateService.deleteOrder(getLoginUserId(), id); |
| 163 | 170 | return success(true); |
| ... | ... | @@ -168,6 +175,7 @@ public class AppTradeOrderController { |
| 168 | 175 | @GetMapping("/item/get") |
| 169 | 176 | @Operation(summary = "获得交易订单项") |
| 170 | 177 | @Parameter(name = "id", description = "交易订单项编号") |
| 178 | + @PreAuthenticated | |
| 171 | 179 | public CommonResult<AppTradeOrderItemRespVO> getOrderItem(@RequestParam("id") Long id) { |
| 172 | 180 | TradeOrderItemDO item = tradeOrderQueryService.getOrderItem(getLoginUserId(), id); |
| 173 | 181 | return success(TradeOrderConvert.INSTANCE.convert03(item)); |
| ... | ... | @@ -175,6 +183,7 @@ public class AppTradeOrderController { |
| 175 | 183 | |
| 176 | 184 | @PostMapping("/item/create-comment") |
| 177 | 185 | @Operation(summary = "创建交易订单项的评价") |
| 186 | + @PreAuthenticated | |
| 178 | 187 | public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) { |
| 179 | 188 | return success(tradeOrderUpdateService.createOrderItemCommentByMember(getLoginUserId(), createReqVO)); |
| 180 | 189 | } | ... | ... |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java
| ... | ... | @@ -13,12 +13,11 @@ public interface DictTypeConstants { |
| 13 | 13 | // ========== SYSTEM 模块 ========== |
| 14 | 14 | |
| 15 | 15 | String USER_SEX = "system_user_sex"; // 用户性别 |
| 16 | + String DATA_SCOPE = "system_data_scope"; // 数据范围 | |
| 16 | 17 | |
| 17 | 18 | String LOGIN_TYPE = "system_login_type"; // 登录日志的类型 |
| 18 | 19 | String LOGIN_RESULT = "system_login_result"; // 登录结果 |
| 19 | 20 | |
| 20 | - String ERROR_CODE_TYPE = "system_error_code_type"; // 错误码的类型枚举 | |
| 21 | - | |
| 22 | 21 | String SMS_CHANNEL_CODE = "system_sms_channel_code"; // 短信渠道编码 |
| 23 | 22 | String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型 |
| 24 | 23 | String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 | ... | ... |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
| ... | ... | @@ -27,10 +27,10 @@ public interface ErrorCodeConstants { |
| 27 | 27 | // ========== 角色模块 1-002-002-000 ========== |
| 28 | 28 | ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1_002_002_000, "角色不存在"); |
| 29 | 29 | ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1_002_002_001, "已经存在名为【{}】的角色"); |
| 30 | - ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1_002_002_002, "已经存在编码为【{}】的角色"); | |
| 30 | + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1_002_002_002, "已经存在标识为【{}】的角色"); | |
| 31 | 31 | ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1_002_002_003, "不能操作类型为系统内置的角色"); |
| 32 | 32 | ErrorCode ROLE_IS_DISABLE = new ErrorCode(1_002_002_004, "名字为【{}】的角色已被禁用"); |
| 33 | - ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "编码【{}】不能使用"); | |
| 33 | + ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "标识【{}】不能使用"); | |
| 34 | 34 | |
| 35 | 35 | // ========== 用户模块 1-002-003-000 ========== |
| 36 | 36 | ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在"); | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java
| ... | ... | @@ -6,9 +6,9 @@ import cn.iocoder.yudao.module.system.enums.DictTypeConstants; |
| 6 | 6 | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; |
| 7 | 7 | import com.alibaba.excel.annotation.ExcelProperty; |
| 8 | 8 | import io.swagger.v3.oas.annotations.media.Schema; |
| 9 | +import jakarta.validation.constraints.NotBlank; | |
| 9 | 10 | import lombok.Data; |
| 10 | 11 | |
| 11 | -import jakarta.validation.constraints.NotBlank; | |
| 12 | 12 | import java.time.LocalDateTime; |
| 13 | 13 | import java.util.Set; |
| 14 | 14 | |
| ... | ... | @@ -46,7 +46,8 @@ public class RoleRespVO { |
| 46 | 46 | private String remark; |
| 47 | 47 | |
| 48 | 48 | @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 49 | - @ExcelProperty("数据范围") | |
| 49 | + @ExcelProperty(value = "数据范围", converter = DictConvert.class) | |
| 50 | + @DictFormat(DictTypeConstants.DATA_SCOPE) | |
| 50 | 51 | private Integer dataScope; |
| 51 | 52 | |
| 52 | 53 | @Schema(description = "数据范围(指定部门数组)", example = "1") | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleSaveReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 3 | 5 | import com.mzt.logapi.starter.annotation.DiffLogField; |
| 4 | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import lombok.Data; | |
| 6 | - | |
| 7 | 7 | import jakarta.validation.constraints.NotBlank; |
| 8 | 8 | import jakarta.validation.constraints.NotNull; |
| 9 | 9 | import jakarta.validation.constraints.Size; |
| 10 | +import lombok.Data; | |
| 10 | 11 | |
| 11 | 12 | @Schema(description = "管理后台 - 角色创建/更新 Request VO") |
| 12 | 13 | @Data |
| ... | ... | @@ -23,7 +24,7 @@ public class RoleSaveReqVO { |
| 23 | 24 | |
| 24 | 25 | @NotBlank(message = "角色标志不能为空") |
| 25 | 26 | @Size(max = 100, message = "角色标志长度不能超过 100 个字符") |
| 26 | - @Schema(description = "角色编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADMIN") | |
| 27 | + @Schema(description = "角色标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADMIN") | |
| 27 | 28 | @DiffLogField(name = "角色标志") |
| 28 | 29 | private String code; |
| 29 | 30 | |
| ... | ... | @@ -32,7 +33,14 @@ public class RoleSaveReqVO { |
| 32 | 33 | @DiffLogField(name = "显示顺序") |
| 33 | 34 | private Integer sort; |
| 34 | 35 | |
| 36 | + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 37 | + @DiffLogField(name = "状态") | |
| 38 | + @NotNull(message = "状态不能为空") | |
| 39 | + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") | |
| 40 | + private Integer status; | |
| 41 | + | |
| 35 | 42 | @Schema(description = "备注", example = "我是一个角色") |
| 43 | + @Size(max = 500, message = "备注长度不能超过 500 个字符") | |
| 36 | 44 | @DiffLogField(name = "备注") |
| 37 | 45 | private String remark; |
| 38 | 46 | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.permission; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.collection.CollectionUtil; |
| 5 | +import cn.hutool.core.util.ObjUtil; | |
| 5 | 6 | import cn.hutool.core.util.ObjectUtil; |
| 6 | 7 | import cn.hutool.extra.spring.SpringUtil; |
| 7 | 8 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| ... | ... | @@ -61,7 +62,7 @@ public class RoleServiceImpl implements RoleService { |
| 61 | 62 | // 2. 插入到数据库 |
| 62 | 63 | RoleDO role = BeanUtils.toBean(createReqVO, RoleDO.class) |
| 63 | 64 | .setType(ObjectUtil.defaultIfNull(type, RoleTypeEnum.CUSTOM.getType())) |
| 64 | - .setStatus(CommonStatusEnum.ENABLE.getStatus()) | |
| 65 | + .setStatus(ObjUtil.defaultIfNull(createReqVO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) | |
| 65 | 66 | .setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 |
| 66 | 67 | roleMapper.insert(role); |
| 67 | 68 | ... | ... |
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImplTest.java
| ... | ... | @@ -51,7 +51,8 @@ public class RoleServiceImplTest extends BaseDbUnitTest { |
| 51 | 51 | public void testCreateRole() { |
| 52 | 52 | // 准备参数 |
| 53 | 53 | RoleSaveReqVO reqVO = randomPojo(RoleSaveReqVO.class) |
| 54 | - .setId(null); // 防止 id 被赋值 | |
| 54 | + .setId(null) // 防止 id 被赋值 | |
| 55 | + .setStatus(randomCommonStatus()); | |
| 55 | 56 | |
| 56 | 57 | // 调用 |
| 57 | 58 | Long roleId = roleService.createRole(reqVO, null); |
| ... | ... | @@ -59,7 +60,6 @@ public class RoleServiceImplTest extends BaseDbUnitTest { |
| 59 | 60 | RoleDO roleDO = roleMapper.selectById(roleId); |
| 60 | 61 | assertPojoEquals(reqVO, roleDO, "id"); |
| 61 | 62 | assertEquals(RoleTypeEnum.CUSTOM.getType(), roleDO.getType()); |
| 62 | - assertEquals(CommonStatusEnum.ENABLE.getStatus(), roleDO.getStatus()); | |
| 63 | 63 | assertEquals(DataScopeEnum.ALL.getScope(), roleDO.getDataScope()); |
| 64 | 64 | } |
| 65 | 65 | |
| ... | ... | @@ -70,7 +70,8 @@ public class RoleServiceImplTest extends BaseDbUnitTest { |
| 70 | 70 | roleMapper.insert(roleDO); |
| 71 | 71 | // 准备参数 |
| 72 | 72 | Long id = roleDO.getId(); |
| 73 | - RoleSaveReqVO reqVO = randomPojo(RoleSaveReqVO.class, o -> o.setId(id)); | |
| 73 | + RoleSaveReqVO reqVO = randomPojo(RoleSaveReqVO.class, o -> o.setId(id) | |
| 74 | + .setStatus(randomCommonStatus())); | |
| 74 | 75 | |
| 75 | 76 | // 调用 |
| 76 | 77 | roleService.updateRole(reqVO); | ... | ... |
yudao-server/src/main/resources/application.yaml
| ... | ... | @@ -151,6 +151,12 @@ spring: |
| 151 | 151 | redis: |
| 152 | 152 | index: default-index |
| 153 | 153 | prefix: "default:" |
| 154 | + embedding: | |
| 155 | + transformer: | |
| 156 | + onnx: | |
| 157 | + model-uri: http://test.yudao.iocoder.cn/model.onnx | |
| 158 | + tokenizer: | |
| 159 | + uri: http://test.yudao.iocoder.cn/tokenizer.json | |
| 154 | 160 | qianfan: # 文心一言 |
| 155 | 161 | api-key: x0cuLZ7XsaTCU08vuJWO87Lg |
| 156 | 162 | secret-key: R9mYF9dl9KASgi5RUq0FQt3wRisSnOcK | ... | ... |