关于vue中根据用户权限动态添加路由的问题

作者:一只烛 时间:2024-05-05 09:25:11 

根据用户的权限,展示不同的菜单页。

知识点

路由守卫(使用了前置守卫):根据用户角色判断要添加的路由
vuex:保存动态添加的路由

难点

每次路由发生变化时都需要调用一次路由守卫,并且store中的数据会在每次刷新的时候清空,因此需要判断store中是否有添加的动态路由。
(若没有判断 则会一直添加 导致内存溢出)

关于vue中根据用户权限动态添加路由的问题

根据角色判断路由
过滤动态路由 判断每条路由角色是否与登录传入的角色一致

关于vue中根据用户权限动态添加路由的问题


<template>
 <div>
   <el-menu
     :default-active="$route.path"
     class="el-menu-vertical-demo menu_wrap"
     background-color="#324057"
     text-color="white"
     active-text-color="#20a0ff"
     :collapse="isCollapse"
     unique-opened
     router
   >
     <el-submenu
       v-for="item in $store.state.Routers"
       :key="item.path"
       :index="item.path"
       v-if="!item.hidden"
     >
       <template slot="title" >
         <i class="el-icon-location"></i>
         <span>{{ item.meta.title }}</span>
       </template>
       <div v-for="chi in item.children" :key="chi.name">
         <el-menu-item v-if="!chi.hidden" :index="item.path + '/' + chi.path">
           <i class="el-icon-location"></i>{{ chi.meta.title }}
         </el-menu-item>
       </div>
     </el-submenu>
   </el-menu>
 </div>
</template>

<script>
export default {
 name: "MenuList",
 data() {
   return {
     isCollapse: false,
   };
 },
 created() {
   this.$bus.$on("getColl", (data) => {
     this.isCollapse = data;
   });
 },
 methods: {

}
};
</script>

<style scoped>
.menu_wrap {
 height: 100vh;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
 width: 200px;
 height: 100vh;
}
</style>

import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '../store/index'

Vue.use(VueRouter)

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
 return originalPush.call(this, location).catch(err => err)
}

export const routes = [
 {
   path: '/home',
   name: 'First',
   component: () => import('../views/Index.vue'),
   meta: { title: 'Home'},
   children: [
     {
       path: 'index',
       name: 'Home',
       component: () => import('../views/Home'),
       meta: { title: 'Home', roles: ['Customer'] }
     }
   ]
 },
 {
   path: '/index',
   name: 'NavigationOne',
   component: () => import('../views/Index.vue'),
   meta: { title: '导航一'},
   children: [
     {
       path: 'personnel',
       name: 'Personnel ',
       component: () => import('../views/One/Personnel.vue'),
       meta: { title: 'Personnel', roles: ['Customer'] }
     },
     {
       path: 'account',
       name: 'Account',
       component: () => import('../views/One/Account.vue'),
       meta: { title: 'Account', roles: ['Customer'] }
     },
     {
       path: 'psw',
       name: 'psw',
       component: () => import('../views/One/Password.vue'),
       meta: { title: 'psw', roles: ['Customer'] }
     }
   ]
 },
 {
   path: '/card',
   name: 'NavigationTwo',
   component: () => import('../views/Index.vue'),
   meta: { title: '导航二'},
   children: [
     {
       path: 'activity',
       name: 'Activity ',
       component: () => import('../views/Three/Activity.vue'),
       meta: { title: 'Activity', roles: ['Customer'] }
     },
     {
       path: 'Social',
       name: 'Social',
       component: () => import('../views/Three/Social.vue'),
       meta: { title: 'Social', roles: ['Customer'] }
     },
     {
       path: 'content',
       name: 'Content',
       component: () => import('../views/Three/Content.vue'),
       meta: { title: 'Content', roles: ['Customer'] }
     }
   ]
 },
 {
   path: '/two',
   name: 'NavigationThree',
   component: () => import('../views/Index.vue'),
   meta: { title: '导航三'},
   children: [
     {
       path: 'index',
       name: 'Two ',
       component: () => import('../views/Two'),
       meta: { title: 'Two', roles: ['Customer'] }
     }]
 },
 {
   path: '/404',
   name: 'Error',
   hidden: true,
   meta: { title: 'error'},
   component: () => import('../views/Error')
 }
]

export const asyncRouter = [
 // Agent3 Staff2
 {
   path: '/agent',
   component: () => import('../views/Index.vue'),
   name: 'Agent',
   meta: { title: 'Agent', roles: ['Agent','Staff']},
   children: [
     {
       path: 'one',
       name: 'agentOne',
       component: () => import('@/views/agent/One'),
       meta: { title: 'agentOne', roles: ['Agent','Staff']  }
     },
     {
       path: 'two',
       name: 'agentTwo',
       component: () => import('@/views/agent/Two'),
       meta: { title: 'agentTwo', roles: ['Agent']  }
     },
     {
       path: 'three',
       name: 'agentThree',
       component: () => import('@/views/agent/Three'),
       meta: { title: 'agentThree', roles: ['Agent','Staff']  }
     }
   ]
 },
 // Staff3
 {
   path: '/staff',
   component: () => import('../views/Index.vue'),
   name: 'Staff',
   meta: { title: 'Staff', roles: ['Staff']},
   children: [
     {
       path: 'one',
       name: 'StaffOne',
       component: () => import('@/views/Staff/One'),
       meta: { title: 'StaffOne', roles: ['Staff']  }
     },
     {
       path: 'two',
       name: 'StaffTwo',
       component: () => import('@/views/Staff/Two'),
       meta: { title: 'StaffTwo', roles: ['Staff']  }
     },
     {
       path: 'three',
       name: 'StaffThree',
       component: () => import('@/views/Staff/Three'),
       meta: { title: 'StaffThree', roles: ['Staff']  }
     }
   ]
 },
 { path: '*', redirect: '/404', hidden: true }
]

const router = new VueRouter({
 routes
})

router.beforeEach((to, from, next) =>{
 let roles = ['Staff']
 if(store.state.Routers.length) {
   console.log('yes')
   next()
 } else {
   console.log('not')
   store.dispatch('asyncGetRouter', {roles})
   .then(res =>{
     router.addRoutes(store.state.addRouters)
   })
   next({...to})
   // next()与next({ ...to })的区别:next() 放行   next('/XXX') 无限拦截
 }
})

export default router


import Vue from 'vue'
import Vuex from 'vuex'
import modules from './module'

import router, {routes, asyncRouter} from '../router'

function hasPermission(route, roles) {
 if(route.meta && route.meta.roles) {
   return roles.some(role =>route.meta.roles.indexOf(role) >= 0)
 } else {
   return true
 }

}

/*
 递归过滤异步路由表 返回符合用户角色的路由
 @param asyncRouter 异步路由
 @param roles 用户角色
*/
function filterAsyncRouter(asyncRouter, roles) {
 let filterRouter = asyncRouter.filter(route =>{
   if(hasPermission(route, roles)) {
     if(route.children && route.children.length) {
         route.children = filterAsyncRouter(route.children, roles)
     }
     return true
   }
   return false
 })
 return filterRouter
}

Vue.use(Vuex)

export default new Vuex.Store({
 state: {
   addRouters:  [],
   Routers: []
 },
 mutations: {
   getRouter(state, paload) {
     // console.log(paload)
     state.Routers = routes.concat(paload)
     state.addRouters = paload
     // router.addRoutes(paload)
   }
 },
 actions: {
   asyncGetRouter({ commit }, data) {
     const { roles } = data
     return new Promise(resolve =>{
       let addAsyncRouters = filterAsyncRouter(asyncRouter, roles)
       commit('getRouter', addAsyncRouters)
       resolve()
     })
   }
 }
})

来源:https://blog.csdn.net/weixin_44813417/article/details/121144909

标签:vue,动态添加路由,用户权限
0
投稿

猜你喜欢

  • 从0编写区块链之用python解释区块链最基本原理

    2022-07-20 10:08:24
  • Python从函数参数类型引出元组实例分析

    2022-12-18 01:51:22
  • Python如何重新加载模块

    2022-09-08 21:31:56
  • JavaScript的陷阱

    2008-10-28 19:52:00
  • SQL Server远程定时备份数据库脚本分享

    2024-01-24 12:20:31
  • Python利用第三方模块实现压缩css文件

    2023-04-28 07:21:02
  • 使用Python的Bottle框架写一个简单的服务接口的示例

    2023-09-01 17:29:50
  • wxpython布局的实现方法

    2022-01-31 10:20:57
  • 使用Python机器学习降低静态日志噪声

    2021-11-09 23:48:57
  • Python 用户登录验证的小例子

    2021-07-04 09:39:25
  • MySql中的json_extract函数处理json字段详情

    2024-01-14 21:06:23
  • ASP自动解压RAR文件代码

    2007-11-06 13:29:00
  • 单步调试 step into/step out/step over 区别说明

    2022-03-09 20:03:26
  • python Spyder界面无法打开的解决方法

    2023-03-02 09:12:09
  • 对numpy中数组转置的求解以及向量内积计算方法

    2023-01-23 16:39:52
  • 基于Python实现的恋爱对话小程序详解

    2023-01-14 11:08:38
  • 使用javaScript动态加载Js文件和Css文件

    2024-04-19 10:16:27
  • 浅析Python面向对象编程

    2023-11-23 07:52:12
  • asp读取数据库中数据到数组的类

    2007-09-16 18:19:00
  • python+numpy实现的基本矩阵操作示例

    2023-07-16 13:52:37
  • asp之家 网络编程 m.aspxhome.com