From 62ec2153401a6ff11a8ec3798ebe21aaf8b6c539 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Wed, 10 Dec 2025 13:35:00 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E4=BA=A7=E5=93=81=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 产品状态:从Directus Schema获取Product的Status字段 - 视图字段:添加Status字段用于标示产品状态 - 测试方法:为Status字段添加单元测试 --- server/mappers/productMapper.test.ts | 45 +++++++++++++++++++++------- server/mappers/productMapper.ts | 3 ++ shared/types/views/product-view.ts | 6 ++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/server/mappers/productMapper.test.ts b/server/mappers/productMapper.test.ts index 931e8af..d9831ef 100644 --- a/server/mappers/productMapper.test.ts +++ b/server/mappers/productMapper.test.ts @@ -456,21 +456,26 @@ describe('toProductDocumentView', () => { * 单元测试: toProductView */ describe('toProductView', () => { + const baseData: Product = { + id: 1, + status: 'in-production', + translations: [ + { + id: 1, + name: 'Product Name', + summary: 'Product Summary', + description: 'Product Description', + }, + ], + }; test('convert raw data to ProductView correctly', () => { const rawData: Product = { - id: 1, - translations: [ - { - id: 1, - name: 'Product Name', - summary: 'Product Summary', - description: 'Product Description', - }, - ], + ...baseData, }; expect(toProductView(rawData)).toEqual({ id: '1', + status: 'in-production', name: 'Product Name', summary: 'Product Summary', description: 'Product Description', @@ -483,12 +488,13 @@ describe('toProductView', () => { test('convert raw data with missing translations', () => { const rawData: Product = { - id: 1, + ...baseData, translations: [], }; expect(toProductView(rawData)).toEqual({ id: '1', + status: 'in-production', name: '', summary: '', description: '', @@ -498,4 +504,23 @@ describe('toProductView', () => { specs: [], }); }); + + test('conert raw data with missing status', () => { + const rawData: Product = { + ...baseData, + status: undefined, + }; + + expect(toProductView(rawData)).toEqual({ + id: '1', + status: 'discontinued', + name: 'Product Name', + summary: 'Product Summary', + description: 'Product Description', + images: [], + documents: [], + faqs: [], + specs: [], + }); + }); }); diff --git a/server/mappers/productMapper.ts b/server/mappers/productMapper.ts index 453b85a..0111141 100644 --- a/server/mappers/productMapper.ts +++ b/server/mappers/productMapper.ts @@ -219,6 +219,8 @@ export function toProductDocumentView( export function toProductView(raw: Product): ProductView { const trans = raw.translations?.[0]; + const status = raw.status ?? 'discontinued'; + const images = toProductImageView(raw.images ?? []); const specs = toProductSpecGroupView(raw.specs ?? []); @@ -229,6 +231,7 @@ export function toProductView(raw: Product): ProductView { return { id: raw.id.toString(), + status: status, name: trans?.name ?? '', summary: trans?.summary ?? '', images: images, diff --git a/shared/types/views/product-view.ts b/shared/types/views/product-view.ts index 0c2a08a..653e5c1 100644 --- a/shared/types/views/product-view.ts +++ b/shared/types/views/product-view.ts @@ -1,4 +1,7 @@ import type { DocumentTypeView } from './document-list-view'; +import type { Product } from '../directus/my-schema.ts'; + +type ProductStatus = Product['status']; /** * 产品图片视图模型 @@ -90,6 +93,9 @@ export interface ProductView { /** 唯一标识符 **/ id: string; + /** 产品状态 **/ + status: ProductStatus; + /** 产品名称 **/ name: string; From 783d482e0a18c64927d79613678285f73126383c Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Wed, 10 Dec 2025 14:00:05 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E4=BA=A7=E5=93=81/=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E6=96=B9=E6=A1=88=E5=88=97=E8=A1=A8=E9=A1=B5=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 页面描述:为产品列表与解决方案列表添加页面描述 - 停产提示:在产品列表中提示停产产品使用搜索功能 --- app/components/pages/products/ProductHeader.vue | 8 ++++++++ app/pages/products/index.vue | 15 +++++++++++++-- app/pages/solutions/index.vue | 13 +++++++++++-- i18n/locales/zh.json | 8 +++++--- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/app/components/pages/products/ProductHeader.vue b/app/components/pages/products/ProductHeader.vue index 8a48b13..1995dc5 100644 --- a/app/components/pages/products/ProductHeader.vue +++ b/app/components/pages/products/ProductHeader.vue @@ -38,6 +38,10 @@

{{ product.name }}

{{ product.summary }}

+

+ + {{ $t('product-discontinued-warning') }} +

@@ -105,6 +109,10 @@ margin-bottom: 2rem; } + .discontinued-warning { + color: var(--el-color-error); + } + @media (max-width: 768px) { .product-header { grid-template-columns: 1fr; diff --git a/app/pages/products/index.vue b/app/pages/products/index.vue index b8c9918..de3028f 100644 --- a/app/pages/products/index.vue +++ b/app/pages/products/index.vue @@ -1,7 +1,13 @@