import { createFileRoute, redirect } from '@tanstack/react-router' import { useAuthStore } from '@/stores/auth-store' import { getSelf } from '@/lib/api' import { AuthenticatedLayout } from '@/components/layout' // 内存中的验证标记,避免同一会话中重复验证 let sessionVerified = false export const Route = createFileRoute('/_authenticated')({ beforeLoad: async ({ location }) => { const { auth } = useAuthStore.getState() // 如果本地没有用户信息,直接跳转登录页 if (!auth.user) { throw redirect({ to: '/sign-in', search: { redirect: location.href }, }) } // 本地有用户信息,但需要验证 session 是否有效(每个会话只验证一次) if (!sessionVerified) { const res = await getSelf().catch(() => null) if (res?.success && res.data) { // 验证成功,更新用户信息(可能有变化) auth.setUser(res.data) sessionVerified = true } else { // 验证失败或 API 调用失败,清除本地缓存并跳转登录页 auth.reset() throw redirect({ to: '/sign-in', search: { redirect: location.href }, }) } } }, component: AuthenticatedLayout, })