VUE 动态路由实现权限控制

尤其是做一些管理端系统就会有角色权限的情况出现,新公司所有项目都是使用vue实现,研究了下,记录下来,希望以后能够继续优化

首先,新建router文件夹管理所有路由相关代码:

如上图,module文件夹内定义好所有路由,并标记好相应的权限信息:

 1 let router = {
 2     path: '/system',
 3     redirect: '/system/user',
 4     meta: { name: '系统管理', icon: 'iconsystem' },
 5     component: () => import ('@/components/templatePage/routerSlot.vue'),
 6     children: [
 7        {
 8             path: '/system/user',
 9             meta: { name: '用户管理', icon: 'iconuser' },
10             component: () => import ('@/pages/system/userManage.vue')
11         },
12         {
13             path: '/system/role',
14             meta: { name: '权限管理', icon: 'iconRole' },
15             component: () => import ('@/pages/system/roleManage.vue')
16         },
17         .......
18     ]
19 }
20 
21 export default router

文件命名为system.js,把系统所有模块如上图依次定义好,并命名导入到router文件夹下permission.js文件夹内:

 1 // 所有路由
 2 import dashboardMoudule from './moudule/dashboard.js';
 3 import logMoudule from './moudule/log.js';
 4 ... 
5
import systemMoudule from './moudule/system.js'; 6 7 export let allRouters = [dashboardMoudule, logMoudule, ..., systemMoudule] 8 9 export let defaultRoutes = [ 10 { 11 path: '', 12 redirect: '/dashboard', 13 component: () => import('@/framework/framework.vue'), 14 children: [ 15 { 16 path: '/403', 17 component: () => import('@/pages/auth/pageNotFound.vue') 18 } 19 ] 20 }, 21 { 22 path: '/login', 23 component: () => import('@/pages/login.vue'), 24 }, 25 { path: '*', redirect: '/403' } 26 ];

 基本上我们已经把整个项目的所有路由都已经放在permission.js文件里定义管理好了,然后我们只需要在这里做一件事就是:

 获取系统的角色权限,根据路由里meta对象里的属性值过滤出该角色权限相对应的路由对象,将生成好的路由对象addRoutes动态加载进去

 1 // 获取角色权限ID数组
 2 let permissionIds = storage.get('permissionIds')
 3 if (permissionIds && permissionIds.length) {
 4     // 过滤出对应角色权限ID相对应的路由对象
 5     let permissionRouter = filterRouter(allRouters, permissionIds)
 6     getRouterMenus(permissionRouter)
 7 }
 8 
 9 // 通过递归过滤路由(存在多级路由的情况
10 function filterRouter(allRouters, permissionIds) {
11     let permissionRouter = []
12     for (let route of allRouters) {
13         let tmp = {...route }
14         if (tmp.meta && tmp.meta.id) {
15             for (let permissionId of permissionIds) {
16                 if (tmp.meta.id == permissionId) {
17                     if (tmp.children) {
18                          tmp.children = filterRouter(tmp.children, permissionIds)
19                     }
20                     permissionRouter.push(tmp)
21                 }
22             }
23         }
24     }
25     return permissionRouter 
26 }
27 
28 function getRouterMenus(permissionRouter) {
29     // 获取需要权限的路由,将可访问的路由表动态添加
30     for (let item of permissionRouter) {
31         defaultRoutes[0].children.push(item)
32     }
33     // 动态添加路由
34     router.addRoutes(defaultRoutes)
35     // 同步路由
36     for (let item of defaultRoutes) {
37 router.options.routes.push(item)
38 }
39 }
40
41

 

.......下次有时间继续写完

posted @ 2021-01-12 17:42  顾非白  阅读(4018)  评论(2编辑  收藏  举报