From c79cedea4920128c6fee4e7b4a56c5d753f3904b Mon Sep 17 00:00:00 2001 From: tbphp Date: Thu, 6 Aug 2026 23:55:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor(models):=20=E9=87=8D=E6=9E=84=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=A1=B5=E9=9D=A2=E5=88=97=E8=A1=A8=E4=B8=8E=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把客户端模型改为单行账本列表,目录信息、价格范围与路由分组下沉到 可折叠详情,消除多套价格下重复渲染的模型元数据。 - 新增 ModelCollection / ModelDetailPanel / ModelCatalogFacts / ModelSummaryStrip 与 model-presenter,替换 ModelTree* 树状组件 - 目录元数据改为规格标签值加少量能力 chip,取代成排标签堆叠 - 上游层复用 catalog_summary 渲染一次目录信息,不再逐价格重复 - 概览改为指标卡片条,目录状态与未使用价格记录归入其中 - 价格单位说明由整块提示降级为页脚小字 --- .../model-prices/ModelPriceDrawer.vue | 4 +- web/src/features/models/ModelCatalogFacts.vue | 160 ++++++ web/src/features/models/ModelCollection.vue | 457 ++++++++++++++++ web/src/features/models/ModelDetailPanel.vue | 359 +++++++++++++ web/src/features/models/ModelSummaryStrip.vue | 183 +++++++ .../features/models/ModelTreeCollection.vue | 372 ------------- web/src/features/models/ModelTreePriceRow.vue | 501 ------------------ web/src/features/models/ModelsView.vue | 126 +---- web/src/features/models/model-presenter.ts | 116 ++++ web/src/i18n/locales/en-US/models.ts | 83 +-- web/src/i18n/locales/ja-JP/models.ts | 83 +-- web/src/i18n/locales/zh-CN/models.ts | 85 +-- 12 files changed, 1422 insertions(+), 1107 deletions(-) create mode 100644 web/src/features/models/ModelCatalogFacts.vue create mode 100644 web/src/features/models/ModelCollection.vue create mode 100644 web/src/features/models/ModelDetailPanel.vue create mode 100644 web/src/features/models/ModelSummaryStrip.vue delete mode 100644 web/src/features/models/ModelTreeCollection.vue delete mode 100644 web/src/features/models/ModelTreePriceRow.vue create mode 100644 web/src/features/models/model-presenter.ts diff --git a/web/src/features/model-prices/ModelPriceDrawer.vue b/web/src/features/model-prices/ModelPriceDrawer.vue index 8ddbe157..17b7d198 100644 --- a/web/src/features/model-prices/ModelPriceDrawer.vue +++ b/web/src/features/model-prices/ModelPriceDrawer.vue @@ -235,7 +235,9 @@ onBeforeUnmount(clearRequest)
  • {{ group.name }} - {{ group.enabled ? t('models.tree.groupEnabled') : t('models.tree.groupDisabled') }} + {{ + group.enabled ? t('models.detail.groupEnabled') : t('models.detail.groupDisabled') + }}
  • diff --git a/web/src/features/models/ModelCatalogFacts.vue b/web/src/features/models/ModelCatalogFacts.vue new file mode 100644 index 00000000..077c7f54 --- /dev/null +++ b/web/src/features/models/ModelCatalogFacts.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/web/src/features/models/ModelCollection.vue b/web/src/features/models/ModelCollection.vue new file mode 100644 index 00000000..ae8e8172 --- /dev/null +++ b/web/src/features/models/ModelCollection.vue @@ -0,0 +1,457 @@ + + + + + diff --git a/web/src/features/models/ModelDetailPanel.vue b/web/src/features/models/ModelDetailPanel.vue new file mode 100644 index 00000000..b0ca775a --- /dev/null +++ b/web/src/features/models/ModelDetailPanel.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/web/src/features/models/ModelSummaryStrip.vue b/web/src/features/models/ModelSummaryStrip.vue new file mode 100644 index 00000000..b2ff23ea --- /dev/null +++ b/web/src/features/models/ModelSummaryStrip.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/web/src/features/models/ModelTreeCollection.vue b/web/src/features/models/ModelTreeCollection.vue deleted file mode 100644 index aa42a827..00000000 --- a/web/src/features/models/ModelTreeCollection.vue +++ /dev/null @@ -1,372 +0,0 @@ - - - - - diff --git a/web/src/features/models/ModelTreePriceRow.vue b/web/src/features/models/ModelTreePriceRow.vue deleted file mode 100644 index 39c4080d..00000000 --- a/web/src/features/models/ModelTreePriceRow.vue +++ /dev/null @@ -1,501 +0,0 @@ - - - - - diff --git a/web/src/features/models/ModelsView.vue b/web/src/features/models/ModelsView.vue index 8ccc319d..1ce77379 100644 --- a/web/src/features/models/ModelsView.vue +++ b/web/src/features/models/ModelsView.vue @@ -21,7 +21,6 @@ import CollectionFilterBar from '@/components/collection/CollectionFilterBar.vue import LedgerSheet from '@/components/layout/LedgerSheet.vue' import PageFrame from '@/components/layout/PageFrame.vue' import AppButton from '@/components/ui/AppButton.vue' -import AppDateTime from '@/components/ui/AppDateTime.vue' import AppSearchInput from '@/components/ui/AppSearchInput.vue' import AppSelect from '@/components/ui/AppSelect.vue' import EmptyState from '@/components/ui/EmptyState.vue' @@ -29,13 +28,13 @@ import InlineFeedback from '@/components/ui/InlineFeedback.vue' import PageHeader from '@/components/ui/PageHeader.vue' import PaginationBar from '@/components/ui/PaginationBar.vue' import QueryFeedback from '@/components/ui/QueryFeedback.vue' -import StatusBadge from '@/components/ui/StatusBadge.vue' import ModelPriceDrawer from '@/features/model-prices/ModelPriceDrawer.vue' -import ModelTreeCollection from './ModelTreeCollection.vue' +import ModelCollection from './ModelCollection.vue' +import ModelSummaryStrip from './ModelSummaryStrip.vue' const client = useApiClient() -const { locale, n, t } = useI18n() +const { n, t } = useI18n() const searchDraft = ref('') const appliedSearch = ref() const groupStatus = ref('enabled') @@ -81,14 +80,6 @@ const pricingStatusOptions = computed(() => label: t(`models.filters.pricingStatus.${value}`), })), ) -const catalogTone = computed(() => { - if (!data.value?.catalog.available) return 'neutral' as const - return data.value.catalog.error_code ? ('warning' as const) : ('success' as const) -}) -const catalogLabel = computed(() => { - if (!data.value?.catalog.available) return t('models.catalog.unavailable') - return data.value.catalog.error_code ? t('models.catalog.stale') : t('models.catalog.available') -}) watch( [() => data.value?.pagination.total_pages, page, () => modelsQuery.isPlaceholderData.value], @@ -140,8 +131,8 @@ function resetConditions(): void { page.value = 1 } -function editScope(scope: ModelPriceBranchDto, trigger: HTMLElement): void { - selected.value = scope +function editBranch(branch: ModelPriceBranchDto, trigger: HTMLElement): void { + selected.value = branch restoreFocus = trigger drawerOpen.value = true } @@ -211,46 +202,7 @@ onBeforeUnmount(() => searchDebounce.cancel()) @retry="modelsQuery.refetch()" /> - - {{ t('models.context') }} - - -
    -
    -
    -
    {{ t('models.summary.clientModels') }}
    -
    {{ n(data.summary.client_model_count) }}
    -
    -
    -
    {{ t('models.summary.upstreamModels') }}
    -
    {{ n(data.summary.upstream_model_count) }}
    -
    -
    -
    {{ t('models.summary.prices') }}
    -
    {{ n(data.summary.price_count) }}
    -
    -
    -
    {{ t('models.summary.pendingPrices') }}
    -
    {{ n(data.summary.pending_price_count) }}
    -
    -
    -
    {{ t('models.summary.unreferencedPrices') }}
    -
    {{ n(data.summary.unreferenced_price_count) }}
    -
    -
    -
    - {{ catalogLabel }} - - {{ t('models.catalog.lastSuccess') }} - - - - {{ t('models.catalog.lastCheck') }} - - - {{ data.catalog.error_code }} -
    -
    + searchDebounce.cancel()) />