路由守卫
ChikoAdmin 通过 createRouteGuard 函数实现路由守卫,支持登录验证、权限控制等功能。
路由守卫原理
路由守卫在路由跳转前执行,用于:
- 验证用户登录状态
 - 检查用户权限
 - 处理重定向逻辑
 - 控制路由访问
 
createRouteGuard 函数
// src/pages/layout.tsx
function createRouteGuard(
  to: Router.Route,
  roles: string[],
  isSuper: boolean,
  previousRoute: Router.Route | null
) {
  const loginRoute = '/login';
  const isLogin = Boolean(localStg.get('token'));
  const notFoundRoute = 'notFound';
  const isNotFoundRoute = to.id === notFoundRoute;
  // 未登录状态处理
  if (!isLogin) {
    if (to.handle.constant && !isNotFoundRoute) {
      return null; // 常量路由允许访问
    }
    // 重定向到登录页,并记录原路径
    const query = to.fullPath;
    return `${loginRoute}?redirect=${query}`;
  }
  const rootRoute = '/';
  const noAuthorizationRoute = '/403';
  const needLogin = !to.handle.constant;
  const routeRoles = to.handle.roles || [];
  // 检查用户角色权限
  const hasRole = roles.some(role => routeRoles.includes(role));
  const hasAuth = isSuper || !routeRoles.length || hasRole;
  // 已登录用户访问登录页,重定向到首页
  if (to.fullPath.includes('login') && to.pathname !== '/login-out' && isLogin) {
    return rootRoute;
  }
  // 404 路由处理
  if (to.id === 'notFound') {
    const exist = matchRoutes(allRoutes[0].children || [], to.pathname);
    if (exist && exist.length > 1) {
      return noAuthorizationRoute;
    }
    return null;
  }
  // 常量路由不需要登录验证
  if (!needLogin) {
    return handleRouteSwitch(to, previousRoute);
  }
  // 权限不足时重定向到 403 页面
  if (!hasAuth && import.meta.env.VITE_AUTH_ROUTE_MODE === 'static') {
    return noAuthorizationRoute;
  }
  return handleRouteSwitch(to, previousRoute);
}
守卫逻辑说明
登录状态检查
// 检查用户是否已登录
const isLogin = Boolean(localStg.get('token'));
if (!isLogin) {
  if (to.handle.constant && !isNotFoundRoute) {
    return null; // 常量路由允许访问
  }
  // 重定向到登录页
  return `${loginRoute}?redirect=${query}`;
}
权限验证
// 检查用户角色权限
const routeRoles = to.handle.roles || [];
const hasRole = roles.some(role => routeRoles.includes(role));
const hasAuth = isSuper || !routeRoles.length || hasRole;
// 权限不足时重定向到 403 页面
if (!hasAuth && import.meta.env.VITE_AUTH_ROUTE_MODE === 'static') {
  return noAuthorizationRoute;
}
特殊路由处理
// 已登录用户访问登录页,重定向到首页
if (to.fullPath.includes('login') && to.pathname !== '/login-out' && isLogin) {
  return rootRoute;
}
// 404 路由处理
if (to.id === 'notFound') {
  const exist = matchRoutes(allRoutes[0].children || [], to.pathname);
  if (exist && exist.length > 1) {
    return noAuthorizationRoute;
  }
  return null;
}
路由类型
常量路由
无需登录验证的路由:
/**
 * @handle {
 *   title: '登录',
 *   constant: true
 * }
 */
export default function LoginPage() {
  return <div>登录页面</div>;
}
权限路由
需要特定角色才能访问的路由:
/**
 * @handle {
 *   title: '管理员面板',
 *   roles: ['R_Admin']
 * }
 */
export default function AdminPage() {
  return <div>管理员页面</div>;
}
公开路由
所有已登录用户都可以访问的路由:
/**
 * @handle {
 *   title: '首页'
 * }
 */
export default function HomePage() {
  return <div>首页</div>;
}
环境变量配置
# 权限路由模式:static(静态) 或 dynamic(动态)
VITE_AUTH_ROUTE_MODE=static
# 超级管理员角色标识
VITE_STATIC_SUPER_ROLE=R_SUPER
常见场景
登录重定向
用户访问需要登录的页面时,自动重定向到登录页并记录原路径。
权限不足
用户访问没有权限的页面时,重定向到 403 页面。
已登录用户访问登录页
已登录用户访问登录页时,自动重定向到首页。
404 处理
访问不存在的路由时,根据情况重定向到 403 或显示 404 页面。