diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..7448a12091e1e8411974ac58aac992870edab3bb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +FROM node:18.18.2-alpine +WORKDIR /opt/data_chain_web +RUN mkdir -p /opt/data_chain_web +COPY . /opt/data_chain_web + +RUN npm install pnpm -g --registry=https://registry.npmmirror.com && \ + pnpm install --registry=https://registry.npmmirror.com && \ + pnpm run build + + +FROM openeuler/openeuler:22.03-lts-sp1 + +ENV TZ Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \ + echo $TZ > /etc/timezone + +RUN sed -i 's|repo.openeuler.org|mirrors.nju.edu.cn/openeuler|g' /etc/yum.repos.d/openEuler.repo && \ + sed -i '/metalink/d' /etc/yum.repos.d/openEuler.repo && \ + sed -i '/metadata_expire/d' /etc/yum.repos.d/openEuler.repo && \ + yum update -y && \ + yum install -y nginx shadow-utils passwd gettext && \ + yum clean all && \ + groupadd -g 1001 eulercopilot && \ + useradd -m -u 1001 -g eulercopilot -s /sbin/nologin eulercopilot && \ + passwd -l eulercopilot + +COPY --from=0 /opt/data_chain_web/dist /usr/share/nginx/html +COPY --from=0 /opt/data_chain_web/public /usr/share/nginx/html +COPY --from=0 /opt/data_chain_web/deploy/prod/nginx.conf.tmpl /home/eulercopilot/nginx.conf.tmpl +COPY --from=0 /opt/data_chain_web/deploy/prod/start.sh /home/eulercopilot/start.sh + +RUN sed -i 's/umask 002/umask 027/g' /etc/bashrc && \ + sed -i 's/umask 022/umask 027/g' /etc/bashrc && \ + chown -R eulercopilot:eulercopilot /usr/share/nginx && \ + chown -R eulercopilot:eulercopilot /var/log/nginx && \ + chown -R eulercopilot:eulercopilot /var/lib/nginx && \ + chown -R eulercopilot:eulercopilot /etc/nginx && \ + chmod -R 750 /var/log/nginx && \ + find /var/log/nginx -type f -exec chmod 640 {} + && \ + chmod -R 500 /var/lib/nginx && \ + chmod -R 500 /usr/share/nginx && \ + chmod -R 500 /etc/nginx && \ + find /var/log/nginx -type f -exec chmod 400 {} + + +RUN yum remove -y gdb-gdbserver && \ + sh -c "find /usr /etc \( -name *yum* -o -name *dnf* -o -name *vi* -o -name *sqlite* -o -name *python* \) -exec rm -rf {} + || true" && \ + sh -c "find /usr /etc \( -name ps -o -name top \) -exec rm -rf {} + || true" + +EXPOSE 9888 + +USER eulercopilot +WORKDIR /home/eulercopilot + +ENTRYPOINT [ "bash", "./start.sh" ] diff --git a/README.md b/README.md index 994145439ba216bc0b8af9efa7eebfe7f85d5fce..0ed320c09eb96cca82d1422be289f4b3d17550da 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,15 @@ -# euler-copilot-witchaind-web +## 项目启动 -#### 介绍 -The web frontend of EulerCopilot witChainD. +```bash +# 安装 pnpm +npm install pnpm -g -#### 软件架构 -软件架构说明 +# 设置镜像源(可忽略) +pnpm config set registry https://registry.npmmirror.com +# 安装依赖 +pnpm install -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +# 启动运行 +pnpm run dev +``` \ No newline at end of file diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..6045ee33bc963156880f38b21c39c2fbf76d274b --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,96 @@ +module.exports = { + // 继承的规则 + extends: ["@commitlint/config-conventional"], + // 自定义规则 + rules: { + // @see https://commitlint.js.org/#/reference-rules + + // 提交类型枚举,git提交type必须是以下类型 + "type-enum": [ + 2, + "always", + [ + "feat", // 新增功能 + "fix", // 修复缺陷 + "docs", // 文档变更 + "style", // 代码格式(不影响功能,例如空格、分号等格式修正) + "refactor", // 代码重构(不包括 bug 修复、功能新增) + "perf", // 性能优化 + "test", // 添加疏漏测试或已有测试改动 + "build", // 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等) + "ci", // 修改 CI 配置、脚本 + "revert", // 回滚 commit + "chore", // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例) + "wip", // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例) + ], + ], + "subject-case": [0], // subject大小写不做校验 + }, + + prompt: { + messages: { + type: "选择你要提交的类型 :", + scope: "选择一个提交范围(可选):", + customScope: "请输入自定义的提交范围 :", + subject: "填写简短精炼的变更描述 :\n", + body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n', + breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n', + footerPrefixesSelect: "选择关联issue前缀(可选):", + customFooterPrefix: "输入自定义issue前缀 :", + footer: "列举关联issue (可选) 例如: #31, #I3244 :\n", + generatingByAI: "正在通过 AI 生成你的提交简短描述...", + generatedSelectByAI: "选择一个 AI 生成的简短描述:", + confirmCommit: "是否提交或修改commit ?", + }, + // prettier-ignore + types: [ + { value: "feat", name: "特性: ✨ 新增功能", emoji: ":sparkles:" }, + { value: "fix", name: "修复: 🐛 修复缺陷", emoji: ":bug:" }, + { value: "docs", name: "文档: 📝 文档变更(更新README文件,或者注释)", emoji: ":memo:" }, + { value: "style", name: "格式: 🌈 代码格式(空格、格式化、缺失的分号等)", emoji: ":lipstick:" }, + { value: "refactor", name: "重构: 🔄 代码重构(不修复错误也不添加特性的代码更改)", emoji: ":recycle:" }, + { value: "perf", name: "性能: 🚀 性能优化", emoji: ":zap:" }, + { value: "test", name: "测试: 🧪 添加疏漏测试或已有测试改动", emoji: ":white_check_mark:" }, + { value: "build", name: "构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 vite 配置等)", emoji: ":package:" }, + { value: "ci", name: "集成: ⚙️ 修改 CI 配置、脚本", emoji: ":ferris_wheel:" }, + { value: "revert", name: "回退: ↩️ 回滚 commit", emoji: ":rewind:" }, + { value: "chore", name: "其他: 🛠️ 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)", emoji: ":hammer:" }, + { value: "wip", name: "开发中: 🚧 开发阶段临时提交", emoji: ":construction:" }, + ], + useEmoji: true, + emojiAlign: "center", + useAI: false, + aiNumber: 1, + themeColorCode: "", + scopes: [], + allowCustomScopes: true, + allowEmptyScopes: true, + customScopesAlign: "bottom", + customScopesAlias: "custom", + emptyScopesAlias: "empty", + upperCaseSubject: false, + markBreakingChangeMode: false, + allowBreakingChanges: ["feat", "fix"], + breaklineNumber: 100, + breaklineChar: "|", + skipQuestions: [], + issuePrefixes: [ + { value: "closed", name: "closed: ISSUES has been processed" }, + ], + customIssuePrefixAlign: "top", + emptyIssuePrefixAlias: "skip", + customIssuePrefixAlias: "custom", + allowCustomIssuePrefix: true, + allowEmptyIssuePrefix: true, + confirmColorize: true, + maxHeaderLength: Infinity, + maxSubjectLength: Infinity, + minSubjectLength: 0, + scopeOverrides: undefined, + defaultBody: "", + defaultIssues: "", + defaultScope: "", + defaultSubject: "", + }, +}; + diff --git a/deploy/dev/euler_copilot.conf b/deploy/dev/euler_copilot.conf new file mode 100644 index 0000000000000000000000000000000000000000..057b8a16f5884f3d9753b5f3d809d44562484bfe --- /dev/null +++ b/deploy/dev/euler_copilot.conf @@ -0,0 +1,78 @@ +server { + listen 8080; + server_name localhost; + charset utf-8; + + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "no-referrer"; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: base64;"; + add_header Cache-Control "no-cache,no-store,must-revalidate"; + add_header Pragma no-cache; + add_header Expires 0; + client_max_body_size 5G; + # limit_conn limitperip 10; + + if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE)$) { + return 444; + } + + location ~ /\. { + deny all; + return 404; + } + + location ~ ^(?:(?!/static)).*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|html|txt|pdf)$ { + root /usr/share/nginx/html; + expires 30d; + } + + location / { + proxy_set_header X-Real-IP $remote_addr; + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html; + if (!-e $request_filename){ + rewrite ^(.*)$ /index.html last; + } + } + + location /api/health_check { + deny all; + return 404; + } + + location /api/ { + proxy_set_header X-Real-IP $remote_addr; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: base64;"; + add_header Cache-Control "no-cache,no-store,must-revalidate"; + add_header Pragma no-cache; + add_header Expires 0; + proxy_buffering off; + error_page 404 = @not_found; + + proxy_pass http://192.168.10.31:9988/; + } + + location @not_found { + root /usr/share/nginx/html; + rewrite ^ /404.html break; + } + + + error_page 401 402 403 405 406 407 413 414 /error.html; + error_page 404 /404.html; + error_page 500 501 502 503 504 505 /error.html; + + location = /404.html { + root /usr/share/nginx/html; + } + + location = /error.html { + root /usr/share/nginx/html; + } + + } diff --git a/deploy/prod/.env.example b/deploy/prod/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..31983a5bad5cf7c52f3b1ce365056271d2d79f1b --- /dev/null +++ b/deploy/prod/.env.example @@ -0,0 +1 @@ +DATA_CHAIN_BACEND_URL= \ No newline at end of file diff --git a/deploy/prod/nginx.conf.tmpl b/deploy/prod/nginx.conf.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..1c1c077f5e87bd1e9fcfb927addc2969ac1d954b --- /dev/null +++ b/deploy/prod/nginx.conf.tmpl @@ -0,0 +1,137 @@ +worker_processes auto; +worker_rlimit_nofile 4096; +error_log ${ERROR_FILE} info; +pid ${PID_FILE}; + +include /usr/share/nginx/modules/*.conf; + +events { + use epoll; + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log ${LOG_FILE} main; + + autoindex off; + server_tokens off; + + port_in_redirect off; + absolute_redirect off; + + client_header_buffer_size 1k; + large_client_header_buffers 4 8k; + client_body_buffer_size 5120M; + client_max_body_size 5120M; + + client_header_timeout 15s; + client_body_timeout 15s; + client_body_in_file_only off; + + keepalive_timeout 500s; + send_timeout 25s; + + limit_conn_zone $binary_remote_addr zone=limitperip:10m; + limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=1000r/s; + + proxy_hide_header X-Powered-By; + proxy_request_buffering off; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + types_hash_max_size 4096; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + gzip on; + gzip_min_length 1k; + gzip_buffers 4 16k; + gzip_comp_level 5; + gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/x-httpd-php application/json; + gzip_vary on; + + include /etc/nginx/conf.d/*.conf; + + server { + listen 9888; + server_name localhost; + charset utf-8; + + add_header X-XSS-Protection "1; mode=block"; + add_header Referrer-Policy "no-referrer"; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: base64;"; + add_header Cache-Control "no-cache,no-store,must-revalidate"; + add_header Pragma no-cache; + add_header Expires 0; + # limit_conn limitperip 10; + + if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE)$) { + return 444; + } + + location ~ /\. { + deny all; + return 404; + } + + location ~ ^(?:(?!/static)).*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|html|txt|pdf)$ { + root /usr/share/nginx/html; + expires 30d; + } + + location / { + proxy_set_header X-Real-IP $remote_addr; + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html; + if (!-e $request_filename){ + rewrite ^(.*)$ /index.html last; + } + } + + location /api/health_check { + deny all; + return 404; + } + + location /api/ { + proxy_set_header X-Real-IP $remote_addr; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: base64;"; + add_header Cache-Control "no-cache,no-store,must-revalidate"; + add_header Pragma no-cache; + add_header Expires 0; + proxy_buffering off; + error_page 404 = @not_found; + + proxy_pass ${DATA_CHAIN_BACEND_URL}/; + } + + location @not_found { + root /usr/share/nginx/html; + rewrite ^ /404.html break; + } + + + error_page 401 402 403 405 406 407 413 414 /error.html; + error_page 404 /404.html; + error_page 500 501 502 503 504 505 /error.html; + + location = /404.html { + root /usr/share/nginx/html; + } + + location = /error.html { + root /usr/share/nginx/html; + } + } +} diff --git a/deploy/prod/start.sh b/deploy/prod/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..14cdb2362e158792d924e9cabdcff5b9c8bb93eb --- /dev/null +++ b/deploy/prod/start.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +export $(cat .env | xargs) + +domain_limit=" + if (\$http_Host !~ ${SERVER_NAME} $) { + return 403; + } +" + +ssl_settings=" + ssl_session_tickets off; + ssl_session_timeout 5m; + ssl_session_cache shared:SSL:10m; + + ssl_certificate /config/server.crt; + ssl_certificate_key /config/server.key; + ssl_password_file /config/pass.txt; + ssl_dhparam /config/dhparam.pem; + ssl_ecdh_curve auto; + ssl_protocols TLSv1.2; + ssl_ciphers \"ECDHE-RSA-AES256-GCM-SHA384\"; + ssl_prefer_server_ciphers on; + ssl_stapling on; + ssl_stapling_verify on; +" + +if [[ -v SSL_ENABLE_FLAG ]]; then + export SSL_ENABLE=ssl + export SSL_SETTINGS=$ssl_settings +else + export SSL_ENABLE="" +fi + +if [[ -v PROD ]]; then + export ERROR_FILE="/dev/stderr" + export LOG_FILE="/dev/stdout" + export PID_FILE="/var/lib/nginx/tmp/nginx.pid" +else + export ERROR_FILE="/var/log/nginx/error.log" + export LOG_FILE="/var/log/nginx/access.log" + export PID_FILE="/var/log/nginx/nginx.pid" +fi + +if [[ -v DOMAIN_LIMIT_ENABLE_FLAG ]]; then + export DOMAIN_LIMIT=$domain_limit +else + export DOMAIN_LIMIT="" +fi + +bash -c "envsubst '\${ERROR_FILE} \${LOG_FILE} \${PID_FILE} \${DATA_CHAIN_BACEND_URL}' < nginx.conf.tmpl > /config/nginx.conf" + +nginx -c /config/nginx.conf -g "daemon off;" \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1d65c6435dd694fc8b9989fb47a9c46717846f86 --- /dev/null +++ b/index.html @@ -0,0 +1,52 @@ + + + + + + + witChainD + + + +
+
+
+ + + + + diff --git a/lib/opendesign-icons-1.0.3.tgz b/lib/opendesign-icons-1.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9e302607c8a5057f203c8407a042d5edf8d859a1 Binary files /dev/null and b/lib/opendesign-icons-1.0.3.tgz differ diff --git a/lib/opendesign2-2.0.11.tgz b/lib/opendesign2-2.0.11.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d11dc18e426343687bb9e278be323cb20b058db0 Binary files /dev/null and b/lib/opendesign2-2.0.11.tgz differ diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..6de155ac825735113431b03fb0fd055f1abd032d --- /dev/null +++ b/lint-staged.config.cjs @@ -0,0 +1,13 @@ +module.exports = { + "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], + "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [ + "prettier --write--parser json", + ], + "package.json": ["prettier --write"], + "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"], + "*.{scss,less,styl,html}": [ + "stylelint --fix --allow-empty-input", + "prettier --write ", + ], + "*.md": ["prettier --write"], +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..d027adb16fecd82290ba9cb0ee36ffaf2be38b68 --- /dev/null +++ b/package.json @@ -0,0 +1,128 @@ +{ + "name": "witChainD", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit & vite build", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit", + "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", + "lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --fix", + "lint:lint-staged": "lint-staged", + "preinstall": "npx only-allow pnpm", + "prepare": "husky install", + "commit": "git-cz" + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + }, + "lint-staged": { + "*.{js,ts}": [ + "prettier --write" + ], + "*.{cjs,json}": [ + "prettier --write" + ], + "*.{vue,html}": [ + "prettier --write" + ], + "*.{scss,css}": [ + "prettier --write" + ], + "*.md": [ + "prettier --write" + ] + }, + "dependencies": { + "@computing/opendesign2": "file:lib\\opendesign2-2.0.11.tgz", + "@element-plus/icons-vue": "^2.3.1", + "@stomp/stompjs": "^7.0.0", + "@vueuse/core": "^10.11.1", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "5.1.10", + "animate.css": "^4.1.1", + "axios": "^1.7.4", + "codemirror": "^5.65.17", + "codemirror-editor-vue3": "^2.7.0", + "color": "^4.2.3", + "echarts": "^5.5.1", + "element-plus": "^2.8.0", + "exceljs": "^4.4.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nprogress": "^0.2.0", + "path-browserify": "^1.0.1", + "path-to-regexp": "^6.2.2", + "pinia": "^2.2.2", + "qs": "^6.13.0", + "sortablejs": "^1.15.2", + "uuid": "^10.0.0", + "vue": "^3.4.38", + "vue-i18n": "9.9.1", + "vue-router": "^4.4.3", + "vue-uuid": "^3.0.0" + }, + "devDependencies": { + "@commitlint/cli": "^18.6.1", + "@commitlint/config-conventional": "^18.6.3", + "@computing/opendesign-icons": "file:lib\\opendesign-icons-1.0.3.tgz", + "@computing/opendesign2": "file:lib\\opendesign2-2.0.11.tgz", + "@iconify-json/ep": "^1.1.16", + "@types/codemirror": "^5.60.15", + "@types/color": "^3.0.6", + "@types/lodash": "^4.17.7", + "@types/node": "^20.14.15", + "@types/nprogress": "^0.2.3", + "@types/path-browserify": "^1.0.2", + "@types/qs": "^6.9.15", + "@types/sortablejs": "^1.15.8", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "autoprefixer": "^10.4.20", + "commitizen": "^4.3.0", + "cz-git": "^1.9.4", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-vue": "^9.27.0", + "fast-glob": "^3.3.2", + "lint-staged": "^15.2.9", + "postcss": "^8.4.41", + "postcss-html": "^1.7.0", + "postcss-scss": "^4.0.9", + "prettier": "^3.3.3", + "sass": "^1.77.8", + "stylelint": "^16.8.2", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.6.0", + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^36.0.1", + "terser": "^5.31.6", + "typescript": "^5.5.4", + "unocss": "^0.58.9", + "unplugin-auto-import": "^0.17.8", + "unplugin-icons": "^0.18.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^5.4.1", + "vite-plugin-mock-dev-server": "^1.7.1", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vue-devtools": "^7.3.8", + "vue-tsc": "^2.0.29", + "husky": "^8.0.3" + }, + "license": "MIT", + "engines": { + "node": ">=18.18.2" + } +} diff --git a/public/euler_copilot_logo.svg b/public/euler_copilot_logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..2ac4fced1382e233d40e6f566e68bc4570c96dd4 --- /dev/null +++ b/public/euler_copilot_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8ed8d998756a7a0dedfb37ee153ce305d9f35f10 Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..b276343cfeffeb8bd0a45e2ffa7829a34e3f3d65 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,17 @@ + + + + diff --git a/src/api/apiType.ts b/src/api/apiType.ts new file mode 100644 index 0000000000000000000000000000000000000000..06e5773811ed8338412eb5de46361c95954bf868 --- /dev/null +++ b/src/api/apiType.ts @@ -0,0 +1,62 @@ +export interface CreateKbRequest { + default_chunk_size: number; + default_parser_method: string; + description: string; + document_type_list: string[]; + embedding_model: string; + name: string; + [property: string]: any; +} + +export interface UpdateKbRequest { + default_chunk_size: number; + default_parser_method: string; + description: string; + document_type_list: object[]; + embedding_model: string; + id: string; + name: string; + [property: string]: any; +} + +export interface QueryKbRequest { + created_time_order?: string; + document_count_order?: string; + name?: string; + page_number: number; + page_size: number; + [property: string]: any; +} + +export interface DocListRequest { + chunk_size_order?: string; + created_time_order?: string; + document_type?: string; + kb_id: string; + name?: string; + page_number: number; + page_size: number; + parse_status?: string; + [property: string]: any; +} + +export interface DocRenameRequest { + chunk_size: number; + document_type: object; + id: string; + name: string; + [property: string]: any; +} + +export interface DocDownload { + id: string; + name: string; +} + +export interface ChunkRequest { + document_id: string; + page_number: number; + page_size: number; + text?: string; + [property: string]: any; +} diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000000000000000000000000000000000000..124fe2a30082839a0bbcf11072808612512e3347 --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,48 @@ +import request from "@/utils/request"; + +class AuthAPI { + /** 登录 接口*/ + static login(data: LoginData) { + return request({ + url: `/user/login`, + method: "get", + params: data, + }); + } + + /** 注销 接口*/ + static logout() { + return request({ + url: `/user/logout`, + method: "get", + }); + } + + /** 注销 接口*/ + static userUpdate(data: userUpade) { + return request({ + url: `/user/update`, + method: "post", + data: data, + }); + } +} + +export default AuthAPI; +/** 登录请求参数 */ +export interface LoginData { + /** 用户名 */ + account: string; + /** 密码 */ + password: string; +} + +export interface userUpade { + account?: string; + language?: string; + name?: string; + passwd?: string; + role?: string; + status?: string; + [property: string]: any; +} diff --git a/src/api/kbApp.ts b/src/api/kbApp.ts new file mode 100644 index 0000000000000000000000000000000000000000..22c5112bb2eef633c1dbd113b5f1c95c19448285 --- /dev/null +++ b/src/api/kbApp.ts @@ -0,0 +1,148 @@ +import request from "@/utils/request"; +import { CreateKbRequest, QueryKbRequest, UpdateKbRequest } from "./apiType"; +import { ModelForm } from "@/components/UserHeaderBar/modelConfig"; + +class KbAppAPI { + /** 获取用户所有知识库*/ + static getKbLibrary(data: QueryKbRequest) { + return request({ + url: `/kb/list`, + method: "post", + data: data, + }); + } + + /** 删除用户知识库*/ + static delKbLibrary(data: { id: string; task_id: string }) { + return request({ + url: `/kb/rm`, + method: "post", + data: data, + }); + } + + /** 创建用户知识库*/ + static createKbLibrary(data: CreateKbRequest) { + return request({ + url: `/kb/create`, + method: "post", + data: data, + }); + } + + /**更新资产库 */ + static updateKbLibrary(data: UpdateKbRequest) { + return request({ + url: `/kb/update`, + method: "post", + data: data, + }); + } + + /** 获取导入知识库状态*/ + static queryKbTaskList(data: { + types: any[]; + page_size: number; + page_number: number; + }) { + return request({ + url: `/kb/task/list`, + method: "post", + data: data, + }); + } + + static stopKbTaskList(data: { task_id?: string; types?: any[] }) { + return request({ + url: `/kb/task/rm`, + method: "post", + data: data, + }); + } + + /**导入资产库 */ + static importKbLibrary(payload: { data: any }, options: any) { + return request({ + url: `/kb/import`, + method: "post", + data: payload.data, + headers: { + "Content-Type": "multipart/form-data", + }, + onUploadProgress(e) { + const rate = Math.floor((e.loaded / (e.total as number)) * 100); + if (rate < 100) { + options.onProgress(rate); + } + }, + }); + } + + /**打包资产库 */ + + static savebLibrary(id: string, options: any) { + return request({ + url: `/kb/export`, + data: { + id, + }, + method: "post", + onUploadProgress(e) { + const rate = Math.floor((e.loaded / (e.total as number)) * 100); + if (rate < 100) { + options.onProgress(rate); + } + }, + }); + } + + /**导出资产库 */ + static exportbLibrary(fileId: string) { + return request({ + url: `/kb/download`, + data: { + id: fileId, + }, + method: "post", + }); + } + + static queryLanguageList() { + return request({ + url: `/kb/language`, + method: "get", + }); + } + + static queryEmbeddingModelList() { + return request({ + url: `/other/embedding_model`, + method: "get", + }); + } + + static queryParseMethodList() { + return request({ + url: `/other/parse_method`, + method: "get", + }); + } + + /** 是否启用文件*/ + static addUserModel(data: ModelForm) { + return request({ + url: `/model/update`, + method: "post", + data: data, + }); + } + + static getdUserModel() { + return request({ + url: `/model/get`, + method: "get", + }); + } +} + +export default KbAppAPI; diff --git a/src/api/kfApp.ts b/src/api/kfApp.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf0bb9f124cfb493981b56f43971dd6f1e1bdabd --- /dev/null +++ b/src/api/kfApp.ts @@ -0,0 +1,124 @@ +import request from "@/utils/request"; +import { + ChunkRequest, + DocDownload, + DocListRequest, + DocRenameRequest, +} from "./apiType"; + +class KfAppAPI { + /** 获取资产库里的文件*/ + static getKbLibraryFile(data: DocListRequest) { + return request({ + url: `/doc/list`, + method: "post", + data: data, + }); + } + /** 修改资产库里的文件*/ + static updateLibraryFile(data: DocRenameRequest) { + return request({ + url: `/doc/update`, + method: "post", + data: data, + }); + } + + /** 是否启用文件*/ + static switchLibraryFile(data: { enabled: boolean; id: string }) { + return request({ + url: `/doc/switch`, + method: "post", + data: data, + }); + } + + /** 是否删除文件*/ + static delLibraryFile(data: { ids: any[] }) { + return request({ + url: `/doc/rm`, + method: "post", + data: data, + }); + } + + /** 是否重启/取消文件*/ + static runLibraryFile(data: { ids: string[]; run: string }) { + return request({ + url: `/doc/run`, + method: "post", + data: data, + }); + } + + /**导入资产库文档 */ + static importKbLibraryFile( + payload: { data: any; params: any }, + options: any + ) { + return request({ + url: `/doc/upload?kb_id=${payload.params.kb_id}`, + method: "post", + data: payload.data, + headers: { + "Content-Type": "multipart/form-data", + }, + onUploadProgress(e) { + const rate = Math.floor((e.loaded / (e.total as number)) * 100); + if (rate < 100) { + options.onProgress(rate); + } + }, + }); + } + + /** 下载文件*/ + static downloadLibraryFile(data: { ids: string[] }) { + return request({ + url: `/doc/download`, + method: "post", + data: data, + }); + } + + /** 获取导入知识库状态*/ + static queryKfTaskList(data: { type: string }) { + return request({ + url: `/doc/task/list`, + method: "post", + data: data, + }); + } + + static stopKfTaskList(data: { id: string }) { + return request({ + url: `/doc/task/stop`, + method: "post", + data: data, + }); + } + + /** 查询文档预览内容*/ + static chunkLibraryFile(data: ChunkRequest) { + return request({ + url: `/chunk/list`, + method: "post", + data: data, + }); + } + + /** 是否启用文件*/ + static switchLibraryFileSection(data: { + enabled: boolean; + ids: string[]; + document_id: string; + }) { + return request({ + url: `/chunk/switch`, + method: "post", + data: data, + }); + } +} + +export default KfAppAPI; diff --git a/src/api/login.ts b/src/api/login.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/api/menu.ts b/src/api/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..baa6243c52e522d5cc1c91274e7680ef5f3335c9 --- /dev/null +++ b/src/api/menu.ts @@ -0,0 +1,51 @@ +import request from "@/utils/request"; +// 菜单基础URL +const MENU_BASE_URL = "/api/v1/menus"; + +class MenuAPI { + /** + * 获取当前用户的路由列表 + *

+ * 无需传入角色,后端解析token获取角色自行判断是否拥有路由的权限 + * + * @returns 路由列表 + */ + static getRoutes() { + return request({ + url: `${MENU_BASE_URL}/routes`, + method: "get", + }); + } +} + +export default MenuAPI; + +/** RouteVO,路由对象 */ +export interface RouteVO { + /** 子路由列表 */ + children: RouteVO[]; + /** 组件路径 */ + component?: string; + /** 路由属性 */ + meta?: Meta; + /** 路由名称 */ + name?: string; + /** 路由路径 */ + path?: string; + /** 跳转链接 */ + redirect?: string; +} + +/** Meta,路由属性 */ +export interface Meta { + /** 【目录】只有一个子路由是否始终显示 */ + alwaysShow?: boolean; + /** 是否隐藏(true-是 false-否) */ + hidden?: boolean; + /** ICON */ + icon?: string; + /** 【菜单】是否开启页面缓存 */ + keepAlive?: boolean; + /** 路由title */ + title?: string; +} diff --git a/src/api/user.ts b/src/api/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..f26c72aa4b1e62690407579d1a774b0dfe68a823 --- /dev/null +++ b/src/api/user.ts @@ -0,0 +1,40 @@ +import request from "@/utils/request"; + +const USER_BASE_URL = "/api/v1/users"; + +class UserAPI { + /** + * 获取当前登录用户信息 + * + * @returns 登录用户昵称、头像信息,包括角色和权限 + */ + static getInfo() { + return request({ + url: `${USER_BASE_URL}/me`, + method: "get", + }); + } +} + +export default UserAPI; + +/** 登录用户信息 */ +export interface UserInfo { + /** 用户ID */ + userId?: number; + + /** 用户名 */ + username?: string; + + /** 昵称 */ + nickname?: string; + + /** 头像URL */ + avatar?: string; + + /** 角色 */ + roles: string[]; + + /** 权限 */ + perms: string[]; +} diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000000000000000000000000000000000000..5750a71a5af048c27eb5459a7cecc6803334cced --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,47 @@ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} +li { + list-style-type: none; + cursor: pointer; +} +textarea { + resize: none; +} + +body { + /* min-height: 100vh; */ + transition: + color 0.5s, + background-color 0.5s; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + Oxygen, + Ubuntu, + Cantarell, + "Fira Sans", + "Droid Sans", + "Helvetica Neue", + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + background-color: #ebeff6; +} +:deep(.dialog) { + padding: 0px; + height: 50%; + display: flex; + flex-direction: column; +} + +:deep(.el-dialog){ + --el-dialog-padding-primary:0px; +} \ No newline at end of file diff --git a/src/assets/fonts/HarmonyOS/HarmonyOS_font.css b/src/assets/fonts/HarmonyOS/HarmonyOS_font.css new file mode 100644 index 0000000000000000000000000000000000000000..1812ff0801474d1c2d17c1395b3bfd19dfdda402 --- /dev/null +++ b/src/assets/fonts/HarmonyOS/HarmonyOS_font.css @@ -0,0 +1,121 @@ +/* + 100 Thin (Hairline) + 200 Extra Light (Ultra Light) + 300 Light + 400 Normal + 500 Medium + 600 Semi Bold (Demi Bold) + 700 Bold + 800 Extra Bold (Ultra Bold) + 900 Black (Heavy) +*/ + +/* 鸿蒙中文 */ +@font-face { + font-family: "HarmonyOS Sans SC Thin"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff) format("woff"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Light"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff) format("woff"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Regular"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff) format("woff"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Medium"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff) format("woff"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Bold"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff) format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Black"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff) format("woff"); + font-weight: 900; + font-style: normal; +} + +/* 鸿蒙西文字体 */ +@font-face { + font-family: "HarmonyOS Sans En Thin"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff) format("woff"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Light"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Light.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Light.woff) format("woff"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Regular"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff) format("woff"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Medium"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff) format("woff"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Bold"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff) format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Black"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Black.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Black.woff) format("woff"); + font-weight: 900; + font-style: normal; +} diff --git a/src/assets/icons/fileIcon.png b/src/assets/icons/fileIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..0101e81d6a70387f165e5dee4afe574a1996dcc5 Binary files /dev/null and b/src/assets/icons/fileIcon.png differ diff --git a/src/assets/icons/taskLoading.png b/src/assets/icons/taskLoading.png new file mode 100644 index 0000000000000000000000000000000000000000..246938fc748910e389f3570fd8f826325c686a18 Binary files /dev/null and b/src/assets/icons/taskLoading.png differ diff --git a/src/assets/icons/taskWait.png b/src/assets/icons/taskWait.png new file mode 100644 index 0000000000000000000000000000000000000000..32df8404c38af3993e28a9e7aa1adb9bebd943a7 Binary files /dev/null and b/src/assets/icons/taskWait.png differ diff --git a/src/assets/images/401.gif b/src/assets/images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c930e72a698889a0f5666d8599652c5808cfc70 Binary files /dev/null and b/src/assets/images/401.gif differ diff --git a/src/assets/images/404.png b/src/assets/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..4e098298787749e55a6dc0321642690b882d130e Binary files /dev/null and b/src/assets/images/404.png differ diff --git a/src/assets/images/404_cloud.png b/src/assets/images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..a81d8daa2c5a025f0137a27d81ed61ce7064039f Binary files /dev/null and b/src/assets/images/404_cloud.png differ diff --git a/src/assets/images/file.png b/src/assets/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..08dff66d5eb57952eea420b29bf734ac053b98df Binary files /dev/null and b/src/assets/images/file.png differ diff --git a/src/assets/images/helpCircle.svg b/src/assets/images/helpCircle.svg new file mode 100644 index 0000000000000000000000000000000000000000..e4b0717b38ea8dcc15d8192861ca4f375faef305 --- /dev/null +++ b/src/assets/images/helpCircle.svg @@ -0,0 +1,16 @@ + + + Created with Pixso. + + + + + + + + + + + + + diff --git a/src/assets/images/language-en.svg b/src/assets/images/language-en.svg new file mode 100644 index 0000000000000000000000000000000000000000..306a6df7be65c77c3d0c4020e44355595955912b --- /dev/null +++ b/src/assets/images/language-en.svg @@ -0,0 +1,12 @@ + + + Created with Pixso. + + + + + + + + + diff --git a/src/assets/images/language-zh.svg b/src/assets/images/language-zh.svg new file mode 100644 index 0000000000000000000000000000000000000000..6e7b694b76715c439487d912ef229243a77b9e58 --- /dev/null +++ b/src/assets/images/language-zh.svg @@ -0,0 +1,13 @@ + + + Created with Pixso. + + + + + + + + + + diff --git a/src/assets/images/login-background-dark.jpg b/src/assets/images/login-background-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50dc817e8fca2d229f91de8f9ee4a395572ee00a Binary files /dev/null and b/src/assets/images/login-background-dark.jpg differ diff --git a/src/assets/images/login-background-light.jpg b/src/assets/images/login-background-light.jpg new file mode 100644 index 0000000000000000000000000000000000000000..993b958e243926e4dd5b1a415c879965117a3419 Binary files /dev/null and b/src/assets/images/login-background-light.jpg differ diff --git a/src/assets/images/login-background-light.png b/src/assets/images/login-background-light.png new file mode 100644 index 0000000000000000000000000000000000000000..bbdbc96190782177734971a1c411ef627382cecb Binary files /dev/null and b/src/assets/images/login-background-light.png differ diff --git a/src/assets/images/timer.png b/src/assets/images/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e7b35c0dd2b798dfe86f26f33746c20f34b066 Binary files /dev/null and b/src/assets/images/timer.png differ diff --git a/src/assets/images/userHeader.jpeg b/src/assets/images/userHeader.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ac2045019ee4e224f1f595a86f2327be6a8d98ac Binary files /dev/null and b/src/assets/images/userHeader.jpeg differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa62f3c600e6bc07573320d20c6db8557a1071f Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/svg/alarm.svg b/src/assets/svg/alarm.svg new file mode 100644 index 0000000000000000000000000000000000000000..df7271a06290438787905774d58bed1b27551e5b --- /dev/null +++ b/src/assets/svg/alarm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg/euler_copilot_logo.svg b/src/assets/svg/euler_copilot_logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..2ac4fced1382e233d40e6f566e68bc4570c96dd4 --- /dev/null +++ b/src/assets/svg/euler_copilot_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg/login.jpg b/src/assets/svg/login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50dc817e8fca2d229f91de8f9ee4a395572ee00a Binary files /dev/null and b/src/assets/svg/login.jpg differ diff --git a/src/assets/svg/user_icon.png b/src/assets/svg/user_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a462180ad60b1f34e68b25b5a1436f2e225211 Binary files /dev/null and b/src/assets/svg/user_icon.png differ diff --git a/src/components/CustomLoading/index.vue b/src/components/CustomLoading/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7eda783595782974f1557209af779bf009325fd6 --- /dev/null +++ b/src/components/CustomLoading/index.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/HeaderBar/index.vue b/src/components/HeaderBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d372bf797bcecf162ac741f91fb1f643cea9981d --- /dev/null +++ b/src/components/HeaderBar/index.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7e3830866bc0ee8d92b82888696953ae7c8eee6f --- /dev/null +++ b/src/components/IconSelect/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/components/KnowledgeForm/index.vue b/src/components/KnowledgeForm/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7fd781fd2dc6d9fbfb82897709ce373f90ebb21d --- /dev/null +++ b/src/components/KnowledgeForm/index.vue @@ -0,0 +1,497 @@ + + + diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..62616292cdc238c46838a8004605685f797ef30a --- /dev/null +++ b/src/components/LangSelect/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..07b65e8ddb62f744a0724db7445ed936874731fb --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/TableFilter/index.vue b/src/components/TableFilter/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..504667e0716b2b3fd99abf987bb22ca5b62ca27b --- /dev/null +++ b/src/components/TableFilter/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/components/TextMoreTootip/index.vue b/src/components/TextMoreTootip/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..c74fb66498e01b06d9273d2702214621018b9a0c --- /dev/null +++ b/src/components/TextMoreTootip/index.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/components/TextSingleTootip/index.vue b/src/components/TextSingleTootip/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..381252c5a8fa6b15df327b59f9ac03ba3b2a6f8a --- /dev/null +++ b/src/components/TextSingleTootip/index.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a42e806260ac42cc7eb303ca7695bf4335ad944d --- /dev/null +++ b/src/components/Upload/index.vue @@ -0,0 +1,470 @@ + + diff --git a/src/components/Upload/uploadProgress.vue b/src/components/Upload/uploadProgress.vue new file mode 100644 index 0000000000000000000000000000000000000000..1cfec256d47d93b89105637653cd67b9685380cc --- /dev/null +++ b/src/components/Upload/uploadProgress.vue @@ -0,0 +1,197 @@ + + + diff --git a/src/components/UserHeaderBar/headerCom.vue b/src/components/UserHeaderBar/headerCom.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec3c54c844d654b897f6f6aa7a703403d50bfc9d --- /dev/null +++ b/src/components/UserHeaderBar/headerCom.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/src/components/UserHeaderBar/index.vue b/src/components/UserHeaderBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..c06111a85f45accb771cd20705ddd88e7d7ab2db --- /dev/null +++ b/src/components/UserHeaderBar/index.vue @@ -0,0 +1,42 @@ + + + + diff --git a/src/components/UserHeaderBar/modelConfig.ts b/src/components/UserHeaderBar/modelConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb48339417ef872e6a577632c1fa1781720b56c5 --- /dev/null +++ b/src/components/UserHeaderBar/modelConfig.ts @@ -0,0 +1,7 @@ +export interface ModelForm { + max_tokens?: number; + model_name?: string; + openai_api_base?: string; + openai_api_key?: string; + [property: string]: any; +} diff --git a/src/enums/CacheEnum.ts b/src/enums/CacheEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3c434baf8274af96dc344ab3ec8b39dec22039d --- /dev/null +++ b/src/enums/CacheEnum.ts @@ -0,0 +1,4 @@ +/** + * 令牌缓存Key + */ +export const TOKEN_KEY = "accessToken"; diff --git a/src/enums/FormTypeEnum.ts b/src/enums/FormTypeEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..583c33ae27ba0cb1ef18e6b4029ad7f2b47146f4 --- /dev/null +++ b/src/enums/FormTypeEnum.ts @@ -0,0 +1,14 @@ +/** + * 表单类型枚举 + */ +export const FormTypeEnum: Record = { + INPUT: { value: 1, label: "输入框" }, + SELECT: { value: 2, label: "下拉框" }, + RADIO: { value: 3, label: "单选框" }, + CHECK_BOX: { value: 4, label: "复选框" }, + INPUT_NUMBER: { value: 5, label: "数字输入框" }, + SWITCH: { value: 6, label: "开关" }, + TEXT_AREA: { value: 7, label: "文本域" }, + DATE: { value: 8, label: "日期框" }, + DATE_TIME: { value: 9, label: "日期时间框" }, +}; diff --git a/src/enums/KnowledgeEnum.ts b/src/enums/KnowledgeEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..b493a8ca0b25e1f1475cf4244e2bc840cc420b22 --- /dev/null +++ b/src/enums/KnowledgeEnum.ts @@ -0,0 +1,15 @@ +/** + * 状态枚举 + */ +export const enum StatusEnum { + FAIL = "failed", + CANCEL = "canceled", + ANALYSIS_ING = "pending", + SUCCESS = "success", + RUNNING = "running", +} + +export const enum MenuType { + KL_FILE = "klFile", + KL_CONFIG = "klConfig", +} diff --git a/src/enums/LanguageEnum.ts b/src/enums/LanguageEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..e674c0b165af818d6699de2bb2866c95a584f7a5 --- /dev/null +++ b/src/enums/LanguageEnum.ts @@ -0,0 +1,14 @@ +/** + * 语言枚举 + */ +export const enum LanguageEnum { + /** + * 中文 + */ + ZH_CN = "zh", + + /** + * 英文 + */ + EN = "en", +} diff --git a/src/enums/MessageTypeEnum.ts b/src/enums/MessageTypeEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..42a6fb946e12dabcaad8e98ce061eb2bcec12f87 --- /dev/null +++ b/src/enums/MessageTypeEnum.ts @@ -0,0 +1,15 @@ +/* 消息类型枚举 */ +export const enum MessageTypeEnum { + /* 消息 */ + MESSAGE = "MESSAGE", + /* 通知 */ + NOTICE = "NOTICE", + /* 待办 */ + TODO = "TODO", +} + +export const MessageTypeLabels = { + [MessageTypeEnum.MESSAGE]: "消息", + [MessageTypeEnum.NOTICE]: "通知", + [MessageTypeEnum.TODO]: "待办", +}; diff --git a/src/enums/QueryTypeEnum.ts b/src/enums/QueryTypeEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..253efc0d96b1bb1b575e14cc54f5f656d65738f6 --- /dev/null +++ b/src/enums/QueryTypeEnum.ts @@ -0,0 +1,37 @@ +/** + * 查询类型枚举 + */ +export const QueryTypeEnum: Record = { + /** 等于 */ + EQ: { value: 1, label: "=" }, + + /** 模糊匹配 */ + LIKE: { value: 2, label: "LIKE '%s%'" }, + + /** 包含 */ + IN: { value: 3, label: "IN" }, + + /** 范围 */ + BETWEEN: { value: 4, label: "BETWEEN" }, + + /** 大于 */ + GT: { value: 5, label: ">" }, + + /** 大于等于 */ + GE: { value: 6, label: ">=" }, + + /** 小于 */ + LT: { value: 7, label: "<" }, + + /** 小于等于 */ + LE: { value: 8, label: "<=" }, + + /** 不等于 */ + NE: { value: 9, label: "!=" }, + + /** 左模糊匹配 */ + LIKE_LEFT: { value: 10, label: "LIKE '%s'" }, + + /** 右模糊匹配 */ + LIKE_RIGHT: { value: 11, label: "LIKE 's%'" }, +}; diff --git a/src/enums/ResultEnum.ts b/src/enums/ResultEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..2f9bc8f857dcfefb5b05aa8f89b0092a421545a2 --- /dev/null +++ b/src/enums/ResultEnum.ts @@ -0,0 +1,18 @@ +/** + * 响应码枚举 + */ +export const enum ResultEnum { + /** + * 成功 + */ + SUCCESS = "200", + /** + * 错误 + */ + ERROR = "10003", + + /** + * 令牌无效或过期 + */ + TOKEN_INVALID = "401", +} diff --git a/src/enums/ThemeEnum.ts b/src/enums/ThemeEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..91458e1606d582346bfc03389d9a963797dc58f6 --- /dev/null +++ b/src/enums/ThemeEnum.ts @@ -0,0 +1,18 @@ +/** + * 主题枚举 + */ +export const enum ThemeEnum { + /** + * 明亮主题 + */ + LIGHT = "light", + /** + * 暗黑主题 + */ + DARK = "dark", + + /** + * 系统自动 + */ + AUTO = "auto", +} diff --git a/src/lang/index.ts b/src/lang/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a350571f93b200f527e714a76069a9e20ccb391c --- /dev/null +++ b/src/lang/index.ts @@ -0,0 +1,32 @@ +import type { App } from "vue"; +import { createI18n } from "vue-i18n"; +import { useAppStoreHook } from "@/store/modules/app"; +// 本地语言包 +import enLocale from "./package/en"; +import zhCnLocale from "./package/zh-cn"; +import defaultSettings from "@/settings"; + +const messages = { + zh: { + ...zhCnLocale, + }, + en: { + ...enLocale, + }, +}; + +const language = useStorage("language", defaultSettings.language); + +const i18n = createI18n({ + legacy: false, + locale: language.value, + messages: messages, + globalInjection: true, +}); + +// 全局注册 i18n +export function setupI18n(app: App) { + app.use(i18n); +} + +export default i18n; diff --git a/src/lang/package/en.ts b/src/lang/package/en.ts new file mode 100644 index 0000000000000000000000000000000000000000..97b47b8ca3e096c19a5bcce1606193be64c519e7 --- /dev/null +++ b/src/lang/package/en.ts @@ -0,0 +1,193 @@ +export default { + // 登录页面国际化 + login: { + username: "Username", + password: "Password", + login: "Log In", + logOut: "Log Out", + welcomeToUse: "Welcome", + loginSuccessful: "Login Successful", + message: { + username: { + usernameMsg: "The username cannot be empty.", + required: "Enter a username.", + }, + password: { + passwordMsg: "The password cannot be empty.", + required: "Enter a password.", + }, + loginTip: "The username or password is not correct.", + loginToken: "The session has expired.Please login again.", + }, + }, + langSelect: { + message: { + success: "Switch Language Successful!", + }, + }, + assetLibrary: { + assetLibrary: "Asset Libraries", + assetId: "Asset ID", + welcomeUsePro: "Welcome to witChainD!", + profile: + "witChainD offers efficient document management and intelligent analysis,supporting a variety of file formats including XML,MD,XLSX,DOCX,DOC,and TXT.Equipped with an advanced document processing technology and powerful retrieval capabilities of the openEulerCopilot System RAG,WitchainD aims to provide you with an exceptional intelligent Q&A service.", + message: { + name: "Enter an asset libraray name.", + libraryNameLen: "The asset library name can contain 1 to 15 characters.", + categoryInfo: "Enter a category name.", + languagePlace: "Select a language.", + modelPlace: "Select a parsing method.", + analyticMethodPlace: "Enter a value", + pleasePlace: "Enter a value", + pleaseChoose: "Select an option", + assetEditSuccess: "Asset library information is modified successfully.", + }, + piece: "piece ", + file: "documents", + name: "Asset Library Name", + desc: "Description", + language: "Language", + embeddedModel: "Embedded Model", + analyticMethod: "Parsing Method", + fileChunkSize: "File Block Size", + configCategory: "Document Categories", + fileConfigCategory: "Document Information Categories", + supAddCategoris: "A maximum of 10 document categories can be added.", + fileNum: "Document Count", + uploadTime: "Create Time", + importTaskList: "Import Task List", + exportTaskList: "Export Task List", + uploadIng: "Uploading", + uploadFailedNet: "Upload failed.Check the netwok.", + fileSuffiexNot: "The file name extension is not supported.", + copySuccessFul: "Copy successful", + }, + assetFile: { + docName: "Document Name", + category: "Category", + chunkSize: "Chunk Size", + uploadTime: "Upload Time", + analyticStatus: "Parsing Status", + parsingMethod: "Parsing Method", + parsingComTime: "Parsing Completion Time", + analyticTip: + "The document will be re-parsed after the chunk size is changed.", + contentView: "Preview", + baseInfo: "Basic Information", + message: { + name: "Enter an file name.", + docNameLen: "The file name can contain 1 to 15 characters", + }, + status: { + analyticIng: "Parsing", + analyticWaitIng: "Parsing waitIng", + analyticFail: "Parsing failed", + cancelAnalytic: "Parsing canceled", + analyticSucces: "Parsing successful", + }, + open: "Open", + close: "Close", + }, + fileChunk: { + parag: "Paragraph", + table: "table", + img: "Image", + }, + model: { + pleasePlace: "Enter a value", + modelName: "Model", + modelConfig: "Configure Model", + modelType: "Model", + maxToken: "Maximum Token Limit", + }, + btnText: { + confirm: "Ok", + cancel: "Cancel", + operation: "Operation", + export: "Export", + edit: "Edit", + delete: "Delete", + retry: "Retry", + restart: "Restart", + clearAll: "Clear all", + homePage: "Home Page", + assetDocList: "Documents List", + configInfo: "Configure Information", + importFile: "Import Document", + editAssetLibrary: "Edit Asset Library", + createAssetLibrary: "Create Asset Library", + batchImport: "Batch Import", + batchDown: "Batch Download", + download: "Download", + downloadAll: "Download All", + downloadChoose: "Download Selected", + all: "All", + chooseFile: "Select File", + batch: "Batch", + enable: "Enable", + close: "Close", + save: "Save", + add: "Add", + delAll: "Delete All", + analytic: "Analytic", + selectAll: "Select All", + }, + dialogTipText: { + importAssetLibrary: "Import Document", + tipsText: "Warining", + isAddFilr: "Are you sure you want to add the documents?", + confirmDelAsset: "Are you sure you want to delete asset?", + confirmDelFile: "Are you sure you want to delete file?", + confirmDelSelected: "Are you sure you want to delete selected file?", + eidtFile: "Edit Document", + confirmCancelAnalytic: + "Are you sure you want to cancel parsing? After you click Ok,parsing will be canceled.Please proceed with caution.", + fileZipFormat: + "The file must be in .zip format. A maximum of five asssets with a total size of 5 GB can be uploaded.", + fileAllFormat: + "The file can be in .md,.xlsx,.pdf,.docx,or .txt format. A maximum of 100 files with a total size of 500 MB can be uploaded.", + continueAdd: "You can drag files to the list area below to add more.", + dragDropAdd: "Drop files here.", + dragFile: "Drop files here.", + fileName: "File name", + fileSize: "Size", + singleFileSize: "The size of a file cannot exceed 20 MB.", + }, + formTipText: { + analyticTip: + "Vectorization model for transforming document chunks into vectors. Currently,two options are available:bge-large-en-v1.5 for English text and bge-mixed-model for Chinese text.", + fileChunkSizeTip: + "Chunk size for dividing files after the configuration file is uploaded. The value ranges from 512 to 1024 tokens per chunk. By default, a chunk size of 1024 tokens is used.", + }, + pageTipText: { + NoData: "No data available.", + systemError: "System error.", + Loading: "Loading", + }, + uploadText: { + uploadFailed: "Upload failed.", + uploadSuccess: "Upload successful.", + }, + exportTask: { + export: " export", + pendingExport: "Pending export", + exportFailed: "Failed", + exportSuccess: "Successful", + reason: "Reason", + downloadTask: "Download Task", + canceled: "Canceled", + }, + opsMessage: { + opsSuccess: "Operation successful.", + opsRestart: "Operation restarted.", + opsCancel: "Operation canceled.", + delSuccess: "Deletion successful.", + opsAnalyticIng: "AnalyticIng", + modifSuccess: "Modification successful.", + }, + timerSearch: { + lastHour: "Last {timer} hour", + }, + copyright: + "Copyright© Huawei Software Technologies Co., Ltd.2024. All rights reserved.", +}; diff --git a/src/lang/package/zh-cn.ts b/src/lang/package/zh-cn.ts new file mode 100644 index 0000000000000000000000000000000000000000..2d4a7797d48862b15d043ef909a805433766f5c4 --- /dev/null +++ b/src/lang/package/zh-cn.ts @@ -0,0 +1,191 @@ +export default { + // 登录页面国际化 + login: { + username: "用户名", + password: "密码", + login: "登录", + logOut: "退出登录", + welcomeToUse: "欢迎使用", + loginSuccessful: "登录成功", + message: { + username: { + usernameMsg: "用户名不能为空", + required: "请输入用户名", + }, + password: { + passwordMsg: "密码不能为空", + required: "请输入密码", + }, + loginTip: "用户名或密码错误", + loginToken: "您的会话已过期,请重新登录", + }, + }, + langSelect: { + message: { + success: "切换语言成功", + }, + }, + assetLibrary: { + assetLibrary: "资产库", + assetId: "资产ID", + welcomeUsePro: "欢迎使用WitChainD!", + profile: + "witChainD专注于文档的高效管理和智能解析,支持包括XML、MD、XLSX、DOCX、DOC以及TXT在内的多种文件格式。本平台搭载的先进文档处理技术,结合openEuler Copilot System RAG的强大检索功能,旨在为您提供卓越的智能问答服务体验。", + message: { + name: "请输入资产库名称", + libraryNameLen: "资产库名称长度1-15个字符", + categoryInfo: "请输入类别名称", + languagePlace: "请选择语言", + modelPlace: "请选择模型", + analyticMethodPlace: "请选择解析方法", + pleasePlace: "请输入", + pleaseChoose: "请选择", + assetEditSuccess: "配置信息修改成功", + }, + piece: "篇", + file: "文档", + name: "资产库名称", + desc: "描述", + language: "语言", + embeddedModel: "嵌入模型", + analyticMethod: "解析方法", + fileChunkSize: "文件分块大小", + configCategory: "配置类别", + fileConfigCategory: "文档信息类别", + supAddCategoris: "最多支持添加10个文档信息类别", + fileNum: "文档数量", + uploadTime: "创建时间", + importTaskList: "导入任务列表", + exportTaskList: "导出任务列表", + uploadIng: "上传中", + uploadFailedNet: "上传失败,请检查网络", + fileSuffiexNot: "文件后缀不符合要求,请检查文件", + copySuccessFul: "复制成功", + }, + assetFile: { + docName: "文档名称", + category: "类别", + chunkSize: "分块大小", + uploadTime: "上传时间", + analyticStatus: "解析状态", + parsingMethod: "解析方法", + parsingComTime: "解析完成时间", + analyticTip: "修改文件分块大小,文档会自动重新解析", + contentView: "内容预览", + baseInfo: "基本信息", + message: { + name: "请输入文档名称", + docNameLen: "资产库名称长度1-15个字符", + }, + status: { + analyticIng: "解析中", + analyticWaitIng: "等待解析", + analyticFail: "解析失败", + cancelAnalytic: "取消解析", + analyticSucces: "解析成功", + }, + open: "开启", + close: "关闭", + }, + + fileChunk: { + parag: "段落", + table: "表格", + img: "图片", + }, + model: { + pleasePlace: "请输入", + modelName: "模型名称", + modelType: "模型类型", + modelConfig: "模型配置", + maxToken: "最大Token数", + }, + btnText: { + confirm: "确定", + cancel: "取消", + operation: "操作", + export: "导出", + edit: "编辑", + delete: "删除", + retry: "重试", + restart: "重启", + clearAll: "全部清空", + homePage: "首页", + assetDocList: "文档列表", + configInfo: "配置信息", + importFile: "导入文档", + createAssetLibrary: "新建资产库", + editAssetLibrary: "编辑资产库", + batchImport: "批量导入", + batchDown: "批量下载", + download: "下载", + downloadAll: "下载全部", + downloadChoose: "下载已选", + all: "全部", + chooseFile: "选择文件", + batch: "批量", + enable: "启用", + close: "关闭", + save: "保存", + add: "添加", + analytic: "解析", + delAll: "删除全部", + selectAll: "选择全部", + }, + dialogTipText: { + importAssetLibrary: "导入资产库", + tipsText: "提示", + isAddFilr: "是否继续添加文档", + confirmDelAsset: "确定删除资产库", + confirmDelFile: "确定删除文档", + confirmDelSelected: "确定删除选择的文档吗", + eidtFile: "文档编辑", + confirmCancelAnalytic: "确认取消解析?点击确认后将停止解析,请谨慎操作。", + fileZipFormat: + "文件支持.zip格式,最多支持上传5个资产库,资产库总大小不超过5GB", + fileAllFormat: + "文件支持.md,.xlsx,.pdf,.docx,.txt格式,最多支持上传128个文件,文件总大小不超过500MB", + continueAdd: "您仍可以通过拖拽文件到下方列表区域进行文件添加", + dragDropAdd: "将文件拖到此处即可继续添加", + dragFile: "将文件拖到此处", + fileName: "文件名", + fileSize: "大小", + singleFileSize: "单个文件大小不能超过20MB", + }, + formTipText: { + analyticTip: + "文档分块后,将分块转换为向量的向量化模型类型,先暂支持两种向量化模型bg-large-en-v1.5(面向英文向量化场景)和bge-mixed-model(面向中文向量化场景),默认情况下选择bge-mixed-model模型。", + fileChunkSizeTip: + "配置文档上传后,将文件处理成片段分块的大小,分块大小范围为512-1024Token/块,默认使用1024Toke/块对文件进行分块。", + }, + pageTipText: { + NoData: "暂无数据", + systemError: "系统出错", + Loading: "加载中", + }, + uploadText: { + uploadFailed: "上传失败", + uploadSuccess: "上传成功", + }, + exportTask: { + export: "导出任务", + pendingExport: "待导出", + exportFailed: "导出失败", + exportSuccess: "导出成功", + reason: "失败原因", + downloadTask: "下载任务", + canceled: "已取消", + }, + opsMessage: { + opsSuccess: "操作成功", + opsRestart: "重启成功", + opsCancel: "取消成功", + opsAnalyticIng: "解析中", + delSuccess: "删除成功", + modifSuccess: "修改成功", + }, + timerSearch: { + lastHour: "最近 {timer} 小时", + }, + copyright: "版权所有© 华为软件技术有限公司2024。保留一切权利", +}; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..651edd92cd2156bf334bfc729e34b0199897faba --- /dev/null +++ b/src/main.ts @@ -0,0 +1,33 @@ +import { createApp } from "vue"; +import { createPinia } from "pinia"; +import ElementPlus from "element-plus"; + +import opendesign2 from "@computing/opendesign2"; +import "element-plus/dist/index.css"; +import "@/assets/base.css"; +import "@computing/opendesign2/themes/es/css"; +import zhCn from "element-plus/es/locale/lang/zh-cn"; +import App from "./App.vue"; +import setupPlugins from "@/plugins"; + +// 本地SVG图标 +import "virtual:svg-icons-register"; +import "@computing/opendesign2/themes/es/css"; + +// 样式 +import "element-plus/theme-chalk/dark/css-vars.css"; +import "@/styles/index.scss"; +import "uno.css"; +import "animate.css"; +import router from "./router"; + +const app = createApp(App); + +app.use(createPinia()); +app.use(router); +app.use(ElementPlus, { + locale: zhCn, +}); +app.use(setupPlugins); +app.use(opendesign2); +app.mount("#app"); diff --git a/src/plugins/icons.ts b/src/plugins/icons.ts new file mode 100644 index 0000000000000000000000000000000000000000..fa85ba1473481fdb54a402885a64028778611feb --- /dev/null +++ b/src/plugins/icons.ts @@ -0,0 +1,9 @@ +import type { App } from "vue"; +import * as ElementPlusIconsVue from "@element-plus/icons-vue"; + +// 注册所有图标 +export function setupElIcons(app: App) { + for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component); + } +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a716ae99a346cb6111e45d8b3a284e1e64967293 --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,21 @@ +import { setupI18n } from "@/lang"; +import { setupRouter } from "@/router"; +import { setupStore } from "@/store"; +import type { App } from "vue"; +import { setupElIcons } from "./icons"; +import { setupPermission } from "./permission"; + +export default { + install(app: App) { + // 路由(router) + setupRouter(app); + // 国际化 + setupI18n(app); + // Element-plus图标 + setupElIcons(app); + // 路由守卫 + setupPermission(); + // 状态管理(store) + setupStore(app); + }, +}; diff --git a/src/plugins/permission.ts b/src/plugins/permission.ts new file mode 100644 index 0000000000000000000000000000000000000000..a3ae8b557cdce41c8aef4715f957e131169240ce --- /dev/null +++ b/src/plugins/permission.ts @@ -0,0 +1,43 @@ +import { + NavigationGuardNext, + RouteLocationNormalized, + RouteRecordRaw, +} from "vue-router"; + +import NProgress from "@/utils/nprogress"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; +import router from "@/router"; + +export function setupPermission() { + // 白名单路由 + const whiteList = ["/login", "/NotFoundPage"]; + + router.beforeEach(async (to, from, next) => { + NProgress.start(); + const hasToken = document.cookie; + if (hasToken?.length === 0 && !["/login", "/"].includes(to.path)) { + next({ path: "/login" }); + NProgress.done(); + } else { + // 未登录 + if (whiteList.includes(to.path)) { + next(); // 在白名单,直接进入 + } else { + // 不在白名单,重定向到登录页 + next(); + } + } + }); + + router.afterEach(() => { + NProgress.done(); + }); +} + +/** 重定向到登录页 */ +function redirectToLogin( + to: RouteLocationNormalized, + next: NavigationGuardNext +) { + next(`/login`); +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..eee898a301f0e0855631d5f448c471f00a375082 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,63 @@ +import type { App } from "vue"; +import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"; + +// 静态路由 +export const constantRoutes: RouteRecordRaw[] = [ + { + path: "/", + name: "/", + redirect: "/login", + }, + { + path: "/login", + component: () => import("@/views/login/index.vue"), + meta: { hidden: true }, + }, + { + path: "/NotFoundPage", + component: () => import("@/views/notFoundPage/index.vue"), + meta: { hidden: true }, + }, + { + path: "/knowledge/library", + component: () => import("@/views/knowledgeLibrary/index.vue"), + meta: { hidden: true }, + }, + { + path: "/knowledge/file", + component: () => import("@/views/knowledgeFile/index.vue"), + meta: { hidden: true }, + }, + { + path: "/knowledge/fileSection", + component: () => import("@/views/knowledgeFileSection/index.vue"), + meta: { hidden: true }, + }, + { + path: "/:catchAll(.*)", + redirect: "/NotFoundPage", + }, +]; +/** + * 创建路由 + */ +const router = createRouter({ + history: createWebHashHistory(), + routes: constantRoutes, + // 刷新时,滚动条位置还原 + scrollBehavior: () => ({ left: 0, top: 0 }), +}); + +// 全局注册 router +export function setupRouter(app: App) { + app.use(router); +} + +/** + * 重置路由 + */ +export function resetRouter() { + window.open(`${window.origin}/#/login`, "_self"); +} + +export default router; diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000000000000000000000000000000000000..04707e5e872fd833fffac94fef4093b14bd21e65 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,22 @@ +import { ThemeEnum } from "./enums/ThemeEnum"; +import { LanguageEnum } from "./enums/LanguageEnum"; + +const { pkg } = __APP_INFO__; + +const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)"); + +const defaultSettings: AppSettings = { + title: pkg.name, + version: pkg.version, + showSettings: true, + tagsView: true, + fixedHeader: true, + sidebarLogo: true, + theme: mediaQueryList.matches ? ThemeEnum.DARK : ThemeEnum.LIGHT, + language: LanguageEnum.ZH_CN, + themeColor: "#409EFF", + watermarkEnabled: false, + watermarkContent: pkg.name, +}; + +export default defaultSettings; diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..809c5d23546c750156004dd94bd581ad103ee02b --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,15 @@ +import type { App } from "vue"; +import { createPinia } from "pinia"; + +const store = createPinia(); + +// 全局注册 store +export function setupStore(app: App) { + app.use(store); +} + +export * from "./modules/app"; +export * from "./modules/permission"; +export * from "./modules/settings"; +export * from "./modules/user"; +export { store }; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000000000000000000000000000000000000..848fb4564c3502bf34cbe5521ea6cacb5463f3bb --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,39 @@ +import defaultSettings from "@/settings"; + +// 导入 Element Plus 中英文语言包 +import zhCn from "element-plus/es/locale/lang/zh-cn"; +import en from "element-plus/es/locale/lang/en"; +import { store } from "@/store"; + +export const useAppStore = defineStore("app", () => { + // 语言 + const language = useStorage("language", defaultSettings.language); + /** + * 根据语言标识读取对应的语言包 + */ + const locale = computed(() => { + if (language?.value == "en") { + return en; + } else { + return zhCn; + } + }); + /** + * 切换语言 + * + * @param val + */ + function changeLanguage(val: string) { + language.value = val; + } + + return { + language, + locale, + changeLanguage, + }; +}); + +export function useAppStoreHook() { + return useAppStore(store); +} diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000000000000000000000000000000000000..38e837cada1087892d5278c4e6a669556244e623 --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,63 @@ +import { RouteRecordRaw } from "vue-router"; +import { constantRoutes } from "@/router"; +import { store } from "@/store"; +import MenuAPI, { RouteVO } from "@/api/menu"; + +const modules = import.meta.glob("../../views/**/**.vue"); + +export const usePermissionStore = defineStore("permission", () => { + /** 所有路由,包括静态和动态路由 */ + const routes = ref([]); + + /** + * 生成动态路由 + */ + function generateRoutes() { + return new Promise((resolve, reject) => { + MenuAPI.getRoutes() + .then((data) => { + const dynamicRoutes = transformRoutes(data); + routes.value = constantRoutes.concat(dynamicRoutes); + resolve(dynamicRoutes); + }) + .catch((error) => { + reject(error); + }); + }); + } + + return { + routes, + generateRoutes, + }; +}); + +/** + * 转换路由数据为组件 + */ +const transformRoutes = (routes: RouteVO[]) => { + const asyncRoutes: RouteRecordRaw[] = []; + routes.forEach((route) => { + const tmpRoute = { ...route } as RouteRecordRaw; + // 顶级目录,替换为 Layout 组件 + // 其他菜单,根据组件路径动态加载组件 + const component = modules[`../../views/${tmpRoute.component}.vue`]; + if (component) { + tmpRoute.component = component; + } else { + tmpRoute.component = modules[`../../views/error-page/404.vue`]; + } + + if (tmpRoute.children) { + tmpRoute.children = transformRoutes(route.children); + } + + asyncRoutes.push(tmpRoute); + }); + + return asyncRoutes; +}; + +export function usePermissionStoreHook() { + return usePermissionStore(store); +} diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts new file mode 100644 index 0000000000000000000000000000000000000000..4367e65083dbefb1cf802252da9e0f03fac16ce6 --- /dev/null +++ b/src/store/modules/settings.ts @@ -0,0 +1,61 @@ +import defaultSettings from "@/settings"; +import { ThemeEnum } from "@/enums/ThemeEnum"; +import Color from "color"; + +type SettingsValue = boolean | string; + +export const useSettingsStore = defineStore("setting", () => { + // 是否固定头部 + const fixedHeader = useStorage( + "fixedHeader", + defaultSettings.fixedHeader + ); + // 主题颜色 + const themeColor = useStorage( + "themeColor", + defaultSettings.themeColor + ); + + // 是否开启水印 + const watermarkEnabled = useStorage( + "watermarkEnabled", + defaultSettings.watermarkEnabled + ); + + const settingsMap: Record> = { + fixedHeader, + watermarkEnabled, + }; + + function changeSetting({ + key, + value, + }: { + key: string; + value: SettingsValue; + }) { + const setting = settingsMap[key]; + if (setting) { + setting.value = value; + } + } + + + /** + * 切换主题颜色 + * + * @param color 主题颜色 + * + */ + function changeThemeColor(color: string) { + themeColor.value = color; + } + + return { + fixedHeader, + themeColor, + watermarkEnabled, + changeSetting, + changeThemeColor, + }; +}); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..56ebb13d3d301fc262bb8375cfc68c3dde7338c1 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,64 @@ +import AuthAPI, { type LoginData } from "@/api/auth"; +import { type UserInfo } from "@/api/user"; +import { resetRouter } from "@/router"; +import { store } from "@/store"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; + +export const useUserStore = defineStore("user", () => { + const user = ref({ + roles: [], + perms: [], + }); + + /** + * 登录 + * + * @param {LoginData} + * @returns + */ + function login(loginData: LoginData) { + return new Promise((resolve, reject) => { + AuthAPI.login(loginData) + .then((data: any) => resolve(data)) + .catch((error) => { + reject(error); + }); + }); + } + + // user logout + function logout() { + return new Promise((resolve, reject) => { + AuthAPI.logout() + .then((data: any) => resolve(data)) + .catch((error) => { + reject(error); + }); + }); + } + + // remove token + function resetToken() { + return new Promise((resolve) => { + document.cookie = ""; + resetRouter(); + resolve(); + }); + } + + return { + user, + login, + logout, + resetToken, + }; +}); + +/** + * 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。 + * 官方文档解释了如何在组件外部使用 Pinia Store: + * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component + */ +export function useUserStoreHook() { + return useUserStore(store); +} diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff new file mode 100644 index 0000000000000000000000000000000000000000..d3a7a9a2f445580353177f71592f722a9f8264b7 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5b1b8fbe5c2b665c378f29a78c8bf9b245bafbe5 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Black.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..90e19c2273855080af70ae1d57f4c650584947b9 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..69d0baa5db0c1fd1a6581c8fec2833e0d681c4ef Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..e06f7add695edd7ee5c39c1a67527a7df51dfae2 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f3731ae01c816eb7d461837b423d4a2b563e113f Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Light.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..0568219cd88f5d376a7f083cf23cdce705cb70c9 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..63f418cb53701cd899c031cb189857d08cb1264b Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..dbe11e9c8547a59da3eae6174b5f2201c321d02f Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..633a70c07aee063d0f301b78cd2bf9d06d42d696 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff new file mode 100644 index 0000000000000000000000000000000000000000..eb04aef0fa66e71063b346d79cbc2ae21fc67c71 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff differ diff --git a/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff2 b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bfe90d34d1a0823f78574f486ff6c2608007a747 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff2 differ diff --git a/src/styles/HarmonyOS_Sans/LICENSE.txt b/src/styles/HarmonyOS_Sans/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..84ac5d4dcdc9e5671ac3095bed9a9194a3e3c8f1 Binary files /dev/null and b/src/styles/HarmonyOS_Sans/LICENSE.txt differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff new file mode 100644 index 0000000000000000000000000000000000000000..4824510dae9974c2f1eb2d64ad96b62d3c133bde Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..749b12841bf135f3414e8baf4e18afc80e70587b Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff2 differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..ec892a1c1c6e9feda6d3ce5abe13c14bda6173c7 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6cb17baa452ae6ee4f688adfa72be2d6c03938e7 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff2 differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..ed26373b729bcb24a77741f950286bdd314b5730 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6a59240cbf4e699739dbe85d4e6d0ce3a21c60d7 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff2 differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..0ba379afc9b8c643898894a6a7a23076d286aaa5 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d44a28aa609934818b770341d831f566b8b86eb6 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff2 differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b32066b3adf0903ccbbfaea99ef52f6078c228c Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1216831e24806fe551138871c6ec9e7be98dbed1 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff2 differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff new file mode 100644 index 0000000000000000000000000000000000000000..650c30466f3378e4e324577b1e4712eeb0ccb1a5 Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff differ diff --git a/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff2 b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..37cf9b3340aa41594bc305868a47e54085771a6e Binary files /dev/null and b/src/styles/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff2 differ diff --git a/src/styles/app.scss b/src/styles/app.scss new file mode 100644 index 0000000000000000000000000000000000000000..0811b459cf2e7cf51350bbbe4fe9f5b7b5686fca --- /dev/null +++ b/src/styles/app.scss @@ -0,0 +1,34 @@ +html, +body, +#app { + box-sizing: border-box; + height: 100vh; + padding: 0; + margin: 0; +} + +.euler-copilot-container { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + min-width: 600px; + overflow-y: auto; + background: url("/src/assets/images/login-background-light.png") center/100% + 100%; +} + +.main-container { + box-sizing: border-box; + display: flex; + flex: 1; + align-items: start; + justify-content: flex-start; + width: 100%; + min-height: 750px; +} + +html.dark .euler-copilot-container { + background: url("@/assets/images/login-background-dark.jpg") no-repeat center + right; +} diff --git a/src/styles/dark.scss b/src/styles/dark.scss new file mode 100644 index 0000000000000000000000000000000000000000..57c986902a0ac2d44ae3ec42b37dd34d88fe6b24 --- /dev/null +++ b/src/styles/dark.scss @@ -0,0 +1,21 @@ +html.dark { + .platform-login-text { + font-size: 12px; + } + + .el-input-wrapper { + background: var(--el-input-bg-color) !important; + } + + .el-form-item { + background: var(--el-input-bg-color); + } + + .el-input__wrapper { + background: var(--el-input-bg-color) !important; + } + + .el-input__inner { + color: white !important; + } +} diff --git a/src/styles/headerBar.scss b/src/styles/headerBar.scss new file mode 100644 index 0000000000000000000000000000000000000000..a2aa90953053e8d306bd82bc73f66369e91c4da6 --- /dev/null +++ b/src/styles/headerBar.scss @@ -0,0 +1,68 @@ +.el-affix { + height: 42px; +} + +.platform-header { + display: flex; + justify-content: space-between; + height: 48px !important; + padding: 0 24px !important; + background-color: transparent; + + .platform-title { + display: flex; + gap: 8px; + align-items: center; + .project-name { + font-size: 16px; + letter-spacing: 0px; + font-weight: 700; + } + } + + .el-popper.is-pure.is-light.el-dropdown__popper { + top: 42px !important; + } + + .el-dropdown-link:hover { + color: var(--el-text-color-regular) !important; + } + + .el-dropdown-link { + color: var(--el-text-color-regular) !important; + outline: 0 !important; + } +} + +.top-bar { + position: relative; + top: 0; + right: 0; + display: flex; + align-items: center; + justify-content: flex-end; + height: 48px; +} + +.user-platform-header { + width: 100%; + height: 300px; + background: url("/src/assets/images/userHeader.jpeg") center/101% 100%; +} + +.page-platform-header { + background-color: rgb(253 254 255); + box-shadow: inset 0 -2px 0 0 rgb(244 246 250); +} + +.user-platform-header, +.page-platform-header { + min-width: 1240px; + .header-container { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + height: 48px; + } +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..3df4ef435ca3975be4d73d48d2de86e2b4d0d6ec --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,33 @@ +@use "./reset"; +@use "./dark"; + +.app-container { + padding: 15px; +} + +.search-container { + padding: 18px 0 0 10px; + margin-bottom: 10px; + background-color: var(--el-bg-color-overlay); + border: 1px solid var(--el-border-color-light); + border-radius: 4px; + box-shadow: var(--el-box-shadow-light); +} + +.table-container > .el-card__header { + padding: calc(var(--el-card-padding) - 8px) var(--el-card-padding); +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32 160 255); + } +} + +.search-container .el-form .el-input { + width: 16rem !important; +} diff --git a/src/styles/knowledgeFile.scss b/src/styles/knowledgeFile.scss new file mode 100644 index 0000000000000000000000000000000000000000..d352a0bf25e5dc8c9f565548f9a47a5591283bd8 --- /dev/null +++ b/src/styles/knowledgeFile.scss @@ -0,0 +1,581 @@ +.kf-container { + display: flex; + flex-direction: column; + gap: 16px; + width: 100%; + height: calc(100% - 48px); + padding: 16px 24px 24px; + min-width: 1240px; + .kf-container-top { + display: flex; + gap: 24px; + align-items: center; + + .kf-left-menu { + display: flex; + gap: 4px; + align-items: center; + width: 232px; + height: 16px; + + .home-menu { + display: inline-block; + max-width: 80px; + height: 16px; + font-size: 12px; + line-height: 16px; + } + + .kf-name { + max-width: 152px; + font-size: 12px; + font-weight: 700; + } + } + + .kf-right-title { + font-size: 18px; + font-weight: 700; + } + } + + .kf-container-action { + position: relative; + display: flex; + gap: 24px; + width: 100%; + height: 100%; + min-height: 500px; + + .kf-container-left { + width: 232px; + min-width: 232px; + .kf-file-config { + margin-top: 8px; + } + + .kf-file-btn, + .kf-file-config { + font-size: 12px; + height: 32px; + padding-left: 16px; + line-height: 32px; + color: rgb(77 88 101); + cursor: pointer; + background-color: rgb(254 254 254); + border-radius: 4px; + } + + .kf-ops-btn { + color: rgb(255 255 255); + background: rgb(0 119 255); + } + } + + .kf-container-right { + flex: 1; + min-width: 700px; + padding: 16px 24px 24px 24px; + background: rgb(254 254 254); + border-radius: 4px; + + .kf-container-table-ops { + display: flex; + margin-bottom: 8px; + + .importFileBtn { + padding: 8px 15px; + } + + .is-disabled { + background: #ebedf3; + } + + .delFileBtn { + padding: 8px 27px; + margin-left: 8px; + + span { + min-width: unset !important; + } + } + + .el-dropdown { + button { + min-width: 96px; + padding: 8px 13.2px; + } + } + } + + .kf-container-table-box { + height: calc(100% - 40px); + display: flex; + flex-direction: column; + tbody { + td { + border-right: unset !important; + } + } + .el-table.is-scrolling-left.el-table--border + .el-table-fixed-column--left.is-last-column.el-table__cell { + border-right: unset !important; + } + .el-table { + ::-webkit-scrollbar { + width: 4px !important; + } + .el-scrollbar__bar.is-vertical { + width: 4px !important; + } + } + } + + .kf-name-row { + color: #0077ff; + font-size: 12px; + font-weight: 500; + cursor: pointer; + } + + .el-table__body-wrapper { + flex: unset !important; + } + + .el-checkbox__inner::before { + top: 4.5px !important; + width: 13px; + } + + .upload-time-cell { + .cell { + display: flex; + align-items: center; + } + } + + .el-table__header { + height: 32px; + width: 100% !important; + box-shadow: inset 0 -1px 0 0 rgb(223 229 239); + + thead tr th { + background-color: #f4f6fa; + } + } + + .el-table__body { + width: 100% !important; + color: black !important; + + .el-table__row { + height: 48px; + } + } + + .el-table__cell { + padding: 0 !important; + font-size: 12px; + } + + .el-table-column--selection .cell { + padding-right: 0 !important; + padding-left: 10px !important; + } + + .kl-selection::after { + content: unset !important; + } + + .kl-name .cell { + padding-left: 0 !important; + } + + .el-pagination { + margin-top: 0; + margin-top: 24px !important; + } + + .el-pagination .el-input__inner { + height: var(--el-input-inner-height) !important; + } + + .statusFail, + .statusSuccess, + .statusCancel { + height: 24px; + width: fit-content; + padding: 0px 8px; + font-size: 12px; + line-height: 24px; + color: rgb(255 255 255); + text-align: center; + border-radius: 2px; + } + + .statusFail { + background: rgb(227, 32, 32); + } + + .statusSuccess { + background: rgb(36, 171, 54); + } + + .statusCancel { + background: rgb(141, 152, 170); + } + + .statusWaitIng { + display: flex; + align-items: center; + gap: 9px; + } + + @keyframes rotate-img { + from { + transform: rotate(0); + } + + to { + transform: rotate(360deg); + } + } + + .icon-loading { + height: 16px; + width: 16px; + background-repeat: no-repeat !important; + background-size: 100% !important; + display: inline-block; + background: url("/src/assets/icons/taskLoading.png"); + } + + .icon-box { + animation: rotate-img 0.8s infinite linear; + } + + .statusAnalysis { + display: flex; + align-items: center; + + .percent-box { + .el-progress-bar { + width: 88px; + } + .el-progress__text { + width: fit-content; + } + } + + .el-progress__text { + width: 24px; + min-width: 18px; + color: rgb(0 0 0); + } + + .statusAnalysisText { + font-size: 12px; + font-family: "HarmonyOS Sans SC Medium"; + margin-left: 2px; + color: rgb(0 0 0); + } + } + + .el-switch, + .el-switch__core { + width: 32px !important; + min-width: unset !important; + height: 16px !important; + } + + .el-switch__action { + top: 1.3px; + left: 1.5px; + width: 12px !important; + height: 12px !important; + } + + .el-switch.is-checked .el-switch__core .el-switch__action { + left: calc(100% - 13px) !important; + } + + .custom-header { + display: flex; + gap: 4px; + align-items: center; + .searchIconIsActive { + color: #0077ff !important; + } + + .el-icon { + font-size: 16px; + color: #8d98aa; + } + + .el-icon:hover { + color: #0077ff; + } + + svg { + width: 16px; + height: 16px; + } + } + + .kl-ruleForm { + max-width: 1000px !important; + + .el-select__popper { + top: 44px !important; + box-sizing: border-box; + width: 100% !important; + background: #fefefe !important; + border: 1px solid #07f !important; + + .el-select-dropdown { + width: 100% !important; + max-width: unset !important; + } + } + + .el-select-dropdown__item.is-hovering { + color: #fff; + background: #07f !important; + width: 399px; + } + + .el-form-item__content { + flex: unset !important; + width: 400px !important; + + .el-input, + .el-select__wrapper, + .el-textarea__inner { + width: 400px !important; + font-size: 12px; + color: var(--o-color-black); + } + + .el-input__inner { + font-size: 12px; + color: var(--o-color-black); + } + + .el-textarea__inner { + height: 88px; + } + } + + .config-form { + .el-form-item__content { + width: 600px !important; + + .supAddCategoris { + width: 400px !important; + height: 24px; + line-height: 24px; + } + } + + .resetBtn { + height: 32px !important; + } + } + } + + .kl-ops-btn { + position: absolute; + bottom: 0; + width: calc(100% - 256px); + height: 48px; + margin-bottom: unset !important; + background: rgb(254 254 254); + border-radius: 4px; + transform: translateX(-16px); + + .el-form-item__content { + margin-left: 0 !important; + } + + .resetBtn { + width: 80px; + } + } + + .domain-config { + margin-bottom: 8px !important; + } + + .config-form { + margin-bottom: 16px !important; + } + } + } + + .kf-container-form { + height: calc(100% - 64px); + padding-bottom: 0 !important; + overflow-y: auto; + padding-top: 24px !important; + padding-left: 16px !important; + .is-focused, + .el-select__selected-item { + span { + color: #000000 !important; + } + } + + .el-input__inner { + color: #000000 !important; + } + + .el-form-item .is-disabled span { + color: rgb(191, 199, 215) !important; + } + } +} + +.kf-ops-dowlon { + .el-dropdown-menu { + padding: 4px 0 !important; + } + .el-dropdown-menu__item { + font-size: 12px; + } +} + +.upload-dialog { + width: 560px; + padding: 0 !important; +} +.upload-drag { + color: rgb(78, 88, 101); + font-size: 12px; +} +.upload-tip-text { + width: 480px; +} + +.chooseFileBtn { + padding: 4px 8px; +} + +.edit-dialog { + padding: 0 !important; + .el-dialog__body { + padding-bottom: 0 !important; + } + .kf-ruleForm { + .el-form-item { + gap: unset !important; + margin-bottom: 24px; + } + + .kl-ops-btn { + display: flex; + justify-content: center; + height: 24px !important; + margin-top: 32px; + .el-button { + height: 24px; + } + + .el-form-item__content { + display: flex; + height: 24px !important; + min-height: unset !important; + justify-content: center; + margin-left: unset !important; + } + } + } + + .docTypeClass { + max-height: 150px; + overflow-x: hidden; + + .el-select-dropdown { + height: 100%; + overflow-y: auto; + } + } + + .docName { + label { + transform: translateX(-9px); + } + } + + .editTip { + display: flex; + gap: 9px; + margin-top: 4px; + } + + .iconAlarmOrange { + svg { + width: 20px; + height: 16px; + } + } + + .editTipText { + font-size: 12px; + color: #8d98aa; + } + + .config-size { + width: 111px !important; + } + + .fileChunkSize { + .el-form-item__content { + line-height: 12px; + } + } + + .el-select__popper { + top: 44px !important; + box-sizing: border-box; + width: 100% !important; + background: #fefefe !important; + border: 1px solid #07f !important; + + .el-select-dropdown { + width: 100% !important; + max-width: unset !important; + } + } + + .el-select-dropdown__item.is-hovering { + color: #fff !important; + background: #07f; + width: 319px; + } +} + +.tip-dialog { + .delTip { + display: flex; + gap: 17.5px; + align-items: center; + } + + .iconAlarmOrange { + svg { + width: 28px; + height: 24px; + } + } +} + +.delTipText { + display: inline-block; + width: 300px; +} + +.delToolTip { + display: inline-block; + max-width: 150px; + line-height: 12px; +} diff --git a/src/styles/knowledgeFileSection.scss b/src/styles/knowledgeFileSection.scss new file mode 100644 index 0000000000000000000000000000000000000000..39d4edc16fb3187ef75b6b1779f6970607c7c099 --- /dev/null +++ b/src/styles/knowledgeFileSection.scss @@ -0,0 +1,493 @@ +.kf-section-container { + display: flex; + flex-direction: column; + gap: 16px; + width: 100%; + height: 100%; + padding: 16px 24px 24px; + min-width: 1240px; + .kf-section-container-top { + display: flex; + align-items: center; + height: 24px; + + .kf-section-left-menu { + display: flex; + gap: 4px; + align-items: center; + width: 310px; + + .home-menu { + max-width: 80px; + height: 16px; + font-size: 12px; + line-height: 16px; + } + + .kf-section-name { + font-size: 12px; + font-weight: 700; + } + } + + .kf-section-right-title { + font-size: 18px; + font-weight: 700; + } + } + + .kf-section-container-action { + display: flex; + gap: 2px; + width: 100%; + height: calc(100% - 80px); + + .kf-section-container-left { + display: flex; + flex-direction: column; + gap: 16px; + width: 314px; + padding: 24px; + background: rgb(254 254 254); + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + box-shadow: iniset -1px 0 0 0 rgb(223 229 239); + + .kf-section-info-title { + font-size: 16px; + font-weight: 700; + } + + .kf-section-info-desc { + display: flex; + + .kf-section-info-label { + width: 101px; + font-size: 12px; + color: rgb(78 88 101); + } + + .kf-section-info-content { + max-width: 145px; + font-size: 12px; + } + } + } + + .kf-section-container-right { + flex: 1; + min-width: 700px; + height: 100%; + padding: 24px 0 24px 24px; + overflow: hidden; + background: rgb(254 254 254); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + + .kf-section-container-table-ops { + display: flex; + gap: 24px; + margin-bottom: 8px; + + .kf-pre-title { + font-size: 16px; + font-weight: 700; + } + + .kf-btn-search { + display: flex; + .el-input-group__prepend { + width: 120px; + height: 32px; + box-sizing: border-box; + padding: unset !important; + background: white !important; + border-color: blue; + } + .el-input__wrapper { + width: 280px; + padding-right: 8px !important; + .el-input__suffix { + .el-input__icon { + font-size: 16px; + } + } + } + .el-input__inner { + font-size: 12px !important; + } + } + + .el-input__wrapper { + width: 280px !important; + .el-input__inner { + width: 280px; + } + } + } + + .kf-section-container-table-box { + height: 100%; + + .el-scrollbar { + padding-right: 24px; + } + + .el-table__body { + width: unset !important; + } + + .el-scrollbar .el-scrollbar__bar .el-scrollbar__thumb { + background: #c3cedf !important; + opacity: 1; + } + + .is-horizontal { + display: none; + } + + ::-webkit-scrollbar-track { + background: #c3cedf !important; + border-radius: 1px; + } + + /* 滚动条滑块样式 */ + ::-webkit-scrollbar-thumb { + background: #c3cedf !important; + background-clip: content-box; + border-radius: 4px; + } + tbody { + .el-checkbox__inner::after { + top: 0; + left: 3px; + } + } + } + + .el-table { + width: 100%; + max-height: calc(100% - 96px) !important; + overflow-x: hidden !important; + } + + .showPagination { + max-height: 100% !important; + } + + .el-checkbox__inner::before { + top: 4.5px !important; + width: 13px; + } + + .el-table__header { + height: 32px; + colgroup { + col:first-child { + width: 24px !important; + } + } + .kf-selection { + border-bottom: unset; + + .cell { + width: 24px !important; + padding-right: 0 !important; + padding-left: 0 !important; + } + } + + col[name="el-table_1_column_1"] { + width: 24px !important; + } + + .kf-file-content { + border-bottom: unset; + } + + .kf-file-type { + border-bottom: unset; + display: none; + } + + .kf-file-content .cell { + width: 100px; + padding-left: 0 !important; + } + + .kf-selection::after { + content: unset !important; + } + } + + .el-table__body { + color: black !important; + transform: translateY(-8px); + colgroup { + col:first-child { + width: 46px !important; + } + } + .el-table__row { + height: 48px; + } + + .kf-selection { + width: 46px !important; + border-top: 1px solid rgb(223 229 239); + border-left: 1px solid rgb(223 229 239); + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + + .cell { + width: 46px !important; + position: absolute !important; + top: 13px !important; + padding-left: 18px; + } + .el-checkbox__inner { + width: 12px; + height: 12px; + } + } + + .text-type-tag { + display: inline-block; + margin-right: 5px; + height: 16px; + padding: 0 8px; + font-size: 12px; + line-height: 16px; + border-radius: 2px; + } + .text-type-para { + color: rgb(0, 119, 255); + background-color: rgb(184, 217, 255); + } + .text-type-table { + background-color: rgb(194, 231, 199); + color: rgb(36, 171, 54); + } + .text-type-image { + background-color: rgb(253, 217, 188); + color: rgb(249, 118, 17); + } + .kf-file-content { + margin-top: 20px; + border-top: 1px solid rgb(223 229 239); + border-right: 1px solid rgb(223 229 239); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + + .cell { + padding-right: 16px; + padding-left: 0; + font-size: 12px; + line-height: 16px; + text-align: left; + letter-spacing: 0; + } + + .kf-file-content-box { + display: flex; + gap: 16px; + justify-content: space-between; + + .kf-file-content-text { + padding: 16px 0; + .highlighted-term { + display: inline-block; + background: rgb(235, 175, 0); + } + } + + .kf-file-content-ops { + padding: 16px 0; + } + } + } + } + + .el-table__cell { + padding: 0 !important; + font-size: 12px; + } + + .el-pagination { + margin-top: 0; + margin-top: 24px !important; + } + + .el-pagination .el-input__inner { + height: var(--el-input-inner-height) !important; + } + + .el-switch, + .el-switch__core { + width: 32px !important; + min-width: unset !important; + height: 16px !important; + } + + .el-switch__action { + top: 1.3px; + left: 1.5px; + width: 12px !important; + height: 12px !important; + } + + .el-switch.is-checked .el-switch__core .el-switch__action { + left: calc(100% - 13px) !important; + } + } + + .kf-batch-ops { + width: 72px; + } + } + + .kf-section-name { + max-width: 120px; + } + + .libraryName { + display: inline-block; + max-width: 120px; + + .el-link__inner { + display: inline-block; + width: 100%; + } + } +} + +.kf-section-ops-dowlon { + width: 72px; + + .el-dropdown-menu__item { + font-size: 12px; + } + + .el-dropdown-menu { + overflow: hidden; + } +} +.fileTypeSelect { + height: 32px; + min-height: unset !important; + background-color: white !important; + .el-select__wrapper { + height: 32px; + min-height: unset !important; + } + .el-select__selection { + display: flex !important; + .el-select__selected-item { + width: 30px; + background: unset !important; + } + .el-tag { + background: unset !important; + } + .el-tag__close { + display: none; + } + } +} +.file-type-select { + min-height: unset !important; + background-color: white !important; + border: 1px solid #409eff; + .el-select-dropdown__item.is-hovering { + color: #fff !important; + background: #07f; + } + li::before { + display: none !important; + } +} + +.fileTypePoperClass { + width: 120px !important; + min-width: unset !important; + transform: translateY(-10px); + background: white !important; + border: 1px solid #0077ff !important; + padding: 4px 16px !important; + .el-checkbox__input.is-indeterminate .el-checkbox__inner:before { + transform: translateX(3px); + } + .el-checkbox { + position: relative; + } + .el-checkbox__label { + font-size: 12px !important; + } + + .isFileTypeChcekHover { + .el-checkbox__label { + color: rgb(255 255 255) !important; + } + + .el-checkbox__inner { + box-sizing: border-box; + border-color: rgb(208 212 220) !important; + } + } + + .isFileTypeChcekHover::after { + position: absolute; + content: ""; + display: block; + z-index: -1; + width: 120px; + height: 32px; + left: -16px; + background-color: #409eff; + } +} +.fileCheckTypeShow { + display: inline-block; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + gap: 8px; + .fileCheckTypeContent { + width: 64px; + height: 32px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + span { + font-size: 12px !important; + } + } + .el-icon-fileType { + font-size: 16px; + } + .fileTypeIcon { + display: flex; + align-items: center; + } + .icon-up { + color: var(--color) !important; + } +} +.filteTypeShowClass { + border-radius: 2px; + border: 1px solid #0077ff; + .fileCheckTypeContent { + transform: translateY(-1px); + span { + font-size: 12px !important; + } + } +} + +.kf-section-container-table-box { + .el-table__body { + // -webkit-border-horizontal-spacing: 13px; // 水平间距 + -webkit-border-vertical-spacing: 8px; // 垂直间距 + } +} diff --git a/src/styles/knowledgeForm.scss b/src/styles/knowledgeForm.scss new file mode 100644 index 0000000000000000000000000000000000000000..68fe1e8aa83b1bb1aab9cdb61641ea63c4a3e18f --- /dev/null +++ b/src/styles/knowledgeForm.scss @@ -0,0 +1,382 @@ +.domain-config { + label { + opacity: 0; + } + + .el-form-item__content { + position: relative; + display: flex; + flex-wrap: nowrap; + gap: 8px; + align-items: center; + width: 320px; + + .deleteConfig { + position: absolute; + right: -22px; + cursor: pointer; + } + + .deleteConfig:hover { + color: #0077ff; + } + } +} + +.kl-ruleForm { + padding-bottom: 0; + + .el-select__popper { + top: 44px !important; + box-sizing: border-box; + width: 100% !important; + background: #fefefe !important; + border: 1px solid #07f !important; + + .el-select-dropdown { + width: 100% !important; + max-width: unset !important; + } + } + + .el-form-item { + gap: 24px; + margin-bottom: 24px; + + .el-form-item__label-wrap { + display: unset !important; + } + + .is-focused, + .el-select__selected-item { + span { + color: #000000 !important; + } + } + + .is-disabled { + span { + color: rgb(191, 199, 215) !important; + } + } + + .el-input__inner { + color: #000000 !important; + } + + .is-transparent { + span { + color: #a8abb2 !important; + } + } + + .is-focused { + span { + color: #000000 !important; + } + } + + .removeIsTrans { + span { + color: #a8abb2 !important; + } + } + + .el-textarea__inner { + color: #000000 !important; + } + } + + .config-size { + width: 111px; + + .el-input-number__increase, + .el-input-number__decrease { + background: transparent; + .el-icon { + color: #8d98aa; + } + } + .el-input__wrapper { + width: 50px !important; + overflow: hidden !important; + padding-left: 30px !important; + padding-right: 30px !important; + } + .el-input__inner { + width: 50px !important; + overflow: hidden !important; + padding-left: 5px !important; + padding-right: 5px !important; + } + } + + .el-select-dropdown__item.is-hovering { + color: #fff !important; + background: #07f; + } + + .el-form-item__content { + flex: unset !important; + width: 320px !important; + + .el-input, + .el-select__wrapper, + .el-textarea__inner { + width: 320px !important; + font-size: 12px; + color: var(--o-color-black); + } + + .el-input__inner { + font-size: 12px; + color: var(--o-color-black); + } + + .el-textarea__inner { + height: 88px; + } + } + + .domain-config { + margin-bottom: 8px !important; + } + + .config-form, + .config-size-desc { + .el-form-item__label::before { + display: block; + margin-right: 4px; + content: "*"; + opacity: 0; + } + } + + .el-form-item__label { + display: flex; + gap: 4px; + align-items: center; + padding: 0 !important; + font-size: 12px !important; + + .el-icon { + margin-top: 2px; + font-size: 16px; + cursor: pointer; + } + + .el-icon:hover { + color: rgb(82 163 255); + } + } + + .el-form-item__label::before { + margin-right: 0 !important; + } + + .config-form { + margin-bottom: 8px !important; + height: 24px !important; + .el-form-item__content { + display: flex; + line-height: 24px; + height: 24px !important; + max-width: unset !important; + min-height: unset !important; + } + + .el-form-item__label { + height: 24px !important; + line-height: 24px !important; + max-width: unset !important; + min-height: unset !important; + } + + .resetBtn { + width: unset !important; + height: 24px !important; + } + + .addDocuType { + box-sizing: border-box; + padding: 4px 27px !important; + + span { + min-width: unset !important; + } + } + + .delAllCocuType { + box-sizing: border-box; + padding: 4px 15px !important; + margin-left: 8px !important; + } + } + + .supAddCategoris { + width: 170px; + height: 24px; + margin-left: 8px; + font-size: 12px; + line-height: 22px; + color: rgb(141 152 170); + } +} + +.analyticMethodSelect { + box-sizing: border-box; + background: #fefefe !important; + border-color: #07f !important; + .el-select-dropdown { + width: 100% !important; + max-width: unset !important; + } + + .el-select-dropdown__item.is-hovering { + color: #fff; + background: #07f !important; + } +} + +.create-dialog { + width: 560px; + height: 600px; + position: relative; + padding: 0 !important; + overflow: hidden; + + .el-dialog__body { + height: 470px !important; + max-height: unset !important; + min-height: unset !important; + padding-left: 16px !important; + margin-right: 0 !important; + padding-bottom: 0; + } + + .analyticMethod { + .el-popper { + inset: auto auto auto 0px !important; + } + } + ::-webkit-scrollbar { + width: 4px !important; + height: 8px; + background: transparent; + } + + .config-size { + width: 111px; + } + + .el-input-number__increase, + .el-input-number__decrease { + background: transparent; + .el-icon { + color: #8d98aa; + } + } + + .el-select-dropdown__item.is-hovering { + color: #fff !important; + background: #07f; + width: 319px; + } + + .kl-ops-btn { + height: 24px !important; + margin-top: 32px; + margin-bottom: 0; + + .el-form-item__content { + display: flex; + justify-content: center; + width: 100% !important; + height: 24px !important; + min-height: unset !important; + margin-left: 0 !important; + line-height: 24px !important; + } + + .resetBtn { + height: 24px !important; + } + } + + .config-form { + .addDocuType { + padding: 4px 19px !important; + } + .delAllCocuType { + padding: 4px 7px !important; + } + } +} + +.tip-dialog { + padding: 0 !important; + + .el-dialog__body { + padding: 24px !important; + margin-right: 0; + font-size: 12px; + } + + .tip-ops-btn { + display: flex; + justify-content: center; + width: 100%; + margin-top: 32px; + + .resetBtn { + width: 64px; + height: 24px; + } + } +} + +.kl-ops-btn { + margin-bottom: 0; +} + +.kl-create-ops-btn { + position: absolute; + bottom: 24px; + left: 190px; +} + +.assetIdClass { + label::before { + opacity: 0; + } +} +#asset-box-id { + .el-form-item__content { + width: 470px !important; + display: flex; + gap: 10px; + } + .copydocument { + cursor: pointer; + transform: rotateZ(180deg); + } + .copydocument:hover { + color: #0077ff; + } +} + +.select-container { + .is-disabled { + .el-select__selected-item { + color: #bfc7d7 !important; + } + } +} + +.analyticTipBox, +.fileChunkSizeTip { + width: 376px !important; + max-width: unset !important; + min-width: unset !important; + padding: 8px !important; +} diff --git a/src/styles/knowledgeLibrary.scss b/src/styles/knowledgeLibrary.scss new file mode 100644 index 0000000000000000000000000000000000000000..a3fdfba7eb3efed16667dfe09db259e2e0250b57 --- /dev/null +++ b/src/styles/knowledgeLibrary.scss @@ -0,0 +1,666 @@ +.knowledgeLibrary-container { + width: 100%; + height: calc(100vh - 300px); + padding: 0 24px 24px; + background: rgb(239 239 239); + min-width: 1240px; + .knowledgeLibrary-box { + box-sizing: border-box; + display: flex; + flex-direction: column; + width: 100%; + height: calc(100vh - 319px); + padding-bottom: 24px; + overflow-y: auto; + background: rgb(253 254 255); + border-radius: 4px; + transform: translateY(-5px); + + .kl-tilte { + height: 24px; + margin-left: 24px; + margin-top: 24px; + font-size: 16px; + line-height: 24px; + color: rgb(0, 0, 0); + font-weight: 700; + } + + .kl-ops { + display: flex; + justify-content: space-between; + width: 100%; + padding: 0 24px; + margin-top: 16px; + + .kl-left-btn { + .createAsset, + .ImportAsset { + font-size: 12px; + font-weight: 500; + } + + .createAsset { + padding: 8px 17.2px; + } + + .ImportAsset { + padding: 8px 23.2px; + } + + .el-button--primary { + background: rgb(0 119 255); + } + } + + .kl-right-btn { + display: flex; + gap: 8px; + + .kl-btn-search { + width: 400px; + height: 32px; + .el-input__icon { + font-size: 16px; + } + .el-input__inner { + font-size: 12px !important; + line-height: 16px; + } + .el-input__wrapper { + padding-right: 8px !important; + } + } + + .kl-btn-switch { + box-sizing: border-box; + display: flex; + align-items: center; + width: 64px; + height: 32px; + border: 1px solid rgb(195 206 223); + border-radius: 2px; + + .kl-btn-switch-icon { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + cursor: pointer; + .el-icon { + color: #8d98aa; + font-size: 16px !important; + } + } + + .bgThumb { + height: 32px; + background: rgb(0 119 255); + + .el-icon { + color: white; + font-size: 16px !important; + } + } + } + } + } + + .kl-card-box { + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 0 16px 24px 24px; + margin-top: 16px; + overflow-y: scroll; + } + + .kl-card { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + .kl-single-card { + display: flex; + flex-direction: column; + height: 302px; + padding: 24px; + cursor: pointer; + background: rgb(244 246 250); + border-radius: 4px; + + .kl-card-top { + display: flex; + align-items: center; + justify-content: space-between; + + .kl-card-name { + width: 90%; + height: 24px; + font-size: 18px; + font-weight: 700; + line-height: 24px; + } + + .kl-card-more-icon { + cursor: pointer; + } + } + + .kl-card-desc { + flex: 1; + padding-top: 16px; + font-size: 14px; + line-height: 22px; + color: rgb(141 152 170); + } + + .kl-card-footer { + display: flex; + gap: 16px; + align-items: center; + color: rgb(78 88 101); + width: 100%; + margin-bottom: 8px; + .el-icon { + font-size: 16px; + } + + .kl-card-file-icon { + display: flex; + gap: 4px; + align-items: center; + .kl-card-file { + display: flex; + width: 90%; + font-size: 14px; + .kl-file-text { + width: 95%; + display: inline-block; + } + } + + .kl-file-num { + font-size: 14px; + font-family: "HarmonyOS Sans SC Bold"; + } + } + + .kl-card-timer-icon { + text-align: right; + display: flex; + gap: 4px; + width: 45%; + align-items: center; + font-size: 14px; + .kl-card-timer { + width: 90%; + } + } + } + + .kl-card-id { + width: 330px !important; + .id-label, + .id-value { + font-size: 14px; + letter-spacing: 0; + color: #575d6c; + } + .id-label { + font-family: "HarmonyOS Sans SC Bold"; + } + } + } + } + + @media screen and (width <= 1560px) { + .kl-card-container { + display: grid; + grid-template-columns: repeat(auto-fill, 350px); + grid-gap: 16px; + } + } + + @media screen and (width >= 1560px) { + .kl-card-container { + display: grid; + grid-template-columns: repeat(auto-fill, 350px); + grid-gap: 16px; + } + } + + .pageNoData { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + font-size: 12px; + color: rgb(78 88 101); + } + } + + .knowledgeLibrayList { + padding-bottom: unset !important; + } + .kl-table-box { + padding: 16px 24px 24px; + height: 100%; + display: flex; + flex-direction: column; + gap: 24px; + min-height: 200px; + .el-checkbox__inner::before { + top: 4.5px !important; + width: 13px; + } + + tbody { + td { + border-right: unset !important; + } + } + .el-table.is-scrolling-left.el-table--border + .el-table-fixed-column--left.is-last-column.el-table__cell { + border-right: unset !important; + } + + .el-table__header { + width: 100% !important; + + height: 32px; + box-shadow: inset 0 -1px 0 0 rgb(223 229 239); + + thead tr th { + background-color: #f4f6fa; + } + } + + .kl-name-row { + color: #0077ff; + font-size: 12px; + font-weight: 500; + cursor: pointer; + } + + .kl-id { + .el-icon { + color: #8d98aa; + } + } + + .el-table__body { + width: 100% !important; + .el-table__row { + height: 48px; + } + } + + .el-table__cell { + padding: 0 !important; + font-size: 12px; + } + + .el-table--border .el-table__cell:first-child .cell { + padding: 0 12px !important; + } + + .el-table-column--selection .cell { + padding-right: 0 !important; + padding-left: 22px; + } + + .kl-selection::after { + content: unset !important; + } + + .el-pagination { + margin-top: 0; + } + + .el-pagination .el-input__inner { + height: var(--el-input-inner-height) !important; + } + } + + .o-export-progress-notify { + position: fixed; + right: 24px; + bottom: 24px; + z-index: 1; + width: 400px; + overflow: hidden; + background-color: var(--o-bg-color-base); + border-color: var(--o-bg-color-base); + border-radius: var(--o-border-radius); + box-shadow: var(--o-box-shadow); + + .o-export-notify__head { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + height: 56px; + padding: 4px 16px; + font-size: var(--o-font-size-text); + line-height: var(--o-line-height-text); + color: var(--o-text-color-primary); + background-color: var(--o-bg-color-light); + + .task-list { + font-size: 16px; + font-weight: 700; + line-height: 24px; + } + + .nofity-show { + display: flex; + align-items: center; + width: 20px; + height: 100%; + } + } + + .o-export-notify__body { + padding: 8px 16px; + background-color: var(--o-bg-color-light); + } + + .o-export-notify__list { + display: flex; + flex-direction: column; + gap: 16px; + max-height: 500px; + overflow-y: auto; + + .item { + max-height: 112px; + padding: 16px; + padding-bottom: 12px; + background: rgb(253 254 255); + border-radius: 2px; + .el-progress__text { + min-width: 10px; + } + } + + .item-box { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 12px; + font-weight: 600; + color: rgb(0 0 0); + } + + .item-info { + display: flex; + } + + .item-close { + width: 16px; + height: 16px; + cursor: pointer; + } + + .item-name { + max-width: 240px; + font-size: 12px; + font-weight: 700; + flex: 1; + .item-name-text { + font-size: 12px; + } + } + + .item-file-size { + max-width: 60px; + } + + .taskStatusPer { + margin-top: 8px; + } + + .waitExport, + .packData { + display: flex; + gap: 4px; + align-items: center; + height: 32px; + font-family: "HarmonyOS Sans SC Regular", sans-serif !important; + font-size: 12px; + font-weight: 600; + + .el-icon { + font-size: 14px; + } + } + + @keyframes rotate-img { + from { + transform: rotate(0); + } + + to { + transform: rotate(360deg); + } + } + + .icon-loading { + height: 16px; + width: 16px; + background-repeat: no-repeat !important; + background-size: 100% !important; + display: inline-block; + background: url("/src/assets/icons/taskLoading.png"); + } + + .icon-box { + animation: rotate-img 0.8s infinite linear; + } + + .errorIcon { + width: 16px; + height: 16px; + + path { + color: rgb(228 33 33) !important; + } + } + + .successIcon { + width: 14px; + height: 14px; + + path { + color: rgb(36 171 54) !important; + } + } + + .successTask { + margin-left: 18px; + font-size: 12px; + color: rgb(0 119 255); + cursor: pointer; + } + + .opsExportTask { + margin-bottom: 24px; + } + + .errorRestart { + font-size: 12px; + color: rgb(0 119 255); + cursor: pointer; + } + + .errorReson { + margin-left: 18px; + font-size: 12px; + color: rgb(141 152 170); + } + + .errorTask { + display: flex; + gap: 4px; + } + + .upload-success, + .upload-error { + display: flex; + gap: 6px; + align-items: center; + margin-top: 6px; + font-size: 12px; + color: rgb(228 33 33); + + .el-icon { + font-size: 14px; + + path { + fill: rgb(228 33 33); + } + } + } + + .upload-restart { + color: rgb(0 119 255); + cursor: pointer; + } + } + + .item-all-close { + width: 100%; + margin-top: 16px; + margin-bottom: 8px; + font-size: 12px; + font-weight: 700; + color: rgb(0 119 255); + text-align: right; + cursor: pointer; + } + + .o-export-notify__close { + position: absolute; + right: 16px; + font-size: var(--o-font-size-body); + color: var(--o-text-color-secondary); + cursor: pointer; + + &:hover { + color: var(--o-text-color-primary); + } + } + } +} + +.upload-dialog { + width: 560px; + padding: 0 !important; +} + +.upload-drag { + color: rgb(78, 88, 101); + font-size: 12px; +} + +.upload-tip-text { + width: 480px; +} + +.chooseFileBtn { + padding: 4px 8px; +} + +.tip-dialog { + .delTip { + display: flex; + gap: 17px; + align-items: center; + } + + .iconAlarmOrange { + svg { + width: 28px; + height: 24px; + } + } +} + +.delTipDialog { + .el-dialog__header { + height: 56px !important; + } + .el-dialog__body { + height: 128px !important; + } + .delTip { + height: 24px !important; + } +} + +.asset-custom-header { + display: flex; + gap: 4px; + align-items: center; + + .searchIconIsActive { + color: #0077ff !important; + } + + .el-icon { + font-size: 16px; + color: #8d98aa; + } + + .el-icon:hover { + color: #0077ff; + } + + svg { + width: 16px; + height: 16px; + } +} + +.asset-upload-time-cell .cell { + display: flex; + align-items: center; +} +.asset-id-custom-header { + display: flex; + gap: 4px; + align-items: center; +} +.asset-id-custom-header svg { + width: 16px; + height: 16px; +} +.asset-id-custom-header .el-icon { + font-size: 16px; +} +.searchIconIsActive { + color: #0077ff !important; +} + +.delToolTip { + display: inline-block; + max-width: 150px; + line-height: 12px; +} + +.delTipText { + display: inline-block; + width: 300px; +} + +.timePng, +.filePng { + width: 16px; + height: 16px; +} +.assetDro { + .el-dropdown-menu { + padding: 4px 0 !important; + } +} diff --git a/src/styles/login.scss b/src/styles/login.scss new file mode 100644 index 0000000000000000000000000000000000000000..843fc5540ab7f71027a056c47dd107cd9a20d889 --- /dev/null +++ b/src/styles/login.scss @@ -0,0 +1,96 @@ +.login-container { + width: 100%; + min-width: 550px; + height: calc(100vh - 42px); + + .login-card { + position: absolute; + top: 19%; + right: 7.7%; + width: 456px; + min-height: 544px; + padding: 48px; + border: none; + border-radius: 4px; + box-shadow: 0 4px 16px 8px rgb(0 0 0 / 10%) !important; + + .el-card__body { + padding: 0; + height: 412px; + } + + .input-wrapper { + display: flex; + align-items: center; + width: 100%; + } + + .captcha-image { + height: 48px; + cursor: pointer; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + } + + .platform-login-text { + font-size: 12px; + color: var(--el-text-color-secondary); + } + + .password-from, + .username-from { + margin-top: 24px; + margin-bottom: unset !important; + .el-input__inner { + font-size: 16px !important; + color: #000000; + } + } + + .login-title { + margin-top: 8px; + margin-bottom: 48px; + font-size: 40px; + font-weight: 700; + line-height: 48px; + text-align: left; + letter-spacing: 0.83px !important; + } + + .login-btn { + height: 48px; + margin-top: 124px; + font-size: 16px; + font-weight: 500; + background-color: rgb(0 119 255); + border-radius: 2px; + span { + font-size: 16px; + } + } + } + + .icp-info { + position: absolute; + bottom: 32px; + width: 100%; + font-size: 14px; + color: var(--el-text-color-secondary); + text-align: center; + } + + .el-input-wrapper { + background: var(--el-input-bg-color) !important; + border: 1px solid var(--el-border-color); + border-radius: 5px; + } + + .el-input__wrapper { + height: 48px !important; + } + + .el-form-item { + background: var(--el-input-bg-color); + border-radius: 5px; + } +} diff --git a/src/styles/reset.scss b/src/styles/reset.scss new file mode 100644 index 0000000000000000000000000000000000000000..e2c0850a31b44b2e8de2658a7f31a9e2ba2a120c --- /dev/null +++ b/src/styles/reset.scss @@ -0,0 +1,870 @@ +@font-face { + font-family: "HarmonyOS Sans SC Thin"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Thin.woff) format("woff"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Light"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Light.woff) format("woff"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Regular"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.woff) format("woff"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Medium"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Medium.woff) format("woff"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Bold"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Bold.woff) format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans SC Black"; + src: + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff2) format("woff2"), + url(./HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Black.woff) format("woff"); + font-weight: 900; + font-style: normal; +} + +/* 鸿蒙西文字体 */ +@font-face { + font-family: "HarmonyOS Sans En Thin"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Thin.woff) format("woff"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Light"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Light.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Light.woff) format("woff"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Regular"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Regular.woff) format("woff"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Medium"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Medium.woff) format("woff"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Bold"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Bold.woff) format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: "HarmonyOS Sans En Black"; + src: + url(./HarmonyOS_Sans/HarmonyOS_Sans_Black.woff2) format("woff2"), + url(./HarmonyOS_Sans/HarmonyOS_Sans_Black.woff) format("woff"); + font-weight: 900; + font-style: normal; +} + +::before, +::after { + box-sizing: border-box; + border-color: currentcolor; + border-style: solid; + border-width: 0; +} + +#app { + width: 100%; + height: 100%; +} + +html, +body { + box-sizing: border-box; + width: 100%; + min-width: 600px; + height: 100%; + line-height: 1.5; + tab-size: 4; + text-size-adjust: 100%; +} + +:root { + --el-font-family: "HarmonyOS Sans SC Medium", -apple-system, + blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", + sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji" !important; +} + +html, +body, +input, +button, +.is-selected { + margin: 0; + font-family: + "HarmonyOS Sans SC Medium", + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + "Helvetica Neue", + Arial, + "Noto Sans", + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji" !important; + line-height: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizelegibility; +} + +a { + color: inherit; + text-decoration: inherit; +} + +img, +svg { + display: inline-block; +} + +svg { + // 因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 + vertical-align: -0.15em; +} + +ul, +li { + padding: 0; + margin: 0; + list-style: none; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + padding: 0; + margin: 0; +} + +.el-button { + border-radius: 2px !important; +} + +.el-button span { + justify-content: center; + font-size: 12px; +} + +.el-button--primary { + background: rgb(0 119 255) !important; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +a, +a:focus, +a:hover { + color: inherit; + text-decoration: none; + cursor: pointer; +} + +a:focus, +a:active, +div:focus { + outline: none; +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; + background: transparent; +} + +::-webkit-scrollbar-track { + background: transparent; + border-radius: 10px; +} + +::-webkit-scrollbar-corner { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #c3cedf; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #bfc7d7 !important; + background-color: #bfc7d7 !important; + border: 0; + opacity: 1; +} + +.el-scrollbar .el-scrollbar__bar .el-scrollbar__thumb { + background: #c3cedf !important; + opacity: 1; +} + +.resetBtn { + width: 64px; + + span { + font-size: 12px; + } +} + +.el-dialog__header { + .el-dialog__title { + font-size: 16px; + font-weight: 700; + color: rgb(0 0 0); + } +} + +.dropdown-container { + margin-top: -10px; + + .el-dropdown-menu__item:not(.is-disabled):hover { + color: rgb(255 255 255); + background: rgb(82 163 255); + } +} + +.el-button:focus-visible { + outline: unset !important; +} + +.el-textarea__inner, +.el-input__wrapper, +.el-select__wrapper { + padding: 8px 16px !important; +} + +.el-input__wrapper, +.el-select__wrapper { + height: 32px !important; +} + +.el-table__column-filter-trigger { + line-height: 16px; +} + +.filterPopper { + display: flex; + flex-direction: column; + width: 168px !important; + padding: 8px 16px 16px !important; + background: rgb(253 254 255) !important; + transform: translateY(-10px); + + .el-checkbox-group { + .el-checkbox { + margin-right: 0; + } + } + + .el-checkbox__inner::before { + top: 4.5px !important; + width: 13px !important; + } + + .el-checkbox__label { + width: 120px; + font-size: 12px; + } + + .el-checkbox__input.is-checked + .el-checkbox__label { + color: rgb(78 88 101); + } + + .el-checkbox__inner { + box-sizing: border-box; + border-color: rgb(141 152 170) !important; + border-radius: 1px; + } + + .el-checkbox:hover:not(.is-disabled) .el-checkbox__inner { + box-sizing: border-box; + border-color: rgb(208 212 220) !important; + border-radius: 1px; + } + + .is-checked { + border: unset !important; + } +} +.form-right-tip { + color: rgb(141, 152, 170); + font-size: 12px; +} +.kbLibraryPage { + .el-select-dropdown__item.is-hovering { + color: white; + background-color: var(--o-select-dropdown-bg-color_hover) !important; + } +} + +.o-message--error { + width: 544px; + background-color: var(--o-message-bg-color_error) !important; + border-color: var(--o-message-border-color_error) !important; + .el-message__content { + flex: 1; + } + .el-icon { + position: relative !important; + top: unset !important; + } +} + +.el-message--info { + height: 48px !important; +} + +.el-message__icon { + font-size: 16px !important; + margin-right: unset !important; +} + +.el-message__content { + font-size: 12px !important; +} + +.o-message--success { + width: 544px; + background-color: #c2e7c7 !important; + border-color: #24ab36 !important; + .el-message__content { + flex: 1; + } + .el-icon { + position: relative !important; + top: unset !important; + } +} + +.el-dialog__headerbtn { + height: 57px !important; + .el-dialog__close { + font-size: 20px !important; + } +} + +.el-table__empty-block { + margin-top: unset !important; + box-shadow: inset 0px -1px 0px 0px rgb(223, 229, 239); +} + +.el-select-dropdown__item { + font-family: "HarmonyOS Sans SC Medium" !important; + font-size: 12px; + font-weight: unset !important; +} + +.model-dialog, +.create-dialog, +.edit-dialog { + .el-form-item__content { + button.is-disabled { + background: #b8d9ff !important; + border: unset; + span { + color: #fff !important; + } + } + } +} + +.upload-ops-btn { + button.is-disabled { + background: #b8d9ff !important; + border: unset; + } +} + +.caret-wrapper { + margin-left: 0 !important; + transform: translateX(-3px); +} + +.removeIsTrans { + color: #a8abb2 !important; +} + +.el-pagination { + .el-pagination__total { + margin-right: unset; + } + .el-pagination__sizes { + margin-left: 7px; + margin-right: unset; + } + .btn-prev { + margin-left: 8px !important; + } + .btn-next { + margin-right: 8px !important; + } + .el-pagination__jump { + margin-left: unset; + } + .el-pagination__goto { + margin-right: unset; + } + .el-pagination__classifier { + margin-left: unset; + } +} + +.el-icon--caretup { + color: #0077ff !important; +} + +.downBtn { + border: 1px solid var(--el-button-border-color) !important; + color: #606266 !important; +} + +.el-pagination { + .el-select { + width: 100px !important; + } + .el-input { + width: 40px !important; + } + + button:disabled .el-icon { + color: #8d98aa !important; + } +} + +.cancelBtn { + margin-left: 8px !important; +} + +.el-message__closeBtn { + color: #8d98aa !important; +} + +.el-select__suffix { + .el-icon { + font-size: 16px; + } +} + +.el-dialog__headerbtn { + width: unset !important; + margin-right: 24px; + .el-dialog__close { + color: #8d98aa !important; + } +} + +.custom-header, +.asset-custom-header { + .el-date-editor--datetimerange { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden; + margin-top: 10px; + opacity: 0; + } +} + +.asset-custom-header { + .el-date-editor--datetimerange { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden; + margin-top: 10px; + opacity: 0; + } +} + +.assetTimeFilterPo { + width: unset !important; + min-width: unset !important; + padding: unset !important; + opacity: 0; +} + +.el-pagination button { + padding: 0 !important; + width: 28px !important; + min-width: unset !important; +} + +.el-pagination .btn-next .el-icon, +.el-pagination .btn-prev .el-icon { + font-size: 14px !important; +} + +.el-pager .number { + color: rgb(78, 88, 101); + font-size: 12px; +} + +:is([role="option"]) { + font-size: 12px !important; +} +.datetimerangeClass { + width: 586px !important; + height: 380px; + margin-right: -12px; + + .el-picker-panel__sidebar { + width: 104px !important; + padding-top: 4px !important; + } + + .el-picker-panel { + width: 100% !important; + } + + .el-picker-panel__body-wrapper { + height: 345px !important; + } + + .el-picker-panel__body { + min-width: unset !important; + height: 345px; + margin-left: 104px !important; + + .el-picker-panel__content { + height: 300px !important; + padding: 8px !important; + + tbody tr { + height: 32px; + border: unset !important; + } + + th { + height: 32px !important; + padding: 0 !important; + color: rgb(191 199 215); + border: unset !important; + } + + th::after { + content: unset !important; + } + + tbody { + tr:first-child { + margin-bottom: 8px; + } + } + + tbody:has(.el-date-table__row) { + .el-date-table__row { + margin-bottom: 4px; + td { + width: 32px !important; + height: 32px !important; + padding: 0 !important; + + .el-date-table-cell { + width: 32px !important; + height: 32px !important; + padding: 0 !important; + + .el-date-table-cell__text { + width: 32px !important; + height: 32px !important; + line-height: 32px !important; + border-radius: 2px !important; + } + } + } + + .start-date, + .end-date { + .el-date-table-cell__text { + background: rgb(0 119 255); + } + } + + .in-range { + .el-date-table-cell__text { + color: rgb(255 255 255) !important; + } + } + } + } + } + } + + .el-date-range-picker__header { + height: 32px; + padding: 8px !important; + margin-bottom: 8px; + + button { + margin-top: 0 !important; + } + } + + .el-date-range-picker__time-header { + .el-icon { + margin: 0 12px !important; + font-size: 8px !important; + svg { + display: none; + } + } + + .el-icon::after { + display: block; + width: 8px; + height: 1px; + content: ""; + background-color: rgb(223 229 239); + } + + .el-input--small .el-input__inner { + font-size: 12px !important; + } + } + + .el-picker-panel__footer { + display: flex; + flex-direction: row-reverse; + gap: 16px; + justify-content: end; + padding-right: 24px !important; + } + + .el-time-panel { + left: -70px; + } + + .is-plain { + color: #07f; + } + + .el-picker-panel__footer:has(.is-disabled) { + .is-plain { + color: #a8abb2 !important; + } + } +} +.datetimerangeClass { + .el-picker-panel__sidebar { + height: 378px; + } + .el-picker-panel__shortcut { + font-size: 12px; + line-height: 32px !important; + padding-left: 16px !important; + } + .el-picker-panel__body { + .el-input { + width: 100px !important; + .el-input__wrapper { + height: 24px !important; + } + } + } + + .el-picker-panel__body-wrapper { + height: 345px !important; + } + + .el-date-range-picker__time-header { + display: flex; + padding: 2px 16px 8px !important; + .el-input--small .el-input__inner { + font-size: 12px !important; + } + } + + .el-date-range-picker__header { + width: 224px !important; + line-height: 16px !important; + button { + display: flex; + height: 16px; + align-items: center; + } + div { + width: 120px !important; + margin-left: 45px !important; + } + } + + .el-picker-panel__content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + .el-date-range-picker__editors-wrap { + display: flex; + gap: 8px; + } + .el-date-range-picker__time-picker-wrap { + padding: 0 0px !important; + } +} + +.timeFilterPo { + max-width: unset !important; + width: 0 !important; + height: 0 !important; + padding: 0 !important; + opacity: 0; + .el-radio.is-checked .el-radio__inner { + background-color: var(--o-radio-bg-color_checked_hover); + border-color: var(--o-radio-border-color_checked_hover); + } + .el-picker-panel__body-wrapper { + overflow: unset !important; + } + .el-picker-panel__footer { + padding-right: 24px; + width: 400px; + padding-top: 3px !important; + border: unset !important; + margin-left: 197px; + } + + .el-picker-panel__shortcut { + font-size: 12px; + } + + .el-picker-panel__body { + border-bottom: 1px solid #e4e7ed; + } + + .el-picker-panel__sidebar { + height: 378px; + border: 1px solid #e4e7ed !important; + } + + .customTimeBtn { + display: flex; + gap: 8px; + align-items: center; + font-size: 12px; + color: rgb(78 88 101); + } + + .el-radio__inner::after { + position: absolute; + top: 50%; + left: 50%; + width: 8px; + height: 8px; + content: ""; + background-color: var(--el-color-white); + border-radius: var(--el-radio-input-border-radius); + transition: transform 0.15s ease-in; + transform: translate(-50%, -50%) scale(0); + } + + .config-size { + width: 104px !important; + } + + .el-input-number__increase, + .el-input-number__decrease { + background: transparent; + .el-icon { + color: #8d98aa; + } + } + + .filter-btn { + display: flex; + justify-content: center; + } + + .is-checked .el-radio__label { + color: rgb(78 88 101) !important; + } +} + +.el-select__popper { + .el-select-dropdown__list { + padding: 4px 0 !important; + li { + height: 32px !important; + line-height: 30px !important; + } + } + + .el-select-dropdown__item { + padding: 0 16px; + } +} + +.el-select-dropdown__item.is-selected { + color: #0077ff; + span { + color: #0077ff; + } +} +.el-select-dropdown__item.is-hovering { + span { + color: #fff !important; + } +} diff --git a/src/styles/upload.scss b/src/styles/upload.scss new file mode 100644 index 0000000000000000000000000000000000000000..4818025ccdcd1a564a3098b440c49637f7237c18 --- /dev/null +++ b/src/styles/upload.scss @@ -0,0 +1,223 @@ +.upload-dialog { + .el-dialog__body { + max-height: unset !important; + } + + .upload-to-list { + .list-action { + display: flex; + + .file-ops { + height: 24px; + padding: 4px 8px; + font-size: 12px; + } + + .delFileBtn { + height: 24px; + padding: 4px 20px; + font-size: 12px; + + span { + min-width: unset !important; + } + } + } + + .list-tip { + margin: 8px 0; + font-size: var(--o-font-size-info); + line-height: var(--o-line-height-info); + } + + &.has-files { + .upload-block { + height: 184px; + } + + .el-table__header .cell { + color: rgb(78 88 101); + } + + .el-table__body .cell { + color: rgb(0 0 0); + } + + .el-alert--info { + align-items: start; + max-height: 48px; + margin-bottom: 16px; + background-color: rgb(184 217 255) !important; + + .el-alert__content { + padding-right: 0 !important; + } + + .el-alert__title { + font-size: 12px; + line-height: 16px; + } + } + + .el-upload-dragger { + border: unset !important; + } + + .el-table__cell { + padding: 0 !important; + } + + .el-table-column--selection .cell { + padding-right: 0 !important; + padding-left: 18px; + } + + .upload-file-name .cell { + padding-left: 0 !important; + } + + .upload-file-selection::after { + content: unset !important; + } + + .upload-ops-btn { + display: flex; + justify-content: center; + width: 100%; + margin-top: 32px; + + .el-button { + height: 24px; + } + + .el-button span { + justify-content: center; + } + } + } + } + + .upload-block { + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 264px; + overflow: hidden; + cursor: pointer; + + .upload-drag-mask { + position: absolute; + inset: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; + opacity: 0; + transition: opacity 0.3s; + + .upload-tip { + color: var(--o-text-color-secondary); + } + + &::before { + position: absolute; + inset: 0; + z-index: -1; + content: ""; + background-color: rgb(235 239 246); + opacity: 0.9; + } + } + } + + .upload-add { + .upload-btn-icon { + font-size: 64px !important; + } + } + + .is-dragover { + opacity: 1; + + .upload-drag-mask { + opacity: 1; + } + } + + .upload-btn-icon { + font-size: var(--o-font-size-large); + color: var(--o-text-color-tertiary); + } + + .upload-tip { + width: 100%; + font-size: var(--o-font-size-info); + line-height: var(--o-line-height-info); + color: var(--o-text-color-tertiary); + + .el-button--primary { + height: 24px; + } + + + .upload-tip { + margin-top: 24px; + } + } + + .upload-preview { + width: 100%; + height: 184px; + cursor: default; + background-color: var(--o-bg-color-base); + .cell { + font-size: 12px !important; + } + .el-table { + ::-webkit-scrollbar { + width: 4px !important; + } + .el-scrollbar__bar.is-vertical { + width: 4px !important; + } + } + } + + .upload-btns { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--o-bg-color-mask); + opacity: 0; + transition: opacity 0.3s; + + .btn { + margin: 8px; + font-size: var(--o-font-size-subtitle); + color: var(--o-text-color-fourth); + + &:hover { + color: var(--o-color-primary); + } + } + } + + .el-upload-dragger { + box-sizing: border-box; + padding: 0 !important; + border: 1px dashed rgb(195 206 223); + border-radius: 2px; + } + + .el-checkbox__inner::before { + top: 4.5px !important; + width: 13px !important; + } + + .el-progress__text { + font-weight: 600 !important; + } +} diff --git a/src/styles/uploadProgress.scss b/src/styles/uploadProgress.scss new file mode 100644 index 0000000000000000000000000000000000000000..f0edf1a4864dd297cce80398d01bad65a3f65100 --- /dev/null +++ b/src/styles/uploadProgress.scss @@ -0,0 +1,161 @@ +.o-upload-progress-notify { + position: fixed; + right: 48px; + bottom: 48px; + z-index: 9999; + width: 400px; + overflow: hidden; + background-color: var(--o-bg-color-base); + border-color: var(--o-bg-color-base); + border-radius: var(--o-border-radius); + box-shadow: var(--o-box-shadow); + + .o-upload-notify__head { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + height: 56px; + padding: 4px 16px; + font-size: var(--o-font-size-text); + line-height: var(--o-line-height-text); + color: var(--o-text-color-primary); + background-color: var(--o-bg-color-light); + + .task-list { + font-size: 16px; + font-weight: 700; + line-height: 24px; + } + + .nofity-show { + display: flex; + align-items: center; + width: 20px; + height: 100%; + } + } + + .o-upload-notify__body { + padding: 8px 16px; + background-color: var(--o-bg-color-light); + } + + .o-upload-notify__list { + display: flex; + flex-direction: column; + gap: 8px; + max-height: 500px; + overflow-y: auto; + + .item { + padding: 16px; + padding-bottom: 12px; + background: rgb(253 254 255); + + .el-progress__text { + min-width: 10px; + } + } + + .item-box { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 12px; + font-weight: 600; + color: rgb(0 0 0); + } + + .item-info { + display: flex; + } + + .item-close { + width: 16px; + height: 16px; + cursor: pointer; + } + + .item-name { + font-size: 12px; + max-width: 160px; + flex: 1; + } + + .item-success-name { + max-width: 220px; + } + + .item-file-size { + max-width: 70; + } + + .upload-status { + width: 80px; + } + + .upload-success { + display: flex; + gap: 6px; + align-items: center; + margin-top: 6px; + font-size: 12px; + color: rgb(0 0 0); + font-size: 12px; + font-weight: 600; + .el-icon { + font-size: 14px; + + path { + fill: green !important; + } + } + } + .upload-error { + display: flex; + gap: 6px; + align-items: center; + margin-top: 6px; + font-size: 12px; + color: rgb(0 0 0); + font-size: 12px; + font-weight: 600; + .el-icon { + font-size: 14px; + + path { + fill: rgb(228 33 33); + } + } + } + + .upload-restart { + color: rgb(0 119 255); + cursor: pointer; + } + } + + .item-all-close { + width: 100%; + margin-top: 16px; + margin-bottom: 8px; + font-size: 12px; + font-weight: 700; + color: rgb(0 119 255); + text-align: right; + cursor: pointer; + } + + .o-upload-notify__close { + position: absolute; + right: 16px; + font-size: var(--o-font-size-body); + color: var(--o-text-color-secondary); + cursor: pointer; + + &:hover { + color: var(--o-text-color-primary); + } + } +} diff --git a/src/styles/variables.module.scss b/src/styles/variables.module.scss new file mode 100644 index 0000000000000000000000000000000000000000..20a624d7fbd50d84a78e55782a96266655f03e80 --- /dev/null +++ b/src/styles/variables.module.scss @@ -0,0 +1,11 @@ +/* stylelint-disable property-no-unknown */ +:export { + sidebar-width: $sidebar-width; + navbar-height: $navbar-height; + tags-view-height: $tags-view-height; + menu-background: $menu-background; + menu-text: $menu-text; + menu-active-text: $menu-active-text; + menu-hover: $menu-hover; +} +/* stylelint-enable property-no-unknown */ diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000000000000000000000000000000000000..42f97182b59ce6430040a7c74e5db588e31c1abf --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,34 @@ +/** 全局SCSS变量 */ + +:root { + --menu-background: #304156; + --menu-text: #bfcbd9; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: #263445; + --sidebar-logo-background: #2d3748; + + // 修复表格 fixed 列被选中后由于透明色导致叠字的 bug + .el-table { + --el-table-current-row-bg-color: rgb(235 243 250); + } +} + +/** 暗黑主题 */ +html.dark { + --menu-background: var(--el-bg-color-overlay); + --menu-text: #fff; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: rgb(0 0 0 / 20%); + --sidebar-logo-background: rgb(0 0 0 / 20%); +} + +$menu-background: var(--menu-background); // 菜单背景色 +$menu-text: var(--menu-text); // 菜单文字颜色 +$menu-active-text: var(--menu-active-text); // 菜单激活文字颜色 +$menu-hover: var(--menu-hover); // 菜单悬停背景色 +$sidebar-logo-background: var(--sidebar-logo-background); // 侧边栏 Logo 背景色 + +$sidebar-width: 210px; // 侧边栏宽度 +$sidebar-width-collapsed: 54px; // 侧边栏收缩宽度 +$navbar-height: 50px; // 导航栏高度 +$tags-view-height: 34px; // TagsView 高度 diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4a814dab85fcdab2d5649e77f380a89ded06d90 --- /dev/null +++ b/src/types/auto-imports.d.ts @@ -0,0 +1,1780 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const EffectScope: (typeof import("vue"))["EffectScope"]; + const ElForm: (typeof import("element-plus/es"))["ElForm"]; + const ElMessage: (typeof import("element-plus/es"))["ElMessage"]; + const ElMessageBox: (typeof import("element-plus/es"))["ElMessageBox"]; + const ElNotification: (typeof import("element-plus/es"))["ElNotification"]; + const ElTree: (typeof import("element-plus/es"))["ElTree"]; + const acceptHMRUpdate: (typeof import("pinia"))["acceptHMRUpdate"]; + const asyncComputed: (typeof import("@vueuse/core"))["asyncComputed"]; + const autoResetRef: (typeof import("@vueuse/core"))["autoResetRef"]; + const computed: (typeof import("vue"))["computed"]; + const computedAsync: (typeof import("@vueuse/core"))["computedAsync"]; + const computedEager: (typeof import("@vueuse/core"))["computedEager"]; + const computedInject: (typeof import("@vueuse/core"))["computedInject"]; + const computedWithControl: (typeof import("@vueuse/core"))["computedWithControl"]; + const controlledComputed: (typeof import("@vueuse/core"))["controlledComputed"]; + const controlledRef: (typeof import("@vueuse/core"))["controlledRef"]; + const createApp: (typeof import("vue"))["createApp"]; + const createEventHook: (typeof import("@vueuse/core"))["createEventHook"]; + const createGlobalState: (typeof import("@vueuse/core"))["createGlobalState"]; + const createInjectionState: (typeof import("@vueuse/core"))["createInjectionState"]; + const createPinia: (typeof import("pinia"))["createPinia"]; + const createReactiveFn: (typeof import("@vueuse/core"))["createReactiveFn"]; + const createReusableTemplate: (typeof import("@vueuse/core"))["createReusableTemplate"]; + const createSharedComposable: (typeof import("@vueuse/core"))["createSharedComposable"]; + const createTemplatePromise: (typeof import("@vueuse/core"))["createTemplatePromise"]; + const createUnrefFn: (typeof import("@vueuse/core"))["createUnrefFn"]; + const customRef: (typeof import("vue"))["customRef"]; + const debouncedRef: (typeof import("@vueuse/core"))["debouncedRef"]; + const debouncedWatch: (typeof import("@vueuse/core"))["debouncedWatch"]; + const defineAsyncComponent: (typeof import("vue"))["defineAsyncComponent"]; + const defineComponent: (typeof import("vue"))["defineComponent"]; + const defineStore: (typeof import("pinia"))["defineStore"]; + const eagerComputed: (typeof import("@vueuse/core"))["eagerComputed"]; + const effectScope: (typeof import("vue"))["effectScope"]; + const extendRef: (typeof import("@vueuse/core"))["extendRef"]; + const getActivePinia: (typeof import("pinia"))["getActivePinia"]; + const getCurrentInstance: (typeof import("vue"))["getCurrentInstance"]; + const getCurrentScope: (typeof import("vue"))["getCurrentScope"]; + const h: (typeof import("vue"))["h"]; + const ignorableWatch: (typeof import("@vueuse/core"))["ignorableWatch"]; + const inject: (typeof import("vue"))["inject"]; + const injectLocal: (typeof import("@vueuse/core"))["injectLocal"]; + const isDefined: (typeof import("@vueuse/core"))["isDefined"]; + const isProxy: (typeof import("vue"))["isProxy"]; + const isReactive: (typeof import("vue"))["isReactive"]; + const isReadonly: (typeof import("vue"))["isReadonly"]; + const isRef: (typeof import("vue"))["isRef"]; + const makeDestructurable: (typeof import("@vueuse/core"))["makeDestructurable"]; + const mapActions: (typeof import("pinia"))["mapActions"]; + const mapGetters: (typeof import("pinia"))["mapGetters"]; + const mapState: (typeof import("pinia"))["mapState"]; + const mapStores: (typeof import("pinia"))["mapStores"]; + const mapWritableState: (typeof import("pinia"))["mapWritableState"]; + const markRaw: (typeof import("vue"))["markRaw"]; + const nextTick: (typeof import("vue"))["nextTick"]; + const onActivated: (typeof import("vue"))["onActivated"]; + const onBeforeMount: (typeof import("vue"))["onBeforeMount"]; + const onBeforeRouteLeave: (typeof import("vue-router"))["onBeforeRouteLeave"]; + const onBeforeRouteUpdate: (typeof import("vue-router"))["onBeforeRouteUpdate"]; + const onBeforeUnmount: (typeof import("vue"))["onBeforeUnmount"]; + const onBeforeUpdate: (typeof import("vue"))["onBeforeUpdate"]; + const onClickOutside: (typeof import("@vueuse/core"))["onClickOutside"]; + const onDeactivated: (typeof import("vue"))["onDeactivated"]; + const onErrorCaptured: (typeof import("vue"))["onErrorCaptured"]; + const onKeyStroke: (typeof import("@vueuse/core"))["onKeyStroke"]; + const onLongPress: (typeof import("@vueuse/core"))["onLongPress"]; + const onMounted: (typeof import("vue"))["onMounted"]; + const onRenderTracked: (typeof import("vue"))["onRenderTracked"]; + const onRenderTriggered: (typeof import("vue"))["onRenderTriggered"]; + const onScopeDispose: (typeof import("vue"))["onScopeDispose"]; + const onServerPrefetch: (typeof import("vue"))["onServerPrefetch"]; + const onStartTyping: (typeof import("@vueuse/core"))["onStartTyping"]; + const onUnmounted: (typeof import("vue"))["onUnmounted"]; + const onUpdated: (typeof import("vue"))["onUpdated"]; + const pausableWatch: (typeof import("@vueuse/core"))["pausableWatch"]; + const provide: (typeof import("vue"))["provide"]; + const provideLocal: (typeof import("@vueuse/core"))["provideLocal"]; + const reactify: (typeof import("@vueuse/core"))["reactify"]; + const reactifyObject: (typeof import("@vueuse/core"))["reactifyObject"]; + const reactive: (typeof import("vue"))["reactive"]; + const reactiveComputed: (typeof import("@vueuse/core"))["reactiveComputed"]; + const reactiveOmit: (typeof import("@vueuse/core"))["reactiveOmit"]; + const reactivePick: (typeof import("@vueuse/core"))["reactivePick"]; + const readonly: (typeof import("vue"))["readonly"]; + const ref: (typeof import("vue"))["ref"]; + const refAutoReset: (typeof import("@vueuse/core"))["refAutoReset"]; + const refDebounced: (typeof import("@vueuse/core"))["refDebounced"]; + const refDefault: (typeof import("@vueuse/core"))["refDefault"]; + const refThrottled: (typeof import("@vueuse/core"))["refThrottled"]; + const refWithControl: (typeof import("@vueuse/core"))["refWithControl"]; + const resolveComponent: (typeof import("vue"))["resolveComponent"]; + const resolveRef: (typeof import("@vueuse/core"))["resolveRef"]; + const resolveUnref: (typeof import("@vueuse/core"))["resolveUnref"]; + const setActivePinia: (typeof import("pinia"))["setActivePinia"]; + const setMapStoreSuffix: (typeof import("pinia"))["setMapStoreSuffix"]; + const shallowReactive: (typeof import("vue"))["shallowReactive"]; + const shallowReadonly: (typeof import("vue"))["shallowReadonly"]; + const shallowRef: (typeof import("vue"))["shallowRef"]; + const storeToRefs: (typeof import("pinia"))["storeToRefs"]; + const syncRef: (typeof import("@vueuse/core"))["syncRef"]; + const syncRefs: (typeof import("@vueuse/core"))["syncRefs"]; + const templateRef: (typeof import("@vueuse/core"))["templateRef"]; + const throttledRef: (typeof import("@vueuse/core"))["throttledRef"]; + const throttledWatch: (typeof import("@vueuse/core"))["throttledWatch"]; + const toRaw: (typeof import("vue"))["toRaw"]; + const toReactive: (typeof import("@vueuse/core"))["toReactive"]; + const toRef: (typeof import("vue"))["toRef"]; + const toRefs: (typeof import("vue"))["toRefs"]; + const toValue: (typeof import("vue"))["toValue"]; + const triggerRef: (typeof import("vue"))["triggerRef"]; + const tryOnBeforeMount: (typeof import("@vueuse/core"))["tryOnBeforeMount"]; + const tryOnBeforeUnmount: (typeof import("@vueuse/core"))["tryOnBeforeUnmount"]; + const tryOnMounted: (typeof import("@vueuse/core"))["tryOnMounted"]; + const tryOnScopeDispose: (typeof import("@vueuse/core"))["tryOnScopeDispose"]; + const tryOnUnmounted: (typeof import("@vueuse/core"))["tryOnUnmounted"]; + const unref: (typeof import("vue"))["unref"]; + const unrefElement: (typeof import("@vueuse/core"))["unrefElement"]; + const until: (typeof import("@vueuse/core"))["until"]; + const useActiveElement: (typeof import("@vueuse/core"))["useActiveElement"]; + const useAnimate: (typeof import("@vueuse/core"))["useAnimate"]; + const useArrayDifference: (typeof import("@vueuse/core"))["useArrayDifference"]; + const useArrayEvery: (typeof import("@vueuse/core"))["useArrayEvery"]; + const useArrayFilter: (typeof import("@vueuse/core"))["useArrayFilter"]; + const useArrayFind: (typeof import("@vueuse/core"))["useArrayFind"]; + const useArrayFindIndex: (typeof import("@vueuse/core"))["useArrayFindIndex"]; + const useArrayFindLast: (typeof import("@vueuse/core"))["useArrayFindLast"]; + const useArrayIncludes: (typeof import("@vueuse/core"))["useArrayIncludes"]; + const useArrayJoin: (typeof import("@vueuse/core"))["useArrayJoin"]; + const useArrayMap: (typeof import("@vueuse/core"))["useArrayMap"]; + const useArrayReduce: (typeof import("@vueuse/core"))["useArrayReduce"]; + const useArraySome: (typeof import("@vueuse/core"))["useArraySome"]; + const useArrayUnique: (typeof import("@vueuse/core"))["useArrayUnique"]; + const useAsyncQueue: (typeof import("@vueuse/core"))["useAsyncQueue"]; + const useAsyncState: (typeof import("@vueuse/core"))["useAsyncState"]; + const useAttrs: (typeof import("vue"))["useAttrs"]; + const useBase64: (typeof import("@vueuse/core"))["useBase64"]; + const useBattery: (typeof import("@vueuse/core"))["useBattery"]; + const useBluetooth: (typeof import("@vueuse/core"))["useBluetooth"]; + const useBreakpoints: (typeof import("@vueuse/core"))["useBreakpoints"]; + const useBroadcastChannel: (typeof import("@vueuse/core"))["useBroadcastChannel"]; + const useBrowserLocation: (typeof import("@vueuse/core"))["useBrowserLocation"]; + const useCached: (typeof import("@vueuse/core"))["useCached"]; + const useClipboard: (typeof import("@vueuse/core"))["useClipboard"]; + const useClipboardItems: (typeof import("@vueuse/core"))["useClipboardItems"]; + const useCloned: (typeof import("@vueuse/core"))["useCloned"]; + const useColorMode: (typeof import("@vueuse/core"))["useColorMode"]; + const useConfirmDialog: (typeof import("@vueuse/core"))["useConfirmDialog"]; + const useCounter: (typeof import("@vueuse/core"))["useCounter"]; + const useCssModule: (typeof import("vue"))["useCssModule"]; + const useCssVar: (typeof import("@vueuse/core"))["useCssVar"]; + const useCssVars: (typeof import("vue"))["useCssVars"]; + const useCurrentElement: (typeof import("@vueuse/core"))["useCurrentElement"]; + const useCycleList: (typeof import("@vueuse/core"))["useCycleList"]; + const useDark: (typeof import("@vueuse/core"))["useDark"]; + const useDateFormat: (typeof import("@vueuse/core"))["useDateFormat"]; + const useDebounce: (typeof import("@vueuse/core"))["useDebounce"]; + const useDebounceFn: (typeof import("@vueuse/core"))["useDebounceFn"]; + const useDebouncedRefHistory: (typeof import("@vueuse/core"))["useDebouncedRefHistory"]; + const useDeviceMotion: (typeof import("@vueuse/core"))["useDeviceMotion"]; + const useDeviceOrientation: (typeof import("@vueuse/core"))["useDeviceOrientation"]; + const useDevicePixelRatio: (typeof import("@vueuse/core"))["useDevicePixelRatio"]; + const useDevicesList: (typeof import("@vueuse/core"))["useDevicesList"]; + const useDisplayMedia: (typeof import("@vueuse/core"))["useDisplayMedia"]; + const useDocumentVisibility: (typeof import("@vueuse/core"))["useDocumentVisibility"]; + const useDraggable: (typeof import("@vueuse/core"))["useDraggable"]; + const useDropZone: (typeof import("@vueuse/core"))["useDropZone"]; + const useElementBounding: (typeof import("@vueuse/core"))["useElementBounding"]; + const useElementByPoint: (typeof import("@vueuse/core"))["useElementByPoint"]; + const useElementHover: (typeof import("@vueuse/core"))["useElementHover"]; + const useElementSize: (typeof import("@vueuse/core"))["useElementSize"]; + const useElementVisibility: (typeof import("@vueuse/core"))["useElementVisibility"]; + const useEventBus: (typeof import("@vueuse/core"))["useEventBus"]; + const useEventListener: (typeof import("@vueuse/core"))["useEventListener"]; + const useEventSource: (typeof import("@vueuse/core"))["useEventSource"]; + const useEyeDropper: (typeof import("@vueuse/core"))["useEyeDropper"]; + const useFavicon: (typeof import("@vueuse/core"))["useFavicon"]; + const useFetch: (typeof import("@vueuse/core"))["useFetch"]; + const useFileDialog: (typeof import("@vueuse/core"))["useFileDialog"]; + const useFileSystemAccess: (typeof import("@vueuse/core"))["useFileSystemAccess"]; + const useFocus: (typeof import("@vueuse/core"))["useFocus"]; + const useFocusWithin: (typeof import("@vueuse/core"))["useFocusWithin"]; + const useFps: (typeof import("@vueuse/core"))["useFps"]; + const useFullscreen: (typeof import("@vueuse/core"))["useFullscreen"]; + const useGamepad: (typeof import("@vueuse/core"))["useGamepad"]; + const useGeolocation: (typeof import("@vueuse/core"))["useGeolocation"]; + const useI18n: (typeof import("vue-i18n"))["useI18n"]; + const useIdle: (typeof import("@vueuse/core"))["useIdle"]; + const useImage: (typeof import("@vueuse/core"))["useImage"]; + const useInfiniteScroll: (typeof import("@vueuse/core"))["useInfiniteScroll"]; + const useIntersectionObserver: (typeof import("@vueuse/core"))["useIntersectionObserver"]; + const useInterval: (typeof import("@vueuse/core"))["useInterval"]; + const useIntervalFn: (typeof import("@vueuse/core"))["useIntervalFn"]; + const useKeyModifier: (typeof import("@vueuse/core"))["useKeyModifier"]; + const useLastChanged: (typeof import("@vueuse/core"))["useLastChanged"]; + const useLink: (typeof import("vue-router"))["useLink"]; + const useLocalStorage: (typeof import("@vueuse/core"))["useLocalStorage"]; + const useMagicKeys: (typeof import("@vueuse/core"))["useMagicKeys"]; + const useManualRefHistory: (typeof import("@vueuse/core"))["useManualRefHistory"]; + const useMediaControls: (typeof import("@vueuse/core"))["useMediaControls"]; + const useMediaQuery: (typeof import("@vueuse/core"))["useMediaQuery"]; + const useMemoize: (typeof import("@vueuse/core"))["useMemoize"]; + const useMemory: (typeof import("@vueuse/core"))["useMemory"]; + const useMounted: (typeof import("@vueuse/core"))["useMounted"]; + const useMouse: (typeof import("@vueuse/core"))["useMouse"]; + const useMouseInElement: (typeof import("@vueuse/core"))["useMouseInElement"]; + const useMousePressed: (typeof import("@vueuse/core"))["useMousePressed"]; + const useMutationObserver: (typeof import("@vueuse/core"))["useMutationObserver"]; + const useNavigatorLanguage: (typeof import("@vueuse/core"))["useNavigatorLanguage"]; + const useNetwork: (typeof import("@vueuse/core"))["useNetwork"]; + const useNow: (typeof import("@vueuse/core"))["useNow"]; + const useObjectUrl: (typeof import("@vueuse/core"))["useObjectUrl"]; + const useOffsetPagination: (typeof import("@vueuse/core"))["useOffsetPagination"]; + const useOnline: (typeof import("@vueuse/core"))["useOnline"]; + const usePageLeave: (typeof import("@vueuse/core"))["usePageLeave"]; + const useParallax: (typeof import("@vueuse/core"))["useParallax"]; + const useParentElement: (typeof import("@vueuse/core"))["useParentElement"]; + const usePerformanceObserver: (typeof import("@vueuse/core"))["usePerformanceObserver"]; + const usePermission: (typeof import("@vueuse/core"))["usePermission"]; + const usePointer: (typeof import("@vueuse/core"))["usePointer"]; + const usePointerLock: (typeof import("@vueuse/core"))["usePointerLock"]; + const usePointerSwipe: (typeof import("@vueuse/core"))["usePointerSwipe"]; + const usePreferredColorScheme: (typeof import("@vueuse/core"))["usePreferredColorScheme"]; + const usePreferredContrast: (typeof import("@vueuse/core"))["usePreferredContrast"]; + const usePreferredDark: (typeof import("@vueuse/core"))["usePreferredDark"]; + const usePreferredLanguages: (typeof import("@vueuse/core"))["usePreferredLanguages"]; + const usePreferredReducedMotion: (typeof import("@vueuse/core"))["usePreferredReducedMotion"]; + const usePrevious: (typeof import("@vueuse/core"))["usePrevious"]; + const useRafFn: (typeof import("@vueuse/core"))["useRafFn"]; + const useRefHistory: (typeof import("@vueuse/core"))["useRefHistory"]; + const useResizeObserver: (typeof import("@vueuse/core"))["useResizeObserver"]; + const useRoute: (typeof import("vue-router"))["useRoute"]; + const useRouter: (typeof import("vue-router"))["useRouter"]; + const useScreenOrientation: (typeof import("@vueuse/core"))["useScreenOrientation"]; + const useScreenSafeArea: (typeof import("@vueuse/core"))["useScreenSafeArea"]; + const useScriptTag: (typeof import("@vueuse/core"))["useScriptTag"]; + const useScroll: (typeof import("@vueuse/core"))["useScroll"]; + const useScrollLock: (typeof import("@vueuse/core"))["useScrollLock"]; + const useSessionStorage: (typeof import("@vueuse/core"))["useSessionStorage"]; + const useShare: (typeof import("@vueuse/core"))["useShare"]; + const useSlots: (typeof import("vue"))["useSlots"]; + const useSorted: (typeof import("@vueuse/core"))["useSorted"]; + const useSpeechRecognition: (typeof import("@vueuse/core"))["useSpeechRecognition"]; + const useSpeechSynthesis: (typeof import("@vueuse/core"))["useSpeechSynthesis"]; + const useStepper: (typeof import("@vueuse/core"))["useStepper"]; + const useStorage: (typeof import("@vueuse/core"))["useStorage"]; + const useStorageAsync: (typeof import("@vueuse/core"))["useStorageAsync"]; + const useStyleTag: (typeof import("@vueuse/core"))["useStyleTag"]; + const useSupported: (typeof import("@vueuse/core"))["useSupported"]; + const useSwipe: (typeof import("@vueuse/core"))["useSwipe"]; + const useTemplateRefsList: (typeof import("@vueuse/core"))["useTemplateRefsList"]; + const useTextDirection: (typeof import("@vueuse/core"))["useTextDirection"]; + const useTextSelection: (typeof import("@vueuse/core"))["useTextSelection"]; + const useTextareaAutosize: (typeof import("@vueuse/core"))["useTextareaAutosize"]; + const useThrottle: (typeof import("@vueuse/core"))["useThrottle"]; + const useThrottleFn: (typeof import("@vueuse/core"))["useThrottleFn"]; + const useThrottledRefHistory: (typeof import("@vueuse/core"))["useThrottledRefHistory"]; + const useTimeAgo: (typeof import("@vueuse/core"))["useTimeAgo"]; + const useTimeout: (typeof import("@vueuse/core"))["useTimeout"]; + const useTimeoutFn: (typeof import("@vueuse/core"))["useTimeoutFn"]; + const useTimeoutPoll: (typeof import("@vueuse/core"))["useTimeoutPoll"]; + const useTimestamp: (typeof import("@vueuse/core"))["useTimestamp"]; + const useTitle: (typeof import("@vueuse/core"))["useTitle"]; + const useToNumber: (typeof import("@vueuse/core"))["useToNumber"]; + const useToString: (typeof import("@vueuse/core"))["useToString"]; + const useToggle: (typeof import("@vueuse/core"))["useToggle"]; + const useTransition: (typeof import("@vueuse/core"))["useTransition"]; + const useUrlSearchParams: (typeof import("@vueuse/core"))["useUrlSearchParams"]; + const useUserMedia: (typeof import("@vueuse/core"))["useUserMedia"]; + const useVModel: (typeof import("@vueuse/core"))["useVModel"]; + const useVModels: (typeof import("@vueuse/core"))["useVModels"]; + const useVibrate: (typeof import("@vueuse/core"))["useVibrate"]; + const useVirtualList: (typeof import("@vueuse/core"))["useVirtualList"]; + const useWakeLock: (typeof import("@vueuse/core"))["useWakeLock"]; + const useWebNotification: (typeof import("@vueuse/core"))["useWebNotification"]; + const useWebSocket: (typeof import("@vueuse/core"))["useWebSocket"]; + const useWebWorker: (typeof import("@vueuse/core"))["useWebWorker"]; + const useWebWorkerFn: (typeof import("@vueuse/core"))["useWebWorkerFn"]; + const useWindowFocus: (typeof import("@vueuse/core"))["useWindowFocus"]; + const useWindowScroll: (typeof import("@vueuse/core"))["useWindowScroll"]; + const useWindowSize: (typeof import("@vueuse/core"))["useWindowSize"]; + const watch: (typeof import("vue"))["watch"]; + const watchArray: (typeof import("@vueuse/core"))["watchArray"]; + const watchAtMost: (typeof import("@vueuse/core"))["watchAtMost"]; + const watchDebounced: (typeof import("@vueuse/core"))["watchDebounced"]; + const watchDeep: (typeof import("@vueuse/core"))["watchDeep"]; + const watchEffect: (typeof import("vue"))["watchEffect"]; + const watchIgnorable: (typeof import("@vueuse/core"))["watchIgnorable"]; + const watchImmediate: (typeof import("@vueuse/core"))["watchImmediate"]; + const watchOnce: (typeof import("@vueuse/core"))["watchOnce"]; + const watchPausable: (typeof import("@vueuse/core"))["watchPausable"]; + const watchPostEffect: (typeof import("vue"))["watchPostEffect"]; + const watchSyncEffect: (typeof import("vue"))["watchSyncEffect"]; + const watchThrottled: (typeof import("@vueuse/core"))["watchThrottled"]; + const watchTriggerable: (typeof import("@vueuse/core"))["watchTriggerable"]; + const watchWithFilter: (typeof import("@vueuse/core"))["watchWithFilter"]; + const whenever: (typeof import("@vueuse/core"))["whenever"]; +} +// for type re-export +declare global { + // @ts-ignore + export type { + Component, + ComponentPublicInstance, + ComputedRef, + ExtractDefaultPropTypes, + ExtractPropTypes, + ExtractPublicPropTypes, + InjectionKey, + PropType, + Ref, + VNode, + WritableComputedRef, + } from "vue"; + import("vue"); +} +// for vue template auto import +import { UnwrapRef } from "vue"; +declare module "vue" { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef<(typeof import("vue"))["EffectScope"]>; + readonly ElMessage: UnwrapRef< + (typeof import("element-plus/es"))["ElMessage"] + >; + readonly ElMessageBox: UnwrapRef< + (typeof import("element-plus/es"))["ElMessageBox"] + >; + readonly acceptHMRUpdate: UnwrapRef< + (typeof import("pinia"))["acceptHMRUpdate"] + >; + readonly asyncComputed: UnwrapRef< + (typeof import("@vueuse/core"))["asyncComputed"] + >; + readonly autoResetRef: UnwrapRef< + (typeof import("@vueuse/core"))["autoResetRef"] + >; + readonly computed: UnwrapRef<(typeof import("vue"))["computed"]>; + readonly computedAsync: UnwrapRef< + (typeof import("@vueuse/core"))["computedAsync"] + >; + readonly computedEager: UnwrapRef< + (typeof import("@vueuse/core"))["computedEager"] + >; + readonly computedInject: UnwrapRef< + (typeof import("@vueuse/core"))["computedInject"] + >; + readonly computedWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["computedWithControl"] + >; + readonly controlledComputed: UnwrapRef< + (typeof import("@vueuse/core"))["controlledComputed"] + >; + readonly controlledRef: UnwrapRef< + (typeof import("@vueuse/core"))["controlledRef"] + >; + readonly createApp: UnwrapRef<(typeof import("vue"))["createApp"]>; + readonly createEventHook: UnwrapRef< + (typeof import("@vueuse/core"))["createEventHook"] + >; + readonly createGlobalState: UnwrapRef< + (typeof import("@vueuse/core"))["createGlobalState"] + >; + readonly createInjectionState: UnwrapRef< + (typeof import("@vueuse/core"))["createInjectionState"] + >; + readonly createPinia: UnwrapRef<(typeof import("pinia"))["createPinia"]>; + readonly createReactiveFn: UnwrapRef< + (typeof import("@vueuse/core"))["createReactiveFn"] + >; + readonly createReusableTemplate: UnwrapRef< + (typeof import("@vueuse/core"))["createReusableTemplate"] + >; + readonly createSharedComposable: UnwrapRef< + (typeof import("@vueuse/core"))["createSharedComposable"] + >; + readonly createTemplatePromise: UnwrapRef< + (typeof import("@vueuse/core"))["createTemplatePromise"] + >; + readonly createUnrefFn: UnwrapRef< + (typeof import("@vueuse/core"))["createUnrefFn"] + >; + readonly customRef: UnwrapRef<(typeof import("vue"))["customRef"]>; + readonly debouncedRef: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedRef"] + >; + readonly debouncedWatch: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedWatch"] + >; + readonly defineAsyncComponent: UnwrapRef< + (typeof import("vue"))["defineAsyncComponent"] + >; + readonly defineComponent: UnwrapRef< + (typeof import("vue"))["defineComponent"] + >; + readonly defineStore: UnwrapRef<(typeof import("pinia"))["defineStore"]>; + readonly eagerComputed: UnwrapRef< + (typeof import("@vueuse/core"))["eagerComputed"] + >; + readonly effectScope: UnwrapRef<(typeof import("vue"))["effectScope"]>; + readonly extendRef: UnwrapRef<(typeof import("@vueuse/core"))["extendRef"]>; + readonly getActivePinia: UnwrapRef< + (typeof import("pinia"))["getActivePinia"] + >; + readonly getCurrentInstance: UnwrapRef< + (typeof import("vue"))["getCurrentInstance"] + >; + readonly getCurrentScope: UnwrapRef< + (typeof import("vue"))["getCurrentScope"] + >; + readonly h: UnwrapRef<(typeof import("vue"))["h"]>; + readonly ignorableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["ignorableWatch"] + >; + readonly inject: UnwrapRef<(typeof import("vue"))["inject"]>; + readonly injectLocal: UnwrapRef< + (typeof import("@vueuse/core"))["injectLocal"] + >; + readonly isDefined: UnwrapRef<(typeof import("@vueuse/core"))["isDefined"]>; + readonly isProxy: UnwrapRef<(typeof import("vue"))["isProxy"]>; + readonly isReactive: UnwrapRef<(typeof import("vue"))["isReactive"]>; + readonly isReadonly: UnwrapRef<(typeof import("vue"))["isReadonly"]>; + readonly isRef: UnwrapRef<(typeof import("vue"))["isRef"]>; + readonly makeDestructurable: UnwrapRef< + (typeof import("@vueuse/core"))["makeDestructurable"] + >; + readonly mapActions: UnwrapRef<(typeof import("pinia"))["mapActions"]>; + readonly mapGetters: UnwrapRef<(typeof import("pinia"))["mapGetters"]>; + readonly mapState: UnwrapRef<(typeof import("pinia"))["mapState"]>; + readonly mapStores: UnwrapRef<(typeof import("pinia"))["mapStores"]>; + readonly mapWritableState: UnwrapRef< + (typeof import("pinia"))["mapWritableState"] + >; + readonly markRaw: UnwrapRef<(typeof import("vue"))["markRaw"]>; + readonly nextTick: UnwrapRef<(typeof import("vue"))["nextTick"]>; + readonly onActivated: UnwrapRef<(typeof import("vue"))["onActivated"]>; + readonly onBeforeMount: UnwrapRef<(typeof import("vue"))["onBeforeMount"]>; + readonly onBeforeRouteLeave: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteLeave"] + >; + readonly onBeforeRouteUpdate: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteUpdate"] + >; + readonly onBeforeUnmount: UnwrapRef< + (typeof import("vue"))["onBeforeUnmount"] + >; + readonly onBeforeUpdate: UnwrapRef< + (typeof import("vue"))["onBeforeUpdate"] + >; + readonly onClickOutside: UnwrapRef< + (typeof import("@vueuse/core"))["onClickOutside"] + >; + readonly onDeactivated: UnwrapRef<(typeof import("vue"))["onDeactivated"]>; + readonly onErrorCaptured: UnwrapRef< + (typeof import("vue"))["onErrorCaptured"] + >; + readonly onKeyStroke: UnwrapRef< + (typeof import("@vueuse/core"))["onKeyStroke"] + >; + readonly onLongPress: UnwrapRef< + (typeof import("@vueuse/core"))["onLongPress"] + >; + readonly onMounted: UnwrapRef<(typeof import("vue"))["onMounted"]>; + readonly onRenderTracked: UnwrapRef< + (typeof import("vue"))["onRenderTracked"] + >; + readonly onRenderTriggered: UnwrapRef< + (typeof import("vue"))["onRenderTriggered"] + >; + readonly onScopeDispose: UnwrapRef< + (typeof import("vue"))["onScopeDispose"] + >; + readonly onServerPrefetch: UnwrapRef< + (typeof import("vue"))["onServerPrefetch"] + >; + readonly onStartTyping: UnwrapRef< + (typeof import("@vueuse/core"))["onStartTyping"] + >; + readonly onUnmounted: UnwrapRef<(typeof import("vue"))["onUnmounted"]>; + readonly onUpdated: UnwrapRef<(typeof import("vue"))["onUpdated"]>; + readonly pausableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["pausableWatch"] + >; + readonly provide: UnwrapRef<(typeof import("vue"))["provide"]>; + readonly provideLocal: UnwrapRef< + (typeof import("@vueuse/core"))["provideLocal"] + >; + readonly reactify: UnwrapRef<(typeof import("@vueuse/core"))["reactify"]>; + readonly reactifyObject: UnwrapRef< + (typeof import("@vueuse/core"))["reactifyObject"] + >; + readonly reactive: UnwrapRef<(typeof import("vue"))["reactive"]>; + readonly reactiveComputed: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveComputed"] + >; + readonly reactiveOmit: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveOmit"] + >; + readonly reactivePick: UnwrapRef< + (typeof import("@vueuse/core"))["reactivePick"] + >; + readonly readonly: UnwrapRef<(typeof import("vue"))["readonly"]>; + readonly ref: UnwrapRef<(typeof import("vue"))["ref"]>; + readonly refAutoReset: UnwrapRef< + (typeof import("@vueuse/core"))["refAutoReset"] + >; + readonly refDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["refDebounced"] + >; + readonly refDefault: UnwrapRef< + (typeof import("@vueuse/core"))["refDefault"] + >; + readonly refThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["refThrottled"] + >; + readonly refWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["refWithControl"] + >; + readonly resolveComponent: UnwrapRef< + (typeof import("vue"))["resolveComponent"] + >; + readonly resolveRef: UnwrapRef< + (typeof import("@vueuse/core"))["resolveRef"] + >; + readonly resolveUnref: UnwrapRef< + (typeof import("@vueuse/core"))["resolveUnref"] + >; + readonly setActivePinia: UnwrapRef< + (typeof import("pinia"))["setActivePinia"] + >; + readonly setMapStoreSuffix: UnwrapRef< + (typeof import("pinia"))["setMapStoreSuffix"] + >; + readonly shallowReactive: UnwrapRef< + (typeof import("vue"))["shallowReactive"] + >; + readonly shallowReadonly: UnwrapRef< + (typeof import("vue"))["shallowReadonly"] + >; + readonly shallowRef: UnwrapRef<(typeof import("vue"))["shallowRef"]>; + readonly storeToRefs: UnwrapRef<(typeof import("pinia"))["storeToRefs"]>; + readonly syncRef: UnwrapRef<(typeof import("@vueuse/core"))["syncRef"]>; + readonly syncRefs: UnwrapRef<(typeof import("@vueuse/core"))["syncRefs"]>; + readonly templateRef: UnwrapRef< + (typeof import("@vueuse/core"))["templateRef"] + >; + readonly throttledRef: UnwrapRef< + (typeof import("@vueuse/core"))["throttledRef"] + >; + readonly throttledWatch: UnwrapRef< + (typeof import("@vueuse/core"))["throttledWatch"] + >; + readonly toRaw: UnwrapRef<(typeof import("vue"))["toRaw"]>; + readonly toReactive: UnwrapRef< + (typeof import("@vueuse/core"))["toReactive"] + >; + readonly toRef: UnwrapRef<(typeof import("vue"))["toRef"]>; + readonly toRefs: UnwrapRef<(typeof import("vue"))["toRefs"]>; + readonly toValue: UnwrapRef<(typeof import("vue"))["toValue"]>; + readonly triggerRef: UnwrapRef<(typeof import("vue"))["triggerRef"]>; + readonly tryOnBeforeMount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeMount"] + >; + readonly tryOnBeforeUnmount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeUnmount"] + >; + readonly tryOnMounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnMounted"] + >; + readonly tryOnScopeDispose: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnScopeDispose"] + >; + readonly tryOnUnmounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnUnmounted"] + >; + readonly unref: UnwrapRef<(typeof import("vue"))["unref"]>; + readonly unrefElement: UnwrapRef< + (typeof import("@vueuse/core"))["unrefElement"] + >; + readonly until: UnwrapRef<(typeof import("@vueuse/core"))["until"]>; + readonly useActiveElement: UnwrapRef< + (typeof import("@vueuse/core"))["useActiveElement"] + >; + readonly useAnimate: UnwrapRef< + (typeof import("@vueuse/core"))["useAnimate"] + >; + readonly useArrayDifference: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayDifference"] + >; + readonly useArrayEvery: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayEvery"] + >; + readonly useArrayFilter: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFilter"] + >; + readonly useArrayFind: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFind"] + >; + readonly useArrayFindIndex: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindIndex"] + >; + readonly useArrayFindLast: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindLast"] + >; + readonly useArrayIncludes: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayIncludes"] + >; + readonly useArrayJoin: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayJoin"] + >; + readonly useArrayMap: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayMap"] + >; + readonly useArrayReduce: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayReduce"] + >; + readonly useArraySome: UnwrapRef< + (typeof import("@vueuse/core"))["useArraySome"] + >; + readonly useArrayUnique: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayUnique"] + >; + readonly useAsyncQueue: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncQueue"] + >; + readonly useAsyncState: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncState"] + >; + readonly useAttrs: UnwrapRef<(typeof import("vue"))["useAttrs"]>; + readonly useBase64: UnwrapRef<(typeof import("@vueuse/core"))["useBase64"]>; + readonly useBattery: UnwrapRef< + (typeof import("@vueuse/core"))["useBattery"] + >; + readonly useBluetooth: UnwrapRef< + (typeof import("@vueuse/core"))["useBluetooth"] + >; + readonly useBreakpoints: UnwrapRef< + (typeof import("@vueuse/core"))["useBreakpoints"] + >; + readonly useBroadcastChannel: UnwrapRef< + (typeof import("@vueuse/core"))["useBroadcastChannel"] + >; + readonly useBrowserLocation: UnwrapRef< + (typeof import("@vueuse/core"))["useBrowserLocation"] + >; + readonly useCached: UnwrapRef<(typeof import("@vueuse/core"))["useCached"]>; + readonly useClipboard: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboard"] + >; + readonly useClipboardItems: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboardItems"] + >; + readonly useCloned: UnwrapRef<(typeof import("@vueuse/core"))["useCloned"]>; + readonly useColorMode: UnwrapRef< + (typeof import("@vueuse/core"))["useColorMode"] + >; + readonly useConfirmDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useConfirmDialog"] + >; + readonly useCounter: UnwrapRef< + (typeof import("@vueuse/core"))["useCounter"] + >; + readonly useCssModule: UnwrapRef<(typeof import("vue"))["useCssModule"]>; + readonly useCssVar: UnwrapRef<(typeof import("@vueuse/core"))["useCssVar"]>; + readonly useCssVars: UnwrapRef<(typeof import("vue"))["useCssVars"]>; + readonly useCurrentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useCurrentElement"] + >; + readonly useCycleList: UnwrapRef< + (typeof import("@vueuse/core"))["useCycleList"] + >; + readonly useDark: UnwrapRef<(typeof import("@vueuse/core"))["useDark"]>; + readonly useDateFormat: UnwrapRef< + (typeof import("@vueuse/core"))["useDateFormat"] + >; + readonly useDebounce: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounce"] + >; + readonly useDebounceFn: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounceFn"] + >; + readonly useDebouncedRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useDebouncedRefHistory"] + >; + readonly useDeviceMotion: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceMotion"] + >; + readonly useDeviceOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceOrientation"] + >; + readonly useDevicePixelRatio: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicePixelRatio"] + >; + readonly useDevicesList: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicesList"] + >; + readonly useDisplayMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useDisplayMedia"] + >; + readonly useDocumentVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useDocumentVisibility"] + >; + readonly useDraggable: UnwrapRef< + (typeof import("@vueuse/core"))["useDraggable"] + >; + readonly useDropZone: UnwrapRef< + (typeof import("@vueuse/core"))["useDropZone"] + >; + readonly useElementBounding: UnwrapRef< + (typeof import("@vueuse/core"))["useElementBounding"] + >; + readonly useElementByPoint: UnwrapRef< + (typeof import("@vueuse/core"))["useElementByPoint"] + >; + readonly useElementHover: UnwrapRef< + (typeof import("@vueuse/core"))["useElementHover"] + >; + readonly useElementSize: UnwrapRef< + (typeof import("@vueuse/core"))["useElementSize"] + >; + readonly useElementVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useElementVisibility"] + >; + readonly useEventBus: UnwrapRef< + (typeof import("@vueuse/core"))["useEventBus"] + >; + readonly useEventListener: UnwrapRef< + (typeof import("@vueuse/core"))["useEventListener"] + >; + readonly useEventSource: UnwrapRef< + (typeof import("@vueuse/core"))["useEventSource"] + >; + readonly useEyeDropper: UnwrapRef< + (typeof import("@vueuse/core"))["useEyeDropper"] + >; + readonly useFavicon: UnwrapRef< + (typeof import("@vueuse/core"))["useFavicon"] + >; + readonly useFetch: UnwrapRef<(typeof import("@vueuse/core"))["useFetch"]>; + readonly useFileDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useFileDialog"] + >; + readonly useFileSystemAccess: UnwrapRef< + (typeof import("@vueuse/core"))["useFileSystemAccess"] + >; + readonly useFocus: UnwrapRef<(typeof import("@vueuse/core"))["useFocus"]>; + readonly useFocusWithin: UnwrapRef< + (typeof import("@vueuse/core"))["useFocusWithin"] + >; + readonly useFps: UnwrapRef<(typeof import("@vueuse/core"))["useFps"]>; + readonly useFullscreen: UnwrapRef< + (typeof import("@vueuse/core"))["useFullscreen"] + >; + readonly useGamepad: UnwrapRef< + (typeof import("@vueuse/core"))["useGamepad"] + >; + readonly useGeolocation: UnwrapRef< + (typeof import("@vueuse/core"))["useGeolocation"] + >; + readonly useI18n: UnwrapRef<(typeof import("vue-i18n"))["useI18n"]>; + readonly useIdle: UnwrapRef<(typeof import("@vueuse/core"))["useIdle"]>; + readonly useImage: UnwrapRef<(typeof import("@vueuse/core"))["useImage"]>; + readonly useInfiniteScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useInfiniteScroll"] + >; + readonly useIntersectionObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useIntersectionObserver"] + >; + readonly useInterval: UnwrapRef< + (typeof import("@vueuse/core"))["useInterval"] + >; + readonly useIntervalFn: UnwrapRef< + (typeof import("@vueuse/core"))["useIntervalFn"] + >; + readonly useKeyModifier: UnwrapRef< + (typeof import("@vueuse/core"))["useKeyModifier"] + >; + readonly useLastChanged: UnwrapRef< + (typeof import("@vueuse/core"))["useLastChanged"] + >; + readonly useLink: UnwrapRef<(typeof import("vue-router"))["useLink"]>; + readonly useLocalStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useLocalStorage"] + >; + readonly useMagicKeys: UnwrapRef< + (typeof import("@vueuse/core"))["useMagicKeys"] + >; + readonly useManualRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useManualRefHistory"] + >; + readonly useMediaControls: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaControls"] + >; + readonly useMediaQuery: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaQuery"] + >; + readonly useMemoize: UnwrapRef< + (typeof import("@vueuse/core"))["useMemoize"] + >; + readonly useMemory: UnwrapRef<(typeof import("@vueuse/core"))["useMemory"]>; + readonly useMounted: UnwrapRef< + (typeof import("@vueuse/core"))["useMounted"] + >; + readonly useMouse: UnwrapRef<(typeof import("@vueuse/core"))["useMouse"]>; + readonly useMouseInElement: UnwrapRef< + (typeof import("@vueuse/core"))["useMouseInElement"] + >; + readonly useMousePressed: UnwrapRef< + (typeof import("@vueuse/core"))["useMousePressed"] + >; + readonly useMutationObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useMutationObserver"] + >; + readonly useNavigatorLanguage: UnwrapRef< + (typeof import("@vueuse/core"))["useNavigatorLanguage"] + >; + readonly useNetwork: UnwrapRef< + (typeof import("@vueuse/core"))["useNetwork"] + >; + readonly useNow: UnwrapRef<(typeof import("@vueuse/core"))["useNow"]>; + readonly useObjectUrl: UnwrapRef< + (typeof import("@vueuse/core"))["useObjectUrl"] + >; + readonly useOffsetPagination: UnwrapRef< + (typeof import("@vueuse/core"))["useOffsetPagination"] + >; + readonly useOnline: UnwrapRef<(typeof import("@vueuse/core"))["useOnline"]>; + readonly usePageLeave: UnwrapRef< + (typeof import("@vueuse/core"))["usePageLeave"] + >; + readonly useParallax: UnwrapRef< + (typeof import("@vueuse/core"))["useParallax"] + >; + readonly useParentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useParentElement"] + >; + readonly usePerformanceObserver: UnwrapRef< + (typeof import("@vueuse/core"))["usePerformanceObserver"] + >; + readonly usePermission: UnwrapRef< + (typeof import("@vueuse/core"))["usePermission"] + >; + readonly usePointer: UnwrapRef< + (typeof import("@vueuse/core"))["usePointer"] + >; + readonly usePointerLock: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerLock"] + >; + readonly usePointerSwipe: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerSwipe"] + >; + readonly usePreferredColorScheme: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredColorScheme"] + >; + readonly usePreferredContrast: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredContrast"] + >; + readonly usePreferredDark: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredDark"] + >; + readonly usePreferredLanguages: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredLanguages"] + >; + readonly usePreferredReducedMotion: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredReducedMotion"] + >; + readonly usePrevious: UnwrapRef< + (typeof import("@vueuse/core"))["usePrevious"] + >; + readonly useRafFn: UnwrapRef<(typeof import("@vueuse/core"))["useRafFn"]>; + readonly useRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useRefHistory"] + >; + readonly useResizeObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useResizeObserver"] + >; + readonly useRoute: UnwrapRef<(typeof import("vue-router"))["useRoute"]>; + readonly useRouter: UnwrapRef<(typeof import("vue-router"))["useRouter"]>; + readonly useScreenOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenOrientation"] + >; + readonly useScreenSafeArea: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenSafeArea"] + >; + readonly useScriptTag: UnwrapRef< + (typeof import("@vueuse/core"))["useScriptTag"] + >; + readonly useScroll: UnwrapRef<(typeof import("@vueuse/core"))["useScroll"]>; + readonly useScrollLock: UnwrapRef< + (typeof import("@vueuse/core"))["useScrollLock"] + >; + readonly useSessionStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useSessionStorage"] + >; + readonly useShare: UnwrapRef<(typeof import("@vueuse/core"))["useShare"]>; + readonly useSlots: UnwrapRef<(typeof import("vue"))["useSlots"]>; + readonly useSorted: UnwrapRef<(typeof import("@vueuse/core"))["useSorted"]>; + readonly useSpeechRecognition: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechRecognition"] + >; + readonly useSpeechSynthesis: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechSynthesis"] + >; + readonly useStepper: UnwrapRef< + (typeof import("@vueuse/core"))["useStepper"] + >; + readonly useStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useStorage"] + >; + readonly useStorageAsync: UnwrapRef< + (typeof import("@vueuse/core"))["useStorageAsync"] + >; + readonly useStyleTag: UnwrapRef< + (typeof import("@vueuse/core"))["useStyleTag"] + >; + readonly useSupported: UnwrapRef< + (typeof import("@vueuse/core"))["useSupported"] + >; + readonly useSwipe: UnwrapRef<(typeof import("@vueuse/core"))["useSwipe"]>; + readonly useTemplateRefsList: UnwrapRef< + (typeof import("@vueuse/core"))["useTemplateRefsList"] + >; + readonly useTextDirection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextDirection"] + >; + readonly useTextSelection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextSelection"] + >; + readonly useTextareaAutosize: UnwrapRef< + (typeof import("@vueuse/core"))["useTextareaAutosize"] + >; + readonly useThrottle: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottle"] + >; + readonly useThrottleFn: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottleFn"] + >; + readonly useThrottledRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottledRefHistory"] + >; + readonly useTimeAgo: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeAgo"] + >; + readonly useTimeout: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeout"] + >; + readonly useTimeoutFn: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutFn"] + >; + readonly useTimeoutPoll: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutPoll"] + >; + readonly useTimestamp: UnwrapRef< + (typeof import("@vueuse/core"))["useTimestamp"] + >; + readonly useTitle: UnwrapRef<(typeof import("@vueuse/core"))["useTitle"]>; + readonly useToNumber: UnwrapRef< + (typeof import("@vueuse/core"))["useToNumber"] + >; + readonly useToString: UnwrapRef< + (typeof import("@vueuse/core"))["useToString"] + >; + readonly useToggle: UnwrapRef<(typeof import("@vueuse/core"))["useToggle"]>; + readonly useTransition: UnwrapRef< + (typeof import("@vueuse/core"))["useTransition"] + >; + readonly useUrlSearchParams: UnwrapRef< + (typeof import("@vueuse/core"))["useUrlSearchParams"] + >; + readonly useUserMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useUserMedia"] + >; + readonly useVModel: UnwrapRef<(typeof import("@vueuse/core"))["useVModel"]>; + readonly useVModels: UnwrapRef< + (typeof import("@vueuse/core"))["useVModels"] + >; + readonly useVibrate: UnwrapRef< + (typeof import("@vueuse/core"))["useVibrate"] + >; + readonly useVirtualList: UnwrapRef< + (typeof import("@vueuse/core"))["useVirtualList"] + >; + readonly useWakeLock: UnwrapRef< + (typeof import("@vueuse/core"))["useWakeLock"] + >; + readonly useWebNotification: UnwrapRef< + (typeof import("@vueuse/core"))["useWebNotification"] + >; + readonly useWebSocket: UnwrapRef< + (typeof import("@vueuse/core"))["useWebSocket"] + >; + readonly useWebWorker: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorker"] + >; + readonly useWebWorkerFn: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorkerFn"] + >; + readonly useWindowFocus: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowFocus"] + >; + readonly useWindowScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowScroll"] + >; + readonly useWindowSize: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowSize"] + >; + readonly watch: UnwrapRef<(typeof import("vue"))["watch"]>; + readonly watchArray: UnwrapRef< + (typeof import("@vueuse/core"))["watchArray"] + >; + readonly watchAtMost: UnwrapRef< + (typeof import("@vueuse/core"))["watchAtMost"] + >; + readonly watchDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["watchDebounced"] + >; + readonly watchDeep: UnwrapRef<(typeof import("@vueuse/core"))["watchDeep"]>; + readonly watchEffect: UnwrapRef<(typeof import("vue"))["watchEffect"]>; + readonly watchIgnorable: UnwrapRef< + (typeof import("@vueuse/core"))["watchIgnorable"] + >; + readonly watchImmediate: UnwrapRef< + (typeof import("@vueuse/core"))["watchImmediate"] + >; + readonly watchOnce: UnwrapRef<(typeof import("@vueuse/core"))["watchOnce"]>; + readonly watchPausable: UnwrapRef< + (typeof import("@vueuse/core"))["watchPausable"] + >; + readonly watchPostEffect: UnwrapRef< + (typeof import("vue"))["watchPostEffect"] + >; + readonly watchSyncEffect: UnwrapRef< + (typeof import("vue"))["watchSyncEffect"] + >; + readonly watchThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["watchThrottled"] + >; + readonly watchTriggerable: UnwrapRef< + (typeof import("@vueuse/core"))["watchTriggerable"] + >; + readonly watchWithFilter: UnwrapRef< + (typeof import("@vueuse/core"))["watchWithFilter"] + >; + readonly whenever: UnwrapRef<(typeof import("@vueuse/core"))["whenever"]>; + } +} +declare module "@vue/runtime-core" { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef<(typeof import("vue"))["EffectScope"]>; + readonly ElMessage: UnwrapRef< + (typeof import("element-plus/es"))["ElMessage"] + >; + readonly ElMessageBox: UnwrapRef< + (typeof import("element-plus/es"))["ElMessageBox"] + >; + readonly acceptHMRUpdate: UnwrapRef< + (typeof import("pinia"))["acceptHMRUpdate"] + >; + readonly asyncComputed: UnwrapRef< + (typeof import("@vueuse/core"))["asyncComputed"] + >; + readonly autoResetRef: UnwrapRef< + (typeof import("@vueuse/core"))["autoResetRef"] + >; + readonly computed: UnwrapRef<(typeof import("vue"))["computed"]>; + readonly computedAsync: UnwrapRef< + (typeof import("@vueuse/core"))["computedAsync"] + >; + readonly computedEager: UnwrapRef< + (typeof import("@vueuse/core"))["computedEager"] + >; + readonly computedInject: UnwrapRef< + (typeof import("@vueuse/core"))["computedInject"] + >; + readonly computedWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["computedWithControl"] + >; + readonly controlledComputed: UnwrapRef< + (typeof import("@vueuse/core"))["controlledComputed"] + >; + readonly controlledRef: UnwrapRef< + (typeof import("@vueuse/core"))["controlledRef"] + >; + readonly createApp: UnwrapRef<(typeof import("vue"))["createApp"]>; + readonly createEventHook: UnwrapRef< + (typeof import("@vueuse/core"))["createEventHook"] + >; + readonly createGlobalState: UnwrapRef< + (typeof import("@vueuse/core"))["createGlobalState"] + >; + readonly createInjectionState: UnwrapRef< + (typeof import("@vueuse/core"))["createInjectionState"] + >; + readonly createPinia: UnwrapRef<(typeof import("pinia"))["createPinia"]>; + readonly createReactiveFn: UnwrapRef< + (typeof import("@vueuse/core"))["createReactiveFn"] + >; + readonly createReusableTemplate: UnwrapRef< + (typeof import("@vueuse/core"))["createReusableTemplate"] + >; + readonly createSharedComposable: UnwrapRef< + (typeof import("@vueuse/core"))["createSharedComposable"] + >; + readonly createTemplatePromise: UnwrapRef< + (typeof import("@vueuse/core"))["createTemplatePromise"] + >; + readonly createUnrefFn: UnwrapRef< + (typeof import("@vueuse/core"))["createUnrefFn"] + >; + readonly customRef: UnwrapRef<(typeof import("vue"))["customRef"]>; + readonly debouncedRef: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedRef"] + >; + readonly debouncedWatch: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedWatch"] + >; + readonly defineAsyncComponent: UnwrapRef< + (typeof import("vue"))["defineAsyncComponent"] + >; + readonly defineComponent: UnwrapRef< + (typeof import("vue"))["defineComponent"] + >; + readonly defineStore: UnwrapRef<(typeof import("pinia"))["defineStore"]>; + readonly eagerComputed: UnwrapRef< + (typeof import("@vueuse/core"))["eagerComputed"] + >; + readonly effectScope: UnwrapRef<(typeof import("vue"))["effectScope"]>; + readonly extendRef: UnwrapRef<(typeof import("@vueuse/core"))["extendRef"]>; + readonly getActivePinia: UnwrapRef< + (typeof import("pinia"))["getActivePinia"] + >; + readonly getCurrentInstance: UnwrapRef< + (typeof import("vue"))["getCurrentInstance"] + >; + readonly getCurrentScope: UnwrapRef< + (typeof import("vue"))["getCurrentScope"] + >; + readonly h: UnwrapRef<(typeof import("vue"))["h"]>; + readonly ignorableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["ignorableWatch"] + >; + readonly inject: UnwrapRef<(typeof import("vue"))["inject"]>; + readonly injectLocal: UnwrapRef< + (typeof import("@vueuse/core"))["injectLocal"] + >; + readonly isDefined: UnwrapRef<(typeof import("@vueuse/core"))["isDefined"]>; + readonly isProxy: UnwrapRef<(typeof import("vue"))["isProxy"]>; + readonly isReactive: UnwrapRef<(typeof import("vue"))["isReactive"]>; + readonly isReadonly: UnwrapRef<(typeof import("vue"))["isReadonly"]>; + readonly isRef: UnwrapRef<(typeof import("vue"))["isRef"]>; + readonly makeDestructurable: UnwrapRef< + (typeof import("@vueuse/core"))["makeDestructurable"] + >; + readonly mapActions: UnwrapRef<(typeof import("pinia"))["mapActions"]>; + readonly mapGetters: UnwrapRef<(typeof import("pinia"))["mapGetters"]>; + readonly mapState: UnwrapRef<(typeof import("pinia"))["mapState"]>; + readonly mapStores: UnwrapRef<(typeof import("pinia"))["mapStores"]>; + readonly mapWritableState: UnwrapRef< + (typeof import("pinia"))["mapWritableState"] + >; + readonly markRaw: UnwrapRef<(typeof import("vue"))["markRaw"]>; + readonly nextTick: UnwrapRef<(typeof import("vue"))["nextTick"]>; + readonly onActivated: UnwrapRef<(typeof import("vue"))["onActivated"]>; + readonly onBeforeMount: UnwrapRef<(typeof import("vue"))["onBeforeMount"]>; + readonly onBeforeRouteLeave: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteLeave"] + >; + readonly onBeforeRouteUpdate: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteUpdate"] + >; + readonly onBeforeUnmount: UnwrapRef< + (typeof import("vue"))["onBeforeUnmount"] + >; + readonly onBeforeUpdate: UnwrapRef< + (typeof import("vue"))["onBeforeUpdate"] + >; + readonly onClickOutside: UnwrapRef< + (typeof import("@vueuse/core"))["onClickOutside"] + >; + readonly onDeactivated: UnwrapRef<(typeof import("vue"))["onDeactivated"]>; + readonly onErrorCaptured: UnwrapRef< + (typeof import("vue"))["onErrorCaptured"] + >; + readonly onKeyStroke: UnwrapRef< + (typeof import("@vueuse/core"))["onKeyStroke"] + >; + readonly onLongPress: UnwrapRef< + (typeof import("@vueuse/core"))["onLongPress"] + >; + readonly onMounted: UnwrapRef<(typeof import("vue"))["onMounted"]>; + readonly onRenderTracked: UnwrapRef< + (typeof import("vue"))["onRenderTracked"] + >; + readonly onRenderTriggered: UnwrapRef< + (typeof import("vue"))["onRenderTriggered"] + >; + readonly onScopeDispose: UnwrapRef< + (typeof import("vue"))["onScopeDispose"] + >; + readonly onServerPrefetch: UnwrapRef< + (typeof import("vue"))["onServerPrefetch"] + >; + readonly onStartTyping: UnwrapRef< + (typeof import("@vueuse/core"))["onStartTyping"] + >; + readonly onUnmounted: UnwrapRef<(typeof import("vue"))["onUnmounted"]>; + readonly onUpdated: UnwrapRef<(typeof import("vue"))["onUpdated"]>; + readonly pausableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["pausableWatch"] + >; + readonly provide: UnwrapRef<(typeof import("vue"))["provide"]>; + readonly provideLocal: UnwrapRef< + (typeof import("@vueuse/core"))["provideLocal"] + >; + readonly reactify: UnwrapRef<(typeof import("@vueuse/core"))["reactify"]>; + readonly reactifyObject: UnwrapRef< + (typeof import("@vueuse/core"))["reactifyObject"] + >; + readonly reactive: UnwrapRef<(typeof import("vue"))["reactive"]>; + readonly reactiveComputed: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveComputed"] + >; + readonly reactiveOmit: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveOmit"] + >; + readonly reactivePick: UnwrapRef< + (typeof import("@vueuse/core"))["reactivePick"] + >; + readonly readonly: UnwrapRef<(typeof import("vue"))["readonly"]>; + readonly ref: UnwrapRef<(typeof import("vue"))["ref"]>; + readonly refAutoReset: UnwrapRef< + (typeof import("@vueuse/core"))["refAutoReset"] + >; + readonly refDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["refDebounced"] + >; + readonly refDefault: UnwrapRef< + (typeof import("@vueuse/core"))["refDefault"] + >; + readonly refThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["refThrottled"] + >; + readonly refWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["refWithControl"] + >; + readonly resolveComponent: UnwrapRef< + (typeof import("vue"))["resolveComponent"] + >; + readonly resolveRef: UnwrapRef< + (typeof import("@vueuse/core"))["resolveRef"] + >; + readonly resolveUnref: UnwrapRef< + (typeof import("@vueuse/core"))["resolveUnref"] + >; + readonly setActivePinia: UnwrapRef< + (typeof import("pinia"))["setActivePinia"] + >; + readonly setMapStoreSuffix: UnwrapRef< + (typeof import("pinia"))["setMapStoreSuffix"] + >; + readonly shallowReactive: UnwrapRef< + (typeof import("vue"))["shallowReactive"] + >; + readonly shallowReadonly: UnwrapRef< + (typeof import("vue"))["shallowReadonly"] + >; + readonly shallowRef: UnwrapRef<(typeof import("vue"))["shallowRef"]>; + readonly storeToRefs: UnwrapRef<(typeof import("pinia"))["storeToRefs"]>; + readonly syncRef: UnwrapRef<(typeof import("@vueuse/core"))["syncRef"]>; + readonly syncRefs: UnwrapRef<(typeof import("@vueuse/core"))["syncRefs"]>; + readonly templateRef: UnwrapRef< + (typeof import("@vueuse/core"))["templateRef"] + >; + readonly throttledRef: UnwrapRef< + (typeof import("@vueuse/core"))["throttledRef"] + >; + readonly throttledWatch: UnwrapRef< + (typeof import("@vueuse/core"))["throttledWatch"] + >; + readonly toRaw: UnwrapRef<(typeof import("vue"))["toRaw"]>; + readonly toReactive: UnwrapRef< + (typeof import("@vueuse/core"))["toReactive"] + >; + readonly toRef: UnwrapRef<(typeof import("vue"))["toRef"]>; + readonly toRefs: UnwrapRef<(typeof import("vue"))["toRefs"]>; + readonly toValue: UnwrapRef<(typeof import("vue"))["toValue"]>; + readonly triggerRef: UnwrapRef<(typeof import("vue"))["triggerRef"]>; + readonly tryOnBeforeMount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeMount"] + >; + readonly tryOnBeforeUnmount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeUnmount"] + >; + readonly tryOnMounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnMounted"] + >; + readonly tryOnScopeDispose: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnScopeDispose"] + >; + readonly tryOnUnmounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnUnmounted"] + >; + readonly unref: UnwrapRef<(typeof import("vue"))["unref"]>; + readonly unrefElement: UnwrapRef< + (typeof import("@vueuse/core"))["unrefElement"] + >; + readonly until: UnwrapRef<(typeof import("@vueuse/core"))["until"]>; + readonly useActiveElement: UnwrapRef< + (typeof import("@vueuse/core"))["useActiveElement"] + >; + readonly useAnimate: UnwrapRef< + (typeof import("@vueuse/core"))["useAnimate"] + >; + readonly useArrayDifference: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayDifference"] + >; + readonly useArrayEvery: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayEvery"] + >; + readonly useArrayFilter: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFilter"] + >; + readonly useArrayFind: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFind"] + >; + readonly useArrayFindIndex: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindIndex"] + >; + readonly useArrayFindLast: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindLast"] + >; + readonly useArrayIncludes: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayIncludes"] + >; + readonly useArrayJoin: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayJoin"] + >; + readonly useArrayMap: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayMap"] + >; + readonly useArrayReduce: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayReduce"] + >; + readonly useArraySome: UnwrapRef< + (typeof import("@vueuse/core"))["useArraySome"] + >; + readonly useArrayUnique: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayUnique"] + >; + readonly useAsyncQueue: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncQueue"] + >; + readonly useAsyncState: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncState"] + >; + readonly useAttrs: UnwrapRef<(typeof import("vue"))["useAttrs"]>; + readonly useBase64: UnwrapRef<(typeof import("@vueuse/core"))["useBase64"]>; + readonly useBattery: UnwrapRef< + (typeof import("@vueuse/core"))["useBattery"] + >; + readonly useBluetooth: UnwrapRef< + (typeof import("@vueuse/core"))["useBluetooth"] + >; + readonly useBreakpoints: UnwrapRef< + (typeof import("@vueuse/core"))["useBreakpoints"] + >; + readonly useBroadcastChannel: UnwrapRef< + (typeof import("@vueuse/core"))["useBroadcastChannel"] + >; + readonly useBrowserLocation: UnwrapRef< + (typeof import("@vueuse/core"))["useBrowserLocation"] + >; + readonly useCached: UnwrapRef<(typeof import("@vueuse/core"))["useCached"]>; + readonly useClipboard: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboard"] + >; + readonly useClipboardItems: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboardItems"] + >; + readonly useCloned: UnwrapRef<(typeof import("@vueuse/core"))["useCloned"]>; + readonly useColorMode: UnwrapRef< + (typeof import("@vueuse/core"))["useColorMode"] + >; + readonly useConfirmDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useConfirmDialog"] + >; + readonly useCounter: UnwrapRef< + (typeof import("@vueuse/core"))["useCounter"] + >; + readonly useCssModule: UnwrapRef<(typeof import("vue"))["useCssModule"]>; + readonly useCssVar: UnwrapRef<(typeof import("@vueuse/core"))["useCssVar"]>; + readonly useCssVars: UnwrapRef<(typeof import("vue"))["useCssVars"]>; + readonly useCurrentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useCurrentElement"] + >; + readonly useCycleList: UnwrapRef< + (typeof import("@vueuse/core"))["useCycleList"] + >; + readonly useDark: UnwrapRef<(typeof import("@vueuse/core"))["useDark"]>; + readonly useDateFormat: UnwrapRef< + (typeof import("@vueuse/core"))["useDateFormat"] + >; + readonly useDebounce: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounce"] + >; + readonly useDebounceFn: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounceFn"] + >; + readonly useDebouncedRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useDebouncedRefHistory"] + >; + readonly useDeviceMotion: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceMotion"] + >; + readonly useDeviceOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceOrientation"] + >; + readonly useDevicePixelRatio: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicePixelRatio"] + >; + readonly useDevicesList: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicesList"] + >; + readonly useDisplayMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useDisplayMedia"] + >; + readonly useDocumentVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useDocumentVisibility"] + >; + readonly useDraggable: UnwrapRef< + (typeof import("@vueuse/core"))["useDraggable"] + >; + readonly useDropZone: UnwrapRef< + (typeof import("@vueuse/core"))["useDropZone"] + >; + readonly useElementBounding: UnwrapRef< + (typeof import("@vueuse/core"))["useElementBounding"] + >; + readonly useElementByPoint: UnwrapRef< + (typeof import("@vueuse/core"))["useElementByPoint"] + >; + readonly useElementHover: UnwrapRef< + (typeof import("@vueuse/core"))["useElementHover"] + >; + readonly useElementSize: UnwrapRef< + (typeof import("@vueuse/core"))["useElementSize"] + >; + readonly useElementVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useElementVisibility"] + >; + readonly useEventBus: UnwrapRef< + (typeof import("@vueuse/core"))["useEventBus"] + >; + readonly useEventListener: UnwrapRef< + (typeof import("@vueuse/core"))["useEventListener"] + >; + readonly useEventSource: UnwrapRef< + (typeof import("@vueuse/core"))["useEventSource"] + >; + readonly useEyeDropper: UnwrapRef< + (typeof import("@vueuse/core"))["useEyeDropper"] + >; + readonly useFavicon: UnwrapRef< + (typeof import("@vueuse/core"))["useFavicon"] + >; + readonly useFetch: UnwrapRef<(typeof import("@vueuse/core"))["useFetch"]>; + readonly useFileDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useFileDialog"] + >; + readonly useFileSystemAccess: UnwrapRef< + (typeof import("@vueuse/core"))["useFileSystemAccess"] + >; + readonly useFocus: UnwrapRef<(typeof import("@vueuse/core"))["useFocus"]>; + readonly useFocusWithin: UnwrapRef< + (typeof import("@vueuse/core"))["useFocusWithin"] + >; + readonly useFps: UnwrapRef<(typeof import("@vueuse/core"))["useFps"]>; + readonly useFullscreen: UnwrapRef< + (typeof import("@vueuse/core"))["useFullscreen"] + >; + readonly useGamepad: UnwrapRef< + (typeof import("@vueuse/core"))["useGamepad"] + >; + readonly useGeolocation: UnwrapRef< + (typeof import("@vueuse/core"))["useGeolocation"] + >; + readonly useI18n: UnwrapRef<(typeof import("vue-i18n"))["useI18n"]>; + readonly useIdle: UnwrapRef<(typeof import("@vueuse/core"))["useIdle"]>; + readonly useImage: UnwrapRef<(typeof import("@vueuse/core"))["useImage"]>; + readonly useInfiniteScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useInfiniteScroll"] + >; + readonly useIntersectionObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useIntersectionObserver"] + >; + readonly useInterval: UnwrapRef< + (typeof import("@vueuse/core"))["useInterval"] + >; + readonly useIntervalFn: UnwrapRef< + (typeof import("@vueuse/core"))["useIntervalFn"] + >; + readonly useKeyModifier: UnwrapRef< + (typeof import("@vueuse/core"))["useKeyModifier"] + >; + readonly useLastChanged: UnwrapRef< + (typeof import("@vueuse/core"))["useLastChanged"] + >; + readonly useLink: UnwrapRef<(typeof import("vue-router"))["useLink"]>; + readonly useLocalStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useLocalStorage"] + >; + readonly useMagicKeys: UnwrapRef< + (typeof import("@vueuse/core"))["useMagicKeys"] + >; + readonly useManualRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useManualRefHistory"] + >; + readonly useMediaControls: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaControls"] + >; + readonly useMediaQuery: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaQuery"] + >; + readonly useMemoize: UnwrapRef< + (typeof import("@vueuse/core"))["useMemoize"] + >; + readonly useMemory: UnwrapRef<(typeof import("@vueuse/core"))["useMemory"]>; + readonly useMounted: UnwrapRef< + (typeof import("@vueuse/core"))["useMounted"] + >; + readonly useMouse: UnwrapRef<(typeof import("@vueuse/core"))["useMouse"]>; + readonly useMouseInElement: UnwrapRef< + (typeof import("@vueuse/core"))["useMouseInElement"] + >; + readonly useMousePressed: UnwrapRef< + (typeof import("@vueuse/core"))["useMousePressed"] + >; + readonly useMutationObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useMutationObserver"] + >; + readonly useNavigatorLanguage: UnwrapRef< + (typeof import("@vueuse/core"))["useNavigatorLanguage"] + >; + readonly useNetwork: UnwrapRef< + (typeof import("@vueuse/core"))["useNetwork"] + >; + readonly useNow: UnwrapRef<(typeof import("@vueuse/core"))["useNow"]>; + readonly useObjectUrl: UnwrapRef< + (typeof import("@vueuse/core"))["useObjectUrl"] + >; + readonly useOffsetPagination: UnwrapRef< + (typeof import("@vueuse/core"))["useOffsetPagination"] + >; + readonly useOnline: UnwrapRef<(typeof import("@vueuse/core"))["useOnline"]>; + readonly usePageLeave: UnwrapRef< + (typeof import("@vueuse/core"))["usePageLeave"] + >; + readonly useParallax: UnwrapRef< + (typeof import("@vueuse/core"))["useParallax"] + >; + readonly useParentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useParentElement"] + >; + readonly usePerformanceObserver: UnwrapRef< + (typeof import("@vueuse/core"))["usePerformanceObserver"] + >; + readonly usePermission: UnwrapRef< + (typeof import("@vueuse/core"))["usePermission"] + >; + readonly usePointer: UnwrapRef< + (typeof import("@vueuse/core"))["usePointer"] + >; + readonly usePointerLock: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerLock"] + >; + readonly usePointerSwipe: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerSwipe"] + >; + readonly usePreferredColorScheme: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredColorScheme"] + >; + readonly usePreferredContrast: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredContrast"] + >; + readonly usePreferredDark: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredDark"] + >; + readonly usePreferredLanguages: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredLanguages"] + >; + readonly usePreferredReducedMotion: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredReducedMotion"] + >; + readonly usePrevious: UnwrapRef< + (typeof import("@vueuse/core"))["usePrevious"] + >; + readonly useRafFn: UnwrapRef<(typeof import("@vueuse/core"))["useRafFn"]>; + readonly useRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useRefHistory"] + >; + readonly useResizeObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useResizeObserver"] + >; + readonly useRoute: UnwrapRef<(typeof import("vue-router"))["useRoute"]>; + readonly useRouter: UnwrapRef<(typeof import("vue-router"))["useRouter"]>; + readonly useScreenOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenOrientation"] + >; + readonly useScreenSafeArea: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenSafeArea"] + >; + readonly useScriptTag: UnwrapRef< + (typeof import("@vueuse/core"))["useScriptTag"] + >; + readonly useScroll: UnwrapRef<(typeof import("@vueuse/core"))["useScroll"]>; + readonly useScrollLock: UnwrapRef< + (typeof import("@vueuse/core"))["useScrollLock"] + >; + readonly useSessionStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useSessionStorage"] + >; + readonly useShare: UnwrapRef<(typeof import("@vueuse/core"))["useShare"]>; + readonly useSlots: UnwrapRef<(typeof import("vue"))["useSlots"]>; + readonly useSorted: UnwrapRef<(typeof import("@vueuse/core"))["useSorted"]>; + readonly useSpeechRecognition: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechRecognition"] + >; + readonly useSpeechSynthesis: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechSynthesis"] + >; + readonly useStepper: UnwrapRef< + (typeof import("@vueuse/core"))["useStepper"] + >; + readonly useStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useStorage"] + >; + readonly useStorageAsync: UnwrapRef< + (typeof import("@vueuse/core"))["useStorageAsync"] + >; + readonly useStyleTag: UnwrapRef< + (typeof import("@vueuse/core"))["useStyleTag"] + >; + readonly useSupported: UnwrapRef< + (typeof import("@vueuse/core"))["useSupported"] + >; + readonly useSwipe: UnwrapRef<(typeof import("@vueuse/core"))["useSwipe"]>; + readonly useTemplateRefsList: UnwrapRef< + (typeof import("@vueuse/core"))["useTemplateRefsList"] + >; + readonly useTextDirection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextDirection"] + >; + readonly useTextSelection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextSelection"] + >; + readonly useTextareaAutosize: UnwrapRef< + (typeof import("@vueuse/core"))["useTextareaAutosize"] + >; + readonly useThrottle: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottle"] + >; + readonly useThrottleFn: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottleFn"] + >; + readonly useThrottledRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottledRefHistory"] + >; + readonly useTimeAgo: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeAgo"] + >; + readonly useTimeout: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeout"] + >; + readonly useTimeoutFn: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutFn"] + >; + readonly useTimeoutPoll: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutPoll"] + >; + readonly useTimestamp: UnwrapRef< + (typeof import("@vueuse/core"))["useTimestamp"] + >; + readonly useTitle: UnwrapRef<(typeof import("@vueuse/core"))["useTitle"]>; + readonly useToNumber: UnwrapRef< + (typeof import("@vueuse/core"))["useToNumber"] + >; + readonly useToString: UnwrapRef< + (typeof import("@vueuse/core"))["useToString"] + >; + readonly useToggle: UnwrapRef<(typeof import("@vueuse/core"))["useToggle"]>; + readonly useTransition: UnwrapRef< + (typeof import("@vueuse/core"))["useTransition"] + >; + readonly useUrlSearchParams: UnwrapRef< + (typeof import("@vueuse/core"))["useUrlSearchParams"] + >; + readonly useUserMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useUserMedia"] + >; + readonly useVModel: UnwrapRef<(typeof import("@vueuse/core"))["useVModel"]>; + readonly useVModels: UnwrapRef< + (typeof import("@vueuse/core"))["useVModels"] + >; + readonly useVibrate: UnwrapRef< + (typeof import("@vueuse/core"))["useVibrate"] + >; + readonly useVirtualList: UnwrapRef< + (typeof import("@vueuse/core"))["useVirtualList"] + >; + readonly useWakeLock: UnwrapRef< + (typeof import("@vueuse/core"))["useWakeLock"] + >; + readonly useWebNotification: UnwrapRef< + (typeof import("@vueuse/core"))["useWebNotification"] + >; + readonly useWebSocket: UnwrapRef< + (typeof import("@vueuse/core"))["useWebSocket"] + >; + readonly useWebWorker: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorker"] + >; + readonly useWebWorkerFn: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorkerFn"] + >; + readonly useWindowFocus: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowFocus"] + >; + readonly useWindowScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowScroll"] + >; + readonly useWindowSize: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowSize"] + >; + readonly watch: UnwrapRef<(typeof import("vue"))["watch"]>; + readonly watchArray: UnwrapRef< + (typeof import("@vueuse/core"))["watchArray"] + >; + readonly watchAtMost: UnwrapRef< + (typeof import("@vueuse/core"))["watchAtMost"] + >; + readonly watchDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["watchDebounced"] + >; + readonly watchDeep: UnwrapRef<(typeof import("@vueuse/core"))["watchDeep"]>; + readonly watchEffect: UnwrapRef<(typeof import("vue"))["watchEffect"]>; + readonly watchIgnorable: UnwrapRef< + (typeof import("@vueuse/core"))["watchIgnorable"] + >; + readonly watchImmediate: UnwrapRef< + (typeof import("@vueuse/core"))["watchImmediate"] + >; + readonly watchOnce: UnwrapRef<(typeof import("@vueuse/core"))["watchOnce"]>; + readonly watchPausable: UnwrapRef< + (typeof import("@vueuse/core"))["watchPausable"] + >; + readonly watchPostEffect: UnwrapRef< + (typeof import("vue"))["watchPostEffect"] + >; + readonly watchSyncEffect: UnwrapRef< + (typeof import("vue"))["watchSyncEffect"] + >; + readonly watchThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["watchThrottled"] + >; + readonly watchTriggerable: UnwrapRef< + (typeof import("@vueuse/core"))["watchTriggerable"] + >; + readonly watchWithFilter: UnwrapRef< + (typeof import("@vueuse/core"))["watchWithFilter"] + >; + readonly whenever: UnwrapRef<(typeof import("@vueuse/core"))["whenever"]>; + } +} diff --git a/src/types/components.d.ts b/src/types/components.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..eecb0e332807510642119e46085a9e6472fbb51a --- /dev/null +++ b/src/types/components.d.ts @@ -0,0 +1,108 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module "vue" { + export interface GlobalComponents { + AppLink: (typeof import("./../components/AppLink/index.vue"))["default"]; + AppMain: (typeof import("./../layout/components/AppMain/index.vue"))["default"]; + VisitTrend: (typeof import("./../views/dashboard/components/VisitTrend.vue"))["default"]; + Breadcrumb: (typeof import("./../components/Breadcrumb/index.vue"))["default"]; + CopyButton: (typeof import("./../components/CopyButton/index.vue"))["default"]; + CURD: (typeof import("./../components/CURD/index.vue"))["default"]; + DeptTree: (typeof import("./../views/system/user/components/dept-tree.vue"))["default"]; + UserImport: (typeof import("./../views/system/user/components/user-import.vue"))["default"]; + Dictionary: (typeof import("./../components/Dictionary/index.vue"))["default"]; + DictItem: (typeof import("./../views/system/dict/components/dict-item.vue"))["default"]; + ElBacktop: (typeof import("element-plus/es"))["ElBacktop"]; + ElBreadcrumb: (typeof import("element-plus/es"))["ElBreadcrumb"]; + ElBreadcrumbItem: (typeof import("element-plus/es"))["ElBreadcrumbItem"]; + ElButton: (typeof import("element-plus/es"))["ElButton"]; + ElCard: (typeof import("element-plus/es"))["ElCard"]; + ElCheckbox: (typeof import("element-plus/es"))["ElCheckbox"]; + ElCheckboxGroup: (typeof import("element-plus/es"))["ElCheckboxGroup"]; + ElCol: (typeof import("element-plus/es"))["ElCol"]; + ElColorPicker: (typeof import("element-plus/es"))["ElColorPicker"]; + ElConfigProvider: (typeof import("element-plus/es"))["ElConfigProvider"]; + ElDatePicker: (typeof import("element-plus/es"))["ElDatePicker"]; + ElDialog: (typeof import("element-plus/es"))["ElDialog"]; + ElDivider: (typeof import("element-plus/es"))["ElDivider"]; + ElDrawer: (typeof import("element-plus/es"))["ElDrawer"]; + ElDropdown: (typeof import("element-plus/es"))["ElDropdown"]; + ElDropdownItem: (typeof import("element-plus/es"))["ElDropdownItem"]; + ElDropdownMenu: (typeof import("element-plus/es"))["ElDropdownMenu"]; + ElForm: (typeof import("element-plus/es"))["ElForm"]; + ElFormItem: (typeof import("element-plus/es"))["ElFormItem"]; + ElIcon: (typeof import("element-plus/es"))["ElIcon"]; + ElImage: (typeof import("element-plus/es"))["ElImage"]; + ElInput: (typeof import("element-plus/es"))["ElInput"]; + ElInputNumber: (typeof import("element-plus/es"))["ElInputNumber"]; + ElLink: (typeof import("element-plus/es"))["ElLink"]; + ElMenu: (typeof import("element-plus/es"))["ElMenu"]; + ElMenuItem: (typeof import("element-plus/es"))["ElMenuItem"]; + ElOption: (typeof import("element-plus/es"))["ElOption"]; + ElPagination: (typeof import("element-plus/es"))["ElPagination"]; + ElPopover: (typeof import("element-plus/es"))["ElPopover"]; + ElRadio: (typeof import("element-plus/es"))["ElRadio"]; + ElRadioGroup: (typeof import("element-plus/es"))["ElRadioGroup"]; + ElRow: (typeof import("element-plus/es"))["ElRow"]; + ElScrollbar: (typeof import("element-plus/es"))["ElScrollbar"]; + ElSelect: (typeof import("element-plus/es"))["ElSelect"]; + ElStatistic: (typeof import("element-plus/es"))["ElStatistic"]; + ElSubMenu: (typeof import("element-plus/es"))["ElSubMenu"]; + ElSwitch: (typeof import("element-plus/es"))["ElSwitch"]; + ElTable: (typeof import("element-plus/es"))["ElTable"]; + ElTableColumn: (typeof import("element-plus/es"))["ElTableColumn"]; + ElTag: (typeof import("element-plus/es"))["ElTag"]; + ElText: (typeof import("element-plus/es"))["ElText"]; + ElTooltip: (typeof import("element-plus/es"))["ElTooltip"]; + ElTreeSelect: (typeof import("element-plus/es"))["ElTreeSelect"]; + ElUpload: (typeof import("element-plus/es"))["ElUpload"]; + ElWatermark: (typeof import("element-plus/es"))["ElWatermark"]; + ElSkeleton: (typeof import("element-plus/es"))["ElSkeleton"]; + Form: (typeof import("./../components/CURD/Form.vue"))["default"]; + FunnelChart: (typeof import("./../views/dashboard/components/FunnelChart.vue"))["default"]; + GithubCorner: (typeof import("./../components/GithubCorner/index.vue"))["default"]; + Hamburger: (typeof import("./../components/Hamburger/index.vue"))["default"]; + IconSelect: (typeof import("./../components/IconSelect/index.vue"))["default"]; + IEpArrowDown: (typeof import("~icons/ep/arrow-down"))["default"]; + IEpArrowUp: (typeof import("~icons/ep/arrow-up"))["default"]; + IEpClose: (typeof import("~icons/ep/close"))["default"]; + IEpDownload: (typeof import("~icons/ep/download"))["default"]; + LangSelect: (typeof import("./../components/LangSelect/index.vue"))["default"]; + MenuSearch: (typeof import("./../components/MenuSearch/index.vue"))["default"]; + LayoutSelect: (typeof import("./../layout/components/Settings/components/LayoutSelect.vue"))["default"]; + MultiUpload: (typeof import("./../components/Upload/MultiUpload.vue"))["default"]; + NavBar: (typeof import("./../layout/components/NavBar/index.vue"))["default"]; + NavbarAction: (typeof import("./../layout/components/NavBar/components/NavbarAction.vue"))["default"]; + PageContent: (typeof import("./../components/CURD/PageContent.vue"))["default"]; + PageForm: (typeof import("./../components/CURD/PageForm.vue"))["default"]; + PageModal: (typeof import("./../components/CURD/PageModal.vue"))["default"]; + PageSearch: (typeof import("./../components/CURD/PageSearch.vue"))["default"]; + Pagination: (typeof import("./../components/Pagination/index.vue"))["default"]; + PieChart: (typeof import("./../views/dashboard/components/PieChart.vue"))["default"]; + RadarChart: (typeof import("./../views/dashboard/components/RadarChart.vue"))["default"]; + RouterLink: (typeof import("vue-router"))["RouterLink"]; + RouterView: (typeof import("vue-router"))["RouterView"]; + Settings: (typeof import("./../layout/components/Settings/index.vue"))["default"]; + Sidebar: (typeof import("./../layout/components/Sidebar/index.vue"))["default"]; + SidebarLogo: (typeof import("./../layout/components/Sidebar/components/SidebarLogo.vue"))["default"]; + SidebarMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMenu.vue"))["default"]; + SidebarMenuItem: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItem.vue"))["default"]; + SidebarMenuItemTitle: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItemTitle.vue"))["default"]; + SidebarMixTopMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMixTopMenu.vue"))["default"]; + SingleUpload: (typeof import("./../components/Upload/SingleUpload.vue"))["default"]; + SizeSelect: (typeof import("./../components/SizeSelect/index.vue"))["default"]; + SvgIcon: (typeof import("./../components/SvgIcon/index.vue"))["default"]; + TableSelect: (typeof import("./../components/TableSelect/index.vue"))["default"]; + TagsView: (typeof import("./../layout/components/TagsView/index.vue"))["default"]; + ThemeColorPicker: (typeof import("./../layout/components/Settings/components/ThemeColorPicker.vue"))["default"]; + WangEditor: (typeof import("./../components/WangEditor/index.vue"))["default"]; + } + export interface ComponentCustomProperties { + vLoading: (typeof import("element-plus/es"))["ElLoadingDirective"]; + } +} diff --git a/src/types/env.d.ts b/src/types/env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ed1377812750c7eb4d82106b340bea9b7fad2ba --- /dev/null +++ b/src/types/env.d.ts @@ -0,0 +1,40 @@ +// https://cn.vitejs.dev/guide/env-and-mode + +declare module "*.vue" { + import { DefineComponent } from "vue"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +// TypeScript 类型提示都为 string: https://github.com/vitejs/vite/issues/6930 +interface ImportMetaEnv { + /** 应用端口 */ + VITE_APP_PORT: number; + /** API 基础路径(代理前缀) */ + VITE_APP_BASE_API: string; + /** API 地址 */ + VITE_APP_API_URL: string; + /** 是否开启 Mock 服务 */ + VITE_MOCK_DEV_SERVER: boolean; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +/** + * 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 + */ +declare const __APP_INFO__: { + pkg: { + name: string; + version: string; + engines: { + node: string; + }; + dependencies: Record; + devDependencies: Record; + }; + buildTimestamp: number; +}; diff --git a/src/types/global.d.ts b/src/types/global.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..17b7c2ac62e36e79b43047d431590182a724bdc0 --- /dev/null +++ b/src/types/global.d.ts @@ -0,0 +1,91 @@ +declare global { + /** + * 响应数据 + */ + interface ResponseData { + code: string; + data: T; + msg: string; + } + + /** + * 分页查询参数 + */ + interface PageQuery { + pageNum: number; + pageSize: number; + } + + /** + * 分页响应对象 + */ + interface PageResult { + /** 数据列表 */ + list: T; + /** 总数 */ + total: number; + } + + /** + * 页签对象 + */ + interface TagView { + /** 页签名称 */ + name: string; + /** 页签标题 */ + title: string; + /** 页签路由路径 */ + path: string; + /** 页签路由完整路径 */ + fullPath: string; + /** 页签图标 */ + icon?: string; + /** 是否固定页签 */ + affix?: boolean; + /** 是否开启缓存 */ + keepAlive?: boolean; + /** 路由查询参数 */ + query?: any; + } + + /** + * 系统设置 + */ + interface AppSettings { + /** 系统标题 */ + title: string; + /** 系统版本 */ + version: string; + /** 是否显示设置 */ + showSettings: boolean; + /** 是否固定头部 */ + fixedHeader: boolean; + /** 是否显示多标签导航 */ + tagsView: boolean; + /** 是否显示侧边栏Logo */ + sidebarLogo: boolean; + /** 主题颜色 */ + themeColor: string; + /** 主题模式(dark|light) */ + theme: string; + /** 语言( zh-cn| en) */ + language: string; + /** 是否开启水印 */ + watermarkEnabled: boolean; + /** 水印内容 */ + watermarkContent: string; + } + + /** + * 组件数据源 + */ + interface OptionType { + /** 值 */ + value: string | number; + /** 文本 */ + label: string; + /** 子列表 */ + children?: OptionType[]; + } +} +export {}; diff --git a/src/types/router.d.ts b/src/types/router.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a175ea18d2bc052808b6268e032416338b0b07bf --- /dev/null +++ b/src/types/router.d.ts @@ -0,0 +1,54 @@ +import "vue-router"; + +declare module "vue-router" { + // https://router.vuejs.org/zh/guide/advanced/meta.html#typescript + // 可以通过扩展 RouteMeta 接口来输入 meta 字段 + interface RouteMeta { + /** + * 菜单名称 + * @example 'Dashboard' + */ + title?: string; + + /** + * 菜单图标 + * @example 'el-icon-edit' + */ + icon?: string; + + /** + * 是否隐藏菜单项 + * true 隐藏, false 显示 + * @default false + */ + hidden?: boolean; + + /** + * 始终显示父级菜单,即使只有一个子菜单 + * true 显示父级菜单, false 隐藏父级菜单,显示唯一子节点 + * @default false + */ + alwaysShow?: boolean; + + /** + * 是否固定在页签上 + * true 固定, false 不固定 + * @default false + */ + affix?: boolean; + + /** + * 是否缓存页面 + * true 缓存, false 不缓存 + * @default false + */ + keepAlive?: boolean; + + /** + * 是否在面包屑导航中隐藏 + * true 隐藏, false 显示 + * @default false + */ + breadcrumb?: boolean; + } +} diff --git a/src/types/socket.d.ts b/src/types/socket.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..15a8ed78b4fbfa8f153889ae7817e94ac88bfaf5 --- /dev/null +++ b/src/types/socket.d.ts @@ -0,0 +1,6 @@ +// https://github.com/sockjs/sockjs-client/issues/565 + +declare module "sockjs-client/dist/sockjs.min.js" { + import Client from "sockjs-client"; + export default Client; +} diff --git a/src/utils/bytesToSize.ts b/src/utils/bytesToSize.ts new file mode 100644 index 0000000000000000000000000000000000000000..78a101cad81b2f04e00d74d08163c09309b1edc7 --- /dev/null +++ b/src/utils/bytesToSize.ts @@ -0,0 +1,15 @@ +export function bytesToSize(bytes: number) { + const sizes = ["B", "KB", "MB", "GB", "TB"]; + if (bytes === 0) return "0 B"; + const i = Math.floor(Math.log(bytes) / Math.log(1024)); + return (bytes / Math.pow(1024, i)).toFixed() + " " + sizes[i]; +} + +export function isMaxMemoryOut(bytes: number, moreNum: number) { + let flag = false; + if (Number((bytes / 1024 / 1024 / 1024).toFixed(3)) >= moreNum) { + flag = true; + } + + return flag; +} diff --git a/src/utils/convertUTCToLocalTime.ts b/src/utils/convertUTCToLocalTime.ts new file mode 100644 index 0000000000000000000000000000000000000000..079e36c782e038f8ecce0a9229435cecc324762c --- /dev/null +++ b/src/utils/convertUTCToLocalTime.ts @@ -0,0 +1,34 @@ +export function convertUTCToLocalTime(utcDateString: string | number | Date) { + const date = new Date(utcDateString); + date.setMinutes(date.getMinutes() + 8 * 60); + + // 使用toLocaleString可以按照本地时区进行格式化 + const localTimer = date + .toLocaleString("zh-CN", { + hour12: false, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + }) + .replace(/\//g, "-"); + return localTimer; +} +export function uTCToLocalTime(utcDateString: string | number | Date) { + const date = new Date(utcDateString); + date.setMinutes(date.getMinutes() - 8 * 60); + + // 使用toLocaleString可以按照本地时区进行格式化 + const localTimer = date + .toLocaleString("zh-CN", { + hour12: false, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + }) + .replace(/\//g, "-"); + return localTimer; +} diff --git a/src/utils/debounce.js b/src/utils/debounce.js new file mode 100644 index 0000000000000000000000000000000000000000..3c9ad8ab94fa534dff8d97bb7f6070e78e2c7091 --- /dev/null +++ b/src/utils/debounce.js @@ -0,0 +1,10 @@ +// 防抖 +export function debounce(func, wait = 1000) { + let timeout = null; + return function (...args) { + clearTimeout(timeout); + timeout = setTimeout(() => { + func.apply(this, args); + }, wait); + }; +} diff --git a/src/utils/generateUuid.ts b/src/utils/generateUuid.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts new file mode 100644 index 0000000000000000000000000000000000000000..17ed904ae2bc670e2d9b82c36cbe4e65fe6c3547 --- /dev/null +++ b/src/utils/i18n.ts @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview +import i18n from "@/lang/index"; + +export function translateRouteTitle(title: any) { + // 判断是否存在国际化配置,如果没有原生返回 + const hasKey = i18n.global.te("route." + title); + if (hasKey) { + const translatedTitle = i18n.global.t("route." + title); + return translatedTitle; + } + return title; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..44bb588bf795737098f944d3af07b14aa6913973 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,41 @@ +/** + * Check if an element has a class + * @param {HTMLElement} ele + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string) { + return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); +} + +/** + * Add class to element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function addClass(ele: HTMLElement, cls: string) { + if (!hasClass(ele, cls)) ele.className += " " + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function removeClass(ele: HTMLElement, cls: string) { + if (hasClass(ele, cls)) { + const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); + ele.className = ele.className.replace(reg, " "); + } +} + +/** + * 判断是否是外部链接 + * + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path); + return isExternal; +} diff --git a/src/utils/nprogress.ts b/src/utils/nprogress.ts new file mode 100644 index 0000000000000000000000000000000000000000..c1d5f2307fc796c47bcefa6c6499952c4ef614ef --- /dev/null +++ b/src/utils/nprogress.ts @@ -0,0 +1,18 @@ +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; + +// 进度条 +NProgress.configure({ + // 动画方式 + easing: "ease", + // 递增进度条的速度 + speed: 500, + // 是否显示加载ico + showSpinner: false, + // 自动递增间隔 + trickleSpeed: 200, + // 初始化时的最小百分比 + minimum: 0.3, +}); + +export default NProgress; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000000000000000000000000000000000000..9051b10451d72bda46da00429b280a208bdd5ee6 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,108 @@ +import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { useUserStoreHook } from "@/store/modules/user"; +import { ResultEnum } from "@/enums/ResultEnum"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; +import qs from "qs"; +import i18n from "@/lang/index"; +import { IconError } from "@computing/opendesign-icons"; + +// 创建 axios 实例 +const service = axios.create({ + baseURL: "/api", + timeout: 90000, + withCredentials: true, + headers: { + "Access-control-allow-origin": "*", + }, + paramsSerializer: (params) => { + return qs.stringify(params); + }, +}); + +// 请求拦截器 +service.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + const accessToken = localStorage.getItem(TOKEN_KEY); + if (accessToken) { + config.headers.Authorization = accessToken; + } + return config; + }, + (error: any) => { + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response: AxiosResponse) => { + // 检查配置的响应类型是否为二进制类型('blob' 或 'arraybuffer'), 如果是,直接返回响应对象 + if ( + response.config.responseType === "blob" || + response.config.responseType === "arraybuffer" + ) { + return response; + } + + const { retcode, data, retmsg } = response?.data; + if (retcode?.toString() === ResultEnum.SUCCESS) { + return data; + } + ElMessage({ + showClose: true, + message: retmsg || i18n.global.t("pageTipText.systemError"), + icon: IconError, + customClass: "o-message--error", + duration: 3000, + }); + return Promise.reject(new Error(retmsg || "Error")); + }, + (error: any) => { + // 异常处理 + if (error?.response?.data) { + const { retcode, retmsg } = error.response.data; + if (retcode?.toString() === ResultEnum.TOKEN_INVALID) { + if (error?.config?.url === "/user/login") { + ElMessage({ + showClose: true, + message: i18n.global.t("login.message.loginTip"), + icon: IconError, + customClass: "o-message--error", + duration: 3000, + }); + } else { + ElNotification({ + title: i18n.global.t("dialogTipText.tipsText"), + message: i18n.global.t("login.message.loginToken"), + type: "info", + }); + useUserStoreHook() + .resetToken() + .then(() => { + location.reload(); + }); + } + } else { + ElMessage({ + showClose: true, + message: retmsg || error?.message, + icon: IconError, + customClass: "o-message--error", + duration: 3000, + }); + } + } else { + ElMessage({ + showClose: true, + message: error?.message, + icon: IconError, + customClass: "o-message--error", + duration: 3000, + }); + } + return Promise.reject(error.message); + } +); + +// 导出 axios 实例 +export default service; diff --git a/src/views/knowledgeFile/fileConfig.ts b/src/views/knowledgeFile/fileConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5307776158fc0428a8157d2ad5b40cd52ec6306 --- /dev/null +++ b/src/views/knowledgeFile/fileConfig.ts @@ -0,0 +1,25 @@ +export interface searchPaylodInterface { + name?: string; + document_type_list?: string[]; + chunk_size_order?: string; + created_time_order?: string; + parse_status?: string[]; + created_time_start?: string; + created_time_end?: string; + enabled?: string; + [property: string]: any; +} + +export interface FileForm { + chunk_size: number; + type_id: string; + id: string; + name: string; + [property: string]: any; +} + +export interface DocumentType { + id: string; + type: string; + [property: string]: any; +} diff --git a/src/views/knowledgeFile/index.vue b/src/views/knowledgeFile/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..53e35364645fec4905f2564f6b931b107a06ad0c --- /dev/null +++ b/src/views/knowledgeFile/index.vue @@ -0,0 +1,1491 @@ + + diff --git a/src/views/knowledgeFileSection/index.vue b/src/views/knowledgeFileSection/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e566c5e9f1e59f65c0e112793a8189891400c627 --- /dev/null +++ b/src/views/knowledgeFileSection/index.vue @@ -0,0 +1,574 @@ + + diff --git a/src/views/knowledgeLibrary/index.vue b/src/views/knowledgeLibrary/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b2fa7804326c67e2dcb7bc6c48d3c8478ee73289 --- /dev/null +++ b/src/views/knowledgeLibrary/index.vue @@ -0,0 +1,1267 @@ + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ddaf66ad779333112a28eebe8afed799067b1cc1 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/notFoundPage/index.vue b/src/views/notFoundPage/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b736d36e4ca7c85168471e2a7e5ee1389b4bf4cf --- /dev/null +++ b/src/views/notFoundPage/index.vue @@ -0,0 +1,9 @@ + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..441cb93194a6770ac8c8ff3cb48eb52ce10b9a23 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "noLib": false, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "baseUrl": ".", + "allowJs": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "jsx": "preserve", + "jsxFactory": "h", + "jsxFragmentFactory": "Fragment", + "paths": { + "@/*": ["src/*"] + }, + "types": ["vite/client", "unplugin-icons/types/vue", "element-plus/global"] + }, + "include": ["mock/**/*.ts", "src/**/*.ts", "src/**/*.vue", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b952fe40b79dd4f5af0283fbc6590c4828d7ed0e --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,43 @@ +// uno.config.ts +import { + defineConfig, + presetAttributify, + presetIcons, + presetTypography, + presetUno, + presetWebFonts, + transformerDirectives, + transformerVariantGroup, +} from "unocss"; + +export default defineConfig({ + shortcuts: { + "flex-center": "flex justify-center items-center", + "flex-x-center": "flex justify-center", + "flex-y-center": "flex items-center", + "wh-full": "w-full h-full", + "flex-x-between": "flex items-center justify-between", + "flex-x-end": "flex items-center justify-end", + "absolute-lt": "absolute left-0 top-0", + "absolute-rt": "absolute right-0 top-0 ", + "fixed-lt": "fixed left-0 top-0", + }, + theme: { + colors: { + primary: "var(--el-color-primary)", + primary_dark: "var(--el-color-primary-light-5)", + }, + }, + presets: [ + presetUno(), + presetAttributify(), + presetIcons(), + presetTypography(), + presetWebFonts({ + fonts: { + // ... + }, + }), + ], + transformers: [transformerDirectives(), transformerVariantGroup()], +}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d38b1519f6bbc5342dc3e3585f608137fe29009 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,248 @@ +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import { UserConfig, ConfigEnv, loadEnv, defineConfig } from "vite"; + +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; +import Icons from "unplugin-icons/vite"; +import IconsResolver from "unplugin-icons/resolver"; + +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; +import mockDevServerPlugin from "vite-plugin-mock-dev-server"; + +import UnoCSS from "unocss/vite"; +import { resolve } from "path"; +import { + name, + version, + engines, + dependencies, + devDependencies, +} from "./package.json"; + +const __APP_INFO__ = { + pkg: { name, version, engines, dependencies, devDependencies }, + buildTimestamp: Date.now(), +}; + +const pathSrc = resolve(__dirname, "src"); +export default defineConfig(({ mode }: ConfigEnv): UserConfig => { + const env = loadEnv(mode, process.cwd()); + return { + resolve: { + alias: { + "@": pathSrc, + }, + }, + css: { + // CSS 预处理器 + preprocessorOptions: { + // 定义全局 SCSS 变量 + scss: { + javascriptEnabled: true, + additionalData: ` + @use "@/styles/variables.scss" as *; + `, + }, + }, + }, + server: { + // 允许IP访问 + host: "127.0.0.1", + port: 3002, + // 运行是否自动打开浏览器 + headers: { + "Access-control-allow-origin": "*", + }, + open: true, + proxy: { + "/api": { + target: "http://116.63.144.61:9988", + changeOrigin: true, + ws: false, + rewrite: (path) => path.replace(new RegExp("^" + "/api"), ""), + }, + }, + }, + plugins: [ + vue(), + // jsx、tsx语法支持 + vueJsx(), + // MOCK 服务 + env.VITE_MOCK_DEV_SERVER === "true" ? mockDevServerPlugin() : null, + UnoCSS({ + hmrTopLevelAwait: false, + }), + AutoImport({ + // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 + imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"], + resolvers: [ + // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) + ElementPlusResolver(), + // 自动导入图标组件 + IconsResolver({}), + ], + eslintrc: { + // 是否自动生成 eslint 规则,建议生成之后设置 false + enabled: false, + // 指定自动导入函数 eslint 规则的文件 + filepath: "./.eslintrc-auto-import.json", + globalsPropValue: true, + }, + // 是否在 vue 模板中自动导入 + vueTemplate: true, + // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成) + dts: false, + // dts: "src/types/auto-imports.d.ts", + }), + Components({ + resolvers: [ + // 自动导入 Element Plus 组件 + ElementPlusResolver(), + // 自动注册图标组件 + IconsResolver({ + // element-plus图标库,其他图标库 https://icon-sets.iconify.design/ + enabledCollections: ["ep"], + }), + ], + // 指定自定义组件位置(默认:src/components) + dirs: ["src/components", "src/**/components"], + // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成) + dts: false, + // dts: "src/types/components.d.ts", + }), + Icons({ + // 自动安装图标库 + autoInstall: true, + }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [resolve(pathSrc, "assets/icons")], + // 指定symbolId格式 + symbolId: "icon-[dir]-[name]", + }), + ], + // 预加载项目必需的组件 + optimizeDeps: { + include: [ + "vue", + "vue-router", + "pinia", + "axios", + "@vueuse/core", + "sortablejs", + "path-to-regexp", + "echarts", + "@wangeditor/editor", + "@wangeditor/editor-for-vue", + "vue-i18n", + "path-browserify", + "element-plus/es/components/form/style/css", + "element-plus/es/components/form-item/style/css", + "element-plus/es/components/button/style/css", + "element-plus/es/components/input/style/css", + "element-plus/es/components/input-number/style/css", + "element-plus/es/components/switch/style/css", + "element-plus/es/components/upload/style/css", + "element-plus/es/components/menu/style/css", + "element-plus/es/components/col/style/css", + "element-plus/es/components/icon/style/css", + "element-plus/es/components/row/style/css", + "element-plus/es/components/tag/style/css", + "element-plus/es/components/dialog/style/css", + "element-plus/es/components/loading/style/css", + "element-plus/es/components/radio/style/css", + "element-plus/es/components/radio-group/style/css", + "element-plus/es/components/popover/style/css", + "element-plus/es/components/scrollbar/style/css", + "element-plus/es/components/tooltip/style/css", + "element-plus/es/components/dropdown/style/css", + "element-plus/es/components/dropdown-menu/style/css", + "element-plus/es/components/dropdown-item/style/css", + "element-plus/es/components/sub-menu/style/css", + "element-plus/es/components/menu-item/style/css", + "element-plus/es/components/divider/style/css", + "element-plus/es/components/card/style/css", + "element-plus/es/components/link/style/css", + "element-plus/es/components/breadcrumb/style/css", + "element-plus/es/components/breadcrumb-item/style/css", + "element-plus/es/components/table/style/css", + "element-plus/es/components/tree-select/style/css", + "element-plus/es/components/table-column/style/css", + "element-plus/es/components/select/style/css", + "element-plus/es/components/option/style/css", + "element-plus/es/components/pagination/style/css", + "element-plus/es/components/tree/style/css", + "element-plus/es/components/alert/style/css", + "element-plus/es/components/radio-button/style/css", + "element-plus/es/components/checkbox-group/style/css", + "element-plus/es/components/checkbox/style/css", + "element-plus/es/components/tabs/style/css", + "element-plus/es/components/tab-pane/style/css", + "element-plus/es/components/rate/style/css", + "element-plus/es/components/date-picker/style/css", + "element-plus/es/components/notification/style/css", + "element-plus/es/components/image/style/css", + "element-plus/es/components/statistic/style/css", + "element-plus/es/components/watermark/style/css", + "element-plus/es/components/config-provider/style/css", + "element-plus/es/components/text/style/css", + "element-plus/es/components/drawer/style/css", + "element-plus/es/components/color-picker/style/css", + "element-plus/es/components/backtop/style/css", + "element-plus/es/components/message-box/style/css", + "element-plus/es/components/skeleton/style/css", + "element-plus/es/components/skeleton/style/css", + "element-plus/es/components/skeleton-item/style/css", + "element-plus/es/components/badge/style/css", + "element-plus/es/components/steps/style/css", + "element-plus/es/components/step/style/css", + "element-plus/es/components/avatar/style/css", + "element-plus/es/components/descriptions/style/css", + "element-plus/es/components/descriptions-item/style/css", + ], + }, + // 构建配置 + build: { + chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告 + minify: "terser", // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效 + terserOptions: { + compress: { + keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题 + drop_console: true, // 生产环境去除 console + drop_debugger: true, // 生产环境去除 debugger + }, + format: { + comments: false, // 删除注释 + }, + }, + rollupOptions: { + output: { + // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 + entryFileNames: "js/[name].[hash].js", + // 用于命名代码拆分时创建的共享块的输出命名 + chunkFileNames: "js/[name].[hash].js", + // 用于输出静态资源的命名,[ext]表示文件扩展名 + assetFileNames: (assetInfo: any) => { + const info = assetInfo.name.split("."); + let extType = info[info.length - 1]; + if ( + /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name) + ) { + extType = "media"; + } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) { + extType = "img"; + } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) { + extType = "fonts"; + } + return `${extType}/[name].[hash].[ext]`; + }, + }, + }, + }, + define: { + __APP_INFO__: JSON.stringify(__APP_INFO__), + }, + }; +});