React Router 6 + Ant Design:构建基于角色的动态路由和菜单

news2024/11/15 13:38:39

在这里插入图片描述
要根据用户的角色生成不同的路由菜单并实现权限控制,你可以采取以下步骤:

  1. 定义路由配置

首先,你需要定义一个包含所有可能路由的配置文件,例如:

const routes = [
  {
    path: '/dashboard',
    element: <DashboardPage />,
    roles: ['admin', 'manager', 'user']
  },
  {
    path: '/users',
    element: <UsersPage />,
    roles: ['admin']
  },
  {
    path: '/settings',
    element: <SettingsPage />,
    roles: ['admin', 'manager']
  },
  // ...其他路由
];

在这个配置中,每个路由对象都包含一个 roles 属性,用于指定可以访问该路由的角色。

  1. 获取用户角色

接下来,你需要从后端API或其他地方获取当前登录用户的角色信息。你可以将这个角色信息存储在React应用的状态中,例如使用React Context或Redux等状态管理库。

  1. 过滤路由配置

在渲染路由之前,你需要根据用户的角色过滤路由配置,只保留用户有权访问的路由。你可以定义一个函数来完成这个过滤操作:

import { useContext } from 'react';
import { AuthContext } from './auth-context';

const routes = [ /* 路由配置 */ ];

function filterRoutes(routes, role) {
  return routes.filter(route => route.roles.includes(role));
}

function AppRouter() {
  const { role } = useContext(AuthContext);
  const allowedRoutes = filterRoutes(routes, role);

  return (
    <Routes>
      {allowedRoutes.map(route => (
        <Route
          key={route.path}
          path={route.path}
          element={route.element}
        />
      ))}
    </Routes>
  );
}

在这个示例中,我们使用 useContext 钩子从 AuthContext 中获取用户的角色信息。然后,我们调用 filterRoutes 函数过滤路由配置,只保留用户有权访问的路由。最后,我们使用 RoutesRoute 组件渲染过滤后的路由。

  1. 生成菜单

对于菜单的生成,你可以采用类似的方式,根据用户的角色过滤菜单项,只显示用户有权访问的菜单项。你可以使用Ant Design的 Menu 组件来渲染菜单:

import { Menu } from 'antd';
import { Link } from 'react-router-dom';

function AppMenu({ routes, role }) {
  const allowedRoutes = filterRoutes(routes, role);

  return (
    <Menu>
      {allowedRoutes.map(route => (
        <Menu.Item key={route.path}>
          <Link to={route.path}>{route.name}</Link>
        </Menu.Item>
      ))}
    </Menu>
  );
}

在示例中,我们使用 filterRoutes 函数过滤路由配置,然后在 Menu 组件中渲染剩余的菜单项。每个菜单项都使用 Link 组件链接到相应的路由。

通过这种方式,可以根据用户的角色动态生成路由和菜单,实现基于角色的访问控制。还可以进一步扩展这个解决方案,例如支持嵌套路由和多级菜单、从后端加载路由配置等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity场景光照数据Light data asset

首先描述一下遇到的问题&#xff0c;游戏运行过程中切换场景之后发现模型接收的光照不对。 Unity编辑模式下正常显示&#xff1a; 运行模式下从其他场景切入之后显示异常&#xff1a; 排查了灯光参数和环境光以及着色器都没发现异常。 根据ChatGPT的回答&#xff0c;问题可能…

15.Nacos服务分级存储模型

服务跨集群调用问题&#xff1a; 服务调用尽可能的选择本地集群的服务&#xff0c;跨集群调用延迟较高。 本地集群不可访问的情况下&#xff0c;再去访问其他集群。 如何配置集群的实例属性&#xff1a; spring: cloud:nacos:server-addr: localhost:8848 #nacos服务端地址d…

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

数栈+AI:数栈V6.2创新发布,让数据开发更智能

近日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕&#xff0c;大会带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量、更高效率的…

究竟该怎么寄快递才能安全无误的送到手中呢?

最近&#xff0c;小编上班了发现有同事在吐槽快递送到手中的时间很晚了&#xff0c;比预计的时间差了很多&#xff0c;并且产品也有不同程度的损坏。这就让我们很是恼火了&#xff0c;但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

echart实现排名列表

function createHorizontalBarChart(chartId, data) {if (typeof echarts undefined) {console.error(请先引入 ECharts 库);return;}// 初始化echarts实例var myChart echarts.init(document.getElementById(chartId));// 对数据按照 value 进行降序排序var sortedData dat…

hexo配置教程、主题使用及涉及的技术学习

一、背景 最近,一直想做一个属于自己的网站.可以从零开始搭建一个网站,顺便可以把日常中学到的技术用于实战,还可以顺便记录自己的所思所感,记录成长的过程. 方案 一开始的方案是从零开始,模仿常见个人博客的设计,基于vueSpringbootMySQL的去实现网站. 新建项目之后,发现vu…

Git 新手快速入门教程

一、什么是 Git 1. 何为版本控制 版本控制是一种记录文件变化的系统&#xff0c;可以跟踪文件的修改历史&#xff0c;并允许用户在不同版本之间进行比较、恢复或合并。它主要用于软件开发过程中管理代码的变更&#xff0c;但也可以应用于任何需要跟踪文件变更的场景。 版本控…

【问题】java查询MySQL时,mysql查询tinyint类型 的数据时,0会被转为false,1或以上会转为true

在做接口测试的数据库断言时&#xff0c;发现type字段断言总是失败&#xff0c;期望是0&#xff0c;打印数据库实际值是false 查看数据库格式&#xff1a; 解决&#xff1a; 在数据库url上&#xff0c;添加&#xff1a;&tinyInt1isBitfalse ——可解决java查询MySQL时&a…

密钥密码学(二)

原文&#xff1a;annas-archive.org/md5/b5abcf9a07e32fc6f42b907f001224a1 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十章&#xff1a;可变长度分数化 本章涵盖 基于摩尔斯电码的密码 混合字母和双字母 可变长度二进制码字 基于文本压缩的密码 本章涵盖…

【JavaWeb】Day52.Mybatis动态SQL(二)

动态SQL-foreach 案例&#xff1a;批量删除员工功能 SQL语句&#xff1a; delete from emp where id in (1,2,3); Mapper接口&#xff1a; ~~~java Mapper public interface EmpMapper {//批量删除public void deleteByIds(List<Integer> ids); } ~~~ XML映射文件&am…

C++学习进阶版(一):用C++写简单的状态机实现

目录 一、基础知识 1、状态机 2、四大要素 3、描述方式 4、设计步骤 5、实现过程中需注意 &#xff08;1&#xff09; 状态定义 &#xff08;2&#xff09; 状态转换规则 &#xff08;3&#xff09; 输入处理 &#xff08;4&#xff09; 状态机的封装 &#xff08;5…

串联超前及对应matlab实现

串联超前校正它的本质是利用相角超前的特性提高系统的相角裕度。传递函数为&#xff1a;下面将以一个实际的例子&#xff0c;使用matlab脚本&#xff0c;实现其校正后的相位裕度≥60。

mysql基础2——字段类型

整数类型 需要考虑存储空间和可靠性的平衡 浮点类型 浮点数类型不精准 将十进制数转换为二进制数存储 浮点数类型&#xff1a;float double real(默认是&#xff0c;double ) 如果需要将real设定为float &#xff0c;那么通过以下语句实现 set sql_mode "real_as…

go语言实现心跳机制样例

1、服务端代码&#xff1a; package mainimport ("fmt""net" )func handleClient(conn net.Conn) {defer conn.Close()fmt.Println("Client connected:", conn.RemoteAddr())// 读取客户端的数据buffer : make([]byte, 1024)for {n, err : conn…

AOC/AGON亮相2024上海国际酒店及商业空间博览会,共话电竞酒店产业新趋势!

摘要&#xff1a;行业头部品牌共聚上海&#xff0c;共话电竞酒店市场未来&#xff01; 春景熙熙&#xff0c;相逢自有时&#xff0c;3月26日-29日&#xff0c;2024上海国际酒店及商业空间博览会以及第二届全国电竞酒店投资交流论坛在上海新国际博览中心圆满帷幕。连续五年蝉联…

腾讯云轻量2核4G5M服务器优惠价格165元1年,2024年多配置报价单

腾讯云轻量2核4G5M服务器优惠价格165元1年。腾讯云服务器价格表2024年最新价格&#xff0c;轻量2核2G3M服务器61元一年、2核2G4M服务器99元1年&#xff0c;三年560元、2核4G5M服务器165元一年、3年900元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、8核32G配置11…

STM32F407,429参考手册(中文)

发布一个适用STM32F405XX、STM32F407XX、STM32F415XX、STM32F417XX、STM32F427XX、STM32F437XX的中文数据手册&#xff0c;具体内容见下图&#xff1a; 点击下载&#xff08;提取码&#xff1a;spnn&#xff09; 链接: https://pan.baidu.com/s/1zqjKFdSV8PnHAHWLYPGyUA 提取码…

你准备好迎接它了吗?英伟达CEO黄仁勋预言:人形机器人将成为未来主流

在近日举行的“CadenceLIVE 硅谷 2024”大会上&#xff0c;英伟达公司的首席执行官黄仁勋与大会主办方Cadence公司的CEO进行了一场富有深度的对话。在这场引人瞩目的交流中&#xff0c;黄仁勋大胆预测&#xff0c;未来人形机器人将成为主流&#xff0c;引领科技发展的新潮流。 …