From f1398a55457e8e6dc71374f5a6a276109a6f76d8 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Fri, 5 Dec 2025 16:49:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E6=90=9C=E7=B4=A2=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E6=B7=BB=E5=8A=A0=E7=BB=86=E5=88=86=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 类型细分:有原先的四大分类添加细分类型,例如产品(原纸分切机) - 接口调整:原先的type分类改为sectionType并将type作为细分类型使用 --- .../pages/search/SearchResultCard.vue | 5 ++++- app/components/pages/search/SearchResults.vue | 17 ++++++++++------- app/components/pages/search/SearchTabs.vue | 2 +- server/utils/search-converters.test.ts | 18 ++++++++++++------ server/utils/search-converters.ts | 18 ++++++++++-------- shared/types/meilisearch/meili-index.ts | 6 ++++++ shared/types/views/search-item-view.ts | 7 +++++-- 7 files changed, 48 insertions(+), 25 deletions(-) diff --git a/app/components/pages/search/SearchResultCard.vue b/app/components/pages/search/SearchResultCard.vue index 3aa76a3..02be23c 100644 --- a/app/components/pages/search/SearchResultCard.vue +++ b/app/components/pages/search/SearchResultCard.vue @@ -6,9 +6,12 @@

{{ item.summary }}

-

+

{{ $t('search.section') }}: {{ typeLabel }} + ({{ item.type }})

diff --git a/app/components/pages/search/SearchResults.vue b/app/components/pages/search/SearchResults.vue index 1cde91c..0414f7b 100644 --- a/app/components/pages/search/SearchResults.vue +++ b/app/components/pages/search/SearchResults.vue @@ -3,10 +3,13 @@
- +
@@ -63,7 +66,7 @@ const items = props.searchItems; const filteredHits = computed(() => { if (props.category) { - return items.filter((item) => item.type === props.category); + return items.filter((item) => item.sectionType === props.category); } else { return items; } @@ -107,19 +110,19 @@ const slug = String(slugCandidate); - if (item.type === 'product') { + if (item.sectionType === 'product') { return localePath({ path: `/products/${slug}` }); } - if (item.type === 'solution') { + if (item.sectionType === 'solution') { return localePath({ path: `/solutions/${slug}` }); } - if (item.type === 'document') { + if (item.sectionType === 'document') { return localePath({ path: `/download/${slug}` }); } - if (item.type === 'question') { + if (item.sectionType === 'question') { return localePath({ path: `/support/faq`, query: { focus: slug } }); } diff --git a/app/components/pages/search/SearchTabs.vue b/app/components/pages/search/SearchTabs.vue index 6ed3e25..1d9e4b5 100644 --- a/app/components/pages/search/SearchTabs.vue +++ b/app/components/pages/search/SearchTabs.vue @@ -32,7 +32,7 @@ const resultCount = computed(() => { const map: Record = { all: props.searchItems.length }; for (const item of props.searchItems) { - map[item.type] = (map[item.type] ?? 0) + 1; + map[item.sectionType] = (map[item.sectionType] ?? 0) + 1; } return map; }); diff --git a/server/utils/search-converters.test.ts b/server/utils/search-converters.test.ts index a90c33d..db52eeb 100644 --- a/server/utils/search-converters.test.ts +++ b/server/utils/search-converters.test.ts @@ -17,9 +17,10 @@ describe('converters', () => { const result = converters.products(item); expect(result).toEqual({ id: 1, - type: 'product', + sectionType: 'product', title: 'Hydraulic Pump', summary: 'High efficiency', + type: 'pump', thumbnail: '/api/assets/rand-om__-uuid-1234', }); }); @@ -36,9 +37,10 @@ describe('converters', () => { const result = converters.solutions(item); expect(result).toEqual({ id: 1, - type: 'solution', + sectionType: 'solution', title: 'Solution A', summary: 'Effective solution', + type: 'Type A', thumbnail: '/api/assets/rand-om__-uuid-5678', }); }); @@ -51,13 +53,15 @@ describe('converters', () => { 'This is a detailed explanation of how to use the product effectively.', products: ['Product A'], product_types: ['Type A'], + type: 'Question Type', }; const result = converters.questions(item); expect(result).toEqual({ id: 1, title: 'How to use product?', - summary: '', - type: 'question', + summary: undefined, + type: 'Question Type', + sectionType: 'question', }); }); @@ -68,13 +72,15 @@ describe('converters', () => { products: ['Product A'], product_types: ['Type A'], fileUUID: 'TEST-UUID', + type: 'manual', }; const result = converters.product_documents(item); expect(result).toEqual({ id: 'TEST-UUID', title: 'User Manual', - summary: '', - type: 'document', + summary: undefined, + sectionType: 'document', + type: 'manual', }); }); }); diff --git a/server/utils/search-converters.ts b/server/utils/search-converters.ts index c334131..6560048 100644 --- a/server/utils/search-converters.ts +++ b/server/utils/search-converters.ts @@ -6,33 +6,35 @@ export const converters: { } = { products: (item: MeiliIndexMap['products']): SearchItemView => ({ id: item.id, - type: 'product', + sectionType: 'product', title: item.name, - summary: item?.summary ?? '', + summary: item?.summary, + type: item?.type, thumbnail: item?.cover ? `/api/assets/${item.cover}` : undefined, }), solutions: (item: MeiliIndexMap['solutions']): SearchItemView => ({ id: item.id, - type: 'solution', + sectionType: 'solution', title: item.title, - summary: item?.summary ?? '', + summary: item?.summary, + type: item?.type, thumbnail: item?.cover ? `/api/assets/${item.cover}` : undefined, }), questions: (item: MeiliIndexMap['questions']): SearchItemView => ({ id: item.id, - type: 'question', + sectionType: 'question', title: item.title, - summary: '', + type: item?.type, }), product_documents: ( item: MeiliIndexMap['product_documents'] ): SearchItemView => ({ id: item.fileUUID || item.id, - type: 'document', + sectionType: 'document', title: item.title, - summary: '', + type: item?.type, }), }; diff --git a/shared/types/meilisearch/meili-index.ts b/shared/types/meilisearch/meili-index.ts index 9555b64..3b6e93d 100644 --- a/shared/types/meilisearch/meili-index.ts +++ b/shared/types/meilisearch/meili-index.ts @@ -57,6 +57,9 @@ export interface MeiliQuestionIndex { /** 问题内容 **/ content?: string; + /** 问题类型 **/ + type?: string; + /** 相关产品 **/ products: string[]; @@ -74,6 +77,9 @@ export interface MeiliProductDocumentIndex { /** 文档标题 **/ title: string; + /** 文档类型 **/ + type?: string; + /** 相关产品 **/ products: string[]; diff --git a/shared/types/views/search-item-view.ts b/shared/types/views/search-item-view.ts index 594caed..1910a03 100644 --- a/shared/types/views/search-item-view.ts +++ b/shared/types/views/search-item-view.ts @@ -3,13 +3,16 @@ export interface SearchItemView { id: number | string; /** 条目类型 **/ - type: 'product' | 'solution' | 'question' | 'document'; + sectionType: 'product' | 'solution' | 'question' | 'document'; /** 条目标题 **/ title: string; /** 条目摘要 **/ - summary: string; + summary?: string; + + /** 条目分类 **/ + type?: string; /** 条目预览图 **/ thumbnail?: string;