Skip to content

路由增加验证 ​

  • 判断一下 要是有token 就放行

routes/modules/auth.tsx ​

tsx
import { Navigate, Outlet, useLocation } from "react-router-dom";

/** 路由守卫:校验 localStorage 中的 token,无 token 则重定向到登录页 */
export default function AuthGuard() {
  const location = useLocation();
  const token = localStorage.getItem("token");

  // token 为空或 undefined 时,记录当前路径并跳转到登录页
  if (!token) {
    return <Navigate to="/login" state={{ from: location }} replace />;
  }

  return <Outlet />;
}

增加需要验证的页面 ​

  • views/user/index.tsx 写一个基础的

  • views/blog/index.tsx 写一个基础的

  • view/home/index.tsx 写一个基础的

tsx
import HomePage from "@/views/home";
import LoginPage from "@/views/login";
import ErrorPage from "@/views/error";
import { Navigate } from "react-router-dom";
import AuthGuard from "./auth";
import LayoutPage from "@/layouts";
// 引入user模块
import UserPage from "@/views/user";
// 引入blog模块
import BlogPage from "@/views/blog";

const commonRoutes = [
  {
    // 需要认证的路由:由 AuthGuard 统一拦截
    element: <AuthGuard />,
    children: [
      {
        path: "/",
        element: <LayoutPage />,
        children: [
          {
            path: "/",
            element: <HomePage />,
          },
          {
            path: "/user",
            element: <UserPage />,
          },
          {
            path: "/blog",
            element: <BlogPage />,
          },
        ],
      },
    ],
  },
  {
    // 公开路由:无需 token
    path: "/login",
    element: <LoginPage />,
  },
  {
    path: "*",
    element: <Navigate to="/404" />,
  },
  {
    path: "/404",
    element: <ErrorPage />,
  },
];

export default commonRoutes;