From ac658e01ae94f906fed09ee4a299c687a47b70c8 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Tue, 11 Nov 2025 16:14:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将首页的数据获取由REST重构为GraphQL --- app/composables/directus/useHomepage.ts | 49 ++----------------------- app/graphql/homepage.graphql | 33 +++++++++++++++++ app/models/mappers/homepageMapper.ts | 3 +- app/pages/index.vue | 2 +- 4 files changed, 40 insertions(+), 47 deletions(-) create mode 100644 app/graphql/homepage.graphql diff --git a/app/composables/directus/useHomepage.ts b/app/composables/directus/useHomepage.ts index 01da60c..af50bfe 100644 --- a/app/composables/directus/useHomepage.ts +++ b/app/composables/directus/useHomepage.ts @@ -1,4 +1,4 @@ -import { readSingleton } from '@directus/sdk'; +import GetHomepage from '@/graphql/homepage.graphql?raw'; export const useHomepage = () => { const { $directus } = useNuxtApp(); @@ -6,49 +6,8 @@ export const useHomepage = () => { 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 }, - }, - }, - }, - }, - }) - ); + return await $directus.query<{ homepage: Homepage }>(GetHomepage, { + locale: locale, + }); }); }; diff --git a/app/graphql/homepage.graphql b/app/graphql/homepage.graphql new file mode 100644 index 0000000..b31229c --- /dev/null +++ b/app/graphql/homepage.graphql @@ -0,0 +1,33 @@ +query GetHomepage($locale: String!) { + homepage { + id + carousel { + id + directus_files_id { + id + } + } + recommend_products { + id + translations(filter: { languages_code: { code: { _eq: $locale } } }) { + id + name + summary + } + cover { + id + } + } + recommend_solutions { + id + translations(filter: { languages_code: { code: { _eq: $locale } } }) { + id + title + summary + } + cover { + id + } + } + } +} diff --git a/app/models/mappers/homepageMapper.ts b/app/models/mappers/homepageMapper.ts index cd95c0e..078890b 100644 --- a/app/models/mappers/homepageMapper.ts +++ b/app/models/mappers/homepageMapper.ts @@ -11,7 +11,8 @@ export function toHomepageView(raw: Homepage): HomepageView { const carousel = (raw.carousel ?? []) .filter(isObject) .map((item) => item.directus_files_id) - .filter((item) => typeof item === 'string'); + .filter(isObject) + .map((file) => file.id); const products = (raw.recommend_products ?? []) .filter(isObject) diff --git a/app/pages/index.vue b/app/pages/index.vue index f2eb413..d5d6720 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -16,7 +16,7 @@ const { data, pending, error } = await useHomepage(); const homepageData = computed(() => { - return toHomepageView(data.value); + return toHomepageView(data.value.homepage); }); const pageTilte = $t('page-title.homepage');