// 保存原始的fetch函数 const originalFetch = window.fetch // 标记是否正在初始化认证(避免在initAuth期间误触发登出) let isInitializingAuth = false // 导出函数,允许外部设置初始化状态 export function setInitializingAuth(value: boolean) { isInitializingAuth = value } // 包装fetch函数,添加401/403错误处理 window.fetch = async function(...args: Parameters): Promise { const response = await originalFetch(...args) // 检查响应状态码(仅在401/403时处理) if (response.status === 401 || response.status === 403) { // 如果正在初始化认证,不自动登出(让initAuth自己处理) if (isInitializingAuth) { return response } // 延迟导入,确保pinia已初始化 try { const { useAuthStore } = await import('../stores/auth') const { default: router } = await import('../../app/router') const authStore = useAuthStore() // 如果用户已登录,执行登出操作 if (authStore.isLoggedIn) { console.warn('检测到401/403错误,Cookie已过期,自动退出登录') await authStore.logout() // 跳转到登录页(避免重复跳转) if (router.currentRoute.value.path !== '/login') { router.push('/login') } } } catch (error) { // 如果store还未初始化,忽略错误(应用启动阶段) // 这不会影响正常的API调用 } } return response } // 导出原始fetch(如果需要的话) export { originalFetch as originalFetch }