如何实现后台管理系统的权限路由和权限菜单

简介: 本文是继 前端如何一键生成多维度数据可视化分析报表 实战的最后一篇文章, 主要介绍如何实现后台管理系统的权限路由和权限菜单. 希望通过这3篇文章的复盘和实战, 可以让大家开发企业应用的时候更加游刃有余.

网络异常,图片无法展示
|


前言


本文是继 前端如何一键生成多维度数据可视化分析报表 实战的最后一篇文章, 主要介绍如何实现后台管理系统的权限路由和权限菜单. 希望通过这3篇文章的复盘和实战, 可以让大家开发企业应用的时候更加游刃有余.


本文主要涉及的技术点如下:


  • 如何使用递归算法动态渲染不定层级的菜单
  • 如何基于权限来控制菜单展现
  • 基于nodejs的权限服务设计


正文


动态菜单和权限路由是后台管理系统设计中必不可少的环节, 作为复杂后台管理系统来说, 导航菜单往往不是简单的一级菜单, 往往都会有3级,4级菜单, 如下:


网络异常,图片无法展示
|


所以我们首要解决的问题就是面对未知层级菜单时的前端解决方案. 其次就是面对不同角色,需要展示不同的权限菜单, 我们如何解决这两个问题, 是实现权限菜单的第一步,接下来笔者就会带大家一起实现.


使用递归算法动态渲染不定层级的菜单



首先我们来解决第一个问题, 实现渲染不定层级的菜单. 我们目前常用的菜单schema如下:


constmenuData= [
  {
key: '/manage',
path: '/manage',
text: 'dooring工作台',
  },
  {
key: '/manage/anazly',
path: '/manage/anazly',
text: '数据大盘',
  },
  {
key: '/manage/h5',
text: 'H5服务中心',
sub: [
      {
key: '/manage/h5/config',
path: '/manage/h5/config',
text: 'H5页面管理',
      },
      {
key: '/manage/h5/tpl',
path: '/manage/h5/tpl',
text: '模板库',
      }
    ]
  },
  {
key: '/manage/order',
path: '/manage/order',
text: '订单管理',
  }
]

我们可以通过实现一个js算法来遍历这个数据生成动态菜单, 比如for, 递归等, 笔者这里采用递归来实现, 关于菜单组件的选择, 我们可以使用antdMenu, 也可以使用element UI, iView等, 原理基本一致, 这里笔者直接写出我的javascript递归版本:


const { SubMenu } =Menu;
constcreateMenu= (menu= []) => {
returnmenu.map(item=> {
if(item.sub) {
return<SubMenukey={item.key} title={item.text}>                  { createMenu(item.sub) }
</SubMenu>      }else {
return<Menu.Itemkey={item.key}><Linkto={item.path}>{ item.text }</Link></Menu.Item>      }
    })
 }

通过以上方式我们就可以渲染出任何层级的菜单了, 在H5-Dooring后台中效果如下:


网络异常,图片无法展示
|


如果没有权限需求, 大家可以直接用以上方案实现任何动态层级菜单. 接下来我们来实现具有权限功能的动态菜单.


基于权限来控制菜单展现



在上面的实现中我们已经实现了动态层级菜单, 对于有权限管理功能的系统, 我们需要对不同用户展现不同菜单, 比如超级管理员, 普通管理员, 或者更细的划分, 我们需要在遍历菜单的时候去动态根据权限过滤, 接下来我们看一个例子: 超级管理员登录的菜单界面:


网络异常,图片无法展示
|


普通管理员登录的菜单界面:


网络异常,图片无法展示
|


首先要想实现权限菜单, 我们需要修改菜单schema结构, 添加权限字段,如下:


constmenuData= [
  {
key: '/manage',
path: '/manage',
text: 'dooring工作台'  },
  {
key: '/manage/anazly',
path: '/manage/anazly',
text: '数据大盘',
  },
  {
key: '/manage/auth',
path: '/manage/auth',
text: '会员管理',
auth: true,
  },
  {
key: '/manage/h5',
text: 'H5服务中心',
sub: [
      {
key: '/manage/h5/config',
path: '/manage/h5/config',
text: 'H5页面管理',
      },
      {
key: '/manage/h5/tpl',
path: '/manage/h5/tpl',
text: '模板库',
auth: true,
      }
    ]
  }
]

上图可知我们添加了auth字段作为权限标示, 这里我们主要用truefalse表示, 因为这里只有2中角色, 如果有多种权限, 我们可以用特殊字符串或者数字表示, 这块只需要和后端约定好即可. 具体实现如下:

constcreateMenu= (menu= []) => {
returnmenu.map(item=> {
if(item.sub) {
return<SubMenukey={item.key} title={item.text}>                  { createMenu(item.sub) }
</SubMenu>      }else {
if((rp==='super'&&item.auth) ||!item.auth) {
return<Menu.Itemkey={item.key} icon={iconMap[item.icon]}><Linkto={item.path}>{ item.text }</Link></Menu.Item>        }else {
returnnull        }
      }
    })
  }

以上就实现了动态不限层级的权限菜单. 大家可以直接食用哈~


基于nodejs的权限服务设计



以上实现主要是前端层面的设计方案, 我们都知道前端的安全措施永远是不可靠的, 所以我们为了保证系统的安全性, 一般我们会把菜单数据存到后端, 通过接口动态请求权限菜单. 这块我们可以提前和后端做好约定, 让后端根据不同用户返回不同的权限菜单schema即可. 由于方案比较简单, 这里笔者就不一一介绍了. 感兴趣可以在参考H5-Dooring的实现.



目录
相关文章
|
SQL 存储 监控
实用技巧:排查数据异常/数据波动问题,该如何下手?
在我做开发的这些年,让我很头痛的一类问题,不是线上故障,而是数据异常,不知道有没有程序员跟我感同身受。大多数的服务故障都有较为直观的异常日志,再结合产品表象,相对排查起来还有迹可循,但数据异常的原因就太多了,很多时候连报错日志都没有,排查起来简直无从下手。
实用技巧:排查数据异常/数据波动问题,该如何下手?
|
11月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
994 2
|
11月前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
1061 2
|
存储 NoSQL Java
Redis助力高并发网站:在线用户统计不再是难题!
小米带你了解如何使用Redis高效统计网站的在线与并发用户数。通过维护用户的活跃时间,利用Redis有序集合(Sorted Set)特性,可实时更新在线用户列表并统计数量。具体实现包括记录用户上线时间、定期清理离线用户及统计特定时间窗口内的活跃用户数。这种方法适用于高并发场景,保证统计结果的实时性和准确性。跟着小米一起探索Redis的强大功能吧!
230 2
|
10月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模板),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、丰富的组件库和灵活的布局设计,适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业快速实现数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台
|
SQL 存储 Java
SQL数据库学习指南:从基础到高级
SQL数据库学习指南:从基础到高级
|
11月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
1281 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
存储 分布式计算 资源调度
什么是Hadoop及其组件?
【8月更文挑战第31天】
919 1
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
Prometheus 监控 Cloud Native
使用 Jenkins 监控和优化构建性能
【8月更文第31天】在软件开发的过程中,构建性能直接影响着开发效率和团队的生产力。一个快速、可靠的构建流程可以显著加快迭代速度,减少等待时间,使团队能够更快地响应变化。Jenkins 作为一款广泛使用的持续集成/持续交付(CI/CD)工具,提供了丰富的功能来帮助开发者监控和优化构建性能。本文将探讨如何利用 Jenkins 的内置工具和外部工具来监控构建性能,并提出一些具体的优化方案。
1019 0

热门文章

最新文章