From 05938550e6a6b172a65846eccb99bac142ddf7ba Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Mon, 20 Oct 2025 15:07:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=86=E9=A6=96=E9=A1=B5=E7=94=B1Str?= =?UTF-8?q?api=E8=BF=81=E7=A7=BB=E8=87=B3Directus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 相关路由界面修改 - 增添响应的视图模型与转换方法 --- app/composables/directus/index.ts | 1 + app/composables/directus/useHomepage.ts | 54 +++++++++++++++++++ app/models/mappers/homepageMapper.ts | 51 ++++++++++++++++++ app/models/views/HomepageView.ts | 50 +++++++++++++++++ app/pages/index.vue | 71 +++++++++---------------- 5 files changed, 182 insertions(+), 45 deletions(-) create mode 100644 app/composables/directus/useHomepage.ts create mode 100644 app/models/mappers/homepageMapper.ts create mode 100644 app/models/views/HomepageView.ts diff --git a/app/composables/directus/index.ts b/app/composables/directus/index.ts index 96113b0..8593c2e 100644 --- a/app/composables/directus/index.ts +++ b/app/composables/directus/index.ts @@ -8,3 +8,4 @@ export * from './useQuestionList'; export * from './useDocumentList'; export * from './useContactInfo'; export * from './useCompanyProfile'; +export * from './useHomepage'; diff --git a/app/composables/directus/useHomepage.ts b/app/composables/directus/useHomepage.ts new file mode 100644 index 0000000..01da60c --- /dev/null +++ b/app/composables/directus/useHomepage.ts @@ -0,0 +1,54 @@ +import { readSingleton } from '@directus/sdk'; + +export const useHomepage = () => { + const { $directus } = useNuxtApp(); + const { getDirectusLocale } = useLocalizations(); + const locale = getDirectusLocale(); + + return useAsyncData(`homepage-${locale}`, async () => { + return await $directus.request( + readSingleton('homepage', { + fields: [ + 'id', + { + carousel: ['id', 'directus_files_id'], + }, + { + recommend_products: [ + 'id', + { + translations: ['id', 'name', 'summary'], + }, + 'cover', + ], + }, + { + recommend_solutions: [ + 'id', + { + translations: ['id', 'title', 'summary'], + }, + 'cover', + ], + }, + ], + deep: { + recommend_products: { + translations: { + _filter: { + languages_code: { _eq: locale }, + }, + }, + }, + recommend_solutions: { + translations: { + _filter: { + languages_code: { _eq: locale }, + }, + }, + }, + }, + }) + ); + }); +}; diff --git a/app/models/mappers/homepageMapper.ts b/app/models/mappers/homepageMapper.ts new file mode 100644 index 0000000..428f526 --- /dev/null +++ b/app/models/mappers/homepageMapper.ts @@ -0,0 +1,51 @@ +/** + * 将 Directus 返回的 Homepage 数据转换为 HomepageView 视图模型 + * + * @param raw: 原始的 Homepage 数据 + * @returns 转换后的 HomepageView 对象 + * + * @example + * const view = toHomepageView(rawHomepage); + */ +export function toHomepageView(raw: Homepage): HomepageView { + const carousel = (raw.carousel ?? []) + .filter(isObject) + .map((item) => item.directus_files_id) + .filter((item) => typeof item === 'string'); + + const products = (raw.recommend_products ?? []) + .filter(isObject) + .map((item) => { + const cover = isObject(item.cover) + ? item.cover.id + : item.cover; + return { + id: item.id, + name: item.translations?.[0].name, + summary: item.translations?.[0].summary, + cover: cover, + } satisfies HomepageProductView; + }); + + const solutions = (raw.recommend_solutions ?? []) + .filter(isObject) + .map((item) => { + const cover = isObject(item.cover) + ? item.cover.id + : item.cover; + + return { + id: item.id, + title: item.translations?.[0].title, + summary: item.translations?.[0].summary, + cover: cover, + } satisfies HomepageSolutionView; + }); + + return { + id: raw.id, + carousel: carousel ?? [], + recommendProducts: products ?? [], + recommendSolutions: solutions ?? [], + }; +} diff --git a/app/models/views/HomepageView.ts b/app/models/views/HomepageView.ts new file mode 100644 index 0000000..fb7558c --- /dev/null +++ b/app/models/views/HomepageView.ts @@ -0,0 +1,50 @@ +/** + * 主页推荐产品视图模型 + */ +export interface HomepageProductView { + /** 唯一标识符 **/ + id: number; + + /** 产品名称 **/ + name: string; + + /** 产品简介 **/ + summary: string; + + /** 产品封面 **/ + cover: string; +} + +/** + * 主页推荐解决方案视图模型 + */ +export interface HomepageSolutionView { + /** 唯一标识符 **/ + id: number; + + /** 解决方案标题 **/ + title: string; + + /** 解决方案摘要 **/ + summary: string; + + /** 解决方案封面 **/ + cover: string; +} + +/** + * 主页视图模型 + */ +export interface HomepageView { + /** 唯一标识符 **/ + id: number; + + /** 首页图片 **/ + carousel: string[]; + + /** 首页推荐产品 **/ + recommendProducts: HomepageProductView[]; + + /** 首页推荐解决方案 **/ + recommendSolutions: HomepageSolutionView[]; +} diff --git a/app/pages/index.vue b/app/pages/index.vue index bb355b7..29e6d86 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -12,14 +12,11 @@ @@ -42,24 +39,24 @@ :autoplay="false" >