Vue3根据菜单动态生成路由

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
如果直接路由是在router里面直接写死这样是不太合理的。因为每个用户都有自己不同的菜单 我们应该根据不同的用户菜单生成不同的路由。根据用户信息中的菜单列表动态的生成该用户拥有的路由。

修改路由拦截器在用户访问页面之前根据其菜单动态添加 路由

(src/router/permission.js)

import {addRoutes,router} from './index.js';
import {getToken} from '../utils/cookie.js';
import {hideFullLoading,showFullLoading,toast} from '../utils/message.js';
import store from '../store/index.js';

//前置路由守卫
router.beforeEach((to,from,next)=>{
   //显示loading
   showFullLoading()
   
   //获取token
   const token = getToken()
   //还没有登录且不是访问登录页面跳转到登录页面
   if(!token && to.path !== '/login'){
     toast('请先登录','warning')
     return next({path:'/login'})
   }
   //防止重复登录有token,且访问的是登录页面
   if(token && to.path === '/login'){
      toast('您已经登录过了','warning')
      return next({path:from.path || '/'})
    }
    //判断是否有新的路由
    let hasNewRoute = false
    //如果用户登录了自动化获取用户信息并存储在vuex中
    if(token){
       let userData = store.dispatch('actionGetUserInfo')
       //动态添加路由
       hasNewRoute = addRoutes(userData.menus)
    }
    //设置页面标题
    document.title = (to.meta.title || '') +'-后台管理系统’
    //放行
    hasNewRoute ? next(to.fullPath) :next()
})
 
//全局后置守卫
router.afterEach((to,from)=>{ hideFullLoading())

修改路由器src/core/router/index.js

import {createRouter,createWebHashHistory} from 'vue-router'

//引入页面
import Layout from '../index.vue'
import NotFound from '../404.vue'
import Login from '../login.vue'
import Index from '../index.vue'

//静态路由数组
const routes = [
    // 配置单个路由
    {
        path:'/',
        name:'Layout',
        component:Layout
    },
    // 登录页面
    {
        path:'/login',
        name:'Login',
        component:Login,
        meta:{
            title:'登录'
        }
    },
    // 所有不存在的路由都 走404
    {
        path:'/:pathMatch(.*)*',
        name:'NotFound',
        component:NotFound
    }
]

// 动态路由用来匹配菜单动态添加路由
const dongtaiRoutes = [
    {
        path:'/index',
        name:'Index',
        component:Index,
        meta:{
            title:'首页'
        }
    },
    {
        path:'/analysis',
        name:'Analysis',
        component:Index,
        meta:{
            level:1,//一级路由
            title:'可视化大屏'
        }
    }
]

// 创建路由器管理所有路由
export const router = createRouter({
    history:createWebHashHistory(),
    routes
})

// 动态添加路由的方法
export const addRoutes = (menus)=>{
    // 是否有新的路由
    let hasNewRoute = false
    // 从动态路由中找菜单
    const findRoute = (menuArr)=>{
        // 遍历每个菜单
        menuArr.forEach(menu=>{
            // 从动态路由中找到和菜单的路径相同的路由
            let route = dongtaiRoutes.find(route=>route.path === menu.url_path)
            // 如果找到了且没有注册过
            if(route && !route.hasRoute(route.name)){
                if(route.meta && route.meta.level && route.meta.level ===1){
                    // 添加一级路由
                    router.addRoute(route)
                }else{
                    // 添加子路由
                    router.addRoute('Layout',route)
                }
                hasNewRoute = true
            }
            // 如果还有嵌套路由
            if(menu.children && menu.children.length >0){
                findRoute(menu.children)
            }
        })
    }
    // 为菜单动态添加路由
    findRoute(menus)
    // 返回
    return hasNewRoute
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: vue