From d1bf90d5fd95814819402e08b3f0a93fc994697b Mon Sep 17 00:00:00 2001 From: Zyy Date: Sat, 26 Sep 2026 19:30:59 +0800 Subject: [PATCH] fix(frontend): support HTTP plugin pages and consolidate shared helpers Reuse secure UUID generation for plugin frame channels and sessions on HTTP. Consolidate utility modules and shorten the plugin views store name. Declare route roles and default entries in metadata instead of guard mappings. Keep source integration build output under node_modules/.vite. Validated frontend lint, production and source builds, browser plugin flows, and 20 route guard scenarios with simulated sessions and plugin resources. Fixes #288 Co-authored-by: Codex --- .gitignore | 1 - docs/development.md | 2 +- frontend/src/components/ApiKeyConfigModal.vue | 6 +- frontend/src/components/LastUsedAtCell.vue | 2 +- frontend/src/components/SchemaForm/index.vue | 2 +- frontend/src/components/SchemaForm/schema.ts | 2 +- frontend/src/components/charts/tooltip.ts | 2 +- .../client-profile/ClientProfileEditor.vue | 2 +- .../ClientProfilePreviewPanel.vue | 2 +- .../client-profile/XaiClientProfileEditor.vue | 2 +- frontend/src/composables/useAsyncAction.ts | 2 +- frontend/src/composables/useCopyText.ts | 2 +- frontend/src/composables/useRequestState.ts | 2 +- frontend/src/layout/components/AppSidebar.vue | 4 +- .../components/SystemUpdateModal/index.vue | 4 +- frontend/src/router/index.ts | 34 +++++++--- frontend/src/router/routes.ts | 12 ++++ ...in-management-views.ts => plugin-views.ts} | 6 +- frontend/src/stores/modules/system-update.ts | 2 +- .../utils/{ccswitchImport.ts => client.ts} | 64 +++++++++++++++++-- frontend/src/utils/codexConfig.ts | 44 ------------- frontend/src/utils/data.ts | 45 +++++++++++++ frontend/src/utils/{date.ts => format.ts} | 40 ++++++++++++ frontend/src/utils/jsonObject.ts | 26 -------- frontend/src/utils/number.ts | 39 ----------- frontend/src/utils/object.ts | 3 - frontend/src/utils/{async.ts => operation.ts} | 9 +++ frontend/src/utils/request-location.ts | 16 ----- frontend/src/utils/serviceUrl.ts | 14 ---- frontend/src/utils/uuid.ts | 8 --- .../components/AccountOverviewCards.vue | 2 +- .../AccountProfileModal/ActivityInsights.vue | 2 +- .../AccountProfileModal/Metrics.vue | 2 +- .../AccountProfileModal/Subscription.vue | 2 +- .../AccountStatusBadge/presenter.ts | 2 +- .../AccountUsageWindow/presenter.ts | 4 +- .../composables/useAccountAuthorization.ts | 2 +- .../composables/useAccountConnectionTest.ts | 4 +- .../composables/useAccountImportTasks.ts | 2 +- .../composables/useAccountMutations.ts | 2 +- .../composables/useAccountOnboarding.ts | 3 +- .../composables/useAccountResetCredits.ts | 3 +- .../src/views/accounts/utils/accountImport.ts | 2 +- .../utils/accountProfileStatistics.ts | 2 +- .../components/AccountOverviewCard.vue | 2 +- .../dashboard/components/WireProfileCard.vue | 2 +- .../dashboard/composables/useDashboard.ts | 5 +- frontend/src/views/dashboard/constants.ts | 2 +- .../groups/composables/useAccountGroups.ts | 4 +- .../key-usage/components/KeyUsageSummary.vue | 2 +- .../key-usage/components/KeyUsageTrend.vue | 2 +- .../key-usage/composables/useKeyConfig.ts | 2 +- frontend/src/views/key-usage/utils/format.ts | 2 +- .../keys/components/ApiKeyBudgetCell.vue | 2 +- .../views/keys/composables/useApiKeyUse.ts | 3 +- .../views/keys/composables/useApiKeysQuery.ts | 2 +- .../components/PluginConfigurationFields.vue | 2 +- .../PluginFrontendAuthenticationEditor.vue | 2 +- .../components/PluginManagementFrame.vue | 6 +- .../views/plugins/components/PluginPage.vue | 4 +- .../components/PluginResourcePicker.vue | 2 +- .../composables/usePluginManagement.ts | 6 +- frontend/src/views/proxies/index.vue | 4 +- .../components/backup/BackupRecordsCard.vue | 2 +- .../ClientDesktopOfflineDownloads.vue | 2 +- .../composables/useClientDownloads.ts | 2 +- .../settings/composables/useBackupRecords.ts | 2 +- .../settings/composables/useBackupSettings.ts | 2 +- .../settings/composables/useSettingsForm.ts | 4 +- .../src/views/settings/pricing/usePricing.ts | 2 +- .../views/usage/components/UsageCostCard.vue | 2 +- .../usage/components/UsageDiagnosticCard.vue | 2 +- .../usage/components/UsageHealthCard.vue | 2 +- .../usage/components/UsagePerformanceCard.vue | 2 +- .../usage/composables/useOpsErrorsTable.ts | 2 +- .../composables/useRequestDiagnostics.ts | 2 +- .../usage/composables/useUsageRecordsTable.ts | 2 +- frontend/src/views/usage/utils/format.ts | 2 +- frontend/src/views/usage/utils/records.ts | 2 +- frontend/vite.config.ts | 2 +- 80 files changed, 270 insertions(+), 255 deletions(-) rename frontend/src/stores/modules/{plugin-management-views.ts => plugin-views.ts} (91%) rename frontend/src/utils/{ccswitchImport.ts => client.ts} (57%) delete mode 100644 frontend/src/utils/codexConfig.ts create mode 100644 frontend/src/utils/data.ts rename frontend/src/utils/{date.ts => format.ts} (62%) delete mode 100644 frontend/src/utils/jsonObject.ts delete mode 100644 frontend/src/utils/number.ts delete mode 100644 frontend/src/utils/object.ts rename frontend/src/utils/{async.ts => operation.ts} (62%) delete mode 100644 frontend/src/utils/request-location.ts delete mode 100644 frontend/src/utils/serviceUrl.ts delete mode 100644 frontend/src/utils/uuid.ts diff --git a/.gitignore b/.gitignore index 58d9bc8e9..a13f02972 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ # Frontend /frontend/node_modules/ /frontend/dist/ -/frontend/.vite/ /frontend/.pnpm-store/ /frontend/.pnpm-cache/ *.tsbuildinfo diff --git a/docs/development.md b/docs/development.md index 2f9fa5717..66661d544 100644 --- a/docs/development.md +++ b/docs/development.md @@ -48,7 +48,7 @@ pnpm --dir frontend build:source pnpm --dir modules/plugins/examples/workbench/frontend build:source ``` -`build:source` 用各项目的 `tsconfig.source.json` 检查源码类型,再构建到各自 `.vite/source-dist`,不改写正式依赖、锁文件或 `dist`。正常 `dev`、`build`、宿主发行 CI 和 Docker 仍消费锁定的 UI 包,无需初始化子模块。CI 另有源码联调检查,显式检出子模块、核对 UI 提交锁定并验证这两个命令。 +`build:source` 用各项目的 `tsconfig.source.json` 检查源码类型,管理端构建到 `frontend/node_modules/.vite/source-dist`,示例构建到其前端项目的 `.vite/source-dist`,不改写正式依赖、锁文件或 `dist`。正常 `dev`、`build`、宿主发行 CI 和 Docker 仍消费锁定的 UI 包,无需初始化子模块。CI 另有源码联调检查,显式检出子模块、核对 UI 提交锁定并验证这两个命令。 ### 本地 SDK 验证 diff --git a/frontend/src/components/ApiKeyConfigModal.vue b/frontend/src/components/ApiKeyConfigModal.vue index a72e1d49e..be16578e6 100644 --- a/frontend/src/components/ApiKeyConfigModal.vue +++ b/frontend/src/components/ApiKeyConfigModal.vue @@ -3,11 +3,7 @@ import { BaseButton, BaseIconButton, BaseModal, BaseScrollbar, BaseSegmented, Ba import { Apple, Copy, Monitor, Upload } from '@lucide/vue' import { computed, shallowRef } from 'vue' -import { buildCodexCcSwitchImportDeeplink } from '@/utils/ccswitchImport' -import { - buildCodexConfigFiles, - CODEX_WEBSOCKET_ENABLED_BY_DEFAULT, -} from '@/utils/codexConfig' +import { buildCodexCcSwitchImportDeeplink, buildCodexConfigFiles, CODEX_WEBSOCKET_ENABLED_BY_DEFAULT } from '@/utils/client' const props = withDefaults(defineProps<{ title?: string diff --git a/frontend/src/components/LastUsedAtCell.vue b/frontend/src/components/LastUsedAtCell.vue index efff7ee20..4f9230f96 100644 --- a/frontend/src/components/LastUsedAtCell.vue +++ b/frontend/src/components/LastUsedAtCell.vue @@ -2,7 +2,7 @@ import { computed } from 'vue' import { useUiClock } from '@/composables/useUiClock' -import { formatDateTime, formatRelativeTime } from '@/utils/date' +import { formatDateTime, formatRelativeTime } from '@/utils/format' const props = defineProps<{ value: string | null diff --git a/frontend/src/components/SchemaForm/index.vue b/frontend/src/components/SchemaForm/index.vue index 864525145..7fd277a1d 100644 --- a/frontend/src/components/SchemaForm/index.vue +++ b/frontend/src/components/SchemaForm/index.vue @@ -3,7 +3,7 @@ import type { InputField } from './schema' import { BaseForm, BaseFormItem, BaseIconButton, BaseInput, BasePopover, BaseSelect, BaseTextarea } from '@codex-proxy/ui' import { Braces, Info, List } from '@lucide/vue' import { computed, nextTick, shallowRef, useTemplateRef } from 'vue' -import { jsonObjectError, parseJsonObject } from '@/utils/jsonObject' +import { jsonObjectError, parseJsonObject } from '@/utils/data' import { inputFields } from './schema' const props = defineProps<{ diff --git a/frontend/src/components/SchemaForm/schema.ts b/frontend/src/components/SchemaForm/schema.ts index 1b4f8c6a4..dff594b01 100644 --- a/frontend/src/components/SchemaForm/schema.ts +++ b/frontend/src/components/SchemaForm/schema.ts @@ -1,4 +1,4 @@ -import { isRecord } from '@/utils/object' +import { isRecord } from '@/utils/data' export interface InputField { key: string diff --git a/frontend/src/components/charts/tooltip.ts b/frontend/src/components/charts/tooltip.ts index 9543e8202..af223891f 100644 --- a/frontend/src/components/charts/tooltip.ts +++ b/frontend/src/components/charts/tooltip.ts @@ -1,4 +1,4 @@ -import { isRecord } from '@/utils/object' +import { isRecord } from '@/utils/data' interface ChartTooltipTheme { surface: string diff --git a/frontend/src/components/client-profile/ClientProfileEditor.vue b/frontend/src/components/client-profile/ClientProfileEditor.vue index ab0b2758f..621d946ca 100644 --- a/frontend/src/components/client-profile/ClientProfileEditor.vue +++ b/frontend/src/components/client-profile/ClientProfileEditor.vue @@ -7,7 +7,7 @@ import type { import { BaseButton, BaseSegmented } from '@codex-proxy/ui' import { computed, onMounted, shallowRef, watch } from 'vue' import { getClientProfileOptions, previewClientProfile } from '@/api/modules/client-profiles' -import { errorMessage } from '@/utils/async' +import { errorMessage } from '@/utils/operation' import ClientProfilePresetFields from './ClientProfilePresetFields.vue' import ClientProfilePreviewPanel from './ClientProfilePreviewPanel.vue' diff --git a/frontend/src/components/client-profile/ClientProfilePreviewPanel.vue b/frontend/src/components/client-profile/ClientProfilePreviewPanel.vue index 6f5f0ee8f..c7cad6285 100644 --- a/frontend/src/components/client-profile/ClientProfilePreviewPanel.vue +++ b/frontend/src/components/client-profile/ClientProfilePreviewPanel.vue @@ -1,7 +1,7 @@