import React from 'react' import { Navigate, useLocation } from 'react-router-dom' import { useAuth } from '../contexts/AuthContext' import { useTranslation } from '../i18n' interface ProtectedRouteProps { children: React.ReactNode /** 可指定的最小角色。admin = 超级管理员 */ requiredRole?: string } /** * 路由守卫组件 * * - 正在验证 token 时,显示加载中状态 * - 未认证时,重定向到 /login 并携带来源路径 * - 已认证时,检查 requiredRole 角色匹配,不匹配则重定向到首页 * - 已认证时,正常渲染子组件 */ export default function ProtectedRoute({ children, requiredRole }: ProtectedRouteProps) { const { t } = useTranslation() const { isAuthenticated, isLoading, user } = useAuth() const location = useLocation() if (isLoading) { return (
{t('components.protectedRoute.verifying')}
) } if (!isAuthenticated) { // 将当前路径作为 state 传递,登录后可跳回 return } // 角色检查:如果指定了 requiredRole,且用户角色不匹配,则重定向到首页 if (requiredRole && user?.role !== requiredRole) { return } return <>{children} }