管理台权限模块 - 完整路由权限及按钮权限
这篇文章主要讲的是动态路由添加,下篇我们再仔细说明一下按钮权限的做法,
- 本文基础框架在element-ui 及element-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,大功告成!
管理台权限模块 - 完整路由权限及按钮权限相关推荐
- asp.net core权限模块的快速构建
大部分系统都会有权限模块,别人家系统的权限怎么生成的我不知道,我只知道这样做是可以并且挺好的. 文章中只对asp.net core的部分代码进行说明 呃 记录~,mvc版本自行前往仓库查阅 代码中的一 ...
- 08-HR-权限管理模块(给员工分配角色,权限点管理页面开发,给角色分配权限,前端权限-页面访问权(路由),前端权限-按钮操作权)
权限管理模块 RBAC的权限设计思想 采用方案: RBAC的权限模型,RBAC(Role-Based Access control) ,也就是基于角色的权限分配解决方案 权限控制目标:不同的用户登录系 ...
- 权限管理,pymysql模块
权限管理 权限管理重点 MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL ...
- 基于 Python/Vue/D2 实现的CRM管理系统(客户管理,产品管理,商机管理,合同管理,客户公海,权限管理等业务模块)
目录 一.系统概述 业务模块 部署方式 二.效果展示 登录页面 客户页面 联系人 产品类目 产品 合同 消息中心 供应商 客户公海 三.关键代码 后端 http 使用 python django 后端 ...
- 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜 ...
- Yii2搭建后台并实现rbac权限控制完整实例教程
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 photoshop教程 ...
- vue根据权限生成动态路由、导航栏
基本思路: 1,创建vueRouter,用公共路由实例化 2,创建需要根据权限筛选的路由对象(在路由对象,添加必要的权限判断字段) 3,登录完成,由后端配合返回当前用户的权限集合 4,筛选出有权限的路 ...
- java用户角色权限管理 只显示姓_扩展RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...
- 若依框架前端菜单生成,权限标识,路由地址
若依菜单分类三种类型M(目录).C(菜单).F(按钮) 系统模板,模仿框架写法 根据后端生成代码来创建前端页面 在菜单管理页面生成目录和菜单 路由地址填写模块名 路由地址:控制器中的地址 组件路径:前 ...
最新文章
- 看板与Scrum:哪个更适合你的团队?
- JAVA后端开发规范
- 结构对齐--__packed与#pragma pack
- linux swap交换分区说明/管理
- Android官方开发文档Training系列课程中文版:Activity测试之测试环境配置
- 媒体查询笔记、 @media
- 虚拟化技术简介--CPU/内存/IO/网络虚拟化介绍
- 【贪心 和 DP】LeetCode 55. Jump Game
- 软件质量管理体系-ISO 9000
- C# 绘制矩形方框读写内存类 cs1.6人物透视例子
- JS 实现右击菜单功能
- Chromedrive下载与安装
- 两台笔记本无线共享上网
- 互联网酒店预订系统的业务流程图-2
- 微生物组-扩增子16S分析和可视化(线上/线下,本周开课,2021.10)
- php数字转换百千万,PHP数字金额转换成中文大写显示
- 神经网络及其在点云中的应用
- matlab用ifft,ifft(matlab中ifft是什么意思)
- 武汉伯钧成科技有限公司之行的郁闷感受
- JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系