动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。
1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式
后端返回路由如下:
前端处理:
共识:动态路由在路由守卫 beforeEach 里面进行处理,每次跳转路由都会走这里。
1.src下新建permission.js文件,main.js中引入
// main.js
import './permission'
2.permission.js里面重要的一点是:要确保路由已经被添加进去才跳转,否则页面会404或白屏
import router from "./router";
import { ElMessage } from "element-plus";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken } from "@/utils/auth";
import usePermissionStore from "@/store/modules/permission";
NProgress.configure({ showSpinner: false });
const whiteList = ["/login", "/register"];
const isWhiteList = (path) => {
return whiteList.some((pattern) => isPathMatch(pattern, path));
};
router.beforeEach((to, from, next) => {
NProgress.start();
if (getToken()) {
/* has token*/
if (to.path === "/login") {
next({ path: "/" });
NProgress.done();
} else if (isWhiteList(to.path)) {
next();
} else {
// 如果已经请求过路由表,直接进入
const hasRefresh = usePermissionStore().hasRefresh
if (!hasRefresh) {
next()
}else{
try {
// getRoutes 方法用来获取动态路由
usePermissionStore().getRoutes().then(routes => {
const hasRoute = router.hasRoute(to.name)
routes.forEach(route => {
router.addRoute(route) // 动态添加可访问路由表
})
if (!hasRoute) {
// 如果该路由不存在,可能是动态注册的路由,它还没准备好,需要再重定向一次到该路由
next({ ...to, replace: true }) // 确保addRoutes已完成
} else {
next()
}
}).catch((err)=>{
next(`/login?redirect=${to.path}`