feat(react19-migration): 阶段3 - 状态管理与路由

- T3.1: 创建 useAuthStore (Zustand) - login/logout/initFromStorage
- T3.2: 创建 usePermissionStore (Zustand) - fetchUserMenus/hasPermission/hasRole
- T3.3: 创建 useAppStore (Zustand) - collapsed 状态管理
- T3.4: 创建 React Router v7 数据路由配置 (createBrowserRouter)
- T3.5: 创建 authLoader 路由守卫 (token校验→初始化→权限加载)
- 创建占位页面组件 (13个路由页面 + DefaultLayout)
- 更新 App.tsx 使用 RouterProvider
- 安装 jwt-decode 依赖

验证: npx tsc --noEmit 通过, npm run dev 启动成功
This commit is contained in:
张翔
2026-05-03 15:34:09 +08:00
committed by zhangxiang
parent 01ddf0a5f6
commit 434a81dc71
21 changed files with 378 additions and 4 deletions
+37
View File
@@ -0,0 +1,37 @@
import { redirect } from 'react-router'
import { useAuthStore } from '@/stores/useAuthStore'
import { usePermissionStore } from '@/stores/usePermissionStore'
export async function authLoader() {
const token = localStorage.getItem('token')
if (!token) {
return redirect('/login')
}
const authState = useAuthStore.getState()
if (!authState.initialized) {
authState.initFromStorage()
}
if (!authState.isAuthenticated) {
return redirect('/login')
}
const permState = usePermissionStore.getState()
if (!permState.loaded) {
const restored = permState.initFromStorage()
if (!restored) {
try {
await permState.fetchUserMenus()
} catch {
authState.logout()
return redirect('/login')
}
}
}
return null
}