注意:
1. allRoutes是本地定义的所有页面路由;
2. 'index' 是主页路由;
3. menuArr是权限菜单id数组 let menuArr = ['useWaterAdmin', 'dataCenter', 'historyData', 'waterMonitor', ];
4. 后端返回权限格式:
4.1 返回菜单id数组:使用本文方法;
4.2 返回菜单树结构:菜单直接渲染,路由直接addRoute;(返回菜单树的话后端需要维护菜单树,不能解耦,不建议使用);
4.3 返回一维数组的父子菜单树:可以使用本文方法,也可以转成4.2的树结构;
一、按钮权限
1. 使用全局自定义指令,在自定义指令的生命周期里添加置灰样式控制;
2. 在按钮上添加权限方法,配合v-if隐藏按钮,会导致样式错乱,不建议使用;
二、菜单权限:
1. 加载全部菜单,根据权限数组用v-if做显示控制;
2. 根据权限数组过滤出有权限的菜单,只加载有权限的菜单;
function filterMenu(allRoutes) { let resultArr = allRoutes.filter((item) => { if (menuArr.includes(item.name)) { if (item.children) { item.children = filterMenu(item.children); } return item; } }); return resultArr; } // console.log(filterMenu(allRoutes));
三、路由权限
1. 在路由配置中注册全部路由,在路由全局前置守卫router.beforeEach的to中根据权限数组判断没权限的跳404;
2. 只注册有权限的路由:
2.1 先在路由配置中注册全部路由,再根据权限数组删除没权限的路由;
filterRoute('index',allRoutes); function filterRoute(parent, allRoutes) { allRoutes.map((item, index) => { if (menuArr.includes(item.name)) { if (item.children) { filterRoute(item.name, item.children); } } else { router.removeRoute(item.name); } }); } // console.log(router.getRoutes());
2.2 根据权限数组过滤出有权限的路由树,使用addRoute只注册有权限的路由。此处和过滤有权限的菜单一样。
function filterMenu(allRoutes) { let resultArr = allRoutes.filter((item) => { if (menuArr.includes(item.name)) { if (item.children) { item.children = filterMenu(item.children); } return item; } }); return resultArr; } router.addRoute('index', filterMenu(allRoutes)); // console.log(router.getRoutes());
相关文章参考:
如何用 Vue 实现前端权限控制