Compare commits

..

24 Commits

Author SHA1 Message Date
41795c7c77 dify更新 2025-12-05 15:33:06 +08:00
1f243f977a aiagent icon样式修改 2025-12-04 15:31:45 +08:00
ed4780d6c2 修改样式 2025-12-04 14:23:49 +08:00
5b3b55cf10 导航栏特殊列 2025-12-04 11:00:20 +08:00
c37cbe0054 样式部分修改 2025-12-04 10:44:46 +08:00
80ddcc96d3 宽度修正 2025-12-02 10:58:15 +08:00
0304804057 字体 2025-12-02 10:29:25 +08:00
9570745a94 字体,样式宽度修改 2025-12-01 18:37:43 +08:00
241807325b gitignore更新 2025-12-01 17:02:43 +08:00
7d62f3a9ed 转移字符渲染 2025-12-01 14:56:14 +08:00
3b468e3177 更新打包 2025-12-01 14:51:14 +08:00
f6849b33c3 更新id 2025-12-01 14:01:04 +08:00
1335959881 工作流修改 2025-12-01 13:39:16 +08:00
a5db05fba6 更新 2025-12-01 10:33:06 +08:00
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
209 changed files with 2318 additions and 1084 deletions

32
.gitignore vendored
View File

@@ -5,4 +5,34 @@ build_output
docker/schoolNews/volumes/ docker/schoolNews/volumes/
docker/schoolNews/crawler docker/schoolNews/crawler
docker.zip docker.zip
docker/dify/volumes # docker/dify/volumes
docker/dify/volumes/app/storage/*
docker/dify/volumes/certbot/*
docker/dify/volumes/db/data/*
docker/dify/volumes/redis/data/*
docker/dify/volumes/weaviate/*
docker/dify/volumes/qdrant/*
docker/dify/tidb/volumes/*
docker/dify/volumes/etcd/*
docker/dify/volumes/minio/*
docker/dify/volumes/milvus/*
docker/dify/volumes/chroma/*
docker/dify/volumes/opensearch/data/*
docker/dify/volumes/myscale/data/*
docker/dify/volumes/myscale/log/*
docker/dify/volumes/unstructured/*
docker/dify/volumes/pgvector/data/*
docker/dify/volumes/pgvecto_rs/data/*
docker/dify/volumes/couchbase/*
docker/dify/volumes/oceanbase/*
docker/dify/volumes/plugin_daemon/*
docker/dify/volumes/matrixone/*
docker/dify/volumes/mysql/*
docker/dify/volumes/seekdb/*
!docker/dify/volumes/oceanbase/init.d
docker/dify/nginx/conf.d/default.conf
docker/dify/nginx/ssl/*
!docker/dify/nginx/ssl/.gitkeep
docker/dify/middleware.env
docker/dify/docker-compose.override.yaml

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

View File

@@ -1502,7 +1502,7 @@ networks:
# create a network between sandbox, api and ssrf_proxy, and can not access outside. # create a network between sandbox, api and ssrf_proxy, and can not access outside.
ssrf_proxy_network: ssrf_proxy_network:
driver: bridge driver: bridge
internal: true # 修改为false以允许访问外部网络如192.168.0.64 internal: true
milvus: milvus:
driver: bridge driver: bridge
opensearch-net: opensearch-net:

View File

@@ -1,58 +0,0 @@
# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration.
server {
listen 80;
server_name _;
location /console/api {
proxy_pass http://api:5001;
include proxy.conf;
}
location /api {
proxy_pass http://api:5001;
include proxy.conf;
}
location /v1 {
proxy_pass http://api:5001;
include proxy.conf;
}
location /files {
proxy_pass http://api:5001;
include proxy.conf;
}
location /explore {
proxy_pass http://web:3000;
include proxy.conf;
}
location /e/ {
proxy_pass http://plugin_daemon:5002;
proxy_set_header Dify-Hook-Url $scheme://$host$request_uri;
include proxy.conf;
}
location / {
proxy_pass http://web:3000;
include proxy.conf;
}
location /mcp {
proxy_pass http://api:5001;
include proxy.conf;
}
location /triggers {
proxy_pass http://api:5001;
include proxy.conf;
}
# placeholder for acme challenge location
# placeholder for https config defined in https.conf.template
}

View File

@@ -0,0 +1,17 @@
<clickhouse>
<users>
<default>
<password></password>
<networks>
<ip>::1</ip> <!-- change to ::/0 to allow access from all addresses -->
<ip>127.0.0.1</ip>
<ip>10.0.0.0/8</ip>
<ip>172.16.0.0/12</ip>
<ip>192.168.0.0/16</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
</default>
</users>
</clickhouse>

View File

@@ -0,0 +1 @@
ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;

View File

@@ -0,0 +1,222 @@
---
# Copyright OpenSearch Contributors
# SPDX-License-Identifier: Apache-2.0
# Description:
# Default configuration for OpenSearch Dashboards
# OpenSearch Dashboards is served by a back end server. This setting specifies the port to use.
# server.port: 5601
# Specifies the address to which the OpenSearch Dashboards server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
# server.host: "localhost"
# Enables you to specify a path to mount OpenSearch Dashboards at if you are running behind a proxy.
# Use the `server.rewriteBasePath` setting to tell OpenSearch Dashboards if it should remove the basePath
# from requests it receives, and to prevent a deprecation warning at startup.
# This setting cannot end in a slash.
# server.basePath: ""
# Specifies whether OpenSearch Dashboards should rewrite requests that are prefixed with
# `server.basePath` or require that they are rewritten by your reverse proxy.
# server.rewriteBasePath: false
# The maximum payload size in bytes for incoming server requests.
# server.maxPayloadBytes: 1048576
# The OpenSearch Dashboards server's name. This is used for display purposes.
# server.name: "your-hostname"
# The URLs of the OpenSearch instances to use for all your queries.
# opensearch.hosts: ["http://localhost:9200"]
# OpenSearch Dashboards uses an index in OpenSearch to store saved searches, visualizations and
# dashboards. OpenSearch Dashboards creates a new index if the index doesn't already exist.
# opensearchDashboards.index: ".opensearch_dashboards"
# The default application to load.
# opensearchDashboards.defaultAppId: "home"
# Setting for an optimized healthcheck that only uses the local OpenSearch node to do Dashboards healthcheck.
# This settings should be used for large clusters or for clusters with ingest heavy nodes.
# It allows Dashboards to only healthcheck using the local OpenSearch node rather than fan out requests across all nodes.
#
# It requires the user to create an OpenSearch node attribute with the same name as the value used in the setting
# This node attribute should assign all nodes of the same cluster an integer value that increments with each new cluster that is spun up
# e.g. in opensearch.yml file you would set the value to a setting using node.attr.cluster_id:
# Should only be enabled if there is a corresponding node attribute created in your OpenSearch config that matches the value here
# opensearch.optimizedHealthcheckId: "cluster_id"
# If your OpenSearch is protected with basic authentication, these settings provide
# the username and password that the OpenSearch Dashboards server uses to perform maintenance on the OpenSearch Dashboards
# index at startup. Your OpenSearch Dashboards users still need to authenticate with OpenSearch, which
# is proxied through the OpenSearch Dashboards server.
# opensearch.username: "opensearch_dashboards_system"
# opensearch.password: "pass"
# Enables SSL and paths to the PEM-format SSL certificate and SSL key files, respectively.
# These settings enable SSL for outgoing requests from the OpenSearch Dashboards server to the browser.
# server.ssl.enabled: false
# server.ssl.certificate: /path/to/your/server.crt
# server.ssl.key: /path/to/your/server.key
# Optional settings that provide the paths to the PEM-format SSL certificate and key files.
# These files are used to verify the identity of OpenSearch Dashboards to OpenSearch and are required when
# xpack.security.http.ssl.client_authentication in OpenSearch is set to required.
# opensearch.ssl.certificate: /path/to/your/client.crt
# opensearch.ssl.key: /path/to/your/client.key
# Optional setting that enables you to specify a path to the PEM file for the certificate
# authority for your OpenSearch instance.
# opensearch.ssl.certificateAuthorities: [ "/path/to/your/CA.pem" ]
# To disregard the validity of SSL certificates, change this setting's value to 'none'.
# opensearch.ssl.verificationMode: full
# Time in milliseconds to wait for OpenSearch to respond to pings. Defaults to the value of
# the opensearch.requestTimeout setting.
# opensearch.pingTimeout: 1500
# Time in milliseconds to wait for responses from the back end or OpenSearch. This value
# must be a positive integer.
# opensearch.requestTimeout: 30000
# List of OpenSearch Dashboards client-side headers to send to OpenSearch. To send *no* client-side
# headers, set this value to [] (an empty list).
# opensearch.requestHeadersWhitelist: [ authorization ]
# Header names and values that are sent to OpenSearch. Any custom headers cannot be overwritten
# by client-side headers, regardless of the opensearch.requestHeadersWhitelist configuration.
# opensearch.customHeaders: {}
# Time in milliseconds for OpenSearch to wait for responses from shards. Set to 0 to disable.
# opensearch.shardTimeout: 30000
# Logs queries sent to OpenSearch. Requires logging.verbose set to true.
# opensearch.logQueries: false
# Specifies the path where OpenSearch Dashboards creates the process ID file.
# pid.file: /var/run/opensearchDashboards.pid
# Enables you to specify a file where OpenSearch Dashboards stores log output.
# logging.dest: stdout
# Set the value of this setting to true to suppress all logging output.
# logging.silent: false
# Set the value of this setting to true to suppress all logging output other than error messages.
# logging.quiet: false
# Set the value of this setting to true to log all events, including system usage information
# and all requests.
# logging.verbose: false
# Set the interval in milliseconds to sample system and process performance
# metrics. Minimum is 100ms. Defaults to 5000.
# ops.interval: 5000
# Specifies locale to be used for all localizable strings, dates and number formats.
# Supported languages are the following: English - en , by default , Chinese - zh-CN .
# i18n.locale: "en"
# Set the allowlist to check input graphite Url. Allowlist is the default check list.
# vis_type_timeline.graphiteAllowedUrls: ['https://www.hostedgraphite.com/UID/ACCESS_KEY/graphite']
# Set the blocklist to check input graphite Url. Blocklist is an IP list.
# Below is an example for reference
# vis_type_timeline.graphiteBlockedIPs: [
# //Loopback
# '127.0.0.0/8',
# '::1/128',
# //Link-local Address for IPv6
# 'fe80::/10',
# //Private IP address for IPv4
# '10.0.0.0/8',
# '172.16.0.0/12',
# '192.168.0.0/16',
# //Unique local address (ULA)
# 'fc00::/7',
# //Reserved IP address
# '0.0.0.0/8',
# '100.64.0.0/10',
# '192.0.0.0/24',
# '192.0.2.0/24',
# '198.18.0.0/15',
# '192.88.99.0/24',
# '198.51.100.0/24',
# '203.0.113.0/24',
# '224.0.0.0/4',
# '240.0.0.0/4',
# '255.255.255.255/32',
# '::/128',
# '2001:db8::/32',
# 'ff00::/8',
# ]
# vis_type_timeline.graphiteBlockedIPs: []
# opensearchDashboards.branding:
# logo:
# defaultUrl: ""
# darkModeUrl: ""
# mark:
# defaultUrl: ""
# darkModeUrl: ""
# loadingLogo:
# defaultUrl: ""
# darkModeUrl: ""
# faviconUrl: ""
# applicationTitle: ""
# Set the value of this setting to true to capture region blocked warnings and errors
# for your map rendering services.
# map.showRegionBlockedWarning: false%
# Set the value of this setting to false to suppress search usage telemetry
# for reducing the load of OpenSearch cluster.
# data.search.usageTelemetry.enabled: false
# 2.4 renames 'wizard.enabled: false' to 'vis_builder.enabled: false'
# Set the value of this setting to false to disable VisBuilder
# functionality in Visualization.
# vis_builder.enabled: false
# 2.4 New Experimental Feature
# Set the value of this setting to true to enable the experimental multiple data source
# support feature. Use with caution.
# data_source.enabled: false
# Set the value of these settings to customize crypto materials to encryption saved credentials
# in data sources.
# data_source.encryption.wrappingKeyName: 'changeme'
# data_source.encryption.wrappingKeyNamespace: 'changeme'
# data_source.encryption.wrappingKey: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
# 2.6 New ML Commons Dashboards Feature
# Set the value of this setting to true to enable the ml commons dashboards
# ml_commons_dashboards.enabled: false
# 2.12 New experimental Assistant Dashboards Feature
# Set the value of this setting to true to enable the assistant dashboards
# assistant.chat.enabled: false
# 2.13 New Query Assistant Feature
# Set the value of this setting to false to disable the query assistant
# observability.query_assist.enabled: false
# 2.14 Enable Ui Metric Collectors in Usage Collector
# Set the value of this setting to true to enable UI Metric collections
# usageCollection.uiMetric.enabled: false
opensearch.hosts: [https://localhost:9200]
opensearch.ssl.verificationMode: none
opensearch.username: admin
opensearch.password: 'Qazwsxedc!@#123'
opensearch.requestHeadersWhitelist: [authorization, securitytenant]
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.preferred: [Private, Global]
opensearch_security.readonly_mode.roles: [kibana_read_only]
# Use this setting if you are running opensearch-dashboards without https
opensearch_security.cookie.secure: false
server.host: '0.0.0.0'

View File

@@ -0,0 +1,14 @@
app:
port: 8194
debug: True
key: dify-sandbox
max_workers: 4
max_requests: 50
worker_timeout: 5
python_path: /usr/local/bin/python3
enable_network: True # please make sure there is no network risk in your environment
allowed_syscalls: # please leave it empty if you have no idea how seccomp works
proxy:
socks5: ''
http: ''
https: ''

View File

@@ -0,0 +1,35 @@
app:
port: 8194
debug: True
key: dify-sandbox
max_workers: 4
max_requests: 50
worker_timeout: 5
python_path: /usr/local/bin/python3
python_lib_path:
- /usr/local/lib/python3.10
- /usr/lib/python3.10
- /usr/lib/python3
- /usr/lib/x86_64-linux-gnu
- /etc/ssl/certs/ca-certificates.crt
- /etc/nsswitch.conf
- /etc/hosts
- /etc/resolv.conf
- /run/systemd/resolve/stub-resolv.conf
- /run/resolvconf/resolv.conf
- /etc/localtime
- /usr/share/zoneinfo
- /etc/timezone
# add more paths if needed
python_pip_mirror_url: https://pypi.tuna.tsinghua.edu.cn/simple
nodejs_path: /usr/local/bin/node
enable_network: True
allowed_syscalls:
- 1
- 2
- 3
# add all the syscalls which you require
proxy:
socks5: ''
http: ''
https: ''

View File

@@ -7,7 +7,7 @@ app:
use_icon_as_answer_icon: false use_icon_as_answer_icon: false
dependencies: [] dependencies: []
kind: app kind: app
version: 0.4.0 version: 0.5.0
workflow: workflow:
conversation_variables: [] conversation_variables: []
environment_variables: [] environment_variables: []
@@ -136,7 +136,16 @@ workflow:
required: true required: true
type: text-input type: text-input
variable: query 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' id: '1747125462435'
position: position:
x: 80 x: 80
@@ -250,7 +259,7 @@ workflow:
}' }'
type: json type: json
desc: '' desc: ''
headers: 'Authorization:Bearer dataset-HeDK9gHBqPnI4rBZ2q2Hm7rV headers: 'Authorization:Bearer {{#1747125462435.dataset_apikey#}}
Content-Type:application/json' Content-Type:application/json'
isInIteration: true isInIteration: true
@@ -260,7 +269,7 @@ workflow:
params: '' params: ''
retry_config: retry_config:
max_retries: 3 max_retries: 3
retry_enabled: true retry_enabled: false
retry_interval: 100 retry_interval: 100
selected: false selected: false
ssl_verify: true ssl_verify: true
@@ -270,9 +279,9 @@ workflow:
max_write_timeout: 0 max_write_timeout: 0
title: HTTP 请求 title: HTTP 请求
type: http-request type: http-request
url: http://192.168.0.64:7700/v1/datasets/{{#1747125586388.item#}}/retrieve url: http://nginx:80/v1/datasets/{{#1747125586388.item#}}/retrieve
variables: [] variables: []
height: 157 height: 111
id: '1747125795256' id: '1747125795256'
parentId: '1747125586388' parentId: '1747125586388'
position: position:
@@ -351,7 +360,7 @@ workflow:
type: custom type: custom
width: 242 width: 242
viewport: viewport:
x: 116.27083894320822 x: -967.224047730792
y: 126.27330841264018 y: 147.70051636546336
zoom: 0.8705505632961247 zoom: 0.8705505632961247
rag_pipeline_variables: [] rag_pipeline_variables: []

View File

@@ -9,17 +9,25 @@ dependencies:
- current_identifier: null - current_identifier: null
type: marketplace type: marketplace
value: value:
marketplace_plugin_unique_identifier: langgenius/siliconflow:0.0.34@1c203017d8ef49fd9152696a42e6dc71ecf272b115d8caf731c99ee0d2956dce marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
version: null version: null
- current_identifier: null - current_identifier: null
type: marketplace type: marketplace
value: value:
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69 marketplace_plugin_unique_identifier: langgenius/ollama:0.1.0@7c18c74b94a855de83aa66f376939d47b96a49b6dbb6904b46b267cb0213396e
version: null version: null
kind: app kind: app
version: 0.4.0 version: 0.5.0
workflow: workflow:
conversation_variables: conversation_variables:
- description: ''
id: 71e3f805-8445-46b1-bd43-8af398234527
name: dataset_apikey
selector:
- conversation
- dataset_apikey
value: ''
value_type: string
- description: '' - description: ''
id: e18aacca-16a2-4d93-80c4-5a85ead53ae4 id: e18aacca-16a2-4d93-80c4-5a85ead53ae4
name: datasets name: datasets
@@ -225,19 +233,6 @@ workflow:
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 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: - data:
isInIteration: false isInIteration: false
isInLoop: false isInLoop: false
@@ -257,6 +252,7 @@ workflow:
sourceType: code sourceType: code
targetType: iteration targetType: iteration
id: 1762510470105-source-1762339969303-target id: 1762510470105-source-1762339969303-target
selected: false
source: '1762510470105' source: '1762510470105'
sourceHandle: source sourceHandle: source
target: '1762339969303' target: '1762339969303'
@@ -268,21 +264,11 @@ workflow:
isInLoop: false isInLoop: false
sourceType: if-else sourceType: if-else
targetType: tool targetType: tool
id: 1762421892949-true-1762511001734-target id: 1762421892949-true-1764314675268-target
selected: false
source: '1762421892949' source: '1762421892949'
sourceHandle: 'true' sourceHandle: 'true'
target: '1762511001734' target: '1764314675268'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: assigner
targetType: tool
id: 1762509024795-source-1762511001734-target
source: '1762509024795'
sourceHandle: source
target: '1762511001734'
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 zIndex: 0
@@ -290,13 +276,76 @@ workflow:
isInLoop: false isInLoop: false
sourceType: tool sourceType: tool
targetType: code targetType: code
id: 1762511001734-source-1762510470105-target id: 1764314675268-source-1762510470105-target
source: '1762511001734' selected: false
source: '1764314675268'
sourceHandle: source sourceHandle: source
target: '1762510470105' target: '1762510470105'
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 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: nodes:
- data: - data:
selected: false selected: false
@@ -321,14 +370,32 @@ workflow:
required: true required: true
type: text-input type: text-input
variable: datasets 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' id: '1762339910800'
position: position:
x: -1233.1402302396395 x: -1704.106555788423
y: 149.5782401176896 y: 174.193204867626
positionAbsolute: positionAbsolute:
x: -1233.1402302396395 x: -1704.106555788423
y: 149.5782401176896 y: 174.193204867626
selected: false selected: false
sourcePosition: right sourcePosition: right
targetPosition: left targetPosition: left
@@ -354,8 +421,8 @@ workflow:
model: model:
completion_params: {} completion_params: {}
mode: chat mode: chat
name: deepseek-ai/DeepSeek-V3 name: qwen-14b
provider: langgenius/siliconflow/siliconflow provider: langgenius/ollama/ollama
prompt_config: prompt_config:
jinja2_variables: jinja2_variables:
- value_selector: - value_selector:
@@ -370,10 +437,14 @@ workflow:
- '1762510470105' - '1762510470105'
- result - result
variable: result variable: result
- value_selector:
- '1762339910800'
- promt
variable: promt
prompt_template: prompt_template:
- edition_type: jinja2 - edition_type: jinja2
id: 5d50499d-b81d-43aa-a891-38fd349bd754 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\r\n{% if searchData %}\r\n结合 {{ searchData }} 回答用户\r\n{% endif %}\r\
\n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n" \n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n"
role: system role: system
@@ -394,7 +465,7 @@ workflow:
- id: 23264213-e421-4449-b666-a55a0e39e561 - id: 23264213-e421-4449-b666-a55a0e39e561
role: user role: user
text: '' text: ''
selected: false selected: true
title: LLM title: LLM
type: llm type: llm
vision: vision:
@@ -407,7 +478,7 @@ workflow:
positionAbsolute: positionAbsolute:
x: 2674.6343495125943 x: 2674.6343495125943
y: 75.75635633814841 y: 75.75635633814841
selected: false selected: true
sourcePosition: right sourcePosition: right
targetPosition: left targetPosition: left
type: custom type: custom
@@ -496,7 +567,7 @@ workflow:
variable_selector: variable_selector:
- '1762339969303' - '1762339969303'
- item - item
height: 92 height: 104
id: '1762339981310' id: '1762339981310'
parentId: '1762339969303' parentId: '1762339969303'
position: position:
@@ -958,7 +1029,7 @@ workflow:
type: code type: code
variables: variables:
- value_selector: - value_selector:
- '1762511001734' - '1764314675268'
- text - text
value_type: string value_type: string
variable: text variable: text
@@ -1034,10 +1105,44 @@ workflow:
scope: null scope: null
template: null template: null
type: string 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: params:
dataset_apikey: ''
dataset_ids: '' dataset_ids: ''
query: '' 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_name: 动态知识库检索
provider_type: workflow provider_type: workflow
selected: false selected: false
@@ -1048,6 +1153,9 @@ workflow:
tool_name: dynamic_dataset tool_name: dynamic_dataset
tool_node_version: '2' tool_node_version: '2'
tool_parameters: tool_parameters:
dataset_apikey:
type: mixed
value: '{{#conversation.dataset_apikey#}}'
dataset_ids: dataset_ids:
type: mixed type: mixed
value: '{{#conversation.datasets#}}' value: '{{#conversation.datasets#}}'
@@ -1056,20 +1164,77 @@ workflow:
value: '{{#sys.query#}}' value: '{{#sys.query#}}'
type: tool type: tool
height: 52 height: 52
id: '1762511001734' id: '1764314675268'
position: position:
x: -142.91348174874167 x: -165.1249185156642
y: -247.51043561574136 y: -247.5444668446392
positionAbsolute: positionAbsolute:
x: -142.91348174874167 x: -165.1249185156642
y: -247.51043561574136 y: -247.5444668446392
selected: true 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 sourcePosition: right
targetPosition: left targetPosition: left
type: custom type: custom
width: 242 width: 242
viewport: viewport:
x: 863.6452676587132 x: -1068.6187404167313
y: 446.19950772630614 y: 347.5222255720734
zoom: 0.9236555375410279 zoom: 0.6093853943072881
rag_pipeline_variables: [] rag_pipeline_variables: []

View File

@@ -400,6 +400,8 @@ class RmrbCrawler(BaseCrawler):
src = str(src) # 转换为字符串 src = str(src) # 转换为字符串
if not src.startswith("http"): if not src.startswith("http"):
src = self.config.base_url + src 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}' />" content = f"<img style='{p_style}' src='{src}' />"
elif p.find('video'): elif p.find('video'):

View File

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

View File

@@ -9,17 +9,25 @@ dependencies:
- current_identifier: null - current_identifier: null
type: marketplace type: marketplace
value: value:
marketplace_plugin_unique_identifier: langgenius/siliconflow:0.0.34@1c203017d8ef49fd9152696a42e6dc71ecf272b115d8caf731c99ee0d2956dce marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
version: null version: null
- current_identifier: null - current_identifier: null
type: marketplace type: marketplace
value: value:
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69 marketplace_plugin_unique_identifier: langgenius/ollama:0.1.0@7c18c74b94a855de83aa66f376939d47b96a49b6dbb6904b46b267cb0213396e
version: null version: null
kind: app kind: app
version: 0.4.0 version: 0.5.0
workflow: workflow:
conversation_variables: conversation_variables:
- description: ''
id: 71e3f805-8445-46b1-bd43-8af398234527
name: dataset_apikey
selector:
- conversation
- dataset_apikey
value: ''
value_type: string
- description: '' - description: ''
id: e18aacca-16a2-4d93-80c4-5a85ead53ae4 id: e18aacca-16a2-4d93-80c4-5a85ead53ae4
name: datasets name: datasets
@@ -225,19 +233,6 @@ workflow:
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 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: - data:
isInIteration: false isInIteration: false
isInLoop: false isInLoop: false
@@ -257,6 +252,7 @@ workflow:
sourceType: code sourceType: code
targetType: iteration targetType: iteration
id: 1762510470105-source-1762339969303-target id: 1762510470105-source-1762339969303-target
selected: false
source: '1762510470105' source: '1762510470105'
sourceHandle: source sourceHandle: source
target: '1762339969303' target: '1762339969303'
@@ -268,21 +264,11 @@ workflow:
isInLoop: false isInLoop: false
sourceType: if-else sourceType: if-else
targetType: tool targetType: tool
id: 1762421892949-true-1762511001734-target id: 1762421892949-true-1764314675268-target
selected: false
source: '1762421892949' source: '1762421892949'
sourceHandle: 'true' sourceHandle: 'true'
target: '1762511001734' target: '1764314675268'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: assigner
targetType: tool
id: 1762509024795-source-1762511001734-target
source: '1762509024795'
sourceHandle: source
target: '1762511001734'
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 zIndex: 0
@@ -290,13 +276,76 @@ workflow:
isInLoop: false isInLoop: false
sourceType: tool sourceType: tool
targetType: code targetType: code
id: 1762511001734-source-1762510470105-target id: 1764314675268-source-1762510470105-target
source: '1762511001734' selected: false
source: '1764314675268'
sourceHandle: source sourceHandle: source
target: '1762510470105' target: '1762510470105'
targetHandle: target targetHandle: target
type: custom type: custom
zIndex: 0 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: nodes:
- data: - data:
selected: false selected: false
@@ -321,14 +370,32 @@ workflow:
required: true required: true
type: text-input type: text-input
variable: datasets 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' id: '1762339910800'
position: position:
x: -1233.1402302396395 x: -1704.106555788423
y: 149.5782401176896 y: 174.193204867626
positionAbsolute: positionAbsolute:
x: -1233.1402302396395 x: -1704.106555788423
y: 149.5782401176896 y: 174.193204867626
selected: false selected: false
sourcePosition: right sourcePosition: right
targetPosition: left targetPosition: left
@@ -354,8 +421,8 @@ workflow:
model: model:
completion_params: {} completion_params: {}
mode: chat mode: chat
name: deepseek-ai/DeepSeek-V3 name: qwen-14b
provider: langgenius/siliconflow/siliconflow provider: langgenius/ollama/ollama
prompt_config: prompt_config:
jinja2_variables: jinja2_variables:
- value_selector: - value_selector:
@@ -370,10 +437,14 @@ workflow:
- '1762510470105' - '1762510470105'
- result - result
variable: result variable: result
- value_selector:
- '1762339910800'
- promt
variable: promt
prompt_template: prompt_template:
- edition_type: jinja2 - edition_type: jinja2
id: 5d50499d-b81d-43aa-a891-38fd349bd754 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\r\n{% if searchData %}\r\n结合 {{ searchData }} 回答用户\r\n{% endif %}\r\
\n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n" \n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n"
role: system role: system
@@ -394,7 +465,7 @@ workflow:
- id: 23264213-e421-4449-b666-a55a0e39e561 - id: 23264213-e421-4449-b666-a55a0e39e561
role: user role: user
text: '' text: ''
selected: false selected: true
title: LLM title: LLM
type: llm type: llm
vision: vision:
@@ -407,7 +478,7 @@ workflow:
positionAbsolute: positionAbsolute:
x: 2674.6343495125943 x: 2674.6343495125943
y: 75.75635633814841 y: 75.75635633814841
selected: false selected: true
sourcePosition: right sourcePosition: right
targetPosition: left targetPosition: left
type: custom type: custom
@@ -496,7 +567,7 @@ workflow:
variable_selector: variable_selector:
- '1762339969303' - '1762339969303'
- item - item
height: 92 height: 104
id: '1762339981310' id: '1762339981310'
parentId: '1762339969303' parentId: '1762339969303'
position: position:
@@ -958,7 +1029,7 @@ workflow:
type: code type: code
variables: variables:
- value_selector: - value_selector:
- '1762511001734' - '1764314675268'
- text - text
value_type: string value_type: string
variable: text variable: text
@@ -1034,10 +1105,44 @@ workflow:
scope: null scope: null
template: null template: null
type: string 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: params:
dataset_apikey: ''
dataset_ids: '' dataset_ids: ''
query: '' 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_name: 动态知识库检索
provider_type: workflow provider_type: workflow
selected: false selected: false
@@ -1048,6 +1153,9 @@ workflow:
tool_name: dynamic_dataset tool_name: dynamic_dataset
tool_node_version: '2' tool_node_version: '2'
tool_parameters: tool_parameters:
dataset_apikey:
type: mixed
value: '{{#conversation.dataset_apikey#}}'
dataset_ids: dataset_ids:
type: mixed type: mixed
value: '{{#conversation.datasets#}}' value: '{{#conversation.datasets#}}'
@@ -1056,20 +1164,77 @@ workflow:
value: '{{#sys.query#}}' value: '{{#sys.query#}}'
type: tool type: tool
height: 52 height: 52
id: '1762511001734' id: '1764314675268'
position: position:
x: -142.91348174874167 x: -165.1249185156642
y: -247.51043561574136 y: -247.5444668446392
positionAbsolute: positionAbsolute:
x: -142.91348174874167 x: -165.1249185156642
y: -247.51043561574136 y: -247.5444668446392
selected: true 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 sourcePosition: right
targetPosition: left targetPosition: left
type: custom type: custom
width: 242 width: 242
viewport: viewport:
x: 863.6452676587132 x: -1068.6187404167313
y: 446.19950772630614 y: 347.5222255720734
zoom: 0.9236555375410279 zoom: 0.6093853943072881
rag_pipeline_variables: [] rag_pipeline_variables: []

View File

@@ -226,15 +226,10 @@ CREATE TABLE `tb_ai_usage_statistics` (
INSERT INTO `tb_ai_agent_config` INSERT INTO `tb_ai_agent_config`
(`id`, `name`, `avatar`, `description`, `connect_internet`,`dify_api_key`, `status`, `creator`, `create_time`) (`id`, `name`, `avatar`, `description`, `connect_internet`,`dify_api_key`, `status`, `creator`, `create_time`)
VALUES VALUES
('agent_default_001', '校园助手', NULL, '我是您的智能校园助手,可以帮助您解答校园相关问题', ('agent_default_001', '校园助手', NULL, '你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。',
0, 'app-fwOqGFLTsZtekCQYlOmj9f8x', 1, '1', NOW()); 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小时一级) -- 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 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), ('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), ('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), ('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()), ('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()), ('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()), ('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()), ('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()); ('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()), -- 权限ID分配规则每个模块预留100个ID
('1','perm_system_manage', '系统管理', 'system:manage', '系统管理权限', 'module_system', '1', now()), -- 9000-9999: 前端用户权限(默认权限)
('2','perm_system_dept_manage', '系统部门查看', 'system:dept:manage', '系统部门查看权限', 'module_system', '1', now()), -- 100-999: 超级管理员专属权限
('3','perm_system_menu_manage', '系统菜单查看', 'system:menu:manage', '系统菜单查看权限', 'module_system', '1', now()), -- 1000-8999: 普通管理员权限
('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()), INSERT INTO `tb_sys_permission` (id, permission_id, name, code, description, module_id, creator, create_time) VALUES
('7','perm_system_module_manage', '系统模块查看', 'system:module:manage', '系统模块查看权限', 'module_system', '1', now()), -- ========== 前端用户权限 (9000-9999) ==========
('8','perm_news_manage', '新闻管理', 'news:manage', '新闻管理权限', 'module_news', '1', now()), -- 9000-9099: 默认权限和基础视图
('9','perm_news_article_add', '文章添加', 'news:manage', '文章添加权限', 'module_news', '1', now()), ('9000', 'perm_default', '默认权限', 'default', '所有登录用户的默认权限', 'module_system', '1', now()),
('10','perm_study_manage', '学习管理', 'study:manage', '学习管理权限', 'module_study', '1', now()), ('9001', 'perm_view_home', '首页访问', 'view:home', '访问首页视图权限', 'module_usercenter', '1', now()),
('10.1','perm_achievement_manage', '成就管理', 'achievement:manage', '成就管理权限', 'module_study', '1', now()), ('9002', 'perm_view_resource_hot', '热门资源访问', 'view:resource:hot', '访问热门资源视图权限', 'module_news', '1', now()),
('11','perm_ai_manage', 'AI管理', 'ai:manage', 'AI管理权限', 'module_ai', '1', now()), ('9003', 'perm_view_resource_center', '资源中心访问', 'view:resource:center', '访问资源中心视图权限', 'module_news', '1', now()),
('12','perm_usercenter_manage', '用户中心管理', 'usercenter:manage', '用户中心管理权限', 'module_usercenter', '1', now()), ('9004', 'perm_view_search', '搜索访问', 'view:search', '访问搜索视图权限', 'module_news', '1', now()),
('13','perm_file_manage', '件管理', 'file:manage', '文件管理权限', 'module_file', '1', now()), ('9005', 'perm_view_article_show', '章展示访问', 'view:article:show', '访问文章展示视图权限', 'module_news', '1', now()),
('14','perm_crontab_manage', '定时任务管理', 'crontab:manage', '定时任务管理权限', 'module_crontab', '1', now()),
('15','perm_crontab_execute', '定时任务执行', 'crontab:execute', '定时任务执行权限', 'module_crontab', '1', now()), -- 9100-9199: 学习计划相关
('16','perm_message_manage', '消息管理', 'message:manage', '消息管理权限(管理端)', 'module_message', '1', now()), ('9100', 'perm_view_study_tasks', '学习任务访问', 'view:study:tasks', '访问学习任务视图权限', 'module_study', '1', now()),
('17','perm_message_send', '消息发送', 'message:send', '消息发送权限', 'module_message', '1', now()), ('9101', 'perm_view_course_center', '课程中心访问', 'view:course:center', '访问课程中心视图权限', 'module_study', '1', now()),
('18','perm_message_view', '消息查看', 'message:view', '消息查看权限(用户端)', 'module_message', '1', now()), ('9102', 'perm_view_task_detail', '任务详情访问', 'view:task:detail', '访问任务详情视图权限', 'module_study', '1', now()),
('19','perm_sensitive_manage', '敏感词管理', 'sensitive:manage', '敏感词管理权限', 'module_sensitive', '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 INSERT INTO `tb_sys_role_permission` (id, role_id, permission_id, creator, create_time) VALUES
-- 前端用户权限 (9000-9999)
('1', 'superadmin', 'perm_default', '1', now()), ('1', 'superadmin', 'perm_default', '1', now()),
('2', 'superadmin', 'perm_system_manage', '1', now()), ('2', 'superadmin', 'perm_view_home', '1', now()),
('3', 'superadmin', 'perm_system_dept_manage', '1', now()), ('3', 'superadmin', 'perm_view_resource_hot', '1', now()),
('4', 'superadmin', 'perm_system_menu_manage', '1', now()), ('4', 'superadmin', 'perm_view_resource_center', '1', now()),
('5', 'superadmin', 'perm_system_permission_manage', '1', now()), ('5', 'superadmin', 'perm_view_search', '1', now()),
('6', 'superadmin', 'perm_system_role_manage', '1', now()), ('6', 'superadmin', 'perm_view_article_show', '1', now()),
('7', 'superadmin', 'perm_system_user_manage', '1', now()), ('7', 'superadmin', 'perm_view_study_tasks', '1', now()),
('8', 'superadmin', 'perm_system_module_manage', '1', now()), ('8', 'superadmin', 'perm_view_course_center', '1', now()),
('9', 'superadmin', 'perm_news_manage', '1', now()), ('9', 'superadmin', 'perm_view_task_detail', '1', now()),
('10', 'superadmin', 'perm_news_article_add', '1', now()), ('10', 'superadmin', 'perm_view_course_detail', '1', now()),
('11', 'superadmin', 'perm_study_manage', '1', now()), ('11', 'superadmin', 'perm_view_course_study', '1', now()),
('12', 'superadmin', 'perm_achievement_manage', '1', now()), ('12', 'superadmin', 'perm_view_learning_records', '1', now()),
('13', 'superadmin', 'perm_ai_manage', '1', now()), ('13', 'superadmin', 'perm_view_my_favorites', '1', now()),
('14', 'superadmin', 'perm_usercenter_manage', '1', now()), ('14', 'superadmin', 'perm_view_my_achievements', '1', now()),
('15', 'superadmin', 'perm_file_manage', '1', now()), ('15', 'superadmin', 'perm_view_personal_info', '1', now()),
('16', 'superadmin', 'perm_crontab_manage', '1', now()), ('16', 'superadmin', 'perm_view_account_settings', '1', now()),
('17', 'superadmin', 'perm_crontab_execute', '1', now()), ('17', 'superadmin', 'perm_view_article_add', '1', now()),
('18', 'superadmin', 'perm_message_manage', '1', now()), ('18', 'superadmin', 'perm_view_message_center', '1', now()),
('19', 'superadmin', 'perm_message_send', '1', now()), ('19', 'superadmin', 'perm_view_message_detail', '1', now()),
('20', 'superadmin', 'perm_message_view', '1', now()),
('21', 'superadmin', 'perm_sensitive_manage', '1', now()),
-- 管理员:拥有业务管理权限,但没有系统日志等系统管理权限 -- 超级管理员专属权限 (100-999)
('22', 'admin', 'perm_default', '1', now()), ('20', 'superadmin', 'perm_admin_overview', '1', now()),
('23', 'admin', 'perm_news_manage', '1', now()), ('21', 'superadmin', 'perm_admin_user_manage', '1', now()),
('24', 'admin', 'perm_news_article_add', '1', now()), ('22', 'superadmin', 'perm_admin_dept_manage', '1', now()),
('25', 'admin', 'perm_study_manage', '1', now()), ('23', 'superadmin', 'perm_admin_role_manage', '1', now()),
('26', 'admin', 'perm_achievement_manage', '1', now()), ('24', 'superadmin', 'perm_admin_menu_manage', '1', now()),
('27', 'admin', 'perm_ai_manage', '1', now()), ('25', 'superadmin', 'perm_admin_module_permission_manage', '1', now()),
('28', 'admin', 'perm_usercenter_manage', '1', now()), ('26', 'superadmin', 'perm_admin_system_logs', '1', now()),
('29', 'admin', 'perm_file_manage', '1', now()), ('27', 'superadmin', 'perm_admin_login_logs', '1', now()),
('30', 'admin', 'perm_message_manage', '1', now()), ('28', 'superadmin', 'perm_admin_system_config', '1', now()),
('31', 'admin', 'perm_message_send', '1', now()),
('32', 'admin', 'perm_message_view', '1', now()),
('33', 'admin', 'perm_sensitive_manage', '1', now()),
-- 自由角色:拥有用户视图相关的所有权限(前台用户权限) -- 普通管理员权限 (1000-8999)
('40', 'freedom', 'perm_default', '1', now()), ('29', 'superadmin', 'perm_admin_resource_manage', '1', now()),
('41', 'freedom', 'perm_news_article_add', '1', now()), ('30', 'superadmin', 'perm_admin_article_manage', '1', now()),
('42', 'freedom', 'perm_ai_manage', '1', now()), ('31', 'superadmin', 'perm_admin_banner_manage', '1', now()),
('43', 'freedom', 'perm_usercenter_manage', '1', now()), ('32', 'superadmin', 'perm_admin_tag_manage', '1', now()),
('44', 'freedom', 'perm_file_manage', '1', now()), ('33', 'superadmin', 'perm_admin_column_manage', '1', now()),
('45', 'freedom', 'perm_message_view', '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) -- 用户前端菜单 (100-699)
@@ -132,6 +303,7 @@ INSERT INTO `tb_sys_menu` VALUES
('402', 'menu_learning_records', '学习记录', 'menu_user_center', '/user-center/learning-records', 'user/user-center/LearningRecordsView', NULL, 1, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('402', 'menu_learning_records', '学习记录', 'menu_user_center', '/user-center/learning-records', 'user/user-center/LearningRecordsView', NULL, 1, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('403', 'menu_my_favorites', '我的收藏', 'menu_user_center', '/user-center/favorites', 'user/user-center/MyFavoritesView', NULL, 2, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('403', 'menu_my_favorites', '我的收藏', 'menu_user_center', '/user-center/favorites', 'user/user-center/MyFavoritesView', NULL, 2, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('404', 'menu_my_achievements', '我的成就', 'menu_user_center', '/user-center/achievements', 'user/user-center/MyAchievementsView', NULL, 3, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('404', 'menu_my_achievements', '我的成就', 'menu_user_center', '/user-center/achievements', 'user/user-center/MyAchievementsView', NULL, 3, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('650', 'menu_user_message_center', '消息中心', 'menu_user_center', '/user-center/message', 'user/message/MyMessageListView', NULL, 4, 0, 'NavigationLayout', '1', NULL, '2025-11-13 10:00:00', '2025-11-13 10:00:00', NULL, 0),
('500', 'menu_profile', '账号中心', 'menu_user_dropdown', '/profile', 'user/user-center/UserCenterLayout', NULL, 5, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('500', 'menu_profile', '账号中心', 'menu_user_dropdown', '/profile', 'user/user-center/UserCenterLayout', NULL, 5, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('501', 'menu_personal_info', '个人信息', 'menu_profile', '/profile/personal-info', 'user/user-center/profile/PersonalInfoView', NULL, 1, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('501', 'menu_personal_info', '个人信息', 'menu_profile', '/profile/personal-info', 'user/user-center/profile/PersonalInfoView', NULL, 1, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('502', 'menu_account_settings', '账号设置', 'menu_profile', '/profile/account-settings', 'user/user-center/profile/AccountSettingsView', NULL, 2, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('502', 'menu_account_settings', '账号设置', 'menu_profile', '/profile/account-settings', 'user/user-center/profile/AccountSettingsView', NULL, 2, 0, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
@@ -147,8 +319,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), ('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), ('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), ('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), ('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', '文章展示', '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), ('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), ('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), ('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), ('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),
@@ -173,77 +345,101 @@ INSERT INTO `tb_sys_menu` VALUES
('8004', 'menu_admin_system_task', '系统定时任务配置', 'menu_admin_crontab_manage', '/admin/manage/crontab/system-task', 'admin/manage/crontab/SystemTaskView', NULL, 4, 0, 'SidebarLayout', '1', NULL, '2025-11-25 13:45:00', '2025-11-25 13:45:00', NULL, 0), ('8004', 'menu_admin_system_task', '系统定时任务配置', 'menu_admin_crontab_manage', '/admin/manage/crontab/system-task', 'admin/manage/crontab/SystemTaskView', NULL, 4, 0, 'SidebarLayout', '1', NULL, '2025-11-25 13:45:00', '2025-11-25 13:45:00', NULL, 0),
-- 消息通知模块菜单 (9000-9999) -- 消息通知模块菜单 (9000-9999)
('9001', 'menu_admin_message_manage', '消息管理', NULL, '/admin/manage/message', 'admin/manage/message/MessageManageView', 'admin/notice.svg', 9, 0, 'SidebarLayout', '1', NULL, '2025-11-13 10:00:00', '2025-11-13 10:00:00', NULL, 0), ('9001', 'menu_admin_message_manage', '消息管理', NULL, '/admin/manage/message', 'admin/manage/message/MessageManageView', 'admin/notice.svg', 9, 0, 'SidebarLayout', '1', NULL, '2025-11-13 10:00:00', '2025-11-13 10:00:00', NULL, 0),
-- 用户端消息中心菜单 (650-699) -- 用户端消息详情菜单 (651)
('650', 'menu_user_message_center', '消息中心', NULL, '/user/message', 'user/message/MyMessageListView', NULL, 7, 1, 'NavigationLayout', '1', NULL, '2025-11-13 10:00:00', '2025-11-13 10:00:00', NULL, 0), ('651', 'menu_user_message_detail', '消息详情', 'menu_user_message_center', '/user-center/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);
('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 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()),
-- 后端管理菜单权限关联 -- ========== 前端用户菜单权限关联 (9000-9999) ==========
('200', 'perm_system_manage', 'menu_admin_overview', '1', now()), -- 基础视图
('201', 'perm_system_manage', 'menu_sys_manage', '1', now()), ('9001', 'perm_view_home', 'menu_home', '1', now()),
('203', 'perm_system_user_manage', 'menu_admin_user', '1', now()), ('9002', 'perm_view_resource_hot', 'menu_resource_hot', '1', now()),
('204', 'perm_system_dept_manage', 'menu_admin_dept', '1', now()), ('9003', 'perm_view_resource_center', 'menu_resource_center', '1', now()),
('205', 'perm_system_role_manage', 'menu_admin_role', '1', now()), ('9004', 'perm_view_search', 'menu_search', '1', now()),
('207', 'perm_system_menu_manage', 'menu_admin_menu', '1', now()), ('9005', 'perm_view_article_show', 'menu_article_show', '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()),
-- 定时任务管理菜单权限关联 -- 学习计划相关
('232', 'perm_crontab_manage', 'menu_admin_crontab_manage', '1', now()), ('9006', 'perm_default', 'menu_study_plan', '1', now()), -- 无View的导航菜单
('236', 'perm_crontab_manage', 'menu_admin_meta_email_default', '1', now()), ('9100', 'perm_view_study_tasks', 'menu_study_tasks', '1', now()),
('233', 'perm_crontab_manage', 'menu_admin_crontab_task', '1', now()), ('9101', 'perm_view_course_center', 'menu_course_center', '1', now()),
('234', 'perm_crontab_manage', 'menu_admin_crontab_log', '1', now()), ('9102', 'perm_view_task_detail', 'menu_task_detail', '1', now()),
('235', 'perm_crontab_manage', 'menu_admin_news_crawler', '1', now()), ('9103', 'perm_view_course_detail', 'menu_course_detail', '1', now()),
('252', 'perm_crontab_manage', 'menu_admin_system_task', '1', now()), ('9104', 'perm_view_course_study', 'menu_course_study', '1', now()),
-- 消息通知管理菜单权限关联 -- 用户中心相关
('240', 'perm_message_manage', 'menu_admin_message_manage', '1', now()), ('9007', 'perm_default', 'menu_user_dropdown', '1', now()), -- 无View的导航菜单
-- 用户端消息中心权限关联 ('9008', 'perm_default', 'menu_user_center', '1', now()), -- Layout菜单
('250', 'perm_default', 'menu_user_message_center', '1', now()), ('9200', 'perm_view_learning_records', 'menu_learning_records', '1', now()),
('251', 'perm_default', 'menu_user_message_detail', '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) { if (achievement.getId() == null) {
achievement.setID(IDUtils.generateID()); achievement.setId(IDUtils.generateID());
} }
if (achievement.getAchievementID() == null) { if (achievement.getAchievementID() == null) {
achievement.setAchievementID(IDUtils.generateID()); achievement.setAchievementID(IDUtils.generateID());
@@ -285,7 +285,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
return rd; return rd;
} }
String userID = user.getID(); String userID = user.getId();
// 仅查询等级类成就 // 仅查询等级类成就
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole(); List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<AchievementVO> levels = achievementMapper.selectUserAchievementsWithProgress( List<AchievementVO> levels = achievementMapper.selectUserAchievementsWithProgress(
@@ -298,7 +298,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
Map<String, Object> payload = new HashMap<>(); Map<String, Object> payload = new HashMap<>();
payload.put("current", null); payload.put("current", null);
payload.put("next", null); payload.put("next", null);
rd.success("无等级成就", payload); rd.success("无等级成就配置", payload);
return rd; return rd;
} }
@@ -315,36 +315,35 @@ public class ACHAchievementServiceImpl implements AchievementService {
Comparator.nullsFirst(Comparator.naturalOrder()) Comparator.nullsFirst(Comparator.naturalOrder())
); );
// 当前:已获得的最高等级,否则取最低等级 // 当前:已获得的最高等级
List<AchievementVO> obtained = levels.stream() List<AchievementVO> obtained = levels.stream()
.filter(a -> Boolean.TRUE.equals(a.getObtained())) .filter(a -> Boolean.TRUE.equals(a.getObtained()))
.sorted(byLevelAsc.reversed()) .sorted(byLevelAsc.reversed())
.collect(Collectors.toList()); .collect(Collectors.toList());
AchievementVO current; AchievementVO current;
final float currentLevel; // 用户实际等级
if (!obtained.isEmpty()) { if (!obtained.isEmpty()) {
// 已获得等级成就,取最高等级
current = obtained.get(0); current = obtained.get(0);
currentLevel = current.getLevel() != null ? current.getLevel() : 1.0f;
} else { } else {
current = levels.stream() // 没有获得任何等级成就,默认 Lv1.0
.sorted(byLevelAsc) current = null;
.findFirst() currentLevel = 1.0f;
.orElse(null);
} }
// 下一等级:比当前等级大的最小等级 // 下一等级:比当前等级大的最小等级
AchievementVO next = null; AchievementVO next = levels.stream()
if (current != null && current.getLevel() != null) { .filter(a -> (a.getLevel() != null) && a.getLevel() > currentLevel)
float curLevel = current.getLevel(); .sorted(byLevelAsc)
next = levels.stream() .findFirst()
.filter(a -> (a.getLevel() != null) && a.getLevel() > curLevel) .orElse(null);
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
}
Map<String, Object> payload = new HashMap<>(); Map<String, Object> payload = new HashMap<>();
payload.put("current", current); payload.put("current", current); // 当前获得的最高等级成就null 表示默认 Lv1.0
payload.put("next", next); payload.put("next", next); // 下一个等级成就
rd.success("获取等级状态成功", payload); rd.success("获取等级状态成功", payload);
return rd; return rd;
} catch (Exception e) { } catch (Exception e) {
@@ -371,7 +370,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
for (AchievementVO vo : voList) { for (AchievementVO vo : voList) {
if (Boolean.TRUE.equals(vo.getObtained())) { if (Boolean.TRUE.equals(vo.getObtained())) {
TbUserAchievement ua = new TbUserAchievement(); TbUserAchievement ua = new TbUserAchievement();
ua.setID(vo.getUserAchievementID()); ua.setId(vo.getUserAchievementID());
ua.setUserID(userID); ua.setUserID(userID);
ua.setAchievementID(vo.getAchievementID()); ua.setAchievementID(vo.getAchievementID());
ua.setObtainTime(vo.getObtainTime()); ua.setObtainTime(vo.getObtainTime());
@@ -396,7 +395,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
resultDomain.fail("请先登录"); resultDomain.fail("请先登录");
return resultDomain; return resultDomain;
} }
return getUserAchievements(user.getID(), type); return getUserAchievements(user.getId(), type);
} }
@Override @Override
@@ -410,7 +409,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
return resultDomain; return resultDomain;
} }
String userID = user.getID(); String userID = user.getId();
// 使用联表查询一次性获取所有数据(包含成就、用户成就、进度信息及权限过滤) // 使用联表查询一次性获取所有数据(包含成就、用户成就、进度信息及权限过滤)
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole(); List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
@@ -474,7 +473,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
// 创建用户成就记录 // 创建用户成就记录
TbUserAchievement userAchievement = new TbUserAchievement(); TbUserAchievement userAchievement = new TbUserAchievement();
userAchievement.setID(IDUtils.generateID()); userAchievement.setId(IDUtils.generateID());
userAchievement.setUserID(userID); userAchievement.setUserID(userID);
userAchievement.setAchievementID(achievementID); userAchievement.setAchievementID(achievementID);
userAchievement.setObtainTime(new Date()); userAchievement.setObtainTime(new Date());
@@ -559,7 +558,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
resultDomain.fail("请先登录"); resultDomain.fail("请先登录");
return resultDomain; return resultDomain;
} }
return getUserAchievementProgress(user.getID(), achievementID); return getUserAchievementProgress(user.getId(), achievementID);
} }
@Override @Override
@@ -812,7 +811,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
} }
progress = new TbUserAchievementProgress(); progress = new TbUserAchievementProgress();
progress.setID(IDUtils.generateID()); progress.setId(IDUtils.generateID());
progress.setUserID(userID); progress.setUserID(userID);
progress.setAchievementID(achievementID); progress.setAchievementID(achievementID);
progress.setCurrentValue(0); progress.setCurrentValue(0);
@@ -845,7 +844,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
private TbUserAchievement grantAchievementInternal(String userID, TbAchievement achievement) { private TbUserAchievement grantAchievementInternal(String userID, TbAchievement achievement) {
try { try {
TbUserAchievement userAchievement = new TbUserAchievement(); TbUserAchievement userAchievement = new TbUserAchievement();
userAchievement.setID(IDUtils.generateID()); userAchievement.setId(IDUtils.generateID());
userAchievement.setUserID(userID); userAchievement.setUserID(userID);
userAchievement.setAchievementID(achievement.getAchievementID()); userAchievement.setAchievementID(achievement.getAchievementID());
userAchievement.setObtainTime(new Date()); userAchievement.setObtainTime(new Date());

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 --> <!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbAchievement"> <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="achievement_id" property="achievementID" />
<result column="name" property="name" /> <result column="name" property="name" />
<result column="description" property="description" /> <result column="description" property="description" />
@@ -34,8 +34,8 @@
<sql id="Base_Where_Clause"> <sql id="Base_Where_Clause">
<where> <where>
<if test="filter != null"> <if test="filter != null">
<if test="filter.ID != null and filter.ID != ''"> <if test="filter.id != null and filter.id != ''">
AND id = #{filter.ID} AND id = #{filter.id}
</if> </if>
<if test="filter.achievementID != null and filter.achievementID != ''"> <if test="filter.achievementID != null and filter.achievementID != ''">
AND achievement_id = #{filter.achievementID} AND achievement_id = #{filter.achievementID}
@@ -183,7 +183,7 @@
condition_value, points, order_num, creator, updater, create_time, update_time, condition_value, points, order_num, creator, updater, create_time, update_time,
delete_time, deleted delete_time, deleted
) VALUES ( ) VALUES (
#{ID}, #{achievementID}, #{name}, #{description}, #{icon}, #{type}, #{level}, #{id}, #{achievementID}, #{name}, #{description}, #{icon}, #{type}, #{level},
#{conditionType}, #{conditionValue}, #{points}, #{orderNum}, #{creator}, #{updater}, #{conditionType}, #{conditionValue}, #{points}, #{orderNum}, #{creator}, #{updater},
#{createTime}, #{updateTime}, #{deleteTime}, #{deleted} #{createTime}, #{updateTime}, #{deleteTime}, #{deleted}
) )
@@ -236,13 +236,13 @@
deleted = #{deleted}, deleted = #{deleted},
</if> </if>
</set> </set>
WHERE id = #{ID} WHERE id = #{id}
</update> </update>
<!-- 删除成就 --> <!-- 删除成就 -->
<delete id="deleteAchievement" parameterType="org.xyzh.common.dto.usercenter.TbAchievement"> <delete id="deleteAchievement" parameterType="org.xyzh.common.dto.usercenter.TbAchievement">
DELETE FROM tb_achievement DELETE FROM tb_achievement
WHERE id = #{ID} WHERE id = #{id}
</delete> </delete>
<!-- 批量插入成就 --> <!-- 批量插入成就 -->
@@ -254,7 +254,7 @@
) VALUES ) VALUES
<foreach collection="achievementList" item="item" separator=","> <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.type}, #{item.level}, #{item.conditionType}, #{item.conditionValue},
#{item.points}, #{item.orderNum}, #{item.creator}, #{item.updater}, #{item.points}, #{item.orderNum}, #{item.creator}, #{item.updater},
#{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted} #{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted}
@@ -327,7 +327,7 @@
<!-- AchievementVO 结果映射(包含用户成就和进度信息) --> <!-- AchievementVO 结果映射(包含用户成就和进度信息) -->
<resultMap id="AchievementVOResultMap" type="org.xyzh.common.vo.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="achievement_id" property="achievementID" />
<result column="name" property="name" /> <result column="name" property="name" />
<result column="description" property="description" /> <result column="description" property="description" />

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 --> <!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserAchievement"> <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="user_id" property="userID" />
<result column="achievement_id" property="achievementID" /> <result column="achievement_id" property="achievementID" />
<result column="obtain_time" property="obtainTime" /> <result column="obtain_time" property="obtainTime" />
@@ -19,8 +19,8 @@
<sql id="Base_Where_Clause"> <sql id="Base_Where_Clause">
<where> <where>
<if test="filter != null"> <if test="filter != null">
<if test="filter.ID != null and filter.ID != ''"> <if test="filter.id != null and filter.id != ''">
AND ua.id = #{filter.ID} AND ua.id = #{filter.id}
</if> </if>
<if test="filter.userID != null and filter.userID != ''"> <if test="filter.userID != null and filter.userID != ''">
AND ua.user_id = #{filter.userID} AND ua.user_id = #{filter.userID}
@@ -118,7 +118,7 @@
INSERT INTO tb_user_achievement ( INSERT INTO tb_user_achievement (
id, user_id, achievement_id, obtain_time id, user_id, achievement_id, obtain_time
) VALUES ( ) VALUES (
#{ID}, #{userID}, #{achievementID}, #{obtainTime} #{id}, #{userID}, #{achievementID}, #{obtainTime}
) )
</insert> </insert>
@@ -136,7 +136,7 @@
obtain_time = #{obtainTime}, obtain_time = #{obtainTime},
</if> </if>
</set> </set>
WHERE id = #{ID} WHERE id = #{id}
</update> </update>
<!-- 删除用户成就 --> <!-- 删除用户成就 -->
@@ -158,7 +158,7 @@
) VALUES ) VALUES
<foreach collection="userAchievementList" item="item" separator=","> <foreach collection="userAchievementList" item="item" separator=",">
( (
#{item.ID}, #{item.userID}, #{item.achievementID}, #{item.obtainTime} #{item.id}, #{item.userID}, #{item.achievementID}, #{item.obtainTime}
) )
</foreach> </foreach>
</insert> </insert>

View File

@@ -4,7 +4,7 @@
<!-- 结果映射 --> <!-- 结果映射 -->
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserAchievementProgress"> <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="user_id" property="userID" />
<result column="achievement_id" property="achievementID" /> <result column="achievement_id" property="achievementID" />
<result column="current_value" property="currentValue" /> <result column="current_value" property="currentValue" />
@@ -65,7 +65,7 @@
id, user_id, achievement_id, current_value, target_value, id, user_id, achievement_id, current_value, target_value,
progress_percentage, completed, last_update_time, create_time progress_percentage, completed, last_update_time, create_time
) VALUES ( ) VALUES (
#{ID}, #{userID}, #{achievementID}, #{currentValue}, #{targetValue}, #{id}, #{userID}, #{achievementID}, #{currentValue}, #{targetValue},
#{progressPercentage}, #{completed}, #{lastUpdateTime}, #{createTime} #{progressPercentage}, #{completed}, #{lastUpdateTime}, #{createTime}
) )
</insert> </insert>
@@ -90,7 +90,7 @@
last_update_time = #{lastUpdateTime}, last_update_time = #{lastUpdateTime},
</if> </if>
</set> </set>
WHERE id = #{ID} WHERE id = #{id}
</update> </update>
<!-- 增加进度值 --> <!-- 增加进度值 -->
@@ -112,7 +112,7 @@
) VALUES ) VALUES
<foreach collection="progressList" item="item" separator=","> <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.targetValue}, #{item.progressPercentage}, #{item.completed},
#{item.lastUpdateTime}, #{item.createTime} #{item.lastUpdateTime}, #{item.createTime}
) )

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -64,7 +64,7 @@
<if test="updater != null">updater = #{updater},</if> <if test="updater != null">updater = #{updater},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
</set> </set>
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- 逻辑删除智能体配置 --> <!-- 逻辑删除智能体配置 -->
@@ -73,7 +73,7 @@
SET deleted = 1, SET deleted = 1,
delete_time = NOW(), delete_time = NOW(),
updater = #{updater} updater = #{updater}
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- 根据ID查询智能体配置 --> <!-- 根据ID查询智能体配置 -->

View File

@@ -61,7 +61,7 @@
status, is_favorite, is_pinned, message_count, total_tokens, status, is_favorite, is_pinned, message_count, total_tokens,
last_message_time, create_time, update_time, deleted last_message_time, create_time, update_time, deleted
) VALUES ( ) VALUES (
#{ID}, #{userID}, #{agentID}, #{title}, #{summary}, #{difyConversationId}, #{id}, #{userID}, #{agentID}, #{title}, #{summary}, #{difyConversationId},
#{status}, #{isFavorite}, #{isPinned}, #{messageCount}, #{totalTokens}, #{status}, #{isFavorite}, #{isPinned}, #{messageCount}, #{totalTokens},
#{lastMessageTime}, #{createTime}, #{updateTime}, #{deleted} #{lastMessageTime}, #{createTime}, #{updateTime}, #{deleted}
) )
@@ -82,12 +82,12 @@
<if test="lastMessageTime != null">last_message_time = #{lastMessageTime},</if> <if test="lastMessageTime != null">last_message_time = #{lastMessageTime},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
</set> </set>
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- 逻辑删除会话 --> <!-- 逻辑删除会话 -->
<update id="deleteConversation" parameterType="org.xyzh.common.dto.ai.TbAiConversation"> <update id="deleteConversation" parameterType="org.xyzh.common.dto.ai.TbAiConversation">
DELETE FROM tb_ai_conversation WHERE id = #{ID} DELETE FROM tb_ai_conversation WHERE id = #{id}
</update> </update>
<!-- 根据ID查询会话 --> <!-- 根据ID查询会话 -->

View File

@@ -197,7 +197,7 @@
vector_id, document_count, total_chunks, status, creator, creator_dept, vector_id, document_count, total_chunks, status, creator, creator_dept,
updater, create_time, update_time, deleted updater, create_time, update_time, deleted
) VALUES ( ) VALUES (
#{ID}, #{title}, #{avatar}, #{description}, #{content}, #{sourceType}, #{sourceID}, #{fileName}, #{filePath}, #{id}, #{title}, #{avatar}, #{description}, #{content}, #{sourceType}, #{sourceID}, #{fileName}, #{filePath},
#{category}, #{tags}, #{difyDatasetId}, #{difyIndexingTechnique}, #{embeddingModel}, #{embeddingModelProvider}, #{category}, #{tags}, #{difyDatasetId}, #{difyIndexingTechnique}, #{embeddingModel}, #{embeddingModelProvider},
#{rerankModel}, #{rerankModelProvider}, #{rerankingEnable}, #{retrievalTopK}, #{retrievalScoreThreshold}, #{rerankModel}, #{rerankModelProvider}, #{rerankingEnable}, #{retrievalTopK}, #{retrievalScoreThreshold},
#{vectorID}, #{documentCount}, #{totalChunks}, #{status}, #{creator}, #{creatorDept}, #{vectorID}, #{documentCount}, #{totalChunks}, #{status}, #{creator}, #{creatorDept},
@@ -235,7 +235,7 @@
<if test="updater != null">updater = #{updater},</if> <if test="updater != null">updater = #{updater},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
</set> </set>
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- deleteKnowledge逻辑删除知识库 --> <!-- deleteKnowledge逻辑删除知识库 -->
@@ -244,7 +244,7 @@
SET deleted = 1, SET deleted = 1,
delete_time = NOW(), delete_time = NOW(),
updater = #{updater} updater = #{updater}
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- selectKnowledgeById根据ID查询知识库不带权限校验 --> <!-- selectKnowledgeById根据ID查询知识库不带权限校验 -->

View File

@@ -50,7 +50,7 @@
file_ids, knowledge_ids, knowledge_refs, token_count, file_ids, knowledge_ids, knowledge_refs, token_count,
dify_message_id, rating, feedback, create_time, update_time, deleted dify_message_id, rating, feedback, create_time, update_time, deleted
) VALUES ( ) VALUES (
#{ID}, #{conversationID}, #{userID}, #{agentID}, #{role}, #{content}, #{id}, #{conversationID}, #{userID}, #{agentID}, #{role}, #{content},
#{fileIDs}, #{knowledgeIDs}, #{knowledgeRefs}, #{tokenCount}, #{fileIDs}, #{knowledgeIDs}, #{knowledgeRefs}, #{tokenCount},
#{difyMessageId}, #{rating}, #{feedback}, #{createTime}, #{updateTime}, #{deleted} #{difyMessageId}, #{rating}, #{feedback}, #{createTime}, #{updateTime}, #{deleted}
) )
@@ -70,7 +70,7 @@
<if test="feedback != null">feedback = #{feedback},</if> <if test="feedback != null">feedback = #{feedback},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
</set> </set>
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- 逻辑删除消息 --> <!-- 逻辑删除消息 -->
@@ -78,7 +78,7 @@
UPDATE tb_ai_message UPDATE tb_ai_message
SET deleted = 1, SET deleted = 1,
delete_time = NOW() delete_time = NOW()
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- 根据ID查询消息 --> <!-- 根据ID查询消息 -->

View File

@@ -73,7 +73,7 @@
chunk_count, status, error_message, enabled, display_status, chunk_count, status, error_message, enabled, display_status,
create_time, update_time, deleted create_time, update_time, deleted
) VALUES ( ) VALUES (
#{ID}, #{userID}, #{knowledgeId}, #{conversationID}, #{messageID}, #{sysFileId}, #{fileName}, #{filePath}, #{fileSize}, #{id}, #{userID}, #{knowledgeId}, #{conversationID}, #{messageID}, #{sysFileId}, #{fileName}, #{filePath}, #{fileSize},
#{fileType}, #{mimeType}, #{extractedText}, #{difyDocumentId}, #{difyBatchId}, #{difyUploadFileId}, #{fileType}, #{mimeType}, #{extractedText}, #{difyDocumentId}, #{difyBatchId}, #{difyUploadFileId},
#{chunkCount}, #{status}, #{errorMessage}, #{enabled}, #{displayStatus}, #{chunkCount}, #{status}, #{errorMessage}, #{enabled}, #{displayStatus},
#{createTime}, #{updateTime}, #{deleted} #{createTime}, #{updateTime}, #{deleted}
@@ -105,7 +105,7 @@
<if test="displayStatus != null">display_status = #{displayStatus},</if> <if test="displayStatus != null">display_status = #{displayStatus},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
</set> </set>
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- deleteUploadFile逻辑删除文件记录 --> <!-- deleteUploadFile逻辑删除文件记录 -->
@@ -113,7 +113,7 @@
UPDATE tb_ai_upload_file UPDATE tb_ai_upload_file
SET deleted = 1, SET deleted = 1,
delete_time = NOW() delete_time = NOW()
WHERE id = #{ID} AND deleted = 0 WHERE id = #{id} AND deleted = 0
</update> </update>
<!-- selectUploadFileById根据ID查询文件 --> <!-- selectUploadFileById根据ID查询文件 -->
@@ -216,7 +216,7 @@
) VALUES ) VALUES
<foreach collection="files" item="file" separator=","> <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.sysFileId}, #{file.fileName}, #{file.filePath}, #{file.fileSize},
#{file.fileType}, #{file.mimeType}, #{file.difyDocumentId}, #{file.difyBatchId}, #{file.difyUploadFileId}, #{file.fileType}, #{file.mimeType}, #{file.difyDocumentId}, #{file.difyBatchId}, #{file.difyUploadFileId},
#{file.chunkCount}, #{file.status}, #{file.enabled}, #{file.displayStatus}, #{file.createTime}, #{file.updateTime}, #{file.deleted} #{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 status: 1
}); });
const agentId = agentResult.data?.ID; const agentId = agentResult.data?.id;
// 2. 流式对话 // 2. 流式对话
await chatApi.streamChat( await chatApi.streamChat(
@@ -294,7 +294,7 @@ const knowledgeResult = await knowledgeApi.createKnowledge({
embeddingModel: 'text-embedding-ada-002' embeddingModel: 'text-embedding-ada-002'
}); });
const knowledgeId = knowledgeResult.data?.ID; const knowledgeId = knowledgeResult.data?.id;
// 2. 上传文件 // 2. 上传文件
const files = document.querySelector('input[type="file"]').files; 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(); String deptId = userDeptRoles.isEmpty() ? null : userDeptRoles.get(0).getDeptID();
// 2. 保存知识库 // 2. 保存知识库
knowledge.setCreator(currentUser.getID()); knowledge.setCreator(currentUser.getId());
knowledge.setCreatorDept(deptId); knowledge.setCreatorDept(deptId);
knowledgeMapper.insert(knowledge); knowledgeMapper.insert(knowledge);
@@ -58,27 +58,27 @@ public class AiKnowledgeServiceImpl {
switch (permissionType) { switch (permissionType) {
case PUBLIC: case PUBLIC:
// 公开知识库:所有人可读 // 公开知识库:所有人可读
createPublicPermission(knowledge.getID()); createPublicPermission(knowledge.getId());
break; break;
case DEPARTMENT: case DEPARTMENT:
// 部门知识库:本部门所有人可读写 // 部门知识库:本部门所有人可读写
createDepartmentPermission(knowledge.getID(), deptId); createDepartmentPermission(knowledge.getId(), deptId);
break; break;
case DEPARTMENT_INHERIT: case DEPARTMENT_INHERIT:
// 部门继承:本部门及子部门可读 // 部门继承:本部门及子部门可读
createDepartmentInheritPermission(knowledge.getID(), deptId); createDepartmentInheritPermission(knowledge.getId(), deptId);
break; break;
case ROLE: case ROLE:
// 角色知识库:特定角色可读(跨部门) // 角色知识库:特定角色可读(跨部门)
createRolePermission(knowledge.getID(), roleIds); createRolePermission(knowledge.getId(), roleIds);
break; break;
case PRIVATE: case PRIVATE:
// 私有知识库:仅创建者所在部门的特定角色 // 私有知识库:仅创建者所在部门的特定角色
createPrivatePermission(knowledge.getID(), deptId, roleIds); createPrivatePermission(knowledge.getId(), deptId, roleIds);
break; break;
} }
@@ -88,7 +88,7 @@ public class AiKnowledgeServiceImpl {
// 创建公开权限 // 创建公开权限
private void createPublicPermission(String knowledgeId) { private void createPublicPermission(String knowledgeId) {
TbResourcePermission permission = new TbResourcePermission(); TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString()); permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10); // AI_KNOWLEDGE permission.setResourceType(10); // AI_KNOWLEDGE
permission.setResourceId(knowledgeId); permission.setResourceId(knowledgeId);
permission.setDeptId(null); // NULL表示不限部门 permission.setDeptId(null); // NULL表示不限部门
@@ -102,7 +102,7 @@ public class AiKnowledgeServiceImpl {
// 创建部门权限 // 创建部门权限
private void createDepartmentPermission(String knowledgeId, String deptId) { private void createDepartmentPermission(String knowledgeId, String deptId) {
TbResourcePermission permission = new TbResourcePermission(); TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString()); permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10); permission.setResourceType(10);
permission.setResourceId(knowledgeId); permission.setResourceId(knowledgeId);
permission.setDeptId(deptId); // 指定部门 permission.setDeptId(deptId); // 指定部门
@@ -120,7 +120,7 @@ public class AiKnowledgeServiceImpl {
// 为本部门创建权限已通过dept_path自动继承给子部门 // 为本部门创建权限已通过dept_path自动继承给子部门
TbResourcePermission permission = new TbResourcePermission(); TbResourcePermission permission = new TbResourcePermission();
permission.setID(UUID.randomUUID().toString()); permission.setId(UUID.randomUUID().toString());
permission.setResourceType(10); permission.setResourceType(10);
permission.setResourceId(knowledgeId); permission.setResourceId(knowledgeId);
permission.setDeptId(deptId); permission.setDeptId(deptId);
@@ -392,7 +392,7 @@ private String getCurrentUserCacheKey() {
String roleIds = roles.stream() String roleIds = roles.stream()
.map(r -> r.getDeptID() + ":" + r.getRoleID()) .map(r -> r.getDeptID() + ":" + r.getRoleID())
.collect(Collectors.joining(",")); .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> addTaskUser(String taskID, List<String> userIDs);
ResultDomain<TbTaskUser> updateTaskUser(String taskID, List<String> userIDs);
/** /**
* @description 批量添加任务用户 * @description 批量添加任务用户
* @param taskID 任务ID * @param taskID 任务ID

View File

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

View File

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

View File

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

View File

@@ -30,5 +30,17 @@
<artifactId>jjwt-api</artifactId> <artifactId>jjwt-api</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </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> </dependencies>
</project> </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> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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