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;