/** * 管理后台认证 composable */ export function useAdmin() { const token = useState('admin_token', () => '') // 客户端刷新时从 localStorage 恢复 token if (import.meta.client && !token.value) { token.value = localStorage.getItem('admin_token') || '' } const isLoggedIn = computed(() => !!token.value) async function login(username, password) { const data = await $fetch('/api/admin/login', { method: 'POST', body: { username, password }, }) token.value = data.token localStorage.setItem('admin_token', data.token) return data } function logout() { token.value = '' localStorage.removeItem('admin_token') navigateTo('/admin/login') } // 带认证的请求封装 function adminFetch(url, options = {}) { return $fetch(url, { ...options, headers: { ...options.headers, Authorization: `Bearer ${token.value}`, }, onResponseError({ response }) { if (response.status === 401) { logout() } }, }) } return { token, isLoggedIn, login, logout, adminFetch } }