Compare commits

..

10 Commits

Author SHA1 Message Date
990910d2c6 修正成就查询 2025-11-28 18:55:31 +08:00
fc960265f4 修复计划任务绑定人员。视图权限 2025-11-28 18:43:27 +08:00
ba0aabdac3 修复查询出未发布的任务 2025-11-28 18:17:30 +08:00
8a8059d05b 修复top的定时任务 2025-11-28 17:59:29 +08:00
dfb11c85f1 前端和json优化 2025-11-28 17:16:17 +08:00
34e69c7f62 文档更新 2025-11-28 15:49:32 +08:00
39120483fa 工作流更新 2025-11-28 15:42:10 +08:00
0483e1f514 系统提示词同步 2025-11-28 15:40:09 +08:00
66da76bbcc Merge branch 'master' of ssh://49.234.3.145:222/wangys/schoolNews 2025-11-28 15:20:34 +08:00
96e9419496 修改 2025-11-28 15:16:47 +08:00
151 changed files with 1390 additions and 797 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -107,15 +107,7 @@ APIKEY授权
保存好知识库的apikey通常以dataset开头。所有知识库共用。
### 4.修改动态知识库检索工作流
![alt text](部署.assets/image-7.png)
修改点有2个
1. 修改http节点post请求的url内容。替换成实际的 ip:8000
2. 修改Authorization的值替换为 Bearer + 空格 + 知识库的apikey
![alt text](部署.assets/image-8.png)
### 4.动态知识库检索工作流
#### 测试
如图即正常
![alt text](部署.assets/image-9.png)
@@ -131,13 +123,14 @@ APIKEY授权
![alt text](部署.assets/image-13.png)
#### 修改节点输入、输出相关节点的引用
修改的输入参数有2第1个是对话变量的datasets。表示该词对话中使用了那些知识库。
第2个是对话变量的query。表示用户输入的对话内容。
![alt text](部署.assets/image-14.png)
修改的输入参数有3第1个是对话变量的datasets。表示该词对话中使用了那些知识库。
第2个是工作流输入的query。表示用户输入的对话内容。
第3个是对话变量的dataset_apikey。表示知识库的apikey
![alt text](部署.assets/image-24.png)
![alt text](部署.assets/image-15.png)
![alt text](部署.assets/image-16.png)
![alt text](部署.assets/image-27.png)
![alt text](部署.assets/image-26.png)
![alt text](部署.assets/image-25.png)
#### 修改知识库处理节点的引用
直接引用“动态知识库检索”的输出内容text即可

View File

@@ -400,6 +400,8 @@ class RmrbCrawler(BaseCrawler):
src = str(src) # 转换为字符串
if not src.startswith("http"):
src = self.config.base_url + src
if src=="http://www.people.com.cn/img/2020wbc/imgs/share.png": #分享图片跳过
continue
content = f"<img style='{p_style}' src='{src}' />"
elif p.find('video'):

View File

@@ -7,7 +7,7 @@ app:
use_icon_as_answer_icon: false
dependencies: []
kind: app
version: 0.4.0
version: 0.5.0
workflow:
conversation_variables: []
environment_variables: []
@@ -136,7 +136,16 @@ workflow:
required: true
type: text-input
variable: query
height: 114
- default: ''
hint: ''
label: dataset_apikey
max_length: 100
options: []
placeholder: ''
required: true
type: text-input
variable: dataset_apikey
height: 161
id: '1747125462435'
position:
x: 80
@@ -250,7 +259,7 @@ workflow:
}'
type: json
desc: ''
headers: 'Authorization:Bearer dataset-DCyO89dHNWmsXMzJaWCCQOKo
headers: 'Authorization:Bearer {{#1747125462435.dataset_apikey#}}
Content-Type:application/json'
isInIteration: true
@@ -260,7 +269,7 @@ workflow:
params: ''
retry_config:
max_retries: 3
retry_enabled: true
retry_enabled: false
retry_interval: 100
selected: false
ssl_verify: true
@@ -272,7 +281,7 @@ workflow:
type: http-request
url: http://nginx:80/v1/datasets/{{#1747125586388.item#}}/retrieve
variables: []
height: 157
height: 111
id: '1747125795256'
parentId: '1747125586388'
position:
@@ -351,7 +360,7 @@ workflow:
type: custom
width: 242
viewport:
x: 116.27083894320822
y: 126.27330841264018
x: -967.224047730792
y: 147.70051636546336
zoom: 0.8705505632961247
rag_pipeline_variables: []

View File

@@ -9,17 +9,25 @@ dependencies:
- current_identifier: null
type: marketplace
value:
marketplace_plugin_unique_identifier: langgenius/siliconflow:0.0.34@1c203017d8ef49fd9152696a42e6dc71ecf272b115d8caf731c99ee0d2956dce
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
version: null
- current_identifier: null
type: marketplace
value:
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
marketplace_plugin_unique_identifier: langgenius/ollama:0.1.0@7c18c74b94a855de83aa66f376939d47b96a49b6dbb6904b46b267cb0213396e
version: null
kind: app
version: 0.4.0
version: 0.5.0
workflow:
conversation_variables:
- description: ''
id: 71e3f805-8445-46b1-bd43-8af398234527
name: dataset_apikey
selector:
- conversation
- dataset_apikey
value: ''
value_type: string
- description: ''
id: e18aacca-16a2-4d93-80c4-5a85ead53ae4
name: datasets
@@ -225,19 +233,6 @@ workflow:
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: start
targetType: if-else
id: 1762339910800-source-1762421892949-target
selected: false
source: '1762339910800'
sourceHandle: source
target: '1762421892949'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
@@ -257,6 +252,7 @@ workflow:
sourceType: code
targetType: iteration
id: 1762510470105-source-1762339969303-target
selected: false
source: '1762510470105'
sourceHandle: source
target: '1762339969303'
@@ -268,21 +264,11 @@ workflow:
isInLoop: false
sourceType: if-else
targetType: tool
id: 1762421892949-true-1762511001734-target
id: 1762421892949-true-1764314675268-target
selected: false
source: '1762421892949'
sourceHandle: 'true'
target: '1762511001734'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: assigner
targetType: tool
id: 1762509024795-source-1762511001734-target
source: '1762509024795'
sourceHandle: source
target: '1762511001734'
target: '1764314675268'
targetHandle: target
type: custom
zIndex: 0
@@ -290,13 +276,76 @@ workflow:
isInLoop: false
sourceType: tool
targetType: code
id: 1762511001734-source-1762510470105-target
source: '1762511001734'
id: 1764314675268-source-1762510470105-target
selected: false
source: '1764314675268'
sourceHandle: source
target: '1762510470105'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: assigner
targetType: tool
id: 1762509024795-source-1764314675268-target
selected: false
source: '1762509024795'
sourceHandle: source
target: '1764314675268'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: start
targetType: if-else
id: 1762339910800-source-1764314703864-target
selected: false
source: '1762339910800'
sourceHandle: source
target: '1764314703864'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: if-else
targetType: assigner
id: 1764314703864-false-1764314714879-target
selected: false
source: '1764314703864'
sourceHandle: 'false'
target: '1764314714879'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: assigner
targetType: if-else
id: 1764314714879-source-1762421892949-target
selected: false
source: '1764314714879'
sourceHandle: source
target: '1762421892949'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: if-else
targetType: if-else
id: 1764314703864-true-1762421892949-target
selected: false
source: '1764314703864'
sourceHandle: 'true'
target: '1762421892949'
targetHandle: target
type: custom
zIndex: 0
nodes:
- data:
selected: false
@@ -321,14 +370,32 @@ workflow:
required: true
type: text-input
variable: datasets
height: 114
- default: ''
hint: ''
label: dataset_apikey
max_length: 100
options: []
placeholder: ''
required: true
type: text-input
variable: dataset_apikey
- default: ''
hint: ''
label: promt
max_length: 2000
options: []
placeholder: ''
required: true
type: paragraph
variable: promt
height: 187
id: '1762339910800'
position:
x: -1233.1402302396395
y: 149.5782401176896
x: -1704.106555788423
y: 174.193204867626
positionAbsolute:
x: -1233.1402302396395
y: 149.5782401176896
x: -1704.106555788423
y: 174.193204867626
selected: false
sourcePosition: right
targetPosition: left
@@ -354,8 +421,8 @@ workflow:
model:
completion_params: {}
mode: chat
name: deepseek-ai/DeepSeek-V3
provider: langgenius/siliconflow/siliconflow
name: qwen-14b
provider: langgenius/ollama/ollama
prompt_config:
jinja2_variables:
- value_selector:
@@ -370,10 +437,14 @@ workflow:
- '1762510470105'
- result
variable: result
- value_selector:
- '1762339910800'
- promt
variable: promt
prompt_template:
- edition_type: jinja2
id: 5d50499d-b81d-43aa-a891-38fd349bd754
jinja2_text: "你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。请基于提供的知识库内容{{ result }},为用户提供准确、简洁的回答。\r\
jinja2_text: "{{ promt }}\r\n\r\n请基于提供的知识库内容{{ result }},为用户提供准确、简洁的回答。\r\
\n\r\n{% if searchData %}\r\n结合 {{ searchData }} 回答用户\r\n{% endif %}\r\
\n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n"
role: system
@@ -394,7 +465,7 @@ workflow:
- id: 23264213-e421-4449-b666-a55a0e39e561
role: user
text: ''
selected: false
selected: true
title: LLM
type: llm
vision:
@@ -407,7 +478,7 @@ workflow:
positionAbsolute:
x: 2674.6343495125943
y: 75.75635633814841
selected: false
selected: true
sourcePosition: right
targetPosition: left
type: custom
@@ -496,7 +567,7 @@ workflow:
variable_selector:
- '1762339969303'
- item
height: 92
height: 104
id: '1762339981310'
parentId: '1762339969303'
position:
@@ -958,7 +1029,7 @@ workflow:
type: code
variables:
- value_selector:
- '1762511001734'
- '1764314675268'
- text
value_type: string
variable: text
@@ -1034,10 +1105,44 @@ workflow:
scope: null
template: null
type: string
- auto_generate: null
default: ''
form: llm
human_description:
en_US: ''
ja_JP: ''
pt_BR: ''
zh_Hans: ''
label:
en_US: dataset_apikey
ja_JP: dataset_apikey
pt_BR: dataset_apikey
zh_Hans: dataset_apikey
llm_description: ''
max: null
min: null
name: dataset_apikey
options: []
placeholder:
en_US: ''
ja_JP: ''
pt_BR: ''
zh_Hans: ''
precision: null
required: true
scope: null
template: null
type: string
params:
dataset_apikey: ''
dataset_ids: ''
query: ''
provider_id: 019a5dd7-5f2b-7767-b2df-82bfda84c7ec
plugin_id: null
plugin_unique_identifier: null
provider_icon:
background: '#FFEAD5'
content: 🤖
provider_id: e7e4453f-0667-47fe-be4c-62accfbc7cc6
provider_name: 动态知识库检索
provider_type: workflow
selected: false
@@ -1048,6 +1153,9 @@ workflow:
tool_name: dynamic_dataset
tool_node_version: '2'
tool_parameters:
dataset_apikey:
type: mixed
value: '{{#conversation.dataset_apikey#}}'
dataset_ids:
type: mixed
value: '{{#conversation.datasets#}}'
@@ -1056,20 +1164,77 @@ workflow:
value: '{{#sys.query#}}'
type: tool
height: 52
id: '1762511001734'
id: '1764314675268'
position:
x: -142.91348174874167
y: -247.51043561574136
x: -165.1249185156642
y: -247.5444668446392
positionAbsolute:
x: -142.91348174874167
y: -247.51043561574136
selected: true
x: -165.1249185156642
y: -247.5444668446392
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 242
- data:
cases:
- case_id: 'true'
conditions:
- comparison_operator: not empty
id: 3123b598-113d-453f-b3fc-d04b6e83a35e
value: ''
varType: string
variable_selector:
- conversation
- dataset_apikey
id: 'true'
logical_operator: and
selected: false
title: 条件分支 3
type: if-else
height: 124
id: '1764314703864'
position:
x: -1295.7675522246373
y: -98.76989654474232
positionAbsolute:
x: -1295.7675522246373
y: -98.76989654474232
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 242
- data:
items:
- input_type: variable
operation: over-write
value:
- '1762339910800'
- dataset_apikey
variable_selector:
- conversation
- dataset_apikey
write_mode: over-write
selected: false
title: 变量赋值 2
type: assigner
version: '2'
height: 84
id: '1764314714879'
position:
x: -988.84455927465
y: -5.23303049498395
positionAbsolute:
x: -988.84455927465
y: -5.23303049498395
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 242
viewport:
x: 863.6452676587132
y: 446.19950772630614
zoom: 0.9236555375410279
x: -1068.6187404167313
y: 347.5222255720734
zoom: 0.6093853943072881
rag_pipeline_variables: []

View File

@@ -226,15 +226,10 @@ CREATE TABLE `tb_ai_usage_statistics` (
INSERT INTO `tb_ai_agent_config`
(`id`, `name`, `avatar`, `description`, `connect_internet`,`dify_api_key`, `status`, `creator`, `create_time`)
VALUES
('agent_default_001', '校园助手', NULL, '我是您的智能校园助手,可以帮助您解答校园相关问题',
('agent_default_001', '校园助手', NULL, '你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。',
0, 'app-fwOqGFLTsZtekCQYlOmj9f8x', 1, '1', NOW());
-- 插入示例知识库(需要配合权限表使用)
INSERT INTO `tb_ai_knowledge`
(`id`, `title`, `description`, `category`, `status`, `creator`, `creator_dept`, `create_time`)
VALUES
('knowledge_demo_001', '校园规章制度', '学校各项规章制度汇总', '规章制度', 1, '1', 'root_department', NOW()),
('knowledge_demo_002', '新生入学指南', '新生入学相关事项说明', '入学指导', 1, '1', 'root_department', NOW());
-- 为示例知识库创建权限(公开可读)
-- 注意:实际使用时应该在应用层通过权限服务自动创建

View File

@@ -5,7 +5,7 @@
-- 等级成就
-- V1段初学者 (0-10小时每2小时一级)
INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`,`icon`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
('ACH001', 'learning_time_l1_1', '初学者 I', 'v1-icon.svg', '开始学习之旅', 2, 1.1, 1, 0, 5, 1, 0),
('ACH001', 'learning_time_l1_1', '初学者 I', 'v1-icon.svg', '开始学习之旅', 2, 1.1, 1, 60*60, 5, 1, 0),
('ACH002', 'learning_time_l1_2', '初学者 II', 'v1-icon.svg', '累计学习时长达到2小时', 2, 1.2, 1, 2*60*60, 10, 2, 0),
('ACH003', 'learning_time_l1_3', '初学者 III', 'v1-icon.svg', '累计学习时长达到4小时', 2, 1.3, 1, 4*60*60, 15, 3, 0),
('ACH004', 'learning_time_l1_4', '初学者 IV', 'v1-icon.svg', '累计学习时长达到6小时', 2, 1.4, 1, 6*60*60, 20, 4, 0),

View File

@@ -31,7 +31,7 @@ INSERT INTO `tb_sys_config` (`id`, `config_key`, `config_name`, `config_value`,
('46', 'email.timeout', '连接超时时间', '30000', 'integer', 'input', '邮件配置', '连接超时时间(毫秒)', '请输入超时时间', 'SMTP连接超时时间', NULL, 5000, 60000, '毫秒', NULL, 46, 1, '1', now()),
-- 短信配置
('50', 'sms.provider', '短信服务商', 'aliyun', 'string', 'select', '短信配置', '短信服务提供商', NULL, '短信服务提供商类型', NULL, NULL, NULL, NULL, 'aliyun,tencent', 50, 1, '1', now()),
('50', 'sms.provider', '短信服务商', 'aliyun', 'string', 'select', '短信配置', '短信服务提供商', NULL, '短信服务提供商类型', NULL, NULL, NULL, NULL, 'aliyun', 50, 1, '1', now()),
('51', 'sms.accessKeyId', 'AccessKey ID', 'LTAI5t68do3qVXx5Rufugt3X', 'string', 'input', '短信配置', '短信服务AccessKey ID', '请输入AccessKey ID', '云服务商的AccessKey ID', NULL, NULL, NULL, NULL, NULL, 51, 1, '1', now()),
('52', 'sms.accessKeySecret', 'AccessKey Secret', '2vD9ToIff49Vph4JQXsn0Cy8nXQfzA', 'string', 'password', '短信配置', '短信服务AccessKey Secret', '请输入AccessKey Secret', '云服务商的AccessKey Secret', NULL, NULL, NULL, NULL, NULL, 52, 1, '1', now()),
('53', 'sms.signName', '短信签名', '星洋智慧', 'string', 'input', '短信配置', '短信签名', '请输入短信签名', '发送短信使用的签名', NULL, NULL, NULL, NULL, NULL, 53, 1, '1', now()),

View File

@@ -45,75 +45,246 @@ INSERT INTO `tb_sys_module` (id, module_id, name, code, description, icon, order
('9', 'module_sensitive', '敏感词管理', 'sensitive', '敏感词管理模块', 'el-icon-warning', 9, 1, '1', now());
-- 插入权限数据
INSERT INTO `tb_sys_permission` (id,permission_id, name, code, description, module_id, creator, create_time) VALUES
('0','perm_default', '默认权限', 'default', '默认权限', 'module_system', '1', now()),
('1','perm_system_manage', '系统管理', 'system:manage', '系统管理权限', 'module_system', '1', now()),
('2','perm_system_dept_manage', '系统部门查看', 'system:dept:manage', '系统部门查看权限', 'module_system', '1', now()),
('3','perm_system_menu_manage', '系统菜单查看', 'system:menu:manage', '系统菜单查看权限', 'module_system', '1', now()),
('4','perm_system_permission_manage', '系统权限查看', 'system:permission:manage', '系统权限查看权限', 'module_system', '1', now()),
('5','perm_system_role_manage', '系统角色查看', 'system:role:manage', '系统角色查看权限', 'module_system', '1', now()),
('6','perm_system_user_manage', '系统用户查看', 'system:user:manage', '系统用户查看权限', 'module_system', '1', now()),
('7','perm_system_module_manage', '系统模块查看', 'system:module:manage', '系统模块查看权限', 'module_system', '1', now()),
('8','perm_news_manage', '新闻管理', 'news:manage', '新闻管理权限', 'module_news', '1', now()),
('9','perm_news_article_add', '文章添加', 'news:manage', '文章添加权限', 'module_news', '1', now()),
('10','perm_study_manage', '学习管理', 'study:manage', '学习管理权限', 'module_study', '1', now()),
('10.1','perm_achievement_manage', '成就管理', 'achievement:manage', '成就管理权限', 'module_study', '1', now()),
('11','perm_ai_manage', 'AI管理', 'ai:manage', 'AI管理权限', 'module_ai', '1', now()),
('12','perm_usercenter_manage', '用户中心管理', 'usercenter:manage', '用户中心管理权限', 'module_usercenter', '1', now()),
('13','perm_file_manage', '件管理', 'file:manage', '文件管理权限', 'module_file', '1', now()),
('14','perm_crontab_manage', '定时任务管理', 'crontab:manage', '定时任务管理权限', 'module_crontab', '1', now()),
('15','perm_crontab_execute', '定时任务执行', 'crontab:execute', '定时任务执行权限', 'module_crontab', '1', now()),
('16','perm_message_manage', '消息管理', 'message:manage', '消息管理权限(管理端)', 'module_message', '1', now()),
('17','perm_message_send', '消息发送', 'message:send', '消息发送权限', 'module_message', '1', now()),
('18','perm_message_view', '消息查看', 'message:view', '消息查看权限(用户端)', 'module_message', '1', now()),
('19','perm_sensitive_manage', '敏感词管理', 'sensitive:manage', '敏感词管理权限', 'module_sensitive', '1', now());
-- ============================================
-- 权限ID分配规则每个模块预留100个ID
-- 9000-9999: 前端用户权限(默认权限)
-- 100-999: 超级管理员专属权限
-- 1000-8999: 普通管理员权限
-- ============================================
INSERT INTO `tb_sys_permission` (id, permission_id, name, code, description, module_id, creator, create_time) VALUES
-- ========== 前端用户权限 (9000-9999) ==========
-- 9000-9099: 默认权限和基础视图
('9000', 'perm_default', '默认权限', 'default', '所有登录用户的默认权限', 'module_system', '1', now()),
('9001', 'perm_view_home', '首页访问', 'view:home', '访问首页视图权限', 'module_usercenter', '1', now()),
('9002', 'perm_view_resource_hot', '热门资源访问', 'view:resource:hot', '访问热门资源视图权限', 'module_news', '1', now()),
('9003', 'perm_view_resource_center', '资源中心访问', 'view:resource:center', '访问资源中心视图权限', 'module_news', '1', now()),
('9004', 'perm_view_search', '搜索访问', 'view:search', '访问搜索视图权限', 'module_news', '1', now()),
('9005', 'perm_view_article_show', '章展示访问', 'view:article:show', '访问文章展示视图权限', 'module_news', '1', now()),
-- 9100-9199: 学习计划相关
('9100', 'perm_view_study_tasks', '学习任务访问', 'view:study:tasks', '访问学习任务视图权限', 'module_study', '1', now()),
('9101', 'perm_view_course_center', '课程中心访问', 'view:course:center', '访问课程中心视图权限', 'module_study', '1', now()),
('9102', 'perm_view_task_detail', '任务详情访问', 'view:task:detail', '访问任务详情视图权限', 'module_study', '1', now()),
('9103', 'perm_view_course_detail', '课程详情访问', 'view:course:detail', '访问课程详情视图权限', 'module_study', '1', now()),
('9104', 'perm_view_course_study', '课程学习访问', 'view:course:study', '访问课程学习视图权限', 'module_study', '1', now()),
-- 9200-9299: 用户中心相关
('9200', 'perm_view_learning_records', '学习记录访问', 'view:learning:records', '访问学习记录视图权限', 'module_usercenter', '1', now()),
('9201', 'perm_view_my_favorites', '我的收藏访问', 'view:my:favorites', '访问我的收藏视图权限', 'module_usercenter', '1', now()),
('9202', 'perm_view_my_achievements', '我的成就访问', 'view:my:achievements', '访问我的成就视图权限', 'module_usercenter', '1', now()),
('9203', 'perm_view_personal_info', '个人信息访问', 'view:personal:info', '访问个人信息视图权限', 'module_usercenter', '1', now()),
('9204', 'perm_view_account_settings', '账号设置访问', 'view:account:settings', '访问账号设置视图权限', 'module_usercenter', '1', now()),
-- 9300-9399: 文章和消息相关
('9300', 'perm_view_article_add', '文章添加访问', 'view:article:add', '访问文章添加视图权限', 'module_news', '1', now()),
('9301', 'perm_view_message_center', '消息中心访问', 'view:message:center', '访问消息中心视图权限', 'module_message', '1', now()),
('9302', 'perm_view_message_detail', '消息详情访问', 'view:message:detail', '访问消息详情视图权限', 'module_message', '1', now()),
-- ========== 超级管理员专属权限 (100-999) ==========
-- 100-199: 系统总览
('100', 'perm_admin_overview', '系统总览', 'admin:overview', '访问系统总览视图权限(超级管理员)', 'module_system', '1', now()),
-- 200-299: 用户管理
('200', 'perm_admin_user_manage', '用户管理', 'admin:user:manage', '访问用户管理视图权限(超级管理员)', 'module_system', '1', now()),
-- 300-399: 部门管理
('300', 'perm_admin_dept_manage', '部门管理', 'admin:dept:manage', '访问部门管理视图权限(超级管理员)', 'module_system', '1', now()),
-- 400-499: 角色管理
('400', 'perm_admin_role_manage', '角色管理', 'admin:role:manage', '访问角色管理视图权限(超级管理员)', 'module_system', '1', now()),
-- 500-599: 菜单管理
('500', 'perm_admin_menu_manage', '菜单管理', 'admin:menu:manage', '访问菜单管理视图权限(超级管理员)', 'module_system', '1', now()),
-- 600-699: 模块权限管理
('600', 'perm_admin_module_permission_manage', '模块权限管理', 'admin:module:permission:manage', '访问模块权限管理视图权限(超级管理员)', 'module_system', '1', now()),
-- 700-799: 系统日志
('700', 'perm_admin_system_logs', '系统日志', 'admin:logs:system', '访问系统日志视图权限(超级管理员)', 'module_system', '1', now()),
('701', 'perm_admin_login_logs', '登录日志', 'admin:logs:login', '访问登录日志视图权限(超级管理员)', 'module_system', '1', now()),
-- 800-899: 系统配置
('800', 'perm_admin_system_config', '系统配置', 'admin:system:config', '访问系统配置视图权限(超级管理员)', 'module_system', '1', now()),
-- ========== 普通管理员权限 (1000-8999) ==========
-- 1000-1099: 资源管理
('1000', 'perm_admin_resource_manage', '资源数据采集', 'admin:resource:manage', '访问资源数据采集视图权限', 'module_news', '1', now()),
-- 1100-1199: 文章管理
('1100', 'perm_admin_article_manage', '文章管理', 'admin:article:manage', '访问文章管理视图权限', 'module_news', '1', now()),
-- 1200-1299: Banner管理
('1200', 'perm_admin_banner_manage', 'Banner管理', 'admin:banner:manage', '访问Banner管理视图权限', 'module_news', '1', now()),
-- 1300-1399: 标签管理
('1300', 'perm_admin_tag_manage', '标签管理', 'admin:tag:manage', '访问标签管理视图权限', 'module_news', '1', now()),
-- 1400-1499: 栏目管理
('1400', 'perm_admin_column_manage', '栏目管理', 'admin:column:manage', '访问栏目管理视图权限', 'module_news', '1', now()),
-- 1500-1599: 敏感词管理
('1500', 'perm_admin_sensitive_manage', '敏感词管理', 'admin:sensitive:manage', '访问敏感词管理视图权限', 'module_sensitive', '1', now()),
-- 2000-2099: 任务管理
('2000', 'perm_admin_task_manage', '任务管理', 'admin:task:manage', '访问任务管理视图权限', 'module_study', '1', now()),
-- 2100-2199: 学习记录管理
('2100', 'perm_admin_study_records', '学习记录管理', 'admin:study:records', '访问学习记录管理视图权限', 'module_study', '1', now()),
-- 2200-2299: 课程管理
('2200', 'perm_admin_course_manage', '课程管理', 'admin:course:manage', '访问课程管理视图权限', 'module_study', '1', now()),
-- 2300-2399: 成就管理
('2300', 'perm_admin_achievement_manage', '成就管理', 'admin:achievement:manage', '访问成就管理视图权限', 'module_study', '1', now()),
-- 3000-3099: AI配置
('3000', 'perm_admin_ai_config', 'AI配置', 'admin:ai:config', '访问AI配置视图权限', 'module_ai', '1', now()),
-- 3100-3199: 知识库管理
('3100', 'perm_admin_knowledge_manage', '知识库管理', 'admin:knowledge:manage', '访问知识库管理视图权限', 'module_ai', '1', now()),
-- 5000-5099: 邮件配置
('5000', 'perm_admin_meta_email_default', '默认接收人配置', 'admin:meta:email:default', '访问默认接收人配置视图权限', 'module_crontab', '1', now()),
-- 5100-5199: 定时任务日志
('5100', 'perm_admin_crontab_log', '定时任务执行日志', 'admin:crontab:log', '访问定时任务执行日志视图权限', 'module_crontab', '1', now()),
-- 5200-5299: 新闻爬虫配置
('5200', 'perm_admin_news_crawler', '新闻爬虫配置', 'admin:news:crawler', '访问新闻爬虫配置视图权限', 'module_crontab', '1', now()),
-- 5300-5399: 系统定时任务
('5300', 'perm_admin_system_task', '系统定时任务配置', 'admin:system:task', '访问系统定时任务配置视图权限', 'module_crontab', '1', now()),
-- 6000-6099: 消息管理
('6000', 'perm_admin_message_manage', '消息管理', 'admin:message:manage', '访问消息管理视图权限', 'module_message', '1', now());
-- 插入角色-权限关联数据
-- 超级管理员:拥有所有权限
-- ============================================
-- 超级管理员:拥有所有权限(前端用户 + 超级管理员 + 普通管理员)
-- ============================================
INSERT INTO `tb_sys_role_permission` (id, role_id, permission_id, creator, create_time) VALUES
-- 前端用户权限 (9000-9999)
('1', 'superadmin', 'perm_default', '1', now()),
('2', 'superadmin', 'perm_system_manage', '1', now()),
('3', 'superadmin', 'perm_system_dept_manage', '1', now()),
('4', 'superadmin', 'perm_system_menu_manage', '1', now()),
('5', 'superadmin', 'perm_system_permission_manage', '1', now()),
('6', 'superadmin', 'perm_system_role_manage', '1', now()),
('7', 'superadmin', 'perm_system_user_manage', '1', now()),
('8', 'superadmin', 'perm_system_module_manage', '1', now()),
('9', 'superadmin', 'perm_news_manage', '1', now()),
('10', 'superadmin', 'perm_news_article_add', '1', now()),
('11', 'superadmin', 'perm_study_manage', '1', now()),
('12', 'superadmin', 'perm_achievement_manage', '1', now()),
('13', 'superadmin', 'perm_ai_manage', '1', now()),
('14', 'superadmin', 'perm_usercenter_manage', '1', now()),
('15', 'superadmin', 'perm_file_manage', '1', now()),
('16', 'superadmin', 'perm_crontab_manage', '1', now()),
('17', 'superadmin', 'perm_crontab_execute', '1', now()),
('18', 'superadmin', 'perm_message_manage', '1', now()),
('19', 'superadmin', 'perm_message_send', '1', now()),
('20', 'superadmin', 'perm_message_view', '1', now()),
('21', 'superadmin', 'perm_sensitive_manage', '1', now()),
('2', 'superadmin', 'perm_view_home', '1', now()),
('3', 'superadmin', 'perm_view_resource_hot', '1', now()),
('4', 'superadmin', 'perm_view_resource_center', '1', now()),
('5', 'superadmin', 'perm_view_search', '1', now()),
('6', 'superadmin', 'perm_view_article_show', '1', now()),
('7', 'superadmin', 'perm_view_study_tasks', '1', now()),
('8', 'superadmin', 'perm_view_course_center', '1', now()),
('9', 'superadmin', 'perm_view_task_detail', '1', now()),
('10', 'superadmin', 'perm_view_course_detail', '1', now()),
('11', 'superadmin', 'perm_view_course_study', '1', now()),
('12', 'superadmin', 'perm_view_learning_records', '1', now()),
('13', 'superadmin', 'perm_view_my_favorites', '1', now()),
('14', 'superadmin', 'perm_view_my_achievements', '1', now()),
('15', 'superadmin', 'perm_view_personal_info', '1', now()),
('16', 'superadmin', 'perm_view_account_settings', '1', now()),
('17', 'superadmin', 'perm_view_article_add', '1', now()),
('18', 'superadmin', 'perm_view_message_center', '1', now()),
('19', 'superadmin', 'perm_view_message_detail', '1', now()),
-- 管理员:拥有业务管理权限,但没有系统日志等系统管理权限
('22', 'admin', 'perm_default', '1', now()),
('23', 'admin', 'perm_news_manage', '1', now()),
('24', 'admin', 'perm_news_article_add', '1', now()),
('25', 'admin', 'perm_study_manage', '1', now()),
('26', 'admin', 'perm_achievement_manage', '1', now()),
('27', 'admin', 'perm_ai_manage', '1', now()),
('28', 'admin', 'perm_usercenter_manage', '1', now()),
('29', 'admin', 'perm_file_manage', '1', now()),
('30', 'admin', 'perm_message_manage', '1', now()),
('31', 'admin', 'perm_message_send', '1', now()),
('32', 'admin', 'perm_message_view', '1', now()),
('33', 'admin', 'perm_sensitive_manage', '1', now()),
-- 超级管理员专属权限 (100-999)
('20', 'superadmin', 'perm_admin_overview', '1', now()),
('21', 'superadmin', 'perm_admin_user_manage', '1', now()),
('22', 'superadmin', 'perm_admin_dept_manage', '1', now()),
('23', 'superadmin', 'perm_admin_role_manage', '1', now()),
('24', 'superadmin', 'perm_admin_menu_manage', '1', now()),
('25', 'superadmin', 'perm_admin_module_permission_manage', '1', now()),
('26', 'superadmin', 'perm_admin_system_logs', '1', now()),
('27', 'superadmin', 'perm_admin_login_logs', '1', now()),
('28', 'superadmin', 'perm_admin_system_config', '1', now()),
-- 自由角色:拥有用户视图相关的所有权限(前台用户权限)
('40', 'freedom', 'perm_default', '1', now()),
('41', 'freedom', 'perm_news_article_add', '1', now()),
('42', 'freedom', 'perm_ai_manage', '1', now()),
('43', 'freedom', 'perm_usercenter_manage', '1', now()),
('44', 'freedom', 'perm_file_manage', '1', now()),
('45', 'freedom', 'perm_message_view', '1', now());
-- 普通管理员权限 (1000-8999)
('29', 'superadmin', 'perm_admin_resource_manage', '1', now()),
('30', 'superadmin', 'perm_admin_article_manage', '1', now()),
('31', 'superadmin', 'perm_admin_banner_manage', '1', now()),
('32', 'superadmin', 'perm_admin_tag_manage', '1', now()),
('33', 'superadmin', 'perm_admin_column_manage', '1', now()),
('34', 'superadmin', 'perm_admin_sensitive_manage', '1', now()),
('35', 'superadmin', 'perm_admin_task_manage', '1', now()),
('36', 'superadmin', 'perm_admin_study_records', '1', now()),
('37', 'superadmin', 'perm_admin_course_manage', '1', now()),
('38', 'superadmin', 'perm_admin_achievement_manage', '1', now()),
('39', 'superadmin', 'perm_admin_ai_config', '1', now()),
('40', 'superadmin', 'perm_admin_knowledge_manage', '1', now()),
('41', 'superadmin', 'perm_admin_meta_email_default', '1', now()),
('42', 'superadmin', 'perm_admin_crontab_log', '1', now()),
('43', 'superadmin', 'perm_admin_news_crawler', '1', now()),
('44', 'superadmin', 'perm_admin_system_task', '1', now()),
('45', 'superadmin', 'perm_admin_message_manage', '1', now()),
-- ============================================
-- 管理员:拥有前端用户权限 + 普通管理员权限(没有超级管理员专属权限)
-- ============================================
-- 前端用户权限 (9000-9999)
('100', 'admin', 'perm_default', '1', now()),
('101', 'admin', 'perm_view_home', '1', now()),
('102', 'admin', 'perm_view_resource_hot', '1', now()),
('103', 'admin', 'perm_view_resource_center', '1', now()),
('104', 'admin', 'perm_view_search', '1', now()),
('105', 'admin', 'perm_view_article_show', '1', now()),
('106', 'admin', 'perm_view_study_tasks', '1', now()),
('107', 'admin', 'perm_view_course_center', '1', now()),
('108', 'admin', 'perm_view_task_detail', '1', now()),
('109', 'admin', 'perm_view_course_detail', '1', now()),
('110', 'admin', 'perm_view_course_study', '1', now()),
('111', 'admin', 'perm_view_learning_records', '1', now()),
('112', 'admin', 'perm_view_my_favorites', '1', now()),
('113', 'admin', 'perm_view_my_achievements', '1', now()),
('114', 'admin', 'perm_view_personal_info', '1', now()),
('115', 'admin', 'perm_view_account_settings', '1', now()),
('116', 'admin', 'perm_view_article_add', '1', now()),
('117', 'admin', 'perm_view_message_center', '1', now()),
('118', 'admin', 'perm_view_message_detail', '1', now()),
-- 超级管理员权限中普通管理员也需要的部分
('119', 'admin', 'perm_admin_user_manage', '1', now()),
('120', 'admin', 'perm_admin_dept_manage', '1', now()),
('121', 'admin', 'perm_admin_role_manage', '1', now()),
-- 普通管理员权限 (1000-8999)
('122', 'admin', 'perm_admin_resource_manage', '1', now()),
('123', 'admin', 'perm_admin_article_manage', '1', now()),
('124', 'admin', 'perm_admin_banner_manage', '1', now()),
('125', 'admin', 'perm_admin_tag_manage', '1', now()),
('126', 'admin', 'perm_admin_column_manage', '1', now()),
('127', 'admin', 'perm_admin_sensitive_manage', '1', now()),
('128', 'admin', 'perm_admin_task_manage', '1', now()),
('129', 'admin', 'perm_admin_study_records', '1', now()),
('130', 'admin', 'perm_admin_course_manage', '1', now()),
('131', 'admin', 'perm_admin_achievement_manage', '1', now()),
('132', 'admin', 'perm_admin_ai_config', '1', now()),
('133', 'admin', 'perm_admin_knowledge_manage', '1', now()),
('134', 'admin', 'perm_admin_meta_email_default', '1', now()),
('135', 'admin', 'perm_admin_crontab_log', '1', now()),
('136', 'admin', 'perm_admin_news_crawler', '1', now()),
('137', 'admin', 'perm_admin_system_task', '1', now()),
('138', 'admin', 'perm_admin_message_manage', '1', now()),
-- ============================================
-- 自由角色:仅拥有前端用户权限
-- ============================================
('200', 'freedom', 'perm_default', '1', now()),
('201', 'freedom', 'perm_view_home', '1', now()),
('202', 'freedom', 'perm_view_resource_hot', '1', now()),
('203', 'freedom', 'perm_view_resource_center', '1', now()),
('204', 'freedom', 'perm_view_search', '1', now()),
('205', 'freedom', 'perm_view_article_show', '1', now()),
('206', 'freedom', 'perm_view_study_tasks', '1', now()),
('207', 'freedom', 'perm_view_course_center', '1', now()),
('208', 'freedom', 'perm_view_task_detail', '1', now()),
('209', 'freedom', 'perm_view_course_detail', '1', now()),
('210', 'freedom', 'perm_view_course_study', '1', now()),
('211', 'freedom', 'perm_view_learning_records', '1', now()),
('212', 'freedom', 'perm_view_my_favorites', '1', now()),
('213', 'freedom', 'perm_view_my_achievements', '1', now()),
('214', 'freedom', 'perm_view_personal_info', '1', now()),
('215', 'freedom', 'perm_view_account_settings', '1', now()),
('216', 'freedom', 'perm_view_article_add', '1', now()),
('217', 'freedom', 'perm_view_message_center', '1', now()),
('218', 'freedom', 'perm_view_message_detail', '1', now());
-- 插入前端菜单数据
-- 用户前端菜单 (100-699)
@@ -147,8 +318,8 @@ INSERT INTO `tb_sys_menu` VALUES
('3000', 'menu_admin_resource_manage', '资源管理', NULL, '', '', 'admin/resource.svg', 3, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:40', NULL, 0),
('3001', 'menu_admin_resource', '数据采集', 'menu_admin_resource_manage', '/admin/manage/resource/resource', 'admin/manage/resource/ResourceManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3002', 'menu_admin_article', '文章管理', 'menu_admin_resource_manage', '/admin/manage/resource/article', 'admin/manage/resource/ArticleManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3010', 'menu_article_add', '文章添加', 'menu_admin_article', '/article/add', 'public/article/ArticleAddView', NULL, 1, 3, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3011', 'menu_article_show', '文章展示', 'menu_admin_article', '/article/show', 'public/article/ArticleShowView', NULL, 2, 3, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3010', 'menu_article_add', '文章添加', NULL, '/article/add', 'public/article/ArticleAddView', NULL, 1, 3, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3011', 'menu_article_show', '文章展示', NULL, '/article/show', 'public/article/ArticleShowView', NULL, 2, 3, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('4000', 'menu_admin_content_manage', '运营管理', NULL, '', '', 'admin/maintain.svg', 4, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:42', NULL, 0),
('4001', 'menu_admin_banner', 'Banner管理', 'menu_admin_content_manage', '/admin/manage/content/banner', 'admin/manage/content/BannerManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('4002', 'menu_admin_tag', '标签管理', 'menu_admin_content_manage', '/admin/manage/content/tag', 'admin/manage/content/TagManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
@@ -178,72 +349,97 @@ INSERT INTO `tb_sys_menu` VALUES
('651', 'menu_user_message_detail', '消息详情', 'menu_user_message_center', '/user/message/detail/:messageID', 'user/message/MyMessageDetailView', NULL, 1, 3, 'NavigationLayout', '1', NULL, '2025-11-13 10:00:00', '2025-11-13 10:00:00', NULL, 0);
-- 插入菜单权限关联数据
-- 前端菜单权限关联
-- ============================================
-- 说明每个有View的菜单对应一个权限
-- 无View的菜单如导航菜单关联默认权限
-- ============================================
INSERT INTO `tb_sys_menu_permission` (id, permission_id, menu_id, creator, create_time) VALUES
('100', 'perm_default', 'menu_home', '1', now()),
('102', 'perm_default', 'menu_resource_hot', '1', now()),
('101', 'perm_default', 'menu_resource_center', '1', now()),
('108', 'perm_default', 'menu_study_plan', '1', now()),
('109', 'perm_default', 'menu_study_tasks', '1', now()),
('110', 'perm_default', 'menu_course_center', '1', now()),
('111', 'perm_default', 'menu_user_center', '1', now()),
('112', 'perm_default', 'menu_learning_records', '1', now()),
('113', 'perm_default', 'menu_my_favorites', '1', now()),
('114', 'perm_default', 'menu_my_achievements', '1', now()),
('115', 'perm_default', 'menu_profile', '1', now()),
('116', 'perm_default', 'menu_personal_info', '1', now()),
('117', 'perm_default', 'menu_account_settings', '1', now()),
('119', 'perm_default', 'menu_user_dropdown', '1', now()),
('120', 'perm_news_article_add', 'menu_article_add', '1', now()),
('121', 'perm_default', 'menu_task_detail', '1', now()),
('122', 'perm_default', 'menu_course_detail', '1', now()),
('123', 'perm_default', 'menu_course_study', '1', now()),
('124', 'perm_default', 'menu_article_show', '1', now()),
('125', 'perm_default', 'menu_search', '1', now()),
-- 后端管理菜单权限关联
('200', 'perm_system_manage', 'menu_admin_overview', '1', now()),
('201', 'perm_system_manage', 'menu_sys_manage', '1', now()),
('203', 'perm_system_user_manage', 'menu_admin_user', '1', now()),
('204', 'perm_system_dept_manage', 'menu_admin_dept', '1', now()),
('205', 'perm_system_role_manage', 'menu_admin_role', '1', now()),
('207', 'perm_system_menu_manage', 'menu_admin_menu', '1', now()),
('208', 'perm_system_module_manage', 'menu_admin_module', '1', now()),
('208.1', 'perm_system_permission_manage', 'menu_admin_module', '1', now()),
('209', 'perm_news_manage', 'menu_admin_resource_manage', '1', now()),
('210', 'perm_news_manage', 'menu_admin_resource', '1', now()),
('211', 'perm_news_manage', 'menu_admin_article', '1', now()),
('212', 'perm_news_manage', 'menu_admin_data_records', '1', now()),
('213', 'perm_news_manage', 'menu_admin_content_manage', '1', now()),
('214', 'perm_news_manage', 'menu_admin_banner', '1', now()),
('215', 'perm_news_manage', 'menu_admin_tag', '1', now()),
('216', 'perm_news_manage', 'menu_admin_column', '1', now()),
('217', 'perm_sensitive_manage', 'menu_admin_sensitive', '1', now()),
('218', 'perm_study_manage', 'menu_admin_study_manage', '1', now()),
('220', 'perm_study_manage', 'menu_admin_task_manage', '1', now()),
('221', 'perm_study_manage', 'menu_admin_study_records', '1', now()),
('222', 'perm_study_manage', 'menu_admin_course_manage', '1', now()),
('222.1', 'perm_achievement_manage', 'menu_admin_achievement_manage', '1', now()),
('223', 'perm_ai_manage', 'menu_admin_ai_manage', '1', now()),
('224', 'perm_ai_manage', 'menu_admin_ai', '1', now()),
('225', 'perm_ai_manage', 'menu_admin_ai_config', '1', now()),
('226', 'perm_ai_manage', 'menu_admin_knowledge', '1', now()),
('227', 'perm_system_manage', 'menu_admin_logs_manage', '1', now()),
('228', 'perm_system_manage', 'menu_admin_system_logs', '1', now()),
('229', 'perm_system_manage', 'menu_admin_login_logs', '1', now()),
('231', 'perm_system_manage', 'menu_admin_system_config', '1', now()),
-- ========== 前端用户菜单权限关联 (9000-9999) ==========
-- 基础视图
('9001', 'perm_view_home', 'menu_home', '1', now()),
('9002', 'perm_view_resource_hot', 'menu_resource_hot', '1', now()),
('9003', 'perm_view_resource_center', 'menu_resource_center', '1', now()),
('9004', 'perm_view_search', 'menu_search', '1', now()),
('9005', 'perm_view_article_show', 'menu_article_show', '1', now()),
-- 定时任务管理菜单权限关联
('232', 'perm_crontab_manage', 'menu_admin_crontab_manage', '1', now()),
('236', 'perm_crontab_manage', 'menu_admin_meta_email_default', '1', now()),
('233', 'perm_crontab_manage', 'menu_admin_crontab_task', '1', now()),
('234', 'perm_crontab_manage', 'menu_admin_crontab_log', '1', now()),
('235', 'perm_crontab_manage', 'menu_admin_news_crawler', '1', now()),
('252', 'perm_crontab_manage', 'menu_admin_system_task', '1', now()),
-- 学习计划相关
('9006', 'perm_default', 'menu_study_plan', '1', now()), -- 无View的导航菜单
('9100', 'perm_view_study_tasks', 'menu_study_tasks', '1', now()),
('9101', 'perm_view_course_center', 'menu_course_center', '1', now()),
('9102', 'perm_view_task_detail', 'menu_task_detail', '1', now()),
('9103', 'perm_view_course_detail', 'menu_course_detail', '1', now()),
('9104', 'perm_view_course_study', 'menu_course_study', '1', now()),
-- 消息通知管理菜单权限关联
('240', 'perm_message_manage', 'menu_admin_message_manage', '1', now()),
-- 用户端消息中心权限关联
('250', 'perm_default', 'menu_user_message_center', '1', now()),
('251', 'perm_default', 'menu_user_message_detail', '1', now());
-- 用户中心相关
('9007', 'perm_default', 'menu_user_dropdown', '1', now()), -- 无View的导航菜单
('9008', 'perm_default', 'menu_user_center', '1', now()), -- Layout菜单
('9200', 'perm_view_learning_records', 'menu_learning_records', '1', now()),
('9201', 'perm_view_my_favorites', 'menu_my_favorites', '1', now()),
('9202', 'perm_view_my_achievements', 'menu_my_achievements', '1', now()),
-- 个人信息相关
('9009', 'perm_default', 'menu_profile', '1', now()), -- Layout菜单
('9203', 'perm_view_personal_info', 'menu_personal_info', '1', now()),
('9204', 'perm_view_account_settings', 'menu_account_settings', '1', now()),
-- 文章和消息
('9300', 'perm_view_article_add', 'menu_article_add', '1', now()),
('9301', 'perm_view_message_center', 'menu_user_message_center', '1', now()),
('9302', 'perm_view_message_detail', 'menu_user_message_detail', '1', now()),
-- ========== 超级管理员菜单权限关联 (100-999) ==========
-- 系统总览
('100', 'perm_admin_overview', 'menu_admin_overview', '1', now()),
-- 系统管理
('101', 'perm_default', 'menu_sys_manage', '1', now()), -- 无View的导航菜单
('200', 'perm_admin_user_manage', 'menu_admin_user', '1', now()),
('300', 'perm_admin_dept_manage', 'menu_admin_dept', '1', now()),
('400', 'perm_admin_role_manage', 'menu_admin_role', '1', now()),
('500', 'perm_admin_menu_manage', 'menu_admin_menu', '1', now()),
('600', 'perm_admin_module_permission_manage', 'menu_admin_module', '1', now()),
-- 系统日志
('102', 'perm_default', 'menu_admin_logs_manage', '1', now()), -- 无View的导航菜单
('700', 'perm_admin_system_logs', 'menu_admin_system_logs', '1', now()),
('701', 'perm_admin_login_logs', 'menu_admin_login_logs', '1', now()),
-- 系统配置
('800', 'perm_admin_system_config', 'menu_admin_system_config', '1', now()),
-- ========== 普通管理员菜单权限关联 (1000-8999) ==========
-- 资源管理
('103', 'perm_default', 'menu_admin_resource_manage', '1', now()), -- 无View的导航菜单
('1000', 'perm_admin_resource_manage', 'menu_admin_resource', '1', now()),
('1100', 'perm_admin_article_manage', 'menu_admin_article', '1', now()),
-- 运营管理
('104', 'perm_default', 'menu_admin_content_manage', '1', now()), -- 无View的导航菜单
('1200', 'perm_admin_banner_manage', 'menu_admin_banner', '1', now()),
('1300', 'perm_admin_tag_manage', 'menu_admin_tag', '1', now()),
('1400', 'perm_admin_column_manage', 'menu_admin_column', '1', now()),
('1500', 'perm_admin_sensitive_manage', 'menu_admin_sensitive', '1', now()),
-- 学习管理
('105', 'perm_default', 'menu_admin_study_manage', '1', now()), -- 无View的导航菜单
('2000', 'perm_admin_task_manage', 'menu_admin_task_manage', '1', now()),
('2100', 'perm_admin_study_records', 'menu_admin_study_records', '1', now()),
('2200', 'perm_admin_course_manage', 'menu_admin_course_manage', '1', now()),
('2300', 'perm_admin_achievement_manage', 'menu_admin_achievement_manage', '1', now()),
-- AI管理
('106', 'perm_default', 'menu_admin_ai_manage', '1', now()), -- 无View的导航菜单
('3000', 'perm_admin_ai_config', 'menu_admin_ai_config', '1', now()),
('3100', 'perm_admin_knowledge_manage', 'menu_admin_knowledge', '1', now()),
-- 定时任务管理
('107', 'perm_default', 'menu_admin_crontab_manage', '1', now()), -- 无View的导航菜单
('5000', 'perm_admin_meta_email_default', 'menu_admin_meta_email_default', '1', now()),
('5100', 'perm_admin_crontab_log', 'menu_admin_crontab_log', '1', now()),
('5200', 'perm_admin_news_crawler', 'menu_admin_news_crawler', '1', now()),
('5300', 'perm_admin_system_task', 'menu_admin_system_task', '1', now()),
-- 消息管理
('6000', 'perm_admin_message_manage', 'menu_admin_message_manage', '1', now());

View File

@@ -90,8 +90,8 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
// 设置默认值
if (achievement.getID() == null) {
achievement.setID(IDUtils.generateID());
if (achievement.getId() == null) {
achievement.setId(IDUtils.generateID());
}
if (achievement.getAchievementID() == null) {
achievement.setAchievementID(IDUtils.generateID());
@@ -285,7 +285,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
return rd;
}
String userID = user.getID();
String userID = user.getId();
// 仅查询等级类成就
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<AchievementVO> levels = achievementMapper.selectUserAchievementsWithProgress(
@@ -298,7 +298,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
Map<String, Object> payload = new HashMap<>();
payload.put("current", null);
payload.put("next", null);
rd.success("无等级成就", payload);
rd.success("无等级成就配置", payload);
return rd;
}
@@ -315,36 +315,35 @@ public class ACHAchievementServiceImpl implements AchievementService {
Comparator.nullsFirst(Comparator.naturalOrder())
);
// 当前:已获得的最高等级,否则取最低等级
// 当前:已获得的最高等级
List<AchievementVO> obtained = levels.stream()
.filter(a -> Boolean.TRUE.equals(a.getObtained()))
.sorted(byLevelAsc.reversed())
.collect(Collectors.toList());
AchievementVO current;
final float currentLevel; // 用户实际等级
if (!obtained.isEmpty()) {
// 已获得等级成就,取最高等级
current = obtained.get(0);
currentLevel = current.getLevel() != null ? current.getLevel() : 1.0f;
} else {
current = levels.stream()
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
// 没有获得任何等级成就,默认 Lv1.0
current = null;
currentLevel = 1.0f;
}
// 下一等级:比当前等级大的最小等级
AchievementVO next = null;
if (current != null && current.getLevel() != null) {
float curLevel = current.getLevel();
next = levels.stream()
.filter(a -> (a.getLevel() != null) && a.getLevel() > curLevel)
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
}
AchievementVO next = levels.stream()
.filter(a -> (a.getLevel() != null) && a.getLevel() > currentLevel)
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
Map<String, Object> payload = new HashMap<>();
payload.put("current", current);
payload.put("next", next);
payload.put("current", current); // 当前获得的最高等级成就null 表示默认 Lv1.0
payload.put("next", next); // 下一个等级成就
rd.success("获取等级状态成功", payload);
return rd;
} catch (Exception e) {
@@ -371,7 +370,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
for (AchievementVO vo : voList) {
if (Boolean.TRUE.equals(vo.getObtained())) {
TbUserAchievement ua = new TbUserAchievement();
ua.setID(vo.getUserAchievementID());
ua.setId(vo.getUserAchievementID());
ua.setUserID(userID);
ua.setAchievementID(vo.getAchievementID());
ua.setObtainTime(vo.getObtainTime());
@@ -396,7 +395,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
resultDomain.fail("请先登录");
return resultDomain;
}
return getUserAchievements(user.getID(), type);
return getUserAchievements(user.getId(), type);
}
@Override
@@ -410,7 +409,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
return resultDomain;
}
String userID = user.getID();
String userID = user.getId();
// 使用联表查询一次性获取所有数据(包含成就、用户成就、进度信息及权限过滤)
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
@@ -474,7 +473,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
// 创建用户成就记录
TbUserAchievement userAchievement = new TbUserAchievement();
userAchievement.setID(IDUtils.generateID());
userAchievement.setId(IDUtils.generateID());
userAchievement.setUserID(userID);
userAchievement.setAchievementID(achievementID);
userAchievement.setObtainTime(new Date());
@@ -559,7 +558,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
resultDomain.fail("请先登录");
return resultDomain;
}
return getUserAchievementProgress(user.getID(), achievementID);
return getUserAchievementProgress(user.getId(), achievementID);
}
@Override
@@ -812,7 +811,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
progress = new TbUserAchievementProgress();
progress.setID(IDUtils.generateID());
progress.setId(IDUtils.generateID());
progress.setUserID(userID);
progress.setAchievementID(achievementID);
progress.setCurrentValue(0);
@@ -845,7 +844,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
private TbUserAchievement grantAchievementInternal(String userID, TbAchievement achievement) {
try {
TbUserAchievement userAchievement = new TbUserAchievement();
userAchievement.setID(IDUtils.generateID());
userAchievement.setId(IDUtils.generateID());
userAchievement.setUserID(userID);
userAchievement.setAchievementID(achievement.getAchievementID());
userAchievement.setObtainTime(new Date());

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbAchievement">
<id column="id" property="ID" />
<id column="id" property="id" />
<result column="achievement_id" property="achievementID" />
<result column="name" property="name" />
<result column="description" property="description" />
@@ -34,8 +34,8 @@
<sql id="Base_Where_Clause">
<where>
<if test="filter != null">
<if test="filter.ID != null and filter.ID != ''">
AND id = #{filter.ID}
<if test="filter.id != null and filter.id != ''">
AND id = #{filter.id}
</if>
<if test="filter.achievementID != null and filter.achievementID != ''">
AND achievement_id = #{filter.achievementID}
@@ -254,7 +254,7 @@
) VALUES
<foreach collection="achievementList" item="item" separator=",">
(
#{item.ID}, #{item.achievementID}, #{item.name}, #{item.description}, #{item.icon},
#{item.id}, #{item.achievementID}, #{item.name}, #{item.description}, #{item.icon},
#{item.type}, #{item.level}, #{item.conditionType}, #{item.conditionValue},
#{item.points}, #{item.orderNum}, #{item.creator}, #{item.updater},
#{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted}
@@ -327,7 +327,7 @@
<!-- AchievementVO 结果映射(包含用户成就和进度信息) -->
<resultMap id="AchievementVOResultMap" type="org.xyzh.common.vo.AchievementVO">
<!-- 成就基本信息 -->
<id column="id" property="ID" />
<id column="id" property="id" />
<result column="achievement_id" property="achievementID" />
<result column="name" property="name" />
<result column="description" property="description" />

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserAchievement">
<id column="id" property="ID" />
<id column="id" property="id" />
<result column="user_id" property="userID" />
<result column="achievement_id" property="achievementID" />
<result column="obtain_time" property="obtainTime" />
@@ -19,8 +19,8 @@
<sql id="Base_Where_Clause">
<where>
<if test="filter != null">
<if test="filter.ID != null and filter.ID != ''">
AND ua.id = #{filter.ID}
<if test="filter.id != null and filter.id != ''">
AND ua.id = #{filter.id}
</if>
<if test="filter.userID != null and filter.userID != ''">
AND ua.user_id = #{filter.userID}
@@ -158,7 +158,7 @@
) VALUES
<foreach collection="userAchievementList" item="item" separator=",">
(
#{item.ID}, #{item.userID}, #{item.achievementID}, #{item.obtainTime}
#{item.id}, #{item.userID}, #{item.achievementID}, #{item.obtainTime}
)
</foreach>
</insert>

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserAchievementProgress">
<id column="id" property="ID" />
<id column="id" property="id" />
<result column="user_id" property="userID" />
<result column="achievement_id" property="achievementID" />
<result column="current_value" property="currentValue" />
@@ -112,7 +112,7 @@
) VALUES
<foreach collection="progressList" item="item" separator=",">
(
#{item.ID}, #{item.userID}, #{item.achievementID}, #{item.currentValue},
#{item.id}, #{item.userID}, #{item.achievementID}, #{item.currentValue},
#{item.targetValue}, #{item.progressPercentage}, #{item.completed},
#{item.lastUpdateTime}, #{item.createTime}
)

View File

@@ -189,7 +189,7 @@ public class AiChatController {
*/
@PutMapping("/conversation")
public ResultDomain<TbAiConversation> updateConversation(@RequestBody TbAiConversation conversation) {
log.info("更新会话: id={}", conversation.getID());
log.info("更新会话: id={}", conversation.getId());
return chatService.updateConversation(conversation);
}

View File

@@ -65,9 +65,9 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
}
// 4. 设置默认值
agentConfig.setID(UUID.randomUUID().toString());
agentConfig.setCreator(currentUser.getID());
agentConfig.setUpdater(currentUser.getID());
agentConfig.setId(UUID.randomUUID().toString());
agentConfig.setCreator(currentUser.getId());
agentConfig.setUpdater(currentUser.getId());
agentConfig.setCreateTime(new Date());
agentConfig.setUpdateTime(new Date());
agentConfig.setDeleted(false);
@@ -79,7 +79,7 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
// 5. 插入数据库
int rows = agentConfigMapper.insertAgentConfig(agentConfig);
if (rows > 0) {
log.info("创建智能体成功: {} - {}", agentConfig.getID(), agentConfig.getName());
log.info("创建智能体成功: {} - {}", agentConfig.getId(), agentConfig.getName());
resultDomain.success("创建智能体成功", agentConfig);
return resultDomain;
} else {
@@ -101,13 +101,13 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
try {
// 1. 参数验证
if (!StringUtils.hasText(agentConfig.getID())) {
if (!StringUtils.hasText(agentConfig.getId())) {
resultDomain.fail("智能体ID不能为空");
return resultDomain;
}
// 2. 检查是否存在
TbAiAgentConfig existing = agentConfigMapper.selectAgentConfigById(agentConfig.getID());
TbAiAgentConfig existing = agentConfigMapper.selectAgentConfigById(agentConfig.getId());
if (existing == null || existing.getDeleted()) {
resultDomain.fail("智能体不存在");
return resultDomain;
@@ -116,7 +116,7 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
// 3. 检查名称是否重复
if (StringUtils.hasText(agentConfig.getName()) &&
!agentConfig.getName().equals(existing.getName())) {
ResultDomain<Boolean> checkResult = checkNameExists(agentConfig.getName(), agentConfig.getID());
ResultDomain<Boolean> checkResult = checkNameExists(agentConfig.getName(), agentConfig.getId());
if (checkResult.getData()) {
resultDomain.fail("智能体名称已存在");
return resultDomain;
@@ -131,15 +131,15 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
}
// 5. 更新字段
agentConfig.setUpdater(currentUser.getID());
agentConfig.setUpdater(currentUser.getId());
agentConfig.setUpdateTime(new Date());
// 6. 执行更新
int rows = agentConfigMapper.updateAgentConfig(agentConfig);
if (rows > 0) {
// 重新查询最新数据
TbAiAgentConfig updated = agentConfigMapper.selectAgentConfigById(agentConfig.getID());
log.info("更新智能体成功: {} - {}", agentConfig.getID(), agentConfig.getName());
TbAiAgentConfig updated = agentConfigMapper.selectAgentConfigById(agentConfig.getId());
log.info("更新智能体成功: {} - {}", agentConfig.getId(), agentConfig.getName());
resultDomain.success("更新智能体成功", updated);
return resultDomain;
} else {
@@ -182,8 +182,8 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
// 4. 逻辑删除
TbAiAgentConfig deleteEntity = new TbAiAgentConfig();
deleteEntity.setID(agentId);
deleteEntity.setUpdater(currentUser.getID());
deleteEntity.setId(agentId);
deleteEntity.setUpdater(currentUser.getId());
int rows = agentConfigMapper.deleteAgentConfig(deleteEntity);
if (rows > 0) {
@@ -310,13 +310,13 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
// 3. 更新状态
TbAiAgentConfig update = new TbAiAgentConfig();
update.setID(agentId);
update.setId(agentId);
update.setStatus(status);
update.setUpdateTime(new Date());
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null) {
update.setUpdater(currentUser.getID());
update.setUpdater(currentUser.getId());
}
int rows = agentConfigMapper.updateAgentConfig(update);
@@ -370,14 +370,14 @@ public class AiAgentConfigServiceImpl implements AiAgentConfigService {
// 4. 更新Dify配置
TbAiAgentConfig update = new TbAiAgentConfig();
update.setID(agentId);
update.setId(agentId);
update.setDifyAppId(difyAppId);
update.setDifyApiKey(difyApiKey);
update.setUpdateTime(new Date());
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null) {
update.setUpdater(currentUser.getID());
update.setUpdater(currentUser.getId());
}
int rows = agentConfigMapper.updateAgentConfig(update);

View File

@@ -55,7 +55,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 查询数据
List<TbAiConversation> conversations = conversationMapper.selectUserConversationsPage(
currentUser.getID(),
currentUser.getId(),
agentId,
keyword,
isFavorite,
@@ -66,7 +66,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 查询总数
long total = conversationMapper.countUserConversationsWithFilter(
currentUser.getID(),
currentUser.getId(),
agentId,
keyword,
isFavorite,
@@ -105,14 +105,14 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 搜索会话
List<TbAiConversation> conversations = conversationMapper.searchConversationsByKeyword(
currentUser.getID(),
currentUser.getId(),
keyword,
pageParam
);
// 查询总数
long total = conversationMapper.countSearchConversations(
currentUser.getID(),
currentUser.getId(),
keyword
);
@@ -147,7 +147,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 搜索消息
List<TbAiMessage> messages = messageMapper.searchMessagesByContent(
currentUser.getID(),
currentUser.getId(),
keyword,
conversationId,
pageParam
@@ -155,7 +155,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 查询总数
long total = messageMapper.countSearchMessages(
currentUser.getID(),
currentUser.getId(),
keyword,
conversationId
);
@@ -197,14 +197,14 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
return resultDomain;
}
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权操作此会话");
return resultDomain;
}
// 更新收藏状态
TbAiConversation update = new TbAiConversation();
update.setID(conversationId);
update.setId(conversationId);
update.setIsFavorite(isFavorite);
update.setUpdateTime(new Date());
conversationMapper.updateConversation(update);
@@ -240,14 +240,14 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
return resultDomain;
}
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权操作此会话");
return resultDomain;
}
// 更新置顶状态
TbAiConversation update = new TbAiConversation();
update.setID(conversationId);
update.setId(conversationId);
update.setIsPinned(isPinned);
update.setUpdateTime(new Date());
conversationMapper.updateConversation(update);
@@ -284,17 +284,17 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
int deleteCount = 0;
for (String conversationId : conversationIds) {
TbAiConversation conversation = conversationMapper.selectConversationById(conversationId);
if (conversation != null && conversation.getUserID().equals(currentUser.getID())) {
if (conversation != null && conversation.getUserID().equals(currentUser.getId())) {
// 逻辑删除会话
TbAiConversation deleteEntity = new TbAiConversation();
deleteEntity.setID(conversationId);
deleteEntity.setId(conversationId);
conversationMapper.deleteConversation(deleteEntity);
// 同时删除消息
List<TbAiMessage> messages = messageMapper.selectMessagesByConversationId(conversationId);
for (TbAiMessage message : messages) {
TbAiMessage deleteMsg = new TbAiMessage();
deleteMsg.setID(message.getID());
deleteMsg.setId(message.getId());
messageMapper.deleteMessage(deleteMsg);
}
@@ -324,7 +324,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
return resultDomain;
}
String targetUserId = StringUtils.hasText(userId) ? userId : currentUser.getID();
String targetUserId = StringUtils.hasText(userId) ? userId : currentUser.getId();
// 统计数据
Map<String, Object> statistics = new HashMap<>();
@@ -388,7 +388,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权访问此会话");
return resultDomain;
}
@@ -455,7 +455,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权访问此会话");
return resultDomain;
}
@@ -523,7 +523,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权访问此会话");
return resultDomain;
}
@@ -631,7 +631,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
// 查询过期会话ID
List<String> expiredIds = conversationMapper.selectExpiredConversationIds(
currentUser.getID(),
currentUser.getId(),
beforeDate
);
@@ -648,7 +648,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
List<TbAiMessage> messages = messageMapper.selectMessagesByConversationId(conversationId);
for (TbAiMessage message : messages) {
TbAiMessage deleteMsg = new TbAiMessage();
deleteMsg.setID(message.getID());
deleteMsg.setId(message.getId());
messageMapper.deleteMessage(deleteMsg);
}
}
@@ -677,7 +677,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
int queryLimit = (limit != null && limit > 0) ? limit : 10;
List<TbAiConversation> conversations = conversationMapper.selectRecentConversations(
currentUser.getID(),
currentUser.getId(),
queryLimit
);
@@ -704,7 +704,7 @@ public class AiChatHistoryServiceImpl implements AiChatHistoryService {
int queryLimit = (limit != null && limit > 0) ? limit : 10;
List<TbAiConversation> conversations = conversationMapper.selectPopularConversations(
currentUser.getID(),
currentUser.getId(),
queryLimit
);

View File

@@ -12,6 +12,7 @@ import org.xyzh.ai.client.DifyApiClient;
import org.xyzh.ai.client.callback.StreamCallback;
import org.xyzh.ai.client.dto.ChatRequest;
import org.xyzh.ai.client.dto.ChatResponse;
import org.xyzh.ai.config.DifyConfig;
import org.xyzh.ai.exception.DifyException;
import org.xyzh.ai.mapper.AiAgentConfigMapper;
import org.xyzh.ai.mapper.AiConversationMapper;
@@ -62,6 +63,9 @@ public class AiChatServiceImpl implements AiChatService {
@Autowired
private DifyApiClient difyApiClient;
@Autowired
private DifyConfig difyConfig;
@Autowired
private AiKnowledgeRedisService knowledgeRedisService;
@@ -202,7 +206,7 @@ public class AiChatServiceImpl implements AiChatService {
emitter.complete();
return emitter;
}
if (!conversation.getUserID().equals(currentUser.getID())) {
if (!conversation.getUserID().equals(currentUser.getId())) {
emitter.send(SseEmitter.event().name("error").data("无权访问此会话"));
emitter.complete();
return emitter;
@@ -218,12 +222,12 @@ public class AiChatServiceImpl implements AiChatService {
conversation = createResult.getData();
}
final String finalConversationId = conversation.getID();
final String finalConversationId = conversation.getId();
// 5. 创建用户消息记录
TbAiMessage userMessage = new TbAiMessage();
String userMessageId = UUID.randomUUID().toString();
userMessage.setID(userMessageId);
userMessage.setId(userMessageId);
userMessage.setConversationID(finalConversationId);
userMessage.setAgentID(agentId);
userMessage.setRole("user");
@@ -231,7 +235,7 @@ public class AiChatServiceImpl implements AiChatService {
userMessage.setCreateTime(new Date());
userMessage.setUpdateTime(new Date());
userMessage.setDeleted(false);
userMessage.setUserID(currentUser.getID());
userMessage.setUserID(currentUser.getId());
// 处理文件关联将文件ID列表转换为JSON数组保存
if (filesData != null && !filesData.isEmpty()) {
@@ -257,7 +261,7 @@ public class AiChatServiceImpl implements AiChatService {
// 6. 保存文件关联记录到tb_ai_upload_file
if (filesData != null && !filesData.isEmpty()) {
saveMessageFileRecords(userMessageId, finalConversationId, currentUser.getID(), filesData);
saveMessageFileRecords(userMessageId, finalConversationId, currentUser.getId(), filesData);
}
// 注意AI消息记录将在获取到Dify的task_id后创建
@@ -268,7 +272,7 @@ public class AiChatServiceImpl implements AiChatService {
// 7. 构建Dify请求
ChatRequest chatRequest = new ChatRequest();
chatRequest.setQuery(query);
chatRequest.setUser(currentUser.getID());
chatRequest.setUser(currentUser.getId());
if (StringUtils.hasText(conversation.getDifyConversationId())) {
chatRequest.setConversationId(conversation.getDifyConversationId());
@@ -278,6 +282,8 @@ public class AiChatServiceImpl implements AiChatService {
Map<String, Object> inputs = new HashMap<>();
inputs.put("connectInternet", agent.getConnectInternet());
inputs.put("datasets", JSON.toJSONString(knowledgeIds));
inputs.put("dataset_apikey", difyConfig.getKnowledgeApiKey());
inputs.put("promt", agent.getDescription());
chatRequest.setInputs(inputs);
chatRequest.setFiles(filesData);
// 6. 调用Dify流式对话
@@ -325,7 +331,7 @@ public class AiChatServiceImpl implements AiChatService {
// 更新AI消息内容使用task_id作为消息ID
if (taskId.get() != null) {
TbAiMessage updateMessage = new TbAiMessage();
updateMessage.setID(taskId.get());
updateMessage.setId(taskId.get());
updateMessage.setContent(fullAnswer.toString());
updateMessage.setDifyMessageId(difyMessageId.get());
updateMessage.setUpdateTime(new Date());
@@ -335,7 +341,7 @@ public class AiChatServiceImpl implements AiChatService {
// 更新会话的Dify会话ID
if (StringUtils.hasText(difyConversationId.get())) {
TbAiConversation updateConv = new TbAiConversation();
updateConv.setID(finalConversationId);
updateConv.setId(finalConversationId);
updateConv.setDifyConversationId(difyConversationId.get());
updateConv.setMessageCount((finalConversation.getMessageCount() != null ?
finalConversation.getMessageCount() : 0) + 2);
@@ -376,7 +382,7 @@ public class AiChatServiceImpl implements AiChatService {
// 使用task_id作为消息ID创建AI消息记录
TbAiMessage aiMessage = new TbAiMessage();
aiMessage.setID(difyTaskId); // 使用Dify的task_id作为消息ID
aiMessage.setId(difyTaskId); // 使用Dify的task_id作为消息ID
aiMessage.setConversationID(finalConversationId);
aiMessage.setAgentID(agentId);
aiMessage.setRole("assistant");
@@ -509,7 +515,7 @@ public class AiChatServiceImpl implements AiChatService {
TbAiConversation conversation;
if (StringUtils.hasText(conversationId)) {
conversation = conversationMapper.selectConversationById(conversationId);
if (conversation == null || !conversation.getUserID().equals(currentUser.getID())) {
if (conversation == null || !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("会话不存在或无权访问");
return resultDomain;
}
@@ -520,12 +526,12 @@ public class AiChatServiceImpl implements AiChatService {
return resultDomain;
}
conversation = createResult.getData();
conversationId = conversation.getID();
conversationId = conversation.getId();
}
// 创建用户消息
TbAiMessage userMessage = new TbAiMessage();
userMessage.setID(UUID.randomUUID().toString());
userMessage.setId(UUID.randomUUID().toString());
userMessage.setConversationID(conversationId);
userMessage.setAgentID(agentId);
userMessage.setRole("user");
@@ -538,7 +544,7 @@ public class AiChatServiceImpl implements AiChatService {
// 构建Dify请求
ChatRequest chatRequest = new ChatRequest();
chatRequest.setQuery(query);
chatRequest.setUser(currentUser.getID());
chatRequest.setUser(currentUser.getId());
if (StringUtils.hasText(conversation.getDifyConversationId())) {
chatRequest.setConversationId(conversation.getDifyConversationId());
@@ -555,7 +561,7 @@ public class AiChatServiceImpl implements AiChatService {
// 创建AI回复消息
TbAiMessage aiMessage = new TbAiMessage();
aiMessage.setID(UUID.randomUUID().toString());
aiMessage.setId(UUID.randomUUID().toString());
aiMessage.setConversationID(conversationId);
aiMessage.setAgentID(agentId);
aiMessage.setRole("assistant");
@@ -568,14 +574,14 @@ public class AiChatServiceImpl implements AiChatService {
// 更新会话
TbAiConversation updateConv = new TbAiConversation();
updateConv.setID(conversationId);
updateConv.setId(conversationId);
updateConv.setDifyConversationId(chatResponse.getConversationId());
updateConv.setMessageCount((conversation.getMessageCount() != null ?
conversation.getMessageCount() : 0) + 2);
updateConv.setUpdateTime(new Date());
conversationMapper.updateConversation(updateConv);
log.info("阻塞式对话成功: {} - {}", conversationId, aiMessage.getID());
log.info("阻塞式对话成功: {} - {}", conversationId, aiMessage.getId());
resultDomain.success("对话成功", aiMessage);
return resultDomain;
@@ -618,7 +624,7 @@ public class AiChatServiceImpl implements AiChatService {
try {
difyApiClient.stopChatMessage(
taskId,
currentUser.getID(),
currentUser.getId(),
agent.getDifyApiKey()
);
log.info("对话停止成功task_id: {}", taskId);
@@ -667,8 +673,8 @@ public class AiChatServiceImpl implements AiChatService {
// 创建会话
TbAiConversation conversation = new TbAiConversation();
conversation.setID(UUID.randomUUID().toString());
conversation.setUserID(currentUser.getID());
conversation.setId(UUID.randomUUID().toString());
conversation.setUserID(currentUser.getId());
conversation.setAgentID(agentId);
conversation.setTitle(StringUtils.hasText(title) ? title : "新对话");
conversation.setMessageCount(0);
@@ -678,7 +684,7 @@ public class AiChatServiceImpl implements AiChatService {
conversationMapper.insertConversation(conversation);
log.info("创建会话成功: {} - {}", conversation.getID(), currentUser.getID());
log.info("创建会话成功: {} - {}", conversation.getId(), currentUser.getId());
resultDomain.success("创建会话成功", conversation);
return resultDomain;
@@ -707,7 +713,7 @@ public class AiChatServiceImpl implements AiChatService {
// 验证所属权
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权访问此会话");
return resultDomain;
}
@@ -728,20 +734,20 @@ public class AiChatServiceImpl implements AiChatService {
ResultDomain<TbAiConversation> resultDomain = new ResultDomain<>();
try {
if (!StringUtils.hasText(conversation.getID())) {
if (!StringUtils.hasText(conversation.getId())) {
resultDomain.fail("会话ID不能为空");
return resultDomain;
}
// 验证所属权
TbAiConversation existing = conversationMapper.selectConversationById(conversation.getID());
TbAiConversation existing = conversationMapper.selectConversationById(conversation.getId());
if (existing == null || existing.getDeleted()) {
resultDomain.fail("会话不存在");
return resultDomain;
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !existing.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !existing.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权修改此会话");
return resultDomain;
}
@@ -751,7 +757,7 @@ public class AiChatServiceImpl implements AiChatService {
conversationMapper.updateConversation(conversation);
// 重新查询
TbAiConversation updated = conversationMapper.selectConversationById(conversation.getID());
TbAiConversation updated = conversationMapper.selectConversationById(conversation.getId());
resultDomain.success("更新成功", updated);
return resultDomain;
@@ -781,21 +787,21 @@ public class AiChatServiceImpl implements AiChatService {
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !existing.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !existing.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权删除此会话");
return resultDomain;
}
// 逻辑删除会话
TbAiConversation deleteEntity = new TbAiConversation();
deleteEntity.setID(conversationId);
deleteEntity.setId(conversationId);
conversationMapper.deleteConversation(deleteEntity);
// 同时逻辑删除该会话的所有消息
List<TbAiMessage> messages = messageMapper.selectMessagesByConversationId(conversationId);
for (TbAiMessage message : messages) {
TbAiMessage deleteMsg = new TbAiMessage();
deleteMsg.setID(message.getID());
deleteMsg.setId(message.getId());
messageMapper.deleteMessage(deleteMsg);
}
@@ -822,7 +828,7 @@ public class AiChatServiceImpl implements AiChatService {
}
List<TbAiConversation> conversations = conversationMapper.selectConversationsByUserId(
currentUser.getID(), agentId
currentUser.getId(), agentId
);
resultDomain.success("查询成功", conversations);
@@ -853,7 +859,7 @@ public class AiChatServiceImpl implements AiChatService {
}
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null && !conversation.getUserID().equals(currentUser.getID())) {
if (currentUser != null && !conversation.getUserID().equals(currentUser.getId())) {
resultDomain.fail("无权访问此会话");
return resultDomain;
}
@@ -990,7 +996,7 @@ public class AiChatServiceImpl implements AiChatService {
// 更新会话摘要
TbAiConversation update = new TbAiConversation();
update.setID(conversationId);
update.setId(conversationId);
update.setSummary(summary);
update.setUpdateTime(new Date());
conversationMapper.updateConversation(update);
@@ -1060,7 +1066,7 @@ public class AiChatServiceImpl implements AiChatService {
difyApiClient.submitMessageFeedback(
message.getDifyMessageId(),
difyRating,
currentUser.getID(),
currentUser.getId(),
feedback,
agent.getDifyApiKey()
);
@@ -1073,7 +1079,7 @@ public class AiChatServiceImpl implements AiChatService {
// 更新本地评价
TbAiMessage update = new TbAiMessage();
update.setID(messageId);
update.setId(messageId);
update.setRating(rating);
update.setFeedback(feedback);
update.setUpdateTime(new Date());
@@ -1104,7 +1110,7 @@ public class AiChatServiceImpl implements AiChatService {
for (DifyFileInfo fileInfo : filesData) {
TbAiUploadFile uploadFile = new TbAiUploadFile();
uploadFile.setID(UUID.randomUUID().toString());
uploadFile.setId(UUID.randomUUID().toString());
uploadFile.setUserID(userId);
uploadFile.setConversationID(conversationId);
uploadFile.setMessageID(messageId); // 绑定到消息
@@ -1146,7 +1152,7 @@ public class AiChatServiceImpl implements AiChatService {
// 获取当前登录用户的完整信息(包含部门角色列表)
LoginDomain loginDomain = LoginUtil.getCurrentLoginDomain();
if (loginDomain == null || loginDomain.getRoles() == null || loginDomain.getRoles().isEmpty()) {
log.warn("用户 {} 没有部门角色信息,返回空知识库列表", user.getID());
log.warn("用户 {} 没有部门角色信息,返回空知识库列表", user.getId());
return null;
}
@@ -1155,7 +1161,7 @@ public class AiChatServiceImpl implements AiChatService {
String deptPath = userRole.getDeptPath();
if (deptPath == null || deptPath.isEmpty()) {
log.warn("用户 {} 的部门路径为空,返回空知识库列表", user.getID());
log.warn("用户 {} 的部门路径为空,返回空知识库列表", user.getId());
return null;
}
@@ -1163,15 +1169,15 @@ public class AiChatServiceImpl implements AiChatService {
List<String> knowledgeIds = ((AiKnowledgeRedisServiceImpl) knowledgeRedisService).getKnowledgeIdsByDeptPath(deptPath);
if (knowledgeIds == null || knowledgeIds.isEmpty()) {
log.warn("用户 {} 所在部门路径 {} 没有关联的知识库", user.getID(), deptPath);
log.warn("用户 {} 所在部门路径 {} 没有关联的知识库", user.getId(), deptPath);
return null;
}
log.info("用户 {} 从部门路径 {} 获取到 {} 个知识库", user.getID(), deptPath, knowledgeIds.size());
log.info("用户 {} 从部门路径 {} 获取到 {} 个知识库", user.getId(), deptPath, knowledgeIds.size());
return knowledgeIds;
} catch (Exception e) {
log.error("根据用户获取知识库ID失败: userId={}", user.getID(), e);
log.error("根据用户获取知识库ID失败: userId={}", user.getId(), e);
return null;
}
}

View File

@@ -61,7 +61,7 @@ public class AiKnowledgeRedisServiceImpl implements AiKnowledgeRedisService, Com
String deptId = knowledge.getCreatorDept();
if (deptId == null || deptId.isEmpty()) {
log.warn("知识库 {} 没有部门信息,跳过", knowledge.getID());
log.warn("知识库 {} 没有部门信息,跳过", knowledge.getId());
continue;
}

View File

@@ -188,7 +188,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
}
// 4. 保存到本地数据库
knowledge.setID(UUID.randomUUID().toString());
knowledge.setId(UUID.randomUUID().toString());
knowledge.setDifyDatasetId(difyDatasetId);
knowledge.setDifyIndexingTechnique(indexingTechnique);
knowledge.setEmbeddingModel(embeddingModel);
@@ -198,9 +198,9 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
}
// 保存检索配置(从前端传入,已经在 knowledge 对象中)
// retrievalTopK, retrievalScoreThreshold, rerankModel, rerankModelProvider 已设置
knowledge.setCreator(currentUser.getID());
knowledge.setCreator(currentUser.getId());
knowledge.setCreatorDept(deptId);
knowledge.setUpdater(currentUser.getID());
knowledge.setUpdater(currentUser.getId());
knowledge.setCreateTime(new Date());
knowledge.setUpdateTime(new Date());
knowledge.setDeleted(false);
@@ -230,7 +230,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
// 5. 创建权限记录
try {
createKnowledgePermission(
knowledge.getID(),
knowledge.getId(),
permissionType,
deptIds,
roleIds,
@@ -250,7 +250,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
// 缓存更新失败不影响知识库创建,记录日志即可
}
log.info("知识库创建成功: {} - {}", knowledge.getID(), knowledge.getTitle());
log.info("知识库创建成功: {} - {}", knowledge.getId(), knowledge.getTitle());
resultDomain.success("知识库创建成功", knowledge);
return resultDomain;
@@ -268,20 +268,20 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
try {
// 1. 参数验证
if (!StringUtils.hasText(knowledge.getID())) {
if (!StringUtils.hasText(knowledge.getId())) {
resultDomain.fail("知识库ID不能为空");
return resultDomain;
}
// 2. 检查是否存在
TbAiKnowledge existing = knowledgeMapper.selectKnowledgeById(knowledge.getID());
TbAiKnowledge existing = knowledgeMapper.selectKnowledgeById(knowledge.getId());
if (existing == null || existing.getDeleted()) {
resultDomain.fail("知识库不存在");
return resultDomain;
}
// 3. 权限检查只有创建者或有write权限的用户可以修改
ResultDomain<Boolean> permissionCheck = checkKnowledgePermission(knowledge.getID(), "write");
ResultDomain<Boolean> permissionCheck = checkKnowledgePermission(knowledge.getId(), "write");
if (!permissionCheck.getData()) {
resultDomain.fail("无权限修改此知识库");
return resultDomain;
@@ -319,7 +319,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
updateRequest.setIndexingTechnique(knowledge.getDifyIndexingTechnique());
needUpdateDify = true;
} else {
log.warn("不允许从high_quality降级为economy: knowledgeId={}", knowledge.getID());
log.warn("不允许从high_quality降级为economy: knowledgeId={}", knowledge.getId());
}
}
@@ -425,14 +425,14 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
}
// 6. 更新本地数据
knowledge.setUpdater(currentUser.getID());
knowledge.setUpdater(currentUser.getId());
knowledge.setUpdateTime(new Date());
int rows = knowledgeMapper.updateKnowledge(knowledge);
if (rows > 0) {
// 重新查询最新数据
TbAiKnowledge updated = knowledgeMapper.selectKnowledgeById(knowledge.getID());
log.info("知识库更新成功: {} - {}", knowledge.getID(), knowledge.getTitle());
TbAiKnowledge updated = knowledgeMapper.selectKnowledgeById(knowledge.getId());
log.info("知识库更新成功: {} - {}", knowledge.getId(), knowledge.getTitle());
resultDomain.success("知识库更新成功", updated);
return resultDomain;
} else {
@@ -473,7 +473,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
return resultDomain;
}
if (!existing.getCreator().equals(currentUser.getID())) {
if (!existing.getCreator().equals(currentUser.getId())) {
resultDomain.fail("只有创建者可以删除知识库");
return resultDomain;
}
@@ -491,8 +491,8 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
// 5. 逻辑删除本地记录
TbAiKnowledge deleteEntity = new TbAiKnowledge();
deleteEntity.setID(knowledgeId);
deleteEntity.setUpdater(currentUser.getID());
deleteEntity.setId(knowledgeId);
deleteEntity.setUpdater(currentUser.getId());
int rows = knowledgeMapper.deleteKnowledge(deleteEntity);
if (rows > 0) {
@@ -623,14 +623,14 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
// 3. 更新本地信息
TbAiKnowledge update = new TbAiKnowledge();
update.setID(knowledgeId);
update.setId(knowledgeId);
update.setDocumentCount(difyDetail.getDocumentCount());
update.setTotalChunks(difyDetail.getWordCount()); // Dify的word_count对应我们的chunks
update.setUpdateTime(new Date());
TbSysUser currentUser = LoginUtil.getCurrentUser();
if (currentUser != null) {
update.setUpdater(currentUser.getID());
update.setUpdater(currentUser.getId());
}
knowledgeMapper.updateKnowledge(update);
@@ -679,7 +679,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
return resultDomain;
}
if (!knowledge.getCreator().equals(currentUser.getID())) {
if (!knowledge.getCreator().equals(currentUser.getId())) {
resultDomain.fail("只有创建者可以修改权限");
return resultDomain;
}

View File

@@ -114,7 +114,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
file,
"ai-agent", // 模块名
agentId, // 业务ID智能体ID
currentUser.getID() // 上传者
currentUser.getId() // 上传者
);
if (!uploadResult.isSuccess() || uploadResult.getData() == null) {
@@ -123,7 +123,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
}
TbSysFile sysFile = (TbSysFile) uploadResult.getData();
log.info("文件已保存到系统文件表: sysFileId={}, fileName={}", sysFile.getID(), sysFile.getOriginalName());
log.info("文件已保存到系统文件表: sysFileId={}, fileName={}", sysFile.getId(), sysFile.getOriginalName());
// 6. 获取已保存文件的File对象直接用于上传到Dify不需要再保存临时文件
File fileToUpload = fileService.getFileByRelativePath(sysFile.getFilePath());
@@ -133,13 +133,13 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
DifyFileInfo difyResponse = difyApiClient.uploadFileForChat(
fileToUpload,
originalFilename,
currentUser.getID(),
currentUser.getId(),
agent.getDifyApiKey());
// 9. 转换为前端需要的格式包含系统文件ID和文件路径
Map<String, Object> fileInfo = new HashMap<>();
fileInfo.put("id", difyResponse.getId()); // Dify文件ID
fileInfo.put("sys_file_id", sysFile.getID()); // 系统文件ID重要用于关联消息
fileInfo.put("sys_file_id", sysFile.getId()); // 系统文件ID重要用于关联消息
fileInfo.put("file_path", sysFile.getFilePath()); // 文件路径(重要:用于保存记录)
fileInfo.put("name", difyResponse.getName());
fileInfo.put("size", difyResponse.getSize());
@@ -150,7 +150,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
fileInfo.put("upload_file_id", difyResponse.getId()); // Dify上传文件ID
fileInfo.put("file_url", sysFile.getFileUrl()); // 文件访问URL
log.info("对话文件上传成功: sysFileId={}, difyFileId={}", sysFile.getID(), difyResponse.getId());
log.info("对话文件上传成功: sysFileId={}, difyFileId={}", sysFile.getId(), difyResponse.getId());
resultDomain.success("文件上传成功", fileInfo);
return resultDomain;
@@ -228,7 +228,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
file,
"ai-knowledge", // 模块名
knowledgeId, // 业务ID知识库ID
currentUser.getID() // 上传者
currentUser.getId() // 上传者
);
if (!uploadResult.isSuccess() || uploadResult.getData() == null) {
@@ -237,7 +237,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
}
TbSysFile sysFile = (TbSysFile) uploadResult.getData();
log.info("文件已保存到系统文件表: sysFileId={}, fileName={}", sysFile.getID(), sysFile.getOriginalName());
log.info("文件已保存到系统文件表: sysFileId={}, fileName={}", sysFile.getId(), sysFile.getOriginalName());
// 6. 获取已保存文件的File对象直接用于上传到Dify
File fileToUpload = fileService.getFileByRelativePath(sysFile.getFilePath());
@@ -259,10 +259,10 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
// 8. 保存到本地数据库
TbAiUploadFile uploadFile = new TbAiUploadFile();
uploadFile.setID(UUID.randomUUID().toString());
uploadFile.setUserID(currentUser.getID());
uploadFile.setId(UUID.randomUUID().toString());
uploadFile.setUserID(currentUser.getId());
uploadFile.setKnowledgeId(knowledgeId);
uploadFile.setSysFileId(sysFile.getID()); // 关联系统文件ID
uploadFile.setSysFileId(sysFile.getId()); // 关联系统文件ID
uploadFile.setFileName(originalFilename);
uploadFile.setFilePath(sysFile.getFilePath()); // 保存系统文件的相对路径
uploadFile.setFileSize(file.getSize());
@@ -282,10 +282,10 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
int knowledgeRows = knowledgeMapper.updateKnowledge(knowledge);
if (rows > 0) {
log.info("知识库文件上传成功: uploadFileId={}, sysFileId={}, fileName={}",
uploadFile.getID(), sysFile.getID(), originalFilename);
uploadFile.getId(), sysFile.getId(), originalFilename);
// 9. 异步更新向量化状态
asyncUpdateVectorStatus(uploadFile.getID());
asyncUpdateVectorStatus(uploadFile.getId());
resultDomain.success("文件上传成功", uploadFile);
if (knowledgeRows <=0) {
@@ -392,7 +392,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
// 4. 逻辑删除本地记录
TbAiUploadFile deleteEntity = new TbAiUploadFile();
deleteEntity.setID(fileId);
deleteEntity.setId(fileId);
int rows = uploadFileMapper.deleteUploadFile(deleteEntity);
knowledge.setDocumentCount(knowledge.getDocumentCount() - 1);
@@ -522,7 +522,7 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
// 4. 更新本地状态
TbAiUploadFile update = new TbAiUploadFile();
update.setID(fileId);
update.setId(fileId);
// 映射Dify状态到本地状态completed=2, processing=1, error=3
// DocumentStatusResponse返回的是文档列表取第一个
@@ -583,9 +583,9 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
List<CompletableFuture<Void>> futures = files.stream()
.map(file -> CompletableFuture.runAsync(() -> {
try {
syncFileStatus(file.getID());
syncFileStatus(file.getId());
} catch (Exception e) {
log.error("同步文件状态失败: {}", file.getID(), e);
log.error("同步文件状态失败: {}", file.getId(), e);
}
}, executorService))
.collect(Collectors.toList());

View File

@@ -216,7 +216,7 @@
) VALUES
<foreach collection="files" item="file" separator=",">
(
#{file.ID}, #{file.userID}, #{file.knowledgeId}, #{file.conversationID}, #{file.messageID},
#{file.id}, #{file.userID}, #{file.knowledgeId}, #{file.conversationID}, #{file.messageID},
#{file.sysFileId}, #{file.fileName}, #{file.filePath}, #{file.fileSize},
#{file.fileType}, #{file.mimeType}, #{file.difyDocumentId}, #{file.difyBatchId}, #{file.difyUploadFileId},
#{file.chunkCount}, #{file.status}, #{file.enabled}, #{file.displayStatus}, #{file.createTime}, #{file.updateTime}, #{file.deleted}

View File

@@ -255,7 +255,7 @@ const agentResult = await aiAgentConfigApi.createAgent({
status: 1
});
const agentId = agentResult.data?.ID;
const agentId = agentResult.data?.id;
// 2. 流式对话
await chatApi.streamChat(
@@ -294,7 +294,7 @@ const knowledgeResult = await knowledgeApi.createKnowledge({
embeddingModel: 'text-embedding-ada-002'
});
const knowledgeId = knowledgeResult.data?.ID;
const knowledgeId = knowledgeResult.data?.id;
// 2. 上传文件
const files = document.querySelector('input[type="file"]').files;

View File

@@ -50,7 +50,7 @@ public class AiKnowledgeServiceImpl {
String deptId = userDeptRoles.isEmpty() ? null : userDeptRoles.get(0).getDeptID();
// 2. 保存知识库
knowledge.setCreator(currentUser.getID());
knowledge.setCreator(currentUser.getId());
knowledge.setCreatorDept(deptId);
knowledgeMapper.insert(knowledge);
@@ -58,27 +58,27 @@ public class AiKnowledgeServiceImpl {
switch (permissionType) {
case PUBLIC:
// 公开知识库:所有人可读
createPublicPermission(knowledge.getID());
createPublicPermission(knowledge.getId());
break;
case DEPARTMENT:
// 部门知识库:本部门所有人可读写
createDepartmentPermission(knowledge.getID(), deptId);
createDepartmentPermission(knowledge.getId(), deptId);
break;
case DEPARTMENT_INHERIT:
// 部门继承:本部门及子部门可读
createDepartmentInheritPermission(knowledge.getID(), deptId);
createDepartmentInheritPermission(knowledge.getId(), deptId);
break;
case ROLE:
// 角色知识库:特定角色可读(跨部门)
createRolePermission(knowledge.getID(), roleIds);
createRolePermission(knowledge.getId(), roleIds);
break;
case PRIVATE:
// 私有知识库:仅创建者所在部门的特定角色
createPrivatePermission(knowledge.getID(), deptId, roleIds);
createPrivatePermission(knowledge.getId(), deptId, roleIds);
break;
}
@@ -88,7 +88,7 @@ public class AiKnowledgeServiceImpl {
// 创建公开权限
private void createPublicPermission(String knowledgeId) {
TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString());
permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10); // AI_KNOWLEDGE
permission.setResourceId(knowledgeId);
permission.setDeptId(null); // NULL表示不限部门
@@ -102,7 +102,7 @@ public class AiKnowledgeServiceImpl {
// 创建部门权限
private void createDepartmentPermission(String knowledgeId, String deptId) {
TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString());
permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10);
permission.setResourceId(knowledgeId);
permission.setDeptId(deptId); // 指定部门
@@ -120,7 +120,7 @@ public class AiKnowledgeServiceImpl {
// 为本部门创建权限已通过dept_path自动继承给子部门
TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString());
permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10);
permission.setResourceId(knowledgeId);
permission.setDeptId(deptId);
@@ -392,7 +392,7 @@ private String getCurrentUserCacheKey() {
String roleIds = roles.stream()
.map(r -> r.getDeptID() + ":" + r.getRoleID())
.collect(Collectors.joining(","));
return user.getID() + ":" + roleIds;
return user.getId() + ":" + roleIds;
}
```

View File

@@ -116,6 +116,8 @@ public interface LearningTaskService {
*/
ResultDomain<TbTaskUser> addTaskUser(String taskID, List<String> userIDs);
ResultDomain<TbTaskUser> updateTaskUser(String taskID, List<String> userIDs);
/**
* @description 批量添加任务用户
* @param taskID 任务ID

View File

@@ -65,7 +65,7 @@ public class UserPrincipal implements UserDetails {
public Collection<? extends GrantedAuthority> getAuthorities() {
// 角色权限
List<GrantedAuthority> roleAuthorities = roles.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role.getID()))
.map(role -> new SimpleGrantedAuthority("ROLE_" + role.getId()))
.collect(Collectors.toList());
// 功能权限

View File

@@ -242,7 +242,7 @@ public class LoginServiceImpl implements LoginService {
loginDomain.setIpAddress(ipAddress);
// 用户信息
try {
ResultDomain<TbSysUserInfo> resultDomain = userService.getUserInfoById(user.getID());
ResultDomain<TbSysUserInfo> resultDomain = userService.getUserInfoById(user.getId());
if (resultDomain.isSuccess()) {
loginDomain.setUserInfo(resultDomain.getData());
}
@@ -251,7 +251,7 @@ public class LoginServiceImpl implements LoginService {
}
// 获取用户角色和权限(如果服务可用)
try {
ResultDomain<UserDeptRoleVO> resultDomain = roleService.getDeptRolesByUserId(user.getID());
ResultDomain<UserDeptRoleVO> resultDomain = roleService.getDeptRolesByUserId(user.getId());
if (resultDomain.isSuccess()) {
List<UserDeptRoleVO> roles = resultDomain.getDataList();
loginDomain.setRoles(roles);
@@ -263,7 +263,7 @@ public class LoginServiceImpl implements LoginService {
}
try {
ResultDomain<TbSysPermission> resultDomain = permissionService.getPermissionsByUserId(user.getID());
ResultDomain<TbSysPermission> resultDomain = permissionService.getPermissionsByUserId(user.getId());
if (resultDomain.isSuccess()) {
List<TbSysPermission> permissions = resultDomain.getDataList();
loginDomain.setPermissions(permissions);
@@ -275,7 +275,7 @@ public class LoginServiceImpl implements LoginService {
}
try {
ResultDomain<TbSysMenu> resultDomain = menuService.getMenusByUserId(user.getID());
ResultDomain<TbSysMenu> resultDomain = menuService.getMenusByUserId(user.getId());
if (resultDomain.isSuccess()) {
List<TbSysMenu> menus = resultDomain.getDataList();
loginDomain.setMenus(menus);
@@ -302,10 +302,10 @@ public class LoginServiceImpl implements LoginService {
TbSysLoginLog loginLog = new TbSysLoginLog();
// 使用IDUtils生成登录日志ID
loginLog.setID(IDUtils.generateID());
loginLog.setId(IDUtils.generateID());
if (user != null) {
loginLog.setUserID(user.getID());
loginLog.setUserID(user.getId());
loginLog.setUsername(user.getUsername());
}else{
if (loginParam.getLoginType().equals("password")) {

View File

@@ -44,7 +44,7 @@ public class JwtTokenUtil {
Map<String, Object> claims = new HashMap<>();
TbSysUser user = loginDomain.getUser();
claims.put("userId", user.getID());
claims.put("userId", user.getId());
claims.put("username", user.getUsername());
claims.put("email", user.getEmail());
claims.put("loginType", loginDomain.getLoginType());
@@ -52,7 +52,7 @@ public class JwtTokenUtil {
return Jwts.builder()
.setClaims(claims)
.setSubject(user.getID())
.setSubject(user.getId())
.setId(IDUtils.generateID()) // 使用IDUtils生成JWT ID
.setIssuedAt(new Date())
.setExpiration(generateExpirationDate())

View File

@@ -30,5 +30,17 @@
<artifactId>jjwt-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- FastJson2 - JSON序列化工具 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!-- FastJson2 Spring6 支持 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension-spring6</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,50 @@
package org.xyzh.common.config.properties;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
/**
* @description FastJson配置类 - 统一处理日期时间格式序列化
* @filename FastJsonConfig.java
* @author yslg
* @copyright xyzh
* @since 2025-11-28
*/
@Configuration
public class FastJsonConfiguration implements WebMvcConfigurer {
/**
* 配置FastJson消息转换器
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
// FastJson配置
FastJsonConfig config = new FastJsonConfig();
// 设置日期格式
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 设置字符集
converter.setDefaultCharset(StandardCharsets.UTF_8);
// 设置支持的MediaType
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
// 应用配置
converter.setFastJsonConfig(config);
// 添加到转换器列表(添加到最前面,优先使用)
converters.add(0, converter);
}
}

View File

@@ -22,6 +22,10 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.alibaba.fastjson2.annotation.JSONField;
/**
* @description BaseDTO.java文件描述
@@ -20,6 +21,7 @@ public class BaseDTO implements Serializable{
* @author yslg
* @since 2025-09-10
*/
@JSONField(name="id")
private String id;
/**
@@ -100,7 +102,7 @@ public class BaseDTO implements Serializable{
* @author yslg
* @since 2025-09-10
*/
public String getID() {
public String getId() {
return this.id;
}
@@ -110,7 +112,7 @@ public class BaseDTO implements Serializable{
* @author yslg
* @since 2025-09-10
*/
public void setID(String id) {
public void setId(String id) {
this.id = id;
}

View File

@@ -136,7 +136,7 @@ public class TbAiAgentConfig extends BaseDTO {
@Override
public String toString() {
return "TbAiAgentConfig{" +
"id=" + getID() +
"id=" + getId() +
", name='" + name + '\'' +
", connectInternet=" + connectInternet +
", difyAppId='" + difyAppId + '\'' +

View File

@@ -160,7 +160,7 @@ public class TbAiConversation extends BaseDTO {
@Override
public String toString() {
return "TbAiConversation{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", title='" + title + '\'' +
", status=" + status +

View File

@@ -408,7 +408,7 @@ public class TbAiKnowledge extends BaseDTO {
@Override
public String toString() {
return "TbAiKnowledge{" +
"id=" + getID() +
"id=" + getId() +
", title='" + title + '\'' +
", sourceType=" + sourceType +
", category='" + category + '\'' +

View File

@@ -169,7 +169,7 @@ public class TbAiMessage extends BaseDTO {
@Override
public String toString() {
return "TbAiMessage{" +
"id=" + getID() +
"id=" + getId() +
", conversationID='" + conversationID + '\'' +
", userID='" + userID + '\'' +
", role='" + role + '\'' +

View File

@@ -262,7 +262,7 @@ public class TbAiUploadFile extends BaseDTO {
@Override
public String toString() {
return "TbAiUploadFile{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", conversationID='" + conversationID + '\'' +
", fileName='" + fileName + '\'' +

View File

@@ -121,7 +121,7 @@ public class TbAiUsageStatistics extends BaseDTO {
@Override
public String toString() {
return "TbAiUsageStatistics{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", statDate=" + statDate +
", conversationCount=" + conversationCount +

View File

@@ -106,7 +106,7 @@ public class TbCrontabEmailDefault extends BaseDTO {
@Override
public String toString() {
return "TbCrontabEmailDefault{" +
"id=" + getID() +
"id=" + getId() +
", defaultId='" + defaultId + '\'' +
", metaId='" + metaId + '\'' +
", userId='" + userId + '\'' +

View File

@@ -107,7 +107,7 @@ public class TbCrontabEmailRecipient extends BaseDTO {
@Override
public String toString() {
return "TbCrontabEmailRecipient{" +
"id=" + getID() +
"id=" + getId() +
", recipientId='" + recipientId + '\'' +
", taskId='" + taskId + '\'' +
", userId='" + userId + '\'' +

View File

@@ -174,7 +174,7 @@ public class TbCrontabLog extends BaseDTO {
@Override
public String toString() {
return "TbCrontabLog{" +
"id=" + getID() +
"id=" + getId() +
", taskId='" + taskId + '\'' +
", taskName='" + taskName + '\'' +
", taskGroup='" + taskGroup + '\'' +

View File

@@ -237,7 +237,7 @@ public class TbCrontabTask extends BaseDTO {
@Override
public String toString() {
return "TbCrontabTask{" +
"id=" + getID() +
"id=" + getId() +
", taskId='" + taskId + '\'' +
", taskName='" + taskName + '\'' +
", taskGroup='" + taskGroup + '\'' +

View File

@@ -172,7 +172,7 @@ public class TbCrontabTaskMeta extends BaseDTO {
@Override
public String toString() {
return "TbCrontabTaskMeta{" +
"id=" + getID() +
"id=" + getId() +
", metaId='" + metaId + '\'' +
", name='" + name + '\'' +
", category='" + category + '\'' +

View File

@@ -121,7 +121,7 @@ public class TbSysDept extends BaseDTO{
@Override
public String toString() {
return "TbSysDept{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", deptID='" + deptID + '\'' +
", parentID='" + parentID + '\'' +
", deptPath='" + deptPath + '\'' +

View File

@@ -95,7 +95,7 @@ public class TbSysDeptRole extends BaseDTO {
@Override
public String toString() {
return "TbSysDeptRole{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", deptID='" + deptID + '\'' +
", roleID='" + roleID + '\'' +
", creator='" + creator + '\'' +

View File

@@ -193,7 +193,7 @@ public class TbSysMenu extends BaseDTO {
@Override
public String toString() {
return "TbSysMenu{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", menuID='" + menuID + '\'' +
", parentID='" + parentID + '\'' +
", name='" + name + '\'' +

View File

@@ -75,7 +75,7 @@ public class TbSysMenuPermission extends BaseDTO{
@Override
public String toString() {
return "TbSysMenuPermission{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", menuID='" + menuID + '\'' +
", permissionID='" + permissionID + '\'' +
", creator='" + creator + '\'' +

View File

@@ -133,7 +133,7 @@ public class TbResourcePermission extends BaseDTO {
@Override
public String toString() {
return "TbResourcePermission{" +
"id=" + getID() +
"id=" + getId() +
", resourceType=" + resourceType +
", resourceID='" + resourceID + '\'' +
", deptID='" + deptID + '\'' +

View File

@@ -120,7 +120,7 @@ public class TbSysPermission extends BaseDTO{
@Override
public String toString() {
return "TbSysPermission{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", permissionID='" + permissionID + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +

View File

@@ -143,7 +143,7 @@ public class TbBanner extends BaseDTO {
@Override
public String toString() {
return "TbBanner{" +
"id=" + getID() +
"id=" + getId() +
", bannerID='" + bannerID + '\'' +
", title='" + title + '\'' +
", imageUrl='" + imageUrl + '\'' +

View File

@@ -266,7 +266,7 @@ public class TbResource extends BaseDTO {
@Override
public String toString() {
return "TbResource{" +
"id=" + getID() +
"id=" + getId() +
", resourceID='" + resourceID + '\'' +
", title='" + title + '\'' +
", tagID='" + tagID + '\'' +

View File

@@ -94,7 +94,7 @@ public class TbResourceRecommend extends BaseDTO {
@Override
public String toString() {
return "TbResourceRecommend{" +
"id=" + getID() +
"id=" + getId() +
", resourceID='" + resourceID + '\'' +
", recommendType=" + recommendType +
", orderNum=" + orderNum +

View File

@@ -55,7 +55,7 @@ public class TbResourceTag extends BaseDTO {
@Override
public String toString() {
return "TbResourceTag{" +
"id=" + getID() +
"id=" + getId() +
", resourceID='" + resourceID + '\'' +
", tagID='" + tagID + '\'' +
", createTime=" + getCreateTime() +

View File

@@ -107,7 +107,7 @@ public class TbTag extends BaseDTO {
@Override
public String toString() {
return "TbTag{" +
"id=" + getID() +
"id=" + getId() +
", tagID='" + tagID + '\'' +
", name='" + name + '\'' +
", color='" + color + '\'' +

View File

@@ -90,7 +90,7 @@ public class TbSysRole extends BaseDTO {
@Override
public String toString() {
return "TbSysRole{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
",roleID='" + roleID + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +

View File

@@ -74,7 +74,7 @@ public class TbSysRolePermission extends BaseDTO{
@Override
public String toString() {
return "TbSysRolePermission{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", roleID='" + roleID + '\'' +
", permissionID='" + permissionID + '\'' +
", creator='" + creator + '\'' +

View File

@@ -217,7 +217,7 @@ public class TbCourse extends BaseDTO {
@Override
public String toString() {
return "TbCourse{" +
"id=" + getID() +
"id=" + getId() +
", courseID='" + courseID + '\'' +
", name='" + name + '\'' +
", coverImage='" + coverImage + '\'' +

View File

@@ -201,7 +201,7 @@ public class TbCourseChapter extends BaseDTO {
@Override
public String toString() {
return "TbCourseChapter{" +
"id=" + getID() +
"id=" + getId() +
", chapterID='" + chapterID + '\'' +
", courseID='" + courseID + '\'' +
", parentID='" + parentID + '\'' +

View File

@@ -212,7 +212,7 @@ public class TbCourseNode extends BaseDTO {
@Override
public String toString() {
return "TbCourseNode{" +
"id=" + getID() +
"id=" + getId() +
", nodeID='" + nodeID + '\'' +
", chapterID='" + chapterID + '\'' +
", name='" + name + '\'' +

View File

@@ -99,7 +99,7 @@ public class TbCourseTag extends BaseDTO {
@Override
public String toString() {
return "TbCourseTag{" +
"id=" + getID() +
"id=" + getId() +
", courseID='" + courseID + '\'' +
", tagID='" + tagID + '\'' +
", createTime=" + getCreateTime() +

View File

@@ -226,7 +226,7 @@ public class TbLearningHistory extends BaseDTO {
@Override
public String toString() {
return "TbLearningHistory{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", historyID='" + historyID + '\'' +
", resourceType=" + resourceType +

View File

@@ -228,7 +228,7 @@ public class TbLearningRecord extends BaseDTO {
@Override
public String toString() {
return "TbLearningRecord{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", taskID='" + taskID + '\'' +
", resourceType=" + resourceType +

View File

@@ -166,7 +166,7 @@ public class TbLearningStatistics extends BaseDTO {
@Override
public String toString() {
return "TbLearningStatistics{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", statDate=" + statDate +
", totalDuration=" + totalDuration +

View File

@@ -173,7 +173,7 @@ public class TbLearningStatisticsDetail extends BaseDTO {
@Override
public String toString() {
return "TbLearningStatisticsDetail{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", statDate=" + statDate +
", resourceType=" + resourceType +

View File

@@ -154,7 +154,7 @@ public class TbLearningTask extends BaseDTO {
@Override
public String toString() {
return "TbLearningTask{" +
"id=" + getID() +
"id=" + getId() +
", taskID='" + taskID + '\'' +
", name='" + name + '\'' +
", startTime=" + startTime +

View File

@@ -54,7 +54,7 @@ public class TbLearningTaskTag extends BaseDTO {
@Override
public String toString() {
return "TbLearningTaskTag{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", taskID='" + taskID + '\'' +
", tagID='" + tagID + '\'' +
", creator='" + creator + '\'' +

View File

@@ -111,7 +111,7 @@ public class TbTaskItem extends BaseDTO {
@Override
public String toString() {
return "TbTaskItem{" +
"id=" + getID() +
"id=" + getId() +
", taskID='" + taskID + '\'' +
", itemType=" + itemType +
", itemID='" + itemID + '\'' +

View File

@@ -154,7 +154,7 @@ public class TbTaskUser extends BaseDTO {
@Override
public String toString() {
return "TbTaskUser{" +
"id=" + getID() +
"id=" + getId() +
", taskID='" + taskID + '\'' +
", userID='" + userID + '\'' +
", deptID='" + deptID + '\'' +

View File

@@ -250,7 +250,7 @@ public class TbSysConfig extends BaseDTO {
@Override
public String toString() {
return "TbSysConfig{" +
"id=" + getID() +
"id=" + getId() +
", configKey='" + configKey + '\'' +
", configName='" + configName + '\'' +
", configValue='" + configValue + '\'' +

View File

@@ -159,7 +159,7 @@ public class TbSysDictData extends BaseDTO {
@Override
public String toString() {
return "TbSysDictData{" +
"id=" + getID() +
"id=" + getId() +
", dictType='" + dictType + '\'' +
", dictLabel='" + dictLabel + '\'' +
", dictValue='" + dictValue + '\'' +

View File

@@ -94,7 +94,7 @@ public class TbSysDictType extends BaseDTO {
@Override
public String toString() {
return "TbSysDictType{" +
"id=" + getID() +
"id=" + getId() +
", dictType='" + dictType + '\'' +
", dictName='" + dictName + '\'' +
", status=" + status +

View File

@@ -181,7 +181,7 @@ public class TbSysLoginLog extends BaseDTO {
@Override
public String toString() {
return "TbSysLoginLog{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", userID='" + userID + '\'' +
", username='" + username + '\'' +
", ipAddress='" + ipAddress + '\'' +

View File

@@ -133,7 +133,7 @@ public class TbSysModule extends BaseDTO {
@Override
public String toString() {
return "TbSysModule{" +
"id=" + getID() +
"id=" + getId() +
", moduleID='" + moduleID + '\'' +
", name='" + name + '\'' +
", code='" + code + '\'' +

View File

@@ -121,7 +121,7 @@ public class TbSysNotification extends BaseDTO {
@Override
public String toString() {
return "TbSysNotification{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", type=" + type +
", title='" + title + '\'' +

View File

@@ -224,7 +224,7 @@ public class TbSysOperationLog extends BaseDTO {
@Override
public String toString() {
return "TbSysOperationLog{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", username='" + username + '\'' +
", module='" + module + '\'' +

View File

@@ -108,7 +108,7 @@ public class TbSysVisitStatistics extends BaseDTO {
@Override
public String toString() {
return "TbSysVisitStatistics{" +
"id=" + getID() +
"id=" + getId() +
", statDate=" + statDate +
", totalVisits=" + totalVisits +
", uniqueVisitors=" + uniqueVisitors +

View File

@@ -107,7 +107,7 @@ public class TbSysUser extends BaseDTO {
@Override
public String toString() {
return "TbSysUser{" +
"id=" + getID() +
"id=" + getId() +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +

View File

@@ -91,7 +91,7 @@ public class TbSysUserDeptRole extends BaseDTO{
@Override
public String toString() {
return "TbSysUserDeptRole{" +
"id='" + getID() + '\'' +
"id='" + getId() + '\'' +
", userID='" + userID + '\'' +
", deptID='" + deptID + '\'' +
", roleID='" + roleID + '\'' +

View File

@@ -167,7 +167,7 @@ public class TbSysUserInfo extends BaseDTO {
@Override
public String toString() {
return "TbSysUserInfo{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", avatar='" + avatar + '\'' +
", gender=" + gender +

View File

@@ -172,7 +172,7 @@ public class TbAchievement extends BaseDTO {
@Override
public String toString() {
return "TbAchievement{" +
"id=" + getID() +
"id=" + getId() +
", achievementID='" + achievementID + '\'' +
", name='" + name + '\'' +
", type=" + type +

View File

@@ -94,7 +94,7 @@ public class TbPointsRecord extends BaseDTO {
@Override
public String toString() {
return "TbPointsRecord{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", points=" + points +
", type=" + type +

View File

@@ -56,7 +56,7 @@ public class TbUserAchievement extends BaseDTO {
@Override
public String toString() {
return "TbUserAchievement{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", achievementID='" + achievementID + '\'' +
", obtainTime=" + obtainTime +

View File

@@ -120,7 +120,7 @@ public class TbUserAchievementProgress extends BaseDTO {
@Override
public String toString() {
return "TbUserAchievementProgress{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", achievementID='" + achievementID + '\'' +
", currentValue=" + currentValue +

View File

@@ -82,7 +82,7 @@ public class TbUserBrowseRecord extends BaseDTO {
@Override
public String toString() {
return "TbUserBrowseRecord{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", browseType=" + browseType +
", browseID='" + browseID + '\'' +

View File

@@ -68,7 +68,7 @@ public class TbUserCollection extends BaseDTO {
@Override
public String toString() {
return "TbUserCollection{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", collectionType=" + collectionType +
", collectionID='" + collectionID + '\'' +

View File

@@ -68,7 +68,7 @@ public class TbUserPoints extends BaseDTO {
@Override
public String toString() {
return "TbUserPoints{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", totalPoints=" + totalPoints +
", currentPoints=" + currentPoints +

View File

@@ -19,7 +19,7 @@ public class AchievementVO extends TbAchievement {
// ==================== TbUserAchievement表的字段 ====================
/**
* @description 用户成就记录IDtb_user_achievement.ID
* @description 用户成就记录IDtb_user_achievement.id
*/
private String userAchievementID;
@@ -36,7 +36,7 @@ public class AchievementVO extends TbAchievement {
// ==================== TbUserAchievementProgress表的字段 ====================
/**
* @description 进度记录IDtb_user_achievement_progress.ID
* @description 进度记录IDtb_user_achievement_progress.id
*/
private String progressID;

View File

@@ -387,7 +387,7 @@ public class CourseItemVO extends BaseDTO {
*/
public TbCourse toCourse() {
TbCourse course = new TbCourse();
course.setID(this.getID());
course.setId(this.getId());
course.setCourseID(this.courseID);
course.setName(this.name);
course.setCoverImage(this.coverImage);
@@ -412,7 +412,7 @@ public class CourseItemVO extends BaseDTO {
}
CourseItemVO vo = new CourseItemVO();
vo.setID(course.getID());
vo.setId(course.getId());
vo.setCourseID(course.getCourseID());
vo.setName(course.getName());
vo.setCoverImage(course.getCoverImage());
@@ -434,7 +434,7 @@ public class CourseItemVO extends BaseDTO {
TbLearningRecord record = new TbLearningRecord();
if (this.recordID != null) {
// 如果有recordID说明是从已有记录转换的需要设置ID
record.setID(this.recordID);
record.setId(this.recordID);
}
record.setCourseID(this.courseID);
record.setDuration(this.learningDuration);
@@ -454,7 +454,7 @@ public class CourseItemVO extends BaseDTO {
return;
}
this.recordID = record.getID();
this.recordID = record.getId();
this.progress = record.getProgress();
this.isComplete = record.getIsComplete();
this.learningDuration = record.getDuration();
@@ -487,7 +487,7 @@ public class CourseItemVO extends BaseDTO {
}
CourseItemVO vo = new CourseItemVO();
vo.setID(chapter.getID());
vo.setId(chapter.getId());
vo.setChapterID(chapter.getChapterID());
vo.setCourseID(chapter.getCourseID());
vo.setParentID(chapter.getParentID());
@@ -513,7 +513,7 @@ public class CourseItemVO extends BaseDTO {
}
CourseItemVO vo = new CourseItemVO();
vo.setID(node.getID());
vo.setId(node.getId());
vo.setNodeID(node.getNodeID());
vo.setChapterID(node.getChapterID());
vo.setName(node.getName());
@@ -535,7 +535,7 @@ public class CourseItemVO extends BaseDTO {
*/
public TbCourseChapter toChapter() {
TbCourseChapter chapter = new TbCourseChapter();
chapter.setID(this.getID());
chapter.setId(this.getId());
chapter.setChapterID(this.chapterID);
chapter.setCourseID(this.courseID);
chapter.setParentID(this.parentID);
@@ -555,7 +555,7 @@ public class CourseItemVO extends BaseDTO {
*/
public TbCourseNode toNode() {
TbCourseNode node = new TbCourseNode();
node.setID(this.getID());
node.setId(this.getId());
node.setNodeID(this.nodeID);
node.setChapterID(this.chapterID);
node.setName(this.name);

View File

@@ -98,7 +98,7 @@ public class ResourcePermissionVO extends TbResourcePermission {
@Override
public String toString() {
return "ResourcePermissionVO{" +
"id=" + getID() +
"id=" + getId() +
", resourceType=" + getResourceType() +
", resourceID='" + getResourceID() + '\'' +
", resourceTitle='" + resourceTitle + '\'' +

View File

@@ -81,7 +81,7 @@ public class TagVO extends BaseDTO {
}
public TbTag getTag() {
TbTag tag = new TbTag();
tag.setID(tagID);
tag.setId(tagID);
tag.setName(tagName);
tag.setColor(tagColor);
return tag;

View File

@@ -67,7 +67,7 @@ public class TaskItemVO extends TbLearningTask {
this.setTaskID(taskItem.getTaskID());
this.orderNum = taskItem.getOrderNum();
this.required = taskItem.getRequired();
this.setID(taskItem.getID());
this.setId(taskItem.getId());
this.setCreateTime(taskItem.getCreateTime());
this.setCreator(taskItem.getCreator());
@@ -140,7 +140,7 @@ public class TaskItemVO extends TbLearningTask {
public TbTaskItem toTaskItem() {
TbTaskItem taskItem = new TbTaskItem();
taskItem.setID(getID());
taskItem.setId(getId());
taskItem.setTaskID(getTaskID());
taskItem.setItemType(itemType);
taskItem.setRequired(required);

View File

@@ -344,7 +344,7 @@ public class UserCollectionVO extends BaseDTO {
@Override
public String toString() {
return "UserCollectionVO{" +
"id=" + getID() +
"id=" + getId() +
", userID='" + userID + '\'' +
", collectionType=" + collectionType +
", collectionID='" + collectionID + '\'' +

View File

@@ -115,8 +115,8 @@ public class CrontabController {
String metaId = request.getMetaId();
// 确保id字段正确传递用于数据库更新
if (crontabItem.getTaskId() != null && crontabItem.getID() == null) {
crontabItem.setID(crontabItem.getTaskId());
if (crontabItem.getTaskId() != null && crontabItem.getId() == null) {
crontabItem.setId(crontabItem.getTaskId());
}
// 验证元数据ID
@@ -141,7 +141,7 @@ public class CrontabController {
crontabItem.setMetaId(metaId); // 保存metaId执行时从数据库读取scriptPath
logger.info("更新任务 - id: {}, metaId: {}, name: {}, category: {}, defaultRecipient: {}",
crontabItem.getID(), metaId, taskMeta.getName(), taskMeta.getCategory(),
crontabItem.getId(), metaId, taskMeta.getName(), taskMeta.getCategory(),
crontabItem.getDefaultRecipient());
// 调用带接收人更新的方法

View File

@@ -46,7 +46,7 @@ public class SchedulerManager {
*/
public void scheduleTask(TbCrontabTask task) {
try {
String taskId = task.getID();
String taskId = task.getId();
// 如果任务已经在调度中,先取消
if (scheduledTasks.containsKey(taskId)) {
@@ -79,7 +79,7 @@ public class SchedulerManager {
*/
public void unscheduleTask(TbCrontabTask task) {
try {
String taskId = task.getID();
String taskId = task.getId();
ScheduledFuture<?> future = scheduledTasks.get(taskId);
if (future != null) {

View File

@@ -46,7 +46,7 @@ public class TaskExecutor {
public void executeTask(TbCrontabTask task) {
Date startTime = new Date();
TbCrontabLog log = new TbCrontabLog();
log.setID(IDUtils.generateID());
log.setId(IDUtils.generateID());
log.setTaskId(task.getTaskId());
log.setTaskName(task.getTaskName());
log.setTaskGroup(task.getTaskGroup());
@@ -159,7 +159,7 @@ public class TaskExecutor {
// 注入taskId、logId和metaId
params.put("taskId", task.getTaskId());
params.put("logId", log.getID());
params.put("logId", log.getId());
if (task.getMetaId() != null) {
params.put("metaId", task.getMetaId());
}

View File

@@ -76,7 +76,7 @@ public class CrontabServiceImpl implements CrontabService {
}
// 生成ID
task.setID(IDUtils.generateID());
task.setId(IDUtils.generateID());
task.setTaskId(IDUtils.generateID());
task.setCreateTime(new Date());
task.setDeleted(false);
@@ -134,7 +134,7 @@ public class CrontabServiceImpl implements CrontabService {
try {
TbCrontabTask task = request.getTask();
TbSysUser user = LoginUtil.getCurrentUser();
task.setCreator(user.getID());
task.setCreator(user.getId());
// 1. 创建任务
ResultDomain<TbCrontabTask> createResult = createTask(task);
if (!createResult.isSuccess()) {

View File

@@ -68,7 +68,7 @@ public class DataCollectionItemServiceImpl implements DataCollectionItemService
}
// 生成ID
item.setID(IDUtils.generateID());
item.setId(IDUtils.generateID());
item.setCreateTime(new Date());
item.setDeleted(false);
@@ -118,7 +118,7 @@ public class DataCollectionItemServiceImpl implements DataCollectionItemService
}
String logId = itemList.get(0).getLogId();
TbCrontabLog log = new TbCrontabLog();
log.setID(logId);
log.setId(logId);
log.setExecuteStatus(1);
log.setExecuteMessage("爬取成功,共" + itemList.size() + "条,新增" + successCount + "");
int i = logMapper.updateLog(log);
@@ -137,7 +137,7 @@ public class DataCollectionItemServiceImpl implements DataCollectionItemService
public ResultDomain<TbDataCollectionItem> updateItem(TbDataCollectionItem item) {
ResultDomain<TbDataCollectionItem> resultDomain = new ResultDomain<>();
try {
if (item.getID() == null) {
if (item.getId() == null) {
resultDomain.fail("采集项ID不能为空");
return resultDomain;
}
@@ -146,7 +146,7 @@ public class DataCollectionItemServiceImpl implements DataCollectionItemService
int result = itemMapper.updateById(item);
if (result > 0) {
logger.info("更新采集项成功: {}", item.getID());
logger.info("更新采集项成功: {}", item.getId());
resultDomain.success("更新采集项成功", item);
} else {
resultDomain.fail("更新采集项失败");

Some files were not shown because too many files have changed in this diff Show More