import { ref, watch } from 'vue' import apiClient from '@/api/client' interface SiteInfo { site_name: string site_subtitle: string } // 模块级缓存,所有组件共享同一份数据 const siteName = ref('Aether') const siteSubtitle = ref('AI Gateway') const loaded = ref(false) let fetchPromise: Promise | null = null async function fetchSiteInfo() { try { const response = await apiClient.get('/api/public/site-info') siteName.value = response.data.site_name siteSubtitle.value = response.data.site_subtitle loaded.value = true } catch { // 加载失败时保持默认值,允许后续重试 fetchPromise = null } } async function refreshSiteInfo() { fetchPromise = null loaded.value = false fetchPromise = fetchSiteInfo() await fetchPromise } export function useSiteInfo() { if (!loaded.value && !fetchPromise) { fetchPromise = fetchSiteInfo() } return { siteName, siteSubtitle, refreshSiteInfo } } // 站点名称变化时同步更新 document.title watch(siteName, (name) => { document.title = name }, { immediate: true })