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

 

.......下次有時間繼續寫完


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM