Compare commits
24 Commits
bbe8866cce
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 41795c7c77 | |||
| 1f243f977a | |||
| ed4780d6c2 | |||
| 5b3b55cf10 | |||
| c37cbe0054 | |||
| 80ddcc96d3 | |||
| 0304804057 | |||
| 9570745a94 | |||
| 241807325b | |||
| 7d62f3a9ed | |||
| 3b468e3177 | |||
| f6849b33c3 | |||
| 1335959881 | |||
| a5db05fba6 | |||
| 990910d2c6 | |||
| fc960265f4 | |||
| ba0aabdac3 | |||
| 8a8059d05b | |||
| dfb11c85f1 | |||
| 34e69c7f62 | |||
| 39120483fa | |||
| 0483e1f514 | |||
| 66da76bbcc | |||
| 96e9419496 |
32
.gitignore
vendored
32
.gitignore
vendored
@@ -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
|
||||||
BIN
doc/部署.assets/image-23.png
Normal file
BIN
doc/部署.assets/image-23.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
BIN
doc/部署.assets/image-24.png
Normal file
BIN
doc/部署.assets/image-24.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 102 KiB |
BIN
doc/部署.assets/image-25.png
Normal file
BIN
doc/部署.assets/image-25.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
BIN
doc/部署.assets/image-26.png
Normal file
BIN
doc/部署.assets/image-26.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
BIN
doc/部署.assets/image-27.png
Normal file
BIN
doc/部署.assets/image-27.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
23
doc/部署.md
23
doc/部署.md
@@ -107,15 +107,7 @@ APIKEY授权
|
|||||||
|
|
||||||
保存好知识库的apikey,通常以dataset开头。所有知识库共用。
|
保存好知识库的apikey,通常以dataset开头。所有知识库共用。
|
||||||
|
|
||||||
### 4.修改动态知识库检索工作流
|
### 4.动态知识库检索工作流
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
修改点有2个:
|
|
||||||
1. 修改http节点post请求的url内容。替换成实际的 ip:8000
|
|
||||||
2. 修改Authorization的值,替换为 Bearer + 空格 + 知识库的apikey
|
|
||||||

|
|
||||||
|
|
||||||
#### 测试
|
#### 测试
|
||||||
如图即正常
|
如图即正常
|
||||||

|

|
||||||
@@ -131,13 +123,14 @@ APIKEY授权
|
|||||||

|

|
||||||
|
|
||||||
#### 修改节点输入、输出相关节点的引用
|
#### 修改节点输入、输出相关节点的引用
|
||||||
修改的输入参数有2个,第1个是对话变量的datasets。表示该词对话中,使用了那些知识库。
|
修改的输入参数有3个,第1个是对话变量的datasets。表示该词对话中,使用了那些知识库。
|
||||||
第2个是对话变量的query。表示用户输入的对话内容。
|
第2个是工作流输入的query。表示用户输入的对话内容。
|
||||||

|
第3个是对话变量的dataset_apikey。表示知识库的apikey
|
||||||
|

|
||||||
|
|
||||||

|

|
||||||
|

|
||||||

|

|
||||||
|
|
||||||
#### 修改知识库处理节点的引用
|
#### 修改知识库处理节点的引用
|
||||||
直接引用“动态知识库检索”的输出内容,text即可
|
直接引用“动态知识库检索”的输出内容,text即可
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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>
|
||||||
1
docker/dify/volumes/oceanbase/init.d/vec_memory.sql
Normal file
1
docker/dify/volumes/oceanbase/init.d/vec_memory.sql
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;
|
||||||
222
docker/dify/volumes/opensearch/opensearch_dashboards.yml
Normal file
222
docker/dify/volumes/opensearch/opensearch_dashboards.yml
Normal 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'
|
||||||
14
docker/dify/volumes/sandbox/conf/config.yaml
Normal file
14
docker/dify/volumes/sandbox/conf/config.yaml
Normal 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: ''
|
||||||
35
docker/dify/volumes/sandbox/conf/config.yaml.example
Normal file
35
docker/dify/volumes/sandbox/conf/config.yaml.example
Normal 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: ''
|
||||||
@@ -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: []
|
||||||
|
|||||||
@@ -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: []
|
||||||
|
|||||||
@@ -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'):
|
||||||
|
|||||||
@@ -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: []
|
||||||
|
|||||||
@@ -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: []
|
||||||
|
|||||||
@@ -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());
|
|
||||||
|
|
||||||
-- 为示例知识库创建权限(公开可读)
|
-- 为示例知识库创建权限(公开可读)
|
||||||
-- 注意:实际使用时应该在应用层通过权限服务自动创建
|
-- 注意:实际使用时应该在应用层通过权限服务自动创建
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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()),
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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查询智能体配置 -->
|
||||||
|
|||||||
@@ -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查询会话 -->
|
||||||
|
|||||||
@@ -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查询知识库,不带权限校验) -->
|
||||||
|
|||||||
@@ -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查询消息 -->
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|
||||||
// 功能权限
|
// 功能权限
|
||||||
|
|||||||
@@ -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")) {
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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() +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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() +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 + '\'' +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user