From de7c03a7a941278d2036f140eb60340d1415f615 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Wed, 15 Oct 2025 16:47:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20directus=E6=8F=92=E4=BB=B6=E4=B8=8E?= =?UTF-8?q?=E7=BB=84=E5=90=88=E5=BC=8F=E5=87=BD=E6=95=B0=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - plugins:Directus插件 - composable:Directus图片/文件的相关组合式函数 --- app/composables/useDirectusFiles.ts | 22 ++++++++++++++++++++ app/composables/useDirectusImage.ts | 32 +++++++++++++++++++++++++++++ app/plugins/directus.ts | 12 +++++++++++ nuxt.config.ts | 3 +-- 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 app/composables/useDirectusFiles.ts create mode 100644 app/composables/useDirectusImage.ts create mode 100644 app/plugins/directus.ts diff --git a/app/composables/useDirectusFiles.ts b/app/composables/useDirectusFiles.ts new file mode 100644 index 0000000..38af82b --- /dev/null +++ b/app/composables/useDirectusFiles.ts @@ -0,0 +1,22 @@ +export const useDirectusFiles = () => { + const config = useRuntimeConfig(); + const baseUrl = config.public.directus.url; + + const getFileUrl = ( + id?: string | null, + options?: Record + ): string => { + if (!id) return ''; + const query = options + ? '?' + + new URLSearchParams( + Object.entries(options).map(([key, value]) => [key, String(value)]) + ).toString() + : ''; + return `${baseUrl}/assets/${id}${query}`; + }; + + return { + getFileUrl, + }; +}; diff --git a/app/composables/useDirectusImage.ts b/app/composables/useDirectusImage.ts new file mode 100644 index 0000000..08215d6 --- /dev/null +++ b/app/composables/useDirectusImage.ts @@ -0,0 +1,32 @@ +export const useDirectusImage = () => { + const config = useRuntimeConfig(); + const baseUrl = config.public.directus.url; + const token = config.public.directus.token; + + type DirectusAssetParams = { + width?: number; + height?: number; + fit?: 'cover' | 'contain' | 'inside' | 'outside'; + quality?: number; + format?: 'webp' | 'jpg' | 'png' | 'auto'; + } & Record; + + const getImageUrl = (id?: string | null, options?: DirectusAssetParams) => { + if (!id) return ''; + const queryToken = token ? 'access_token=' + token : ''; + const queryOptions = options + ? new URLSearchParams( + Object.fromEntries( + Object.entries(options).map(([key, value]) => [key, String(value)]) + ) + ).toString + : ''; + const query = + queryToken || queryOptions + ? `?${[queryToken, queryOptions].filter(Boolean).join('&')}` + : ''; + return `${baseUrl}/assets/${id}${query}`; + }; + + return { getImageUrl }; +}; diff --git a/app/plugins/directus.ts b/app/plugins/directus.ts new file mode 100644 index 0000000..a68bc1b --- /dev/null +++ b/app/plugins/directus.ts @@ -0,0 +1,12 @@ +import { createDirectus, rest, staticToken } from '@directus/sdk'; + +export default defineNuxtPlugin(() => { + const config = useRuntimeConfig(); + + const directus = createDirectus(config.public.directus.url) + .with(rest()) + .with(staticToken(config.public.directus.token || '')); + return { + provide: { directus }, + }; +}); diff --git a/nuxt.config.ts b/nuxt.config.ts index 45c1ad9..639a4ca 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -118,7 +118,7 @@ export default defineNuxtConfig({ }, imports: { - dirs: ['types/**'], + dirs: ['types/**', 'models/**'], }, modules: [ @@ -133,6 +133,5 @@ export default defineNuxtConfig({ '@element-plus/nuxt', '@nuxtjs/i18n', '@nuxtjs/strapi', - 'nuxt-directus', ], });