Files
admin/www/app/composables/usePageSeo.ts
T
2026-08-03 19:09:03 +08:00

37 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { PageSeo } from '~/types/site';
/**
* 页面 SEO 适配
*
* 从 dashboard 的 page-seo 配置读取 meta_title / meta_description / meta_keywords / og_image_url
* 应用到当前页面的 useHead;未配置时回退到全局 SEO 默认值或页面默认标题。
*/
export async function usePageSeo(pageType: string, entityId?: number, fallbackTitle?: string) {
const { getPageSeo } = useSiteApi();
const siteStore = useSiteStore();
// 注意:本函数可能在 onMounted 等异步上下文中被调用,useI18n 要求 setup 顶层,
// 这里改用全局 i18n 实例($i18n.t 跟随当前 locale,任意上下文安全)
const i18n = (useNuxtApp() as unknown as { $i18n?: { t(key: string): string } }).$i18n;
const t = (key: string) => i18n?.t(key) || key;
let seo: PageSeo | null = null;
try {
seo = await getPageSeo(pageType, entityId);
} catch {
seo = null;
}
const title = seo?.meta_title || fallbackTitle || t('app.name');
const description = seo?.meta_description || siteStore.seo?.meta_description || '';
const keywords = seo?.meta_keywords || siteStore.seo?.meta_keywords || '';
useHead({
title,
meta: [
...(description ? [{ name: 'description', content: description }] : []),
...(keywords ? [{ name: 'keywords', content: keywords }] : []),
...(seo?.og_image_url ? [{ property: 'og:image', content: seo.og_image_url }] : [])
]
});
}