尤其是做一些管理端系統就會有角色權限的情況出現,新公司所有項目都是使用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
.......下次有時間繼續寫完