wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 1 | // src/router/Guards.jsx |
| 2 | import React from 'react' |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 3 | import { Navigate, Outlet, useLocation, useParams } from 'react-router-dom' |
| 4 | import { getUserInfo } from '../utils/auth' |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 5 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 6 | /** 需登录 */ |
| 7 | export function RequireAuth() { |
| 8 | const user = getUserInfo() |
| 9 | const location = useLocation() |
| 10 | if (!user) { |
| 11 | return <Navigate to="/login" state={{ from: location }} replace /> |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 12 | } |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 13 | return <Outlet /> |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 14 | } |
| 15 | |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 16 | /** 需特定角色 */ |
| 17 | export function RequireRole({ allowedRoles }) { |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 18 | const user = getUserInfo() |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 19 | if (!user || !allowedRoles.includes(user.role)) { |
| 20 | return <Navigate to="/login" replace /> |
| 21 | } |
wu | 70fc8c5 | 2025-06-19 15:55:03 +0800 | [diff] [blame] | 22 | return <Outlet /> |
| 23 | } |
| 24 | |
| 25 | /** 只能访问自己的用户详情 */ |
| 26 | export function RequireOwnProfile() { |
| 27 | const user = getUserInfo() |
| 28 | const { userId } = useParams() |
| 29 | if (!user || user.id.toString() !== userId) { |
| 30 | return <Navigate to="/home" replace /> |
| 31 | } |
| 32 | return <Outlet /> |
| 33 | } |
| 34 | |
| 35 | /** 只能访问自己的 Admin 页面 */ |
| 36 | export function RequireAdminOwn() { |
| 37 | const user = getUserInfo() |
| 38 | const { userId } = useParams() |
| 39 | if (!user || user.role !== 'admin' || user.id.toString() !== userId) { |
| 40 | return <Navigate to="/login" replace /> |
| 41 | } |
| 42 | return <Outlet /> |
| 43 | } |
| 44 | |
| 45 | /** 只能访问自己的 SuperAdmin 区 */ |
| 46 | export function RequireSuperAdminOwn() { |
| 47 | const user = getUserInfo() |
| 48 | const { userId } = useParams() |
| 49 | if (!user || user.role !== 'superadmin' || user.id.toString() !== userId) { |
| 50 | return <Navigate to="/login" replace /> |
| 51 | } |
| 52 | return <Outlet /> |
wu | 2f28f67 | 2025-06-19 14:29:30 +0800 | [diff] [blame] | 53 | } |