这篇文章主要讲的是动态路由添加,下篇我们再仔细说明一下按钮权限的做法,

  1. 本文基础框架在element-uielement-admin-template基础上进行的二次开发

动态路由权限:

首先这里我们应该想清楚我们要怎么去做这个动态路由,按照我对动态路由的理解,一般都是服务端储存路由数据,返回到客户端进行路由列表渲染,element-admin官方的根据角色权限渲染可能是另外一种方式,不过在我自己处理的前端框架中一般情况都是第一种方案,这里只是给大家提供一个思路,特殊情况的需要自己处理。

1 全局路由守卫添加如下代码

// 获取动态路由然后使用VUEX进行组织
const accessRoutes = await store.dispatch('permission/generateRoutes', menuList);// 高版本vue-router使用addRoute 方法,低版本则使用 addRoutes
accessRoutes.forEach(item => {router.addRoute(item)
})

这里我们先看下这个menuList的返回格式 下图中这个是单条数据格式,我解释下关键的几个字段,首先是id(主键),然后是pid(父级ID),fullAuth(权限授权),path(命名路由),因为返回的并不是一棵树,所有我们接下来要进行实际的数据组织

{"description": "Dubbo管理","createTime": "2021-10-13 18:46:15","createBy": "c107e1f74d484b218bdf11341f5c048d","deleteTime": null,"deleteBy": null,"updateBy": null,"updateTime": null,"isDel": "0","id": "1a1f1e0f528d49399c0ead0fb92e6b1d","pid": "b2e13293b744402081e023337a58b23e","name": "Dubbo管理","fkDicMenuType": "01", // 菜单类型 01 - 菜单, 02 - 按钮"fkDicMenuShow": "01", // 是否显示 01 - 是, 02 - 否"auth": "dubbo","fullAuth": "system:dubbo","path": "dubbo","icon": null,"sort": 7,"fkModularId": "cafc9923d4404babada7ebcb90a2f377","parent": null,"flag": true
}

2 组织原始数据

下面的代码不难看懂,递归一个树,为什么设置pid初始值为1呢,因为跟pid为1,这个要看后端的具体返回

function dataToTree(data, pid = '1') => {if (!data) return [];let res = [];let loopList = data.filter(ele => {return ele.pid == pid;})if (loopList && loopList.length) {let children = [];loopList.forEach(im => {children = utils.dataToTree(data, im.id);if (children && children.length) {im.children = children;} else {im.children = undefined;}})res.push(...loopList);return res;} else {return []}
}

3 修改原始数据

这里我直接上代码,然后看注释

return new Promise(res => {
let accessedRoutes, originMenuList;
if (true || rootState.app.isPro) {// 过滤之前保存一份原始menu 用途是按钮权限获取originMenuList = lodash.cloneDeep(menuList);// 利用刚才的工具方法递归数据originMenuList = utils.dataToTree(originMenuList);// 组织树结构accessedRoutes = getMenuItems(asyncRoutes, menuList);// 过滤不显示的路由accessedRoutes = filterMenu(accessedRoutes);// 排序accessedRoutes = lodash.sortBy(accessedRoutes, it => {return it.sort;});console.log(accessedRoutes);} else {accessedRoutes = asyncRoutes;
}// 保存原始数据
commit('SET_ORIGINMENULIST', originMenuList)// 添加目前的路由数据
commit('SET_ROUTES', accessedRoutes)// 返回数据
res (accessedRoutes)
})

我们逐个分析这几个核心方法

  • getMenuItems

function getMenuItems(list, accessMenu) {

if (!accessMenu || !accessMenu.length) return [];

return list.map(item => {

// 查找是否有当前路由

let menu = accessMenu.find(it => {

return it.path == item.name;

});

if (menu) {

let {

path,

alwaysShow,

meta,

redirect,

component,

icon,

} = item,

{

name,

fkDicMenuType,

fkDicMenuShow,

auth,

fullAuth,

sort

} = menu,

children = undefined;

let target = menu.path;

// 如果数据有children 就进入递归方法传入item.children

if (item.children && item.children.length > 0) {

children = getMenuItems(item.children, accessMenu);

};

return {

alwaysShow, // 遵循路由规则 不熟悉的童鞋可以去看下element-admin

children, // 子集

redirect,

component, // 当前路由的component

path,  //  path路径

meta: {

title: name,  // 路由名称

icon:meta.icon, // 路由图标 -- 根据自己的需求去改,后来我舍弃了,没必要

affix: meta.affix  // 遵循路由规则 不熟悉的童鞋可以去看下element-admin

},

fkDicMenuShow,  // 路由是否显示

fkDicMenuType, // 路由类型

auth,

fullAuth, // 路由权限,用来处理按钮权限的标识

sort,

name: target

};

} else {

// 这里就是为了我下一步过滤做准备

return {

fkDicMenuShow: '02'

}

}

});

};

到此呢我们就完成了基本的数据组装,可能有些童鞋会理解不了,精心思考就明白了,无非就是多了一个递归写法,如果有children就是找,接下来要做的事情就是过滤那些不展示的路由

  • filterMenu

function filterMenu(list){

return list.filter((item) => {

let children = undefined;

if(item.children && item.children.length > 0){

children = filterMenu(item.children);

item.children = children;

if (!children || children.length == 0) {

return false;

} else {

return item.fkDicMenuShow == '01';

}

}else{

return item.fkDicMenuShow == '01';

}

});

};

这段代码的作用就是将后端返回中不显示的菜单过滤掉,同样也是使用了递归方法

4 添加路由

我是在全局路由守卫中添加的

accessRoutes.forEach(item => {router.addRoute(item)
})// 所有不存在的路由都是404
router.addRoute({ path: '*', redirect: '/404', hidden: true }); 

ok,大功告成!

管理台权限模块 - 完整路由权限及按钮权限相关推荐

  1. asp.net core权限模块的快速构建

    大部分系统都会有权限模块,别人家系统的权限怎么生成的我不知道,我只知道这样做是可以并且挺好的. 文章中只对asp.net core的部分代码进行说明 呃 记录~,mvc版本自行前往仓库查阅 代码中的一 ...

  2. 08-HR-权限管理模块(给员工分配角色,权限点管理页面开发,给角色分配权限,前端权限-页面访问权(路由),前端权限-按钮操作权)

    权限管理模块 RBAC的权限设计思想 采用方案: RBAC的权限模型,RBAC(Role-Based Access control) ,也就是基于角色的权限分配解决方案 权限控制目标:不同的用户登录系 ...

  3. 权限管理,pymysql模块

    权限管理 权限管理重点 MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL ...

  4. 基于 Python/Vue/D2 实现的CRM管理系统(客户管理,产品管理,商机管理,合同管理,客户公海,权限管理等业务模块)

    目录 一.系统概述 业务模块 部署方式 二.效果展示 登录页面 客户页面 联系人 产品类目 产品 合同 消息中心 供应商 客户公海 三.关键代码 后端 http 使用 python django 后端 ...

  5. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理

    从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜 ...

  6. Yii2搭建后台并实现rbac权限控制完整实例教程

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 photoshop教程 ...

  7. vue根据权限生成动态路由、导航栏

    基本思路: 1,创建vueRouter,用公共路由实例化 2,创建需要根据权限筛选的路由对象(在路由对象,添加必要的权限判断字段) 3,登录完成,由后端配合返回当前用户的权限集合 4,筛选出有权限的路 ...

  8. java用户角色权限管理 只显示姓_扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  9. 若依框架前端菜单生成,权限标识,路由地址

    若依菜单分类三种类型M(目录).C(菜单).F(按钮) 系统模板,模仿框架写法 根据后端生成代码来创建前端页面 在菜单管理页面生成目录和菜单 路由地址填写模块名 路由地址:控制器中的地址 组件路径:前 ...

最新文章

  1. 看板与Scrum:哪个更适合你的团队?
  2. JAVA后端开发规范
  3. 结构对齐--__packed与#pragma pack
  4. linux swap交换分区说明/管理
  5. Android官方开发文档Training系列课程中文版:Activity测试之测试环境配置
  6. 媒体查询笔记、 @media
  7. 虚拟化技术简介--CPU/内存/IO/网络虚拟化介绍
  8. 【贪心 和 DP】LeetCode 55. Jump Game
  9. 软件质量管理体系-ISO 9000
  10. C# 绘制矩形方框读写内存类 cs1.6人物透视例子
  11. JS 实现右击菜单功能
  12. Chromedrive下载与安装
  13. 两台笔记本无线共享上网
  14. 互联网酒店预订系统的业务流程图-2
  15. 微生物组-扩增子16S分析和可视化(线上/线下,本周开课,2021.10)
  16. php数字转换百千万,PHP数字金额转换成中文大写显示
  17. 神经网络及其在点云中的应用
  18. matlab用ifft,ifft(matlab中ifft是什么意思)
  19. 武汉伯钧成科技有限公司之行的郁闷感受
  20. JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系

热门文章

  1. SitePoint播客#134:410,已消失
  2. C语言:Hello Word(梦开始的地方)
  3. 透明背景的loading下载_让输入法键盘背景透明的方法
  4. 《鬼谷子》中的沟通技巧——入门篇
  5. ComSec作业七 Signature
  6. 单位的换算 (Python)
  7. 电脑显示未激活Windows的解决办法
  8. 双汇集团网站搜索引擎友好性分析报告
  9. 对onreadystatechange属性的理解
  10. CAS:1798782-17-8,PD-175仅用于科学研究