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
.......下次有时间继续写完