From 89888cef73699f795103cb13712cff6aa5bcc50f Mon Sep 17 00:00:00 2001 From: CityFun <31820853+zhengkunwang223@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:48:42 +0800 Subject: [PATCH] feat: Optimize frontend structure (#12475) --- frontend/package.json | 5 +- frontend/src/api/index.ts | 3 +- frontend/src/api/modules/alert.ts | 3 +- frontend/src/api/modules/backup.ts | 2 +- frontend/src/api/modules/database.ts | 2 +- frontend/src/api/modules/host.ts | 2 +- frontend/src/api/modules/setting.ts | 2 +- frontend/src/api/modules/terminal.ts | 3 +- frontend/src/api/modules/toolbox.ts | 3 +- frontend/src/api/modules/website.ts | 2 +- frontend/src/components/backup/index.vue | 6 +- frontend/src/components/copy-button/index.vue | 2 +- .../components/error-message/err_domain.vue | 2 +- .../src/components/error-message/err_ip.vue | 2 +- .../src/components/error-message/unsafe.vue | 2 +- frontend/src/components/exist-file/index.vue | 3 +- frontend/src/components/file-list/index.vue | 4 +- .../src/components/fu/FuInputRwSwitch.vue | 92 ++ .../src/components/fu/FuReadWriteSwitch.vue | 76 ++ .../src/components/fu/FuSelectRwSwitch.vue | 104 ++ frontend/src/components/fu/FuStep.ts | 18 + frontend/src/components/fu/FuSteps.ts | 213 ++++ frontend/src/components/fu/FuTable.ts | 213 ++++ .../src/components/fu/FuTableColumnSelect.vue | 125 ++ .../src/components/fu/FuTableOperations.vue | 225 ++++ .../src/components/fu/FuTablePagination.vue | 51 + .../src/components/fu/__compat-smoke__.ts | 3 + frontend/src/components/fu/index.ts | 31 + frontend/src/components/fu/shared.ts | 68 ++ frontend/src/components/index.ts | 2 + frontend/src/components/input-tag/index.vue | 2 +- .../src/components/log/container/index.vue | 2 +- frontend/src/components/log/file/index.vue | 2 +- frontend/src/components/port-jump/index.vue | 2 +- frontend/src/components/task-list/index.vue | 2 +- frontend/src/components/upload/index.vue | 4 +- .../components/v-charts/components/Line.vue | 2 +- frontend/src/lang/fu.ts | 148 +++ frontend/src/lang/modules/en.ts | 4 +- frontend/src/lang/modules/es-es.ts | 4 +- frontend/src/lang/modules/ja.ts | 4 +- frontend/src/lang/modules/ko.ts | 4 +- frontend/src/lang/modules/ms.ts | 4 +- frontend/src/lang/modules/pt-br.ts | 4 +- frontend/src/lang/modules/ru.ts | 4 +- frontend/src/lang/modules/tr.ts | 4 +- frontend/src/lang/modules/zh-Hant.ts | 4 +- frontend/src/lang/modules/zh.ts | 4 +- frontend/src/main.ts | 12 +- frontend/src/styles/fu.scss | 177 +++ frontend/src/styles/index.scss | 2 +- frontend/src/utils/app-store.ts | 55 + frontend/src/utils/app.ts | 2 +- frontend/src/utils/auth.ts | 83 ++ frontend/src/utils/browser.ts | 24 + frontend/src/utils/clipboard.ts | 15 + frontend/src/utils/date.ts | 172 +++ frontend/src/utils/docker.ts | 2 +- frontend/src/utils/file.ts | 154 +++ frontend/src/utils/id.ts | 14 + frontend/src/utils/misc.ts | 79 ++ frontend/src/utils/router.ts | 4 + frontend/src/utils/size.ts | 81 ++ frontend/src/utils/ssl.ts | 46 + frontend/src/utils/util.ts | 1018 ----------------- frontend/src/utils/validate.ts | 184 +++ .../src/views/ai/agents/agent/add/index.vue | 2 +- .../tabs/channels/useAgentPluginChannel.ts | 3 +- .../agent/config/tabs/channels/weixin.vue | 2 +- .../ai/agents/agent/config/tabs/skills.vue | 2 +- .../views/ai/agents/agent/delete/index.vue | 2 +- frontend/src/views/ai/agents/agent/index.vue | 3 +- frontend/src/views/ai/agents/model/index.vue | 2 +- frontend/src/views/ai/gpu/history/index.vue | 2 +- .../src/views/ai/mcp/server/bind/index.vue | 3 +- frontend/src/views/ai/mcp/server/index.vue | 2 +- .../src/views/ai/model/ollama/add/index.vue | 3 +- .../views/ai/model/ollama/domain/index.vue | 3 +- frontend/src/views/ai/model/ollama/index.vue | 3 +- .../src/views/ai/model/tensorrt/index.vue | 2 +- frontend/src/views/app-store/apps/index.vue | 4 +- .../src/views/app-store/detail/form/index.vue | 2 +- frontend/src/views/app-store/detail/index.vue | 2 +- .../views/app-store/detail/install/index.vue | 2 +- .../views/app-store/detail/params/index.vue | 4 +- .../views/app-store/installed/app/info.vue | 4 +- .../app-store/installed/detail/index.vue | 3 +- .../src/views/app-store/installed/index.vue | 2 +- .../src/views/container/compose/index.vue | 3 +- .../container/container/commit/index.vue | 3 +- .../container/file-browser/index.vue | 3 +- .../src/views/container/container/index.vue | 3 +- .../container/container/inspect/index.vue | 2 +- .../container/container/monitor/index.vue | 2 +- .../container/container/operate/index.vue | 3 +- .../views/container/container/prune/index.vue | 3 +- .../container/container/upgrade/index.vue | 2 +- .../src/views/container/dashboard/index.vue | 3 +- .../src/views/container/image/build/index.vue | 2 +- frontend/src/views/container/image/index.vue | 4 +- .../src/views/container/image/load/index.vue | 3 +- .../src/views/container/image/prune/index.vue | 2 +- .../src/views/container/image/pull/index.vue | 3 +- .../src/views/container/image/push/index.vue | 3 +- .../src/views/container/image/save/index.vue | 3 +- .../views/container/network/create/index.vue | 2 +- .../views/container/network/detail/index.vue | 3 +- .../src/views/container/network/index.vue | 3 +- frontend/src/views/container/repo/index.vue | 2 +- .../views/container/setting/ipv6/index.vue | 2 +- .../views/container/setting/mirror/index.vue | 3 +- .../container/setting/registry/index.vue | 3 +- .../src/views/container/template/index.vue | 3 +- frontend/src/views/container/volume/index.vue | 3 +- .../views/cronjob/cronjob/backup/index.vue | 4 +- frontend/src/views/cronjob/cronjob/helper.ts | 3 +- frontend/src/views/cronjob/cronjob/index.vue | 2 +- .../views/cronjob/cronjob/operate/index.vue | 2 +- .../views/cronjob/cronjob/record/index.vue | 2 +- frontend/src/views/cronjob/library/index.vue | 4 +- .../src/views/database/mysql/conn/index.vue | 3 +- .../src/views/database/mysql/create/index.vue | 3 +- frontend/src/views/database/mysql/index.vue | 2 +- .../src/views/database/mysql/remote/index.vue | 2 +- .../database/mysql/setting/status/index.vue | 2 +- .../views/database/postgresql/conn/index.vue | 3 +- .../database/postgresql/create/index.vue | 3 +- .../src/views/database/postgresql/index.vue | 2 +- .../database/postgresql/remote/index.vue | 2 +- .../src/views/database/redis/conn/index.vue | 3 +- .../src/views/database/redis/remote/index.vue | 2 +- .../redis/setting/persistence/index.vue | 3 +- frontend/src/views/home/index.vue | 5 +- frontend/src/views/home/status/index.vue | 2 +- .../file-management/code-editor/index.vue | 3 +- .../host/file-management/convert/index.vue | 2 +- .../host/file-management/delete/index.vue | 2 +- .../host/file-management/detail/index.vue | 5 +- .../src/views/host/file-management/index.vue | 15 +- .../views/host/file-management/move/index.vue | 2 +- .../host/file-management/process/index.vue | 2 +- .../recycle-bin/delete/index.vue | 2 +- .../file-management/recycle-bin/index.vue | 3 +- .../recycle-bin/reduce/index.vue | 2 +- .../host/file-management/share-list/index.vue | 2 +- .../host/file-management/share/index.vue | 4 +- .../file-management/text-preview/index.vue | 2 +- .../host/firewall/advance/operate/index.vue | 3 +- .../src/views/host/firewall/forward/index.vue | 4 +- .../host/firewall/forward/operate/index.vue | 4 +- frontend/src/views/host/firewall/ip/index.vue | 4 +- .../views/host/firewall/ip/operate/index.vue | 4 +- .../src/views/host/firewall/port/index.vue | 4 +- .../host/firewall/port/operate/index.vue | 4 +- .../src/views/host/monitor/monitor/index.vue | 3 +- .../src/views/host/monitor/setting/index.vue | 3 +- .../host/monitor/setting/interval/index.vue | 3 +- frontend/src/views/host/ssh/log/log.vue | 3 +- .../src/views/host/ssh/ssh/address/index.vue | 3 +- .../host/ssh/ssh/certification/index.vue | 2 +- .../ssh/ssh/certification/operate/index.vue | 2 +- frontend/src/views/log/login/index.vue | 2 +- frontend/src/views/log/operation/index.vue | 2 +- frontend/src/views/log/task/index.vue | 2 +- .../src/views/login/components/login-form.vue | 2 +- frontend/src/views/login/index.vue | 3 +- .../views/setting/alert/dash/task/index.vue | 3 +- .../src/views/setting/alert/log/index.vue | 2 +- .../views/setting/backup-account/index.vue | 2 +- .../setting/backup-account/operate/index.vue | 4 +- frontend/src/views/setting/license/index.vue | 2 +- .../setting/panel/api-interface/index.vue | 2 +- .../views/setting/panel/hidemenu/index.vue | 2 +- .../views/setting/panel/systemip/index.vue | 3 +- .../src/views/setting/safe/allowips/index.vue | 3 +- .../src/views/setting/safe/entrance/index.vue | 2 +- .../src/views/setting/safe/passkey/index.vue | 3 +- frontend/src/views/setting/safe/ssl/index.vue | 3 +- .../views/setting/snapshot/create/index.vue | 4 +- frontend/src/views/setting/snapshot/index.vue | 4 +- .../views/setting/snapshot/recover/index.vue | 4 +- .../views/setting/snapshot/status/index.vue | 3 +- frontend/src/views/share/index.vue | 3 +- frontend/src/views/terminal/command/index.vue | 3 +- .../src/views/toolbox/clam/operate/index.vue | 3 +- .../src/views/toolbox/clam/record/index.vue | 2 +- frontend/src/views/toolbox/clean/index.vue | 2 +- frontend/src/views/toolbox/device/index.vue | 2 +- .../src/views/toolbox/device/swap/index.vue | 3 +- .../views/toolbox/fail2ban/ban-time/index.vue | 3 +- .../toolbox/fail2ban/find-time/index.vue | 3 +- frontend/src/views/toolbox/fail2ban/index.vue | 2 +- .../src/views/toolbox/fail2ban/ips/index.vue | 3 +- frontend/src/views/toolbox/ftp/index.vue | 3 +- frontend/src/views/toolbox/ftp/log/index.vue | 2 +- .../src/views/toolbox/ftp/operate/index.vue | 4 +- .../views/website/runtime/dotnet/index.vue | 2 +- .../src/views/website/runtime/go/index.vue | 2 +- .../src/views/website/runtime/java/index.vue | 2 +- .../src/views/website/runtime/node/index.vue | 2 +- .../website/runtime/php/create/index.vue | 2 +- .../php/extension-management/index.vue | 2 +- .../src/views/website/runtime/php/index.vue | 3 +- .../views/website/runtime/python/index.vue | 2 +- .../views/website/ssl/acme-account/index.vue | 2 +- frontend/src/views/website/ssl/ca/index.vue | 3 +- .../src/views/website/ssl/create/index.vue | 2 +- .../src/views/website/ssl/detail/index.vue | 4 +- .../views/website/ssl/dns-account/index.vue | 3 +- frontend/src/views/website/ssl/index.vue | 3 +- .../website/components/https/index.vue | 3 +- .../website/components/website-ssl/index.vue | 3 +- .../config/basic/auth-basic/create/index.vue | 3 +- .../website/config/basic/domain/index.vue | 2 +- .../config/basic/php/composer/index.vue | 2 +- .../config/basic/proxy/create/index.vue | 2 +- .../views/website/website/create/index.vue | 6 +- .../views/website/website/domain/index.vue | 3 +- frontend/src/views/website/website/index.vue | 3 +- .../website/nginx/module/build/index.vue | 2 +- .../views/website/website/status/index.vue | 2 +- 221 files changed, 2740 insertions(+), 1291 deletions(-) create mode 100644 frontend/src/components/fu/FuInputRwSwitch.vue create mode 100644 frontend/src/components/fu/FuReadWriteSwitch.vue create mode 100644 frontend/src/components/fu/FuSelectRwSwitch.vue create mode 100644 frontend/src/components/fu/FuStep.ts create mode 100644 frontend/src/components/fu/FuSteps.ts create mode 100644 frontend/src/components/fu/FuTable.ts create mode 100644 frontend/src/components/fu/FuTableColumnSelect.vue create mode 100644 frontend/src/components/fu/FuTableOperations.vue create mode 100644 frontend/src/components/fu/FuTablePagination.vue create mode 100644 frontend/src/components/fu/__compat-smoke__.ts create mode 100644 frontend/src/components/fu/index.ts create mode 100644 frontend/src/components/fu/shared.ts create mode 100644 frontend/src/lang/fu.ts create mode 100644 frontend/src/styles/fu.scss create mode 100644 frontend/src/utils/app-store.ts create mode 100644 frontend/src/utils/auth.ts create mode 100644 frontend/src/utils/browser.ts create mode 100644 frontend/src/utils/clipboard.ts create mode 100644 frontend/src/utils/date.ts create mode 100644 frontend/src/utils/file.ts create mode 100644 frontend/src/utils/id.ts create mode 100644 frontend/src/utils/misc.ts create mode 100644 frontend/src/utils/size.ts create mode 100644 frontend/src/utils/ssl.ts delete mode 100644 frontend/src/utils/util.ts create mode 100644 frontend/src/utils/validate.ts diff --git a/frontend/package.json b/frontend/package.json index fea747ce8..a42c31327 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,8 @@ "dev": "node --max-old-space-size=8192 ./node_modules/.bin/vite --host", "serve": "vite", "build:dev": "vite build --mode development", - "build:test": "vue-tsc --noEmit && vite build --mode test", + "type-check": "node --max-old-space-size=8192 ./node_modules/vue-tsc/bin/vue-tsc.js --noEmit", + "build:test": "npm run type-check && vite build --mode test", "build:pro": "vite build --mode production", "preview": "vite preview", "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", @@ -68,6 +69,7 @@ "@vitejs/plugin-vue-jsx": "^5.1.1", "autoprefixer": "^10.4.7", "commitizen": "^4.2.4", + "esbuild": "^0.27.3", "eslint": "^8.57.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-prettier": "^4.2.1", @@ -88,7 +90,6 @@ "vite-plugin-compression": "^0.5.1", "vite-plugin-eslint2": "^5.0.3", "vite-plugin-html": "^3.2.2", - "vite-plugin-monaco-editor": "^1.1.0", "vite-plugin-vue-setup-extend": "^0.4.0", "vite-svg-loader": "^5.1.0", "vue-tsc": "^0.29.8" diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 637b730a1..7aeb6cef6 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -8,8 +8,7 @@ import { MsgError } from '@/utils/message'; import { Base64 } from 'js-base64'; import i18n from '@/lang'; import { changeToLocal } from '@/utils/node'; -import { getCookie } from '@/utils/util'; - +import { getCookie } from '@/utils/auth'; const globalStore = GlobalStore(); const config = { diff --git a/frontend/src/api/modules/alert.ts b/frontend/src/api/modules/alert.ts index 29c2b7600..7b26886f9 100644 --- a/frontend/src/api/modules/alert.ts +++ b/frontend/src/api/modules/alert.ts @@ -1,8 +1,7 @@ import http from '@/api'; import { ResPage } from '@/api/interface'; import { Alert } from '../interface/alert'; -import { deepCopy } from '@/utils/util'; - +import { deepCopy } from '@/utils/misc'; export const SearchAlerts = (req: Alert.AlertSearch) => { return http.post>(`/alert/search`, req); }; diff --git a/frontend/src/api/modules/backup.ts b/frontend/src/api/modules/backup.ts index 6a306be49..553aa1d9e 100644 --- a/frontend/src/api/modules/backup.ts +++ b/frontend/src/api/modules/backup.ts @@ -1,5 +1,5 @@ import http from '@/api'; -import { deepCopy } from '@/utils/util'; +import { deepCopy } from '@/utils/misc'; import { Base64 } from 'js-base64'; import { ResPage } from '../interface'; import { Backup } from '../interface/backup'; diff --git a/frontend/src/api/modules/database.ts b/frontend/src/api/modules/database.ts index 3dbd356d7..0cfe47950 100644 --- a/frontend/src/api/modules/database.ts +++ b/frontend/src/api/modules/database.ts @@ -1,5 +1,5 @@ import http from '@/api'; -import { deepCopy } from '@/utils/util'; +import { deepCopy } from '@/utils/misc'; import { Base64 } from 'js-base64'; import { ResPage, DescriptionUpdate } from '../interface'; import { Database } from '../interface/database'; diff --git a/frontend/src/api/modules/host.ts b/frontend/src/api/modules/host.ts index e7ac21a05..a79096d64 100644 --- a/frontend/src/api/modules/host.ts +++ b/frontend/src/api/modules/host.ts @@ -2,7 +2,7 @@ import http from '@/api'; import { ResPage, ReqPage } from '../interface'; import { Host } from '../interface/host'; import { TimeoutEnum } from '@/enums/http-enum'; -import { deepCopy } from '@/utils/util'; +import { deepCopy } from '@/utils/misc'; import { Base64 } from 'js-base64'; // firewall diff --git a/frontend/src/api/modules/setting.ts b/frontend/src/api/modules/setting.ts index df2e1651d..4d1481fd8 100644 --- a/frontend/src/api/modules/setting.ts +++ b/frontend/src/api/modules/setting.ts @@ -1,5 +1,5 @@ import http from '@/api'; -import { deepCopy } from '@/utils/util'; +import { deepCopy } from '@/utils/misc'; import { Base64 } from 'js-base64'; import { ResPage, SearchWithPage, DescriptionUpdate, ReqPage } from '../interface'; import { Setting } from '../interface/setting'; diff --git a/frontend/src/api/modules/terminal.ts b/frontend/src/api/modules/terminal.ts index 428188828..7d95071f8 100644 --- a/frontend/src/api/modules/terminal.ts +++ b/frontend/src/api/modules/terminal.ts @@ -2,8 +2,7 @@ import http from '@/api'; import { ResPage } from '../interface'; import { Host } from '../interface/host'; import { Base64 } from 'js-base64'; -import { deepCopy } from '@/utils/util'; - +import { deepCopy } from '@/utils/misc'; export const searchHosts = (params: Host.SearchWithPage) => { return http.postLocalNode>(`/hosts/search`, params); }; diff --git a/frontend/src/api/modules/toolbox.ts b/frontend/src/api/modules/toolbox.ts index 3eb174427..d4156ed39 100644 --- a/frontend/src/api/modules/toolbox.ts +++ b/frontend/src/api/modules/toolbox.ts @@ -3,8 +3,7 @@ import { ReqPage, ResPage, UpdateByFile } from '../interface'; import { Toolbox } from '../interface/toolbox'; import { Base64 } from 'js-base64'; import { TimeoutEnum } from '@/enums/http-enum'; -import { deepCopy } from '@/utils/util'; - +import { deepCopy } from '@/utils/misc'; // device export const getDeviceBase = () => { return http.post(`/toolbox/device/base`, {}, TimeoutEnum.T_60S); diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index 860ec860d..08de4f23a 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -3,7 +3,7 @@ import { ReqPage, ResPage } from '../interface'; import { Website } from '../interface/website'; import { File } from '../interface/file'; import { TimeoutEnum } from '@/enums/http-enum'; -import { deepCopy } from '@/utils/util'; +import { deepCopy } from '@/utils/misc'; import { Base64 } from 'js-base64'; export const searchWebsites = (req: Website.WebSiteSearch, node?: string) => { diff --git a/frontend/src/components/backup/index.vue b/frontend/src/components/backup/index.vue index d684d2ed8..7f834f7cf 100644 --- a/frontend/src/components/backup/index.vue +++ b/frontend/src/components/backup/index.vue @@ -173,7 +173,11 @@