Compare commits
9 Commits
1.0
...
80ddcc96d3
| Author | SHA1 | Date | |
|---|---|---|---|
| 80ddcc96d3 | |||
| 0304804057 | |||
| 9570745a94 | |||
| 241807325b | |||
| 7d62f3a9ed | |||
| 3b468e3177 | |||
| f6849b33c3 | |||
| 1335959881 | |||
| a5db05fba6 |
32
.gitignore
vendored
32
.gitignore
vendored
@@ -5,4 +5,34 @@ build_output
|
||||
docker/schoolNews/volumes/
|
||||
docker/schoolNews/crawler
|
||||
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
docker/dify.zip
Normal file
BIN
docker/dify.zip
Normal file
Binary file not shown.
@@ -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
|
||||
dependencies: []
|
||||
kind: app
|
||||
version: 0.4.0
|
||||
version: 0.5.0
|
||||
workflow:
|
||||
conversation_variables: []
|
||||
environment_variables: []
|
||||
@@ -136,7 +136,16 @@ workflow:
|
||||
required: true
|
||||
type: text-input
|
||||
variable: query
|
||||
height: 114
|
||||
- default: ''
|
||||
hint: ''
|
||||
label: dataset_apikey
|
||||
max_length: 100
|
||||
options: []
|
||||
placeholder: ''
|
||||
required: true
|
||||
type: text-input
|
||||
variable: dataset_apikey
|
||||
height: 161
|
||||
id: '1747125462435'
|
||||
position:
|
||||
x: 80
|
||||
@@ -250,7 +259,7 @@ workflow:
|
||||
}'
|
||||
type: json
|
||||
desc: ''
|
||||
headers: 'Authorization:Bearer dataset-HeDK9gHBqPnI4rBZ2q2Hm7rV
|
||||
headers: 'Authorization:Bearer {{#1747125462435.dataset_apikey#}}
|
||||
|
||||
Content-Type:application/json'
|
||||
isInIteration: true
|
||||
@@ -260,7 +269,7 @@ workflow:
|
||||
params: ''
|
||||
retry_config:
|
||||
max_retries: 3
|
||||
retry_enabled: true
|
||||
retry_enabled: false
|
||||
retry_interval: 100
|
||||
selected: false
|
||||
ssl_verify: true
|
||||
@@ -270,9 +279,9 @@ workflow:
|
||||
max_write_timeout: 0
|
||||
title: HTTP 请求
|
||||
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: []
|
||||
height: 157
|
||||
height: 111
|
||||
id: '1747125795256'
|
||||
parentId: '1747125586388'
|
||||
position:
|
||||
@@ -351,7 +360,7 @@ workflow:
|
||||
type: custom
|
||||
width: 242
|
||||
viewport:
|
||||
x: 116.27083894320822
|
||||
y: 126.27330841264018
|
||||
x: -967.224047730792
|
||||
y: 147.70051636546336
|
||||
zoom: 0.8705505632961247
|
||||
rag_pipeline_variables: []
|
||||
|
||||
@@ -9,17 +9,25 @@ dependencies:
|
||||
- current_identifier: null
|
||||
type: marketplace
|
||||
value:
|
||||
marketplace_plugin_unique_identifier: langgenius/siliconflow:0.0.34@1c203017d8ef49fd9152696a42e6dc71ecf272b115d8caf731c99ee0d2956dce
|
||||
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
|
||||
version: null
|
||||
- current_identifier: null
|
||||
type: marketplace
|
||||
value:
|
||||
marketplace_plugin_unique_identifier: anspire/anspire_search:0.0.9@a59824e9507c05c81d582cc5d8384197215d91bf5c787150d8aad723eb5d1a69
|
||||
marketplace_plugin_unique_identifier: langgenius/ollama:0.1.0@7c18c74b94a855de83aa66f376939d47b96a49b6dbb6904b46b267cb0213396e
|
||||
version: null
|
||||
kind: app
|
||||
version: 0.4.0
|
||||
version: 0.5.0
|
||||
workflow:
|
||||
conversation_variables:
|
||||
- description: ''
|
||||
id: 71e3f805-8445-46b1-bd43-8af398234527
|
||||
name: dataset_apikey
|
||||
selector:
|
||||
- conversation
|
||||
- dataset_apikey
|
||||
value: ''
|
||||
value_type: string
|
||||
- description: ''
|
||||
id: e18aacca-16a2-4d93-80c4-5a85ead53ae4
|
||||
name: datasets
|
||||
@@ -225,19 +233,6 @@ workflow:
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
sourceType: start
|
||||
targetType: if-else
|
||||
id: 1762339910800-source-1762421892949-target
|
||||
selected: false
|
||||
source: '1762339910800'
|
||||
sourceHandle: source
|
||||
target: '1762421892949'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
@@ -257,6 +252,7 @@ workflow:
|
||||
sourceType: code
|
||||
targetType: iteration
|
||||
id: 1762510470105-source-1762339969303-target
|
||||
selected: false
|
||||
source: '1762510470105'
|
||||
sourceHandle: source
|
||||
target: '1762339969303'
|
||||
@@ -268,21 +264,11 @@ workflow:
|
||||
isInLoop: false
|
||||
sourceType: if-else
|
||||
targetType: tool
|
||||
id: 1762421892949-true-1762511001734-target
|
||||
id: 1762421892949-true-1764314675268-target
|
||||
selected: false
|
||||
source: '1762421892949'
|
||||
sourceHandle: 'true'
|
||||
target: '1762511001734'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInLoop: false
|
||||
sourceType: assigner
|
||||
targetType: tool
|
||||
id: 1762509024795-source-1762511001734-target
|
||||
source: '1762509024795'
|
||||
sourceHandle: source
|
||||
target: '1762511001734'
|
||||
target: '1764314675268'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
@@ -290,13 +276,76 @@ workflow:
|
||||
isInLoop: false
|
||||
sourceType: tool
|
||||
targetType: code
|
||||
id: 1762511001734-source-1762510470105-target
|
||||
source: '1762511001734'
|
||||
id: 1764314675268-source-1762510470105-target
|
||||
selected: false
|
||||
source: '1764314675268'
|
||||
sourceHandle: source
|
||||
target: '1762510470105'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInLoop: false
|
||||
sourceType: assigner
|
||||
targetType: tool
|
||||
id: 1762509024795-source-1764314675268-target
|
||||
selected: false
|
||||
source: '1762509024795'
|
||||
sourceHandle: source
|
||||
target: '1764314675268'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
sourceType: start
|
||||
targetType: if-else
|
||||
id: 1762339910800-source-1764314703864-target
|
||||
selected: false
|
||||
source: '1762339910800'
|
||||
sourceHandle: source
|
||||
target: '1764314703864'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
sourceType: if-else
|
||||
targetType: assigner
|
||||
id: 1764314703864-false-1764314714879-target
|
||||
selected: false
|
||||
source: '1764314703864'
|
||||
sourceHandle: 'false'
|
||||
target: '1764314714879'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInLoop: false
|
||||
sourceType: assigner
|
||||
targetType: if-else
|
||||
id: 1764314714879-source-1762421892949-target
|
||||
selected: false
|
||||
source: '1764314714879'
|
||||
sourceHandle: source
|
||||
target: '1762421892949'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInLoop: false
|
||||
sourceType: if-else
|
||||
targetType: if-else
|
||||
id: 1764314703864-true-1762421892949-target
|
||||
selected: false
|
||||
source: '1764314703864'
|
||||
sourceHandle: 'true'
|
||||
target: '1762421892949'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
nodes:
|
||||
- data:
|
||||
selected: false
|
||||
@@ -321,14 +370,32 @@ workflow:
|
||||
required: true
|
||||
type: text-input
|
||||
variable: datasets
|
||||
height: 114
|
||||
- default: ''
|
||||
hint: ''
|
||||
label: dataset_apikey
|
||||
max_length: 100
|
||||
options: []
|
||||
placeholder: ''
|
||||
required: true
|
||||
type: text-input
|
||||
variable: dataset_apikey
|
||||
- default: ''
|
||||
hint: ''
|
||||
label: promt
|
||||
max_length: 2000
|
||||
options: []
|
||||
placeholder: ''
|
||||
required: true
|
||||
type: paragraph
|
||||
variable: promt
|
||||
height: 187
|
||||
id: '1762339910800'
|
||||
position:
|
||||
x: -1233.1402302396395
|
||||
y: 149.5782401176896
|
||||
x: -1704.106555788423
|
||||
y: 174.193204867626
|
||||
positionAbsolute:
|
||||
x: -1233.1402302396395
|
||||
y: 149.5782401176896
|
||||
x: -1704.106555788423
|
||||
y: 174.193204867626
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
@@ -354,8 +421,8 @@ workflow:
|
||||
model:
|
||||
completion_params: {}
|
||||
mode: chat
|
||||
name: deepseek-ai/DeepSeek-V3
|
||||
provider: langgenius/siliconflow/siliconflow
|
||||
name: qwen-14b
|
||||
provider: langgenius/ollama/ollama
|
||||
prompt_config:
|
||||
jinja2_variables:
|
||||
- value_selector:
|
||||
@@ -370,10 +437,14 @@ workflow:
|
||||
- '1762510470105'
|
||||
- result
|
||||
variable: result
|
||||
- value_selector:
|
||||
- '1762339910800'
|
||||
- promt
|
||||
variable: promt
|
||||
prompt_template:
|
||||
- edition_type: jinja2
|
||||
id: 5d50499d-b81d-43aa-a891-38fd349bd754
|
||||
jinja2_text: "你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。请基于提供的知识库内容{{ result }},为用户提供准确、简洁的回答。\r\
|
||||
jinja2_text: "{{ promt }}\r\n\r\n请基于提供的知识库内容{{ result }},为用户提供准确、简洁的回答。\r\
|
||||
\n\r\n{% if searchData %}\r\n结合 {{ searchData }} 回答用户\r\n{% endif %}\r\
|
||||
\n{% if fileData %}\r\n结合文件内容 {{ fileData }} 回答用户\r\n{% endif %}\r\n"
|
||||
role: system
|
||||
@@ -394,7 +465,7 @@ workflow:
|
||||
- id: 23264213-e421-4449-b666-a55a0e39e561
|
||||
role: user
|
||||
text: ''
|
||||
selected: false
|
||||
selected: true
|
||||
title: LLM
|
||||
type: llm
|
||||
vision:
|
||||
@@ -407,7 +478,7 @@ workflow:
|
||||
positionAbsolute:
|
||||
x: 2674.6343495125943
|
||||
y: 75.75635633814841
|
||||
selected: false
|
||||
selected: true
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
@@ -496,7 +567,7 @@ workflow:
|
||||
variable_selector:
|
||||
- '1762339969303'
|
||||
- item
|
||||
height: 92
|
||||
height: 104
|
||||
id: '1762339981310'
|
||||
parentId: '1762339969303'
|
||||
position:
|
||||
@@ -958,7 +1029,7 @@ workflow:
|
||||
type: code
|
||||
variables:
|
||||
- value_selector:
|
||||
- '1762511001734'
|
||||
- '1764314675268'
|
||||
- text
|
||||
value_type: string
|
||||
variable: text
|
||||
@@ -1034,10 +1105,44 @@ workflow:
|
||||
scope: null
|
||||
template: null
|
||||
type: string
|
||||
- auto_generate: null
|
||||
default: ''
|
||||
form: llm
|
||||
human_description:
|
||||
en_US: ''
|
||||
ja_JP: ''
|
||||
pt_BR: ''
|
||||
zh_Hans: ''
|
||||
label:
|
||||
en_US: dataset_apikey
|
||||
ja_JP: dataset_apikey
|
||||
pt_BR: dataset_apikey
|
||||
zh_Hans: dataset_apikey
|
||||
llm_description: ''
|
||||
max: null
|
||||
min: null
|
||||
name: dataset_apikey
|
||||
options: []
|
||||
placeholder:
|
||||
en_US: ''
|
||||
ja_JP: ''
|
||||
pt_BR: ''
|
||||
zh_Hans: ''
|
||||
precision: null
|
||||
required: true
|
||||
scope: null
|
||||
template: null
|
||||
type: string
|
||||
params:
|
||||
dataset_apikey: ''
|
||||
dataset_ids: ''
|
||||
query: ''
|
||||
provider_id: 019a5dd7-5f2b-7767-b2df-82bfda84c7ec
|
||||
plugin_id: null
|
||||
plugin_unique_identifier: null
|
||||
provider_icon:
|
||||
background: '#FFEAD5'
|
||||
content: 🤖
|
||||
provider_id: e7e4453f-0667-47fe-be4c-62accfbc7cc6
|
||||
provider_name: 动态知识库检索
|
||||
provider_type: workflow
|
||||
selected: false
|
||||
@@ -1048,6 +1153,9 @@ workflow:
|
||||
tool_name: dynamic_dataset
|
||||
tool_node_version: '2'
|
||||
tool_parameters:
|
||||
dataset_apikey:
|
||||
type: mixed
|
||||
value: '{{#conversation.dataset_apikey#}}'
|
||||
dataset_ids:
|
||||
type: mixed
|
||||
value: '{{#conversation.datasets#}}'
|
||||
@@ -1056,20 +1164,77 @@ workflow:
|
||||
value: '{{#sys.query#}}'
|
||||
type: tool
|
||||
height: 52
|
||||
id: '1762511001734'
|
||||
id: '1764314675268'
|
||||
position:
|
||||
x: -142.91348174874167
|
||||
y: -247.51043561574136
|
||||
x: -165.1249185156642
|
||||
y: -247.5444668446392
|
||||
positionAbsolute:
|
||||
x: -142.91348174874167
|
||||
y: -247.51043561574136
|
||||
selected: true
|
||||
x: -165.1249185156642
|
||||
y: -247.5444668446392
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 242
|
||||
- data:
|
||||
cases:
|
||||
- case_id: 'true'
|
||||
conditions:
|
||||
- comparison_operator: not empty
|
||||
id: 3123b598-113d-453f-b3fc-d04b6e83a35e
|
||||
value: ''
|
||||
varType: string
|
||||
variable_selector:
|
||||
- conversation
|
||||
- dataset_apikey
|
||||
id: 'true'
|
||||
logical_operator: and
|
||||
selected: false
|
||||
title: 条件分支 3
|
||||
type: if-else
|
||||
height: 124
|
||||
id: '1764314703864'
|
||||
position:
|
||||
x: -1295.7675522246373
|
||||
y: -98.76989654474232
|
||||
positionAbsolute:
|
||||
x: -1295.7675522246373
|
||||
y: -98.76989654474232
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 242
|
||||
- data:
|
||||
items:
|
||||
- input_type: variable
|
||||
operation: over-write
|
||||
value:
|
||||
- '1762339910800'
|
||||
- dataset_apikey
|
||||
variable_selector:
|
||||
- conversation
|
||||
- dataset_apikey
|
||||
write_mode: over-write
|
||||
selected: false
|
||||
title: 变量赋值 2
|
||||
type: assigner
|
||||
version: '2'
|
||||
height: 84
|
||||
id: '1764314714879'
|
||||
position:
|
||||
x: -988.84455927465
|
||||
y: -5.23303049498395
|
||||
positionAbsolute:
|
||||
x: -988.84455927465
|
||||
y: -5.23303049498395
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 242
|
||||
viewport:
|
||||
x: 863.6452676587132
|
||||
y: 446.19950772630614
|
||||
zoom: 0.9236555375410279
|
||||
x: -1068.6187404167313
|
||||
y: 347.5222255720734
|
||||
zoom: 0.6093853943072881
|
||||
rag_pipeline_variables: []
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
condition_value, points, order_num, creator, updater, create_time, update_time,
|
||||
delete_time, deleted
|
||||
) VALUES (
|
||||
#{ID}, #{achievementID}, #{name}, #{description}, #{icon}, #{type}, #{level},
|
||||
#{id}, #{achievementID}, #{name}, #{description}, #{icon}, #{type}, #{level},
|
||||
#{conditionType}, #{conditionValue}, #{points}, #{orderNum}, #{creator}, #{updater},
|
||||
#{createTime}, #{updateTime}, #{deleteTime}, #{deleted}
|
||||
)
|
||||
@@ -236,13 +236,13 @@
|
||||
deleted = #{deleted},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{ID}
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<!-- 删除成就 -->
|
||||
<delete id="deleteAchievement" parameterType="org.xyzh.common.dto.usercenter.TbAchievement">
|
||||
DELETE FROM tb_achievement
|
||||
WHERE id = #{ID}
|
||||
WHERE id = #{id}
|
||||
</delete>
|
||||
|
||||
<!-- 批量插入成就 -->
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
INSERT INTO tb_user_achievement (
|
||||
id, user_id, achievement_id, obtain_time
|
||||
) VALUES (
|
||||
#{ID}, #{userID}, #{achievementID}, #{obtainTime}
|
||||
#{id}, #{userID}, #{achievementID}, #{obtainTime}
|
||||
)
|
||||
</insert>
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
obtain_time = #{obtainTime},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{ID}
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<!-- 删除用户成就 -->
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
id, user_id, achievement_id, current_value, target_value,
|
||||
progress_percentage, completed, last_update_time, create_time
|
||||
) VALUES (
|
||||
#{ID}, #{userID}, #{achievementID}, #{currentValue}, #{targetValue},
|
||||
#{id}, #{userID}, #{achievementID}, #{currentValue}, #{targetValue},
|
||||
#{progressPercentage}, #{completed}, #{lastUpdateTime}, #{createTime}
|
||||
)
|
||||
</insert>
|
||||
@@ -90,7 +90,7 @@
|
||||
last_update_time = #{lastUpdateTime},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{ID}
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<!-- 增加进度值 -->
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</set>
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- 逻辑删除智能体配置 -->
|
||||
@@ -73,7 +73,7 @@
|
||||
SET deleted = 1,
|
||||
delete_time = NOW(),
|
||||
updater = #{updater}
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- 根据ID查询智能体配置 -->
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
status, is_favorite, is_pinned, message_count, total_tokens,
|
||||
last_message_time, create_time, update_time, deleted
|
||||
) VALUES (
|
||||
#{ID}, #{userID}, #{agentID}, #{title}, #{summary}, #{difyConversationId},
|
||||
#{id}, #{userID}, #{agentID}, #{title}, #{summary}, #{difyConversationId},
|
||||
#{status}, #{isFavorite}, #{isPinned}, #{messageCount}, #{totalTokens},
|
||||
#{lastMessageTime}, #{createTime}, #{updateTime}, #{deleted}
|
||||
)
|
||||
@@ -82,12 +82,12 @@
|
||||
<if test="lastMessageTime != null">last_message_time = #{lastMessageTime},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</set>
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- 逻辑删除会话 -->
|
||||
<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>
|
||||
|
||||
<!-- 根据ID查询会话 -->
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
vector_id, document_count, total_chunks, status, creator, creator_dept,
|
||||
updater, create_time, update_time, deleted
|
||||
) 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},
|
||||
#{rerankModel}, #{rerankModelProvider}, #{rerankingEnable}, #{retrievalTopK}, #{retrievalScoreThreshold},
|
||||
#{vectorID}, #{documentCount}, #{totalChunks}, #{status}, #{creator}, #{creatorDept},
|
||||
@@ -235,7 +235,7 @@
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</set>
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- deleteKnowledge(逻辑删除知识库) -->
|
||||
@@ -244,7 +244,7 @@
|
||||
SET deleted = 1,
|
||||
delete_time = NOW(),
|
||||
updater = #{updater}
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- selectKnowledgeById(根据ID查询知识库,不带权限校验) -->
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
file_ids, knowledge_ids, knowledge_refs, token_count,
|
||||
dify_message_id, rating, feedback, create_time, update_time, deleted
|
||||
) VALUES (
|
||||
#{ID}, #{conversationID}, #{userID}, #{agentID}, #{role}, #{content},
|
||||
#{id}, #{conversationID}, #{userID}, #{agentID}, #{role}, #{content},
|
||||
#{fileIDs}, #{knowledgeIDs}, #{knowledgeRefs}, #{tokenCount},
|
||||
#{difyMessageId}, #{rating}, #{feedback}, #{createTime}, #{updateTime}, #{deleted}
|
||||
)
|
||||
@@ -70,7 +70,7 @@
|
||||
<if test="feedback != null">feedback = #{feedback},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</set>
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- 逻辑删除消息 -->
|
||||
@@ -78,7 +78,7 @@
|
||||
UPDATE tb_ai_message
|
||||
SET deleted = 1,
|
||||
delete_time = NOW()
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- 根据ID查询消息 -->
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
chunk_count, status, error_message, enabled, display_status,
|
||||
create_time, update_time, deleted
|
||||
) 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},
|
||||
#{chunkCount}, #{status}, #{errorMessage}, #{enabled}, #{displayStatus},
|
||||
#{createTime}, #{updateTime}, #{deleted}
|
||||
@@ -105,7 +105,7 @@
|
||||
<if test="displayStatus != null">display_status = #{displayStatus},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
</set>
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- deleteUploadFile(逻辑删除文件记录) -->
|
||||
@@ -113,7 +113,7 @@
|
||||
UPDATE tb_ai_upload_file
|
||||
SET deleted = 1,
|
||||
delete_time = NOW()
|
||||
WHERE id = #{ID} AND deleted = 0
|
||||
WHERE id = #{id} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- selectUploadFileById(根据ID查询文件) -->
|
||||
|
||||
@@ -671,21 +671,21 @@ public class MessageServiceImpl implements MessageService {
|
||||
switch (target.getTargetType()) {
|
||||
case "dept":
|
||||
// 查询该部门及所有子部门的用户
|
||||
userIDs = userMapper.selectUserIdsByDeptId(target.getTargetId());
|
||||
logger.info("部门 {} 解析到 {} 个用户", target.getTargetId(), userIDs.size());
|
||||
userIDs = userMapper.selectUserIdsByDeptId(target.getTargetID());
|
||||
logger.info("部门 {} 解析到 {} 个用户", target.getTargetID(), userIDs.size());
|
||||
break;
|
||||
case "role":
|
||||
// 查询scopeDeptID及子部门中该角色的用户
|
||||
String scopeDeptID = target.getScopeDeptID();
|
||||
if (scopeDeptID == null || scopeDeptID.isEmpty()) {
|
||||
logger.warn("角色目标缺少 scopeDeptID,跳过:{}", target.getTargetId());
|
||||
logger.warn("角色目标缺少 scopeDeptID,跳过:{}", target.getTargetID());
|
||||
break;
|
||||
}
|
||||
userIDs = userMapper.selectUserIdsByDeptRole(scopeDeptID, target.getTargetId());
|
||||
logger.info("部门 {} 中角色 {} 解析到 {} 个用户", scopeDeptID, target.getTargetId(), userIDs.size());
|
||||
userIDs = userMapper.selectUserIdsByDeptRole(scopeDeptID, target.getTargetID());
|
||||
logger.info("部门 {} 中角色 {} 解析到 {} 个用户", scopeDeptID, target.getTargetID(), userIDs.size());
|
||||
break;
|
||||
case "user":
|
||||
userIDs.add(target.getTargetId());
|
||||
userIDs.add(target.getTargetID());
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-BOLD.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-BOLD.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-EXTRALIGHT.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-EXTRALIGHT.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-HEAVY.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-HEAVY.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-LIGHT.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-LIGHT.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-MEDIUM.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-MEDIUM.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-NORMAL.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-NORMAL.OTF
Normal file
Binary file not shown.
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-REGULAR.OTF
Normal file
BIN
schoolNewsWeb/public/font/siyuan/SOURCEHANSANSCN-REGULAR.OTF
Normal file
Binary file not shown.
@@ -12,8 +12,7 @@
|
||||
|
||||
<style lang="scss">
|
||||
#app {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
|
||||
'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-family: 'Source Han Sans SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
height: 100vh;
|
||||
|
||||
@@ -75,9 +75,17 @@ export const chatApi = {
|
||||
|
||||
// 监听标准消息事件
|
||||
eventSource.addEventListener('message', (event) => {
|
||||
try {
|
||||
// 解析JSON字符串,处理Unicode转义
|
||||
const data = JSON.parse(event.data);
|
||||
fullMessage += data;
|
||||
callback?.onMessage?.(data);
|
||||
} catch (e) {
|
||||
// 如果不是JSON,直接使用原始数据
|
||||
const data = event.data;
|
||||
fullMessage += data;
|
||||
callback?.onMessage?.(data);
|
||||
}
|
||||
});
|
||||
|
||||
// 监听结束事件
|
||||
@@ -335,9 +343,17 @@ export const chatApi = {
|
||||
|
||||
// 监听标准消息事件
|
||||
eventSource.addEventListener('message', (event) => {
|
||||
try {
|
||||
// 解析JSON字符串,处理Unicode转义
|
||||
const data = JSON.parse(event.data);
|
||||
fullMessage += data;
|
||||
callback?.onMessage?.(data);
|
||||
} catch (e) {
|
||||
// 如果不是JSON,直接使用原始数据
|
||||
const data = event.data;
|
||||
fullMessage += data;
|
||||
callback?.onMessage?.(data);
|
||||
}
|
||||
});
|
||||
|
||||
// 监听结束事件
|
||||
|
||||
@@ -5,6 +5,55 @@
|
||||
* @figma https://www.figma.com/design/4aM0yqyoAjtW2jTZcqPAtN
|
||||
*/
|
||||
|
||||
// ============ 字体声明 ============
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-EXTRALIGHT.OTF') format('opentype');
|
||||
font-weight: 200;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-LIGHT.OTF') format('opentype');
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-REGULAR.OTF') format('opentype');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-MEDIUM.OTF') format('opentype');
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-BOLD.OTF') format('opentype');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Source Han Sans SC';
|
||||
src: url('/font/siyuan/SOURCEHANSANSCN-HEAVY.OTF') format('opentype');
|
||||
font-weight: 900;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
// ============ 设计令牌 (Design Tokens) ============
|
||||
|
||||
// 颜色
|
||||
@@ -18,8 +67,8 @@ $color-bg-white: #FFFFFF; // 白色背景
|
||||
$color-border: #dcdfe6; // 边框
|
||||
|
||||
// 字体
|
||||
$font-family-cn: 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||||
$font-family-en: 'Nunito Sans', sans-serif;
|
||||
$font-family-cn: 'Source Han Sans SC', sans-serif;
|
||||
$font-family-en: 'Source Han Sans SC', sans-serif;
|
||||
$font-size-base: 14px;
|
||||
$line-height-base: 1.571428571em;
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ withDefaults(defineProps<Props>(), {
|
||||
}
|
||||
|
||||
.head-title {
|
||||
font-family: 'MiSans VF', 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 630;
|
||||
font-size: 40px;
|
||||
line-height: 1.2;
|
||||
@@ -57,7 +57,7 @@ withDefaults(defineProps<Props>(), {
|
||||
}
|
||||
|
||||
.breadcrumb-label {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
@@ -72,7 +72,7 @@ withDefaults(defineProps<Props>(), {
|
||||
}
|
||||
|
||||
.breadcrumb-item {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
@@ -84,7 +84,7 @@ withDefaults(defineProps<Props>(), {
|
||||
}
|
||||
|
||||
.separator {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-size: 14px;
|
||||
color: #C9CDD4;
|
||||
}
|
||||
|
||||
@@ -196,7 +196,7 @@ function handleClick(menu: SysMenu) {
|
||||
color: #334155;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
font-family: 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
line-height: 1.5;
|
||||
transition: color 0.3s;
|
||||
user-select: none;
|
||||
|
||||
@@ -63,7 +63,7 @@ function handleMenuClick(menu: SysMenu) {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
|
||||
@@ -55,7 +55,7 @@ input {
|
||||
padding: 0 90px 0 20px;
|
||||
border: none;
|
||||
outline: none;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-size: 14px;
|
||||
color: #141F38;
|
||||
|
||||
|
||||
@@ -256,7 +256,7 @@ function handleLogout() {
|
||||
}
|
||||
|
||||
.logo-text {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 700;
|
||||
font-size: 20.6px;
|
||||
line-height: 1.31;
|
||||
@@ -328,7 +328,7 @@ function handleLogout() {
|
||||
gap: 2px;
|
||||
padding: 26px 21px;
|
||||
color: #141F38;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -380,7 +380,7 @@ function handleLogout() {
|
||||
gap: 8px;
|
||||
padding: 12px 16px;
|
||||
color: #333;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
@@ -425,7 +425,7 @@ function handleLogout() {
|
||||
border: none;
|
||||
outline: none;
|
||||
padding: 7px 20px;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
<el-form-item label="助手描述">
|
||||
<el-input
|
||||
v-model="configForm.systemPrompt"
|
||||
v-model="configForm.description"
|
||||
type="textarea"
|
||||
:rows="8"
|
||||
placeholder="请输入助手描述,介绍AI助手的功能、特点和用途..."
|
||||
@@ -104,7 +104,7 @@ defineOptions({
|
||||
const configForm = ref<AiAgentConfig>({
|
||||
name: '',
|
||||
avatar: '',
|
||||
systemPrompt: '',
|
||||
description: '',
|
||||
connectInternet: 0,
|
||||
modelName: '',
|
||||
modelProvider: 'dify',
|
||||
|
||||
@@ -348,7 +348,7 @@ function handleDialogClose() {
|
||||
|
||||
.title {
|
||||
margin: 0;
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
@@ -366,7 +366,7 @@ function handleDialogClose() {
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
color: #FFFFFF;
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 1.43em;
|
||||
@@ -409,7 +409,7 @@ function handleDialogClose() {
|
||||
|
||||
.category-title {
|
||||
margin: 0;
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 18px;
|
||||
line-height: 1.5em;
|
||||
@@ -417,7 +417,7 @@ function handleDialogClose() {
|
||||
}
|
||||
|
||||
.category-count {
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.5em;
|
||||
@@ -462,7 +462,7 @@ function handleDialogClose() {
|
||||
}
|
||||
|
||||
.tag-name {
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
@@ -478,7 +478,7 @@ function handleDialogClose() {
|
||||
background: #ECEEF2;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 8px;
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 12px;
|
||||
line-height: 1.33em;
|
||||
@@ -501,7 +501,7 @@ function handleDialogClose() {
|
||||
background: #FFFFFF;
|
||||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||
border-radius: 8px;
|
||||
font-family: 'Inter', 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 1.43em;
|
||||
|
||||
@@ -111,7 +111,7 @@ function handleClick() {
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
@@ -126,7 +126,7 @@ function handleClick() {
|
||||
flex-direction: column;
|
||||
|
||||
.article-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 1.25em;
|
||||
line-height: 1.4;
|
||||
@@ -141,7 +141,7 @@ function handleClick() {
|
||||
}
|
||||
|
||||
.article-desc {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
@@ -173,7 +173,7 @@ function handleClick() {
|
||||
}
|
||||
|
||||
span {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
@@ -182,7 +182,7 @@ function handleClick() {
|
||||
}
|
||||
|
||||
.view-count {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
|
||||
@@ -113,7 +113,7 @@ function handleClick() {
|
||||
box-sizing: border-box;
|
||||
|
||||
.day {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 1.875em;
|
||||
line-height: 0.73;
|
||||
@@ -123,7 +123,7 @@ function handleClick() {
|
||||
}
|
||||
|
||||
.month {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
@@ -140,7 +140,7 @@ function handleClick() {
|
||||
flex-direction: column;
|
||||
|
||||
.card-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 1.25em;
|
||||
line-height: 1.4;
|
||||
@@ -155,7 +155,7 @@ function handleClick() {
|
||||
}
|
||||
|
||||
.card-desc {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 0.875em;
|
||||
line-height: 1.57;
|
||||
|
||||
@@ -735,7 +735,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.article-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 28px;
|
||||
line-height: 28px;
|
||||
@@ -753,7 +753,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.meta-item {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 28px;
|
||||
@@ -780,7 +780,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.article-content {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 30px;
|
||||
|
||||
@@ -69,7 +69,7 @@ function handleLearn() {
|
||||
background: #FFFFFF;
|
||||
border-radius: 12px;
|
||||
border: none;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 22.4px;
|
||||
|
||||
@@ -530,7 +530,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.course-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
line-height: 1.4;
|
||||
@@ -539,7 +539,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.course-desc {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
@@ -568,7 +568,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
span {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
@@ -590,7 +590,7 @@ function formatDuration(minutes?: number): string {
|
||||
gap: 14px;
|
||||
|
||||
.progress-label {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 1.71;
|
||||
@@ -620,7 +620,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.progress-percent {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
line-height: 1.71;
|
||||
@@ -637,7 +637,7 @@ function formatDuration(minutes?: number): string {
|
||||
:deep(.el-button) {
|
||||
height: 42px;
|
||||
border-radius: 8px;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
padding: 8px 24px;
|
||||
@@ -727,7 +727,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.title-text {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -772,7 +772,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.chapter-name {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -806,7 +806,7 @@ function formatDuration(minutes?: number): string {
|
||||
flex: 1;
|
||||
|
||||
.node-number {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
@@ -825,7 +825,7 @@ function formatDuration(minutes?: number): string {
|
||||
}
|
||||
|
||||
.node-name {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
@@ -836,7 +836,7 @@ function formatDuration(minutes?: number): string {
|
||||
|
||||
.node-right {
|
||||
.node-status {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.57;
|
||||
|
||||
@@ -540,7 +540,7 @@ onMounted(() => {
|
||||
margin-top: 46.66px;
|
||||
|
||||
p {
|
||||
font-family: 'Taipei Sans TC Beta', 'PingFang SC', sans-serif;
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 50px;
|
||||
line-height: 1.42;
|
||||
@@ -606,7 +606,7 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.login-title {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -762,7 +762,7 @@ onMounted(() => {
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
color: #FFFFFF;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
@@ -774,7 +774,7 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.agreement-text {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 10px;
|
||||
line-height: 1.8;
|
||||
@@ -788,7 +788,7 @@ onMounted(() => {
|
||||
width: 100%;
|
||||
|
||||
.register-link {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
line-height: 1.83;
|
||||
@@ -806,7 +806,7 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.copyright {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-size: 12px;
|
||||
line-height: 2;
|
||||
color: #D9D9D9;
|
||||
|
||||
@@ -557,7 +557,7 @@ onUnmounted(() => {
|
||||
margin-top: 46.66px;
|
||||
|
||||
p {
|
||||
font-family: 'Taipei Sans TC Beta', 'PingFang SC', sans-serif;
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 50px;
|
||||
line-height: 1.42;
|
||||
@@ -623,7 +623,7 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.register-title {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -718,7 +718,7 @@ onUnmounted(() => {
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
color: #FFFFFF;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
@@ -730,7 +730,7 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.agreement-text {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 10px;
|
||||
line-height: 1.8;
|
||||
@@ -744,7 +744,7 @@ onUnmounted(() => {
|
||||
width: 100%;
|
||||
|
||||
.login-link {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
line-height: 1.83;
|
||||
@@ -762,7 +762,7 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.copyright {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-size: 12px;
|
||||
line-height: 2;
|
||||
color: #D9D9D9;
|
||||
|
||||
@@ -104,7 +104,7 @@ function getChartOption(): EChartsOption {
|
||||
axisLabel: {
|
||||
color: '#979797',
|
||||
fontSize: 14,
|
||||
fontFamily: 'PingFang SC'
|
||||
fontFamily: 'Source Han Sans SC'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
@@ -121,7 +121,7 @@ function getChartOption(): EChartsOption {
|
||||
axisLabel: {
|
||||
color: '#979797',
|
||||
fontSize: 14,
|
||||
fontFamily: 'PingFang SC'
|
||||
fontFamily: 'Source Han Sans SC";'
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
@@ -221,7 +221,7 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.progress-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
line-height: 38px;
|
||||
@@ -230,7 +230,7 @@ onUnmounted(() => {
|
||||
}
|
||||
|
||||
.update-time {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
@@ -254,7 +254,7 @@ onUnmounted(() => {
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
|
||||
@@ -512,7 +512,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
}
|
||||
|
||||
.header-text {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
@@ -527,7 +527,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
padding: 10px;
|
||||
|
||||
.task-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
line-height: 1.4;
|
||||
@@ -536,7 +536,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
}
|
||||
|
||||
.task-description {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.5714285714285714;
|
||||
@@ -560,7 +560,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 1.5714285714285714;
|
||||
@@ -612,7 +612,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
gap: 8px;
|
||||
|
||||
.stat-label {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 1.5714285714285714;
|
||||
@@ -620,7 +620,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 32px;
|
||||
line-height: 1;
|
||||
@@ -654,7 +654,7 @@ function getItemStatusType(status?: number): 'info' | 'warning' | 'success' {
|
||||
|
||||
.progress-label,
|
||||
.progress-value {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
|
||||
@@ -234,7 +234,7 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
.section {
|
||||
max-width: 1440px;
|
||||
// max-width: 1440px;
|
||||
margin: 0 auto;
|
||||
padding: 0 120px;
|
||||
margin-top: 60px;
|
||||
@@ -246,7 +246,7 @@ onMounted(() => {
|
||||
margin-bottom: 24px;
|
||||
|
||||
.section-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 28px;
|
||||
line-height: 38px;
|
||||
@@ -262,7 +262,7 @@ onMounted(() => {
|
||||
transition: color 0.3s;
|
||||
|
||||
span {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: 'Source Han Sans SC', sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
|
||||
@@ -347,7 +347,8 @@ onMounted(() => {
|
||||
|
||||
.my-message-list {
|
||||
padding: 20px;
|
||||
max-width: 1200px;
|
||||
width: 90%;
|
||||
// max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
min-height: calc(100vh - 76px - 40px);
|
||||
display: flex;
|
||||
|
||||
@@ -113,7 +113,8 @@ async function handleArticleNavigate(direction: 'prev' | 'next', resourceId: str
|
||||
padding: 20px 0;
|
||||
|
||||
:deep(.resource-search) {
|
||||
width: 1200px;
|
||||
// width: 1200px;
|
||||
width: 90%;
|
||||
height: 60px;
|
||||
padding: 0;
|
||||
|
||||
@@ -145,7 +146,7 @@ async function handleArticleNavigate(direction: 'prev' | 'next', resourceId: str
|
||||
}
|
||||
|
||||
.content-container {
|
||||
width: 1200px;
|
||||
width: 90%;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 24px;
|
||||
|
||||
@@ -48,7 +48,7 @@ function handleNavigate(direction: 'prev' | 'next') {
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
|
||||
@@ -60,7 +60,7 @@ function handleCollect() {
|
||||
}
|
||||
|
||||
span {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
|
||||
@@ -231,7 +231,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.resource-title {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 28px;
|
||||
line-height: 28px;
|
||||
@@ -251,7 +251,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
span {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
@@ -260,7 +260,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.resource-summary {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
@@ -278,7 +278,7 @@ defineExpose({
|
||||
.empty {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-size: 14px;
|
||||
color: #979797;
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ function handleCategoryClick(category: Tag) {
|
||||
}
|
||||
|
||||
.category-name {
|
||||
font-family: 'PingFang SC';
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
|
||||
@@ -57,4 +57,12 @@ function handleMenuClick(menu: SysMenu) {
|
||||
min-height: 100vh;
|
||||
background: #F9F9F9;
|
||||
}
|
||||
:deep(.menu-container){
|
||||
width: 90%;
|
||||
max-width: none;
|
||||
}
|
||||
:deep(.main-content .container){
|
||||
width: 90%;
|
||||
max-width: none !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -63,14 +63,14 @@ const menus = computed(() => {
|
||||
}
|
||||
|
||||
.user-card-wrapper {
|
||||
width: 100%;
|
||||
width: 90%;
|
||||
height: 25%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
width: 100%;
|
||||
width: 90%;
|
||||
|
||||
height: 75%;
|
||||
display: flex;
|
||||
|
||||
@@ -117,7 +117,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.title {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
line-height: 28px;
|
||||
@@ -130,7 +130,7 @@ onMounted(async () => {
|
||||
background: rgba(198, 40, 40, 0.05);
|
||||
border: 1px solid #C62828;
|
||||
border-radius: 4px;
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
@@ -178,7 +178,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.username {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
line-height: 24px;
|
||||
@@ -198,7 +198,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.gender-text {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
@@ -212,7 +212,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.info-item {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
@@ -226,7 +226,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
@@ -239,7 +239,7 @@ onMounted(async () => {
|
||||
}
|
||||
|
||||
.level-text {
|
||||
font-family: 'PingFang SC', sans-serif;
|
||||
font-family: "Source Han Sans SC";
|
||||
font-weight: 500;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
|
||||
Reference in New Issue
Block a user