vue+element-ui实现动态的权限管理和菜单渲染_权限设置ui

需求:需要根据不用的用户匹配不同的管理权限,既:匹配不同的操作导航,尤其体现在后台管理系统内,如果仅仅只是在导航菜单内不予显示,仍然是可以通过路径直接打开页面,因为其路由信息已经在路由信息对象(new Router({}))函数中进行了注册

当然 这里可以通过全局导航守卫来区分不同的用户,允许其进入不同的路径,但是这只能进行简单的权限判断,且前端已经写死,灵活性不高,不能针对每个用户,做定制化权限区分

项目地址:github.com/cgq001/vue-…

欢迎star, 留着也许就用到了,毕竟权限管理 还是很普遍的嘛

使用到的规则

1、动态设置权限的UI展示

这里使用element-ui的Three树形控件,数据结构如下:

data: [{
          id: 1,
          label: '一级 1',
          children: [{
            id: 4,
            label: '二级 1-1',
            children: [{
              id: 9,
              label: '三级 1-1-1'
            }, {
              id: 10,
              label: '三级 1-1-2'
            }]
          }]
        }, {
          id: 2,
          label: '一级 2',
          children: [{
            id: 5,
            label: '二级 2-1'
          }, {
            id: 6,
            label: '二级 2-2'
          }]
        }, {
          id: 3,
          label: '一级 3',
          children: [{
            id: 7,
            label: '二级 3-1'
          }, {
            id: 8,
            label: '二级 3-2'
          }]
        }]
复制代码

这里选择这个树形控件,是因为其数据结构和我们的 注册路由信息结构十分接近,不需要再重新修改路由信息的数据结构,即可完美的 展现在 Three树形控件里

2、将侧边导航所需要的路由信息对象 抽离成一个数组,根据后台返回的数组,筛选出对应的路由信息,通过addRoutes添加到路由信息对象里,即可完成路由信息的动态添加

详情
// 在router.js 路由文件 新建数组路由存储 '/'  父路由下的所有子路由(这里所有的动态路由均为 '/' 的子路由)
let routerLists=[ 
  {
    id:1,
    path: '',
    label: '首页',
    redirect: '/index',  //重定向到
    meta:{
      title: '首页',
      table: true,
      display: false,
      icon: 'el-icon-s-home'
    }
  },
  {
    id: 2,
    path: '/index',   
    name: 'index',
    label: '首页',
    component: _import('Index/Index'),
    meta:{
      title: '首页',
      table: true,
      display:true,
      icon: 'el-icon-s-home'
    }
  },
  {
    id: 3,
    path: '/shop',
    name: 'shop',
    label: '商品管理',
    component: _import('Shop/Shop'),
    meta:{
      title: '商品列表',
      table: true,
      display:true,
      icon: 'el-icon-s-operation'
    }
  },
  {
    id:20,
    path: '/admin',
    label: '管理员列表',
    component: _import('admin/index'),
    meta:{
        title: '管理员列表',
        table: true,
        display:true,
        icon: 'el-icon-s-custom'
    },
    children:[
      {
        id:21,
        path: '/admin/index',
        label: '管理员列表',
        component: _import('admin/admin'),
        meta:{
          title: '管理员列表',
          table: true,
          display:true,
          icon:'el-icon-tickets'
        }
      },
      {
        id:22,
        path: '/admin/adminlist',
        label: '添加管理员',
        component: _import('admin/adminlist'),
        meta:{
          title: '添加管理员',
          table: true,
          display:true,
          icon:'el-icon-document-remove'
        }
      }
    ]
  }
]

//定义 上面数组的父路由
let routerAlls=[   //这里为routerLists的父路由
        {
          path: '/',
          component: Home
        }
]

1 .权限配置表
// 先把路由信息对象字符串化,然后去除component字段 ,再传递给 权限配置表
 let routerListString =JSON.stringify(routerLists)
 let src= routerListStr(routerListString)
 store.commit('serRouterList',src)

 let arr=[1,2,3,20,21,22]   //这里为权限列表数组(既后台根据用户身份返回的对应的路由数组)

 //根据权限配置表(arr数组)和动态路由信息对象(routerLists数组) 获取本用户的路由信息表,并添加到 routerAlls 路由的二级路由里
 
 2.获取动态路由
 
routerAlls[0].children = routerListFun(arr,routerLists)  
//获取 路径 '/' 的子路由,并添加至 routerAlls   这里的  routerListFun函数 为 根据权限列表数组(arr)筛选动态路由信息对象(routerLists) PS:函数内容见 文章末尾:附录


3.获取侧边导航栏 的 渲染菜单 数组

//根据权限配置表数组(arr)和动态路由信息对象(routerLists) 获取本用户的菜单列表
let mentParse =JSON.parse(JSON.stringify(src))
let menuList = routerListFun(arr,mentParse)   //这里routerListFun函数注意去除返回数组中的component
store.commit('setMents',menuList)   //将其添加到vuex  


// 注册路由
let routers =new Router({
  mode: 'history',
  // base: process.env.BASE_URL,
  routes: [
    {
      path: '/loading',
      name: 'loading',
      component: () => import('../views/Load/Loading.vue'),
      meta:{
        title: '登陆',
        table: false
      }
    }
  ]
})

// 将筛选后的路由信息对象添加至路由表
routers.addRoutes(routerAlls)


// 进行全局导航守卫
routers.beforeEach((to,from,next)=>{
    
      if(to.path != '/loading'){
          
          let username=store.state.load.userList.username
          
          if(username){
            next()
          }else{

            next({
              path:'/loading',
              query:{
                path:to.path
              }
            }) 
          }
      }else{
        next()
      }   
})

export default routers;
复制代码
附录

1.动态路由书写规则

* 路由书写规则
 *    1、只有一级路由(实际为二级路由):
 *     {
          id: 2,                                  //ID全局不能重复
          path: '/index',                         //路由路径 全局不能重复
          name: 'index',                          //名字,全局不能重复,存在二级路由,则一级路由不能有名字
          label: '首页',                          // 页面名称(用于权限配置时 显示名称使用)
          component: _import('Index/Index'),      // 文件地址(此处对应的是views目录)
          meta:{
            title: '首页',                        //页面名称(横向teble标签切换)
            table: true,                          // 是否显示 teable 切换按钮
            display:true,                         //  是否在侧边导航菜单显示
            icon: 'el-icon-s-home'                //  侧边导航的icon图标
          }
        }
      2、包含二级路由(实际为三级路由)
        {
            id:20,                                  //ID全局不能重复
            path: '/admin',                         //路由路径 全局不能重复(此处为父级))
            label: '管理员列表',                     // 页面名称(用于权限配置时 显示名称使用)
            component: _import('admin/index'),      // 文件地址(此处对应的是views目录)注意:此文件下 应包含(router-view 标签 来显示子页面)
            meta:{
                title: '管理员列表',                   //页面名称(横向teble标签切换)
                table: true,
                display:true,                         //  是否在侧边导航菜单显示(注意 这里是父级,如果为false,则子级不在折叠)


### 总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以**底层逻辑,基础知识要掌握好!**

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。



这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 **HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法**等高频考点**238道(含答案)**!  

资料截图 :

![](https://img-blog.csdnimg.cn/img_convert/edeaa71cbc745698bdedcfe65be40387.png)

![](https://img-blog.csdnimg.cn/img_convert/981487b285a8b90918f35c830c299df8.png)



![](https://img-blog.csdnimg.cn/img_convert/9866daffbebcf87b44d9530a59427834.png)



**高级前端工程师必备资料包**  

![](https://img-blog.csdnimg.cn/img_convert/ba803e1b69e399b6739e3d33554d42a7.png)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud-gateway 路由加载流程

问题 Spring Cloud Gateway版本是2.2.9.RELEASE,原本项目中依赖服务自动发现来自动配置路由到微服务的,但是发现将spring.cloud.gateway.discovery.locator.enabledfalse 启动之后Gateway依然会将所有微服务自动注册到路由中,百思不得其解&a…

NineData和华为云在一起!提供一站式智能数据库DevOps平台

以GuassDB数据库为底座 NineData和华为云一起 为企业提供 一站式智能数据库DevOps平台 帮助开发者 高效、安全地完成 数据库SQL审核 访问控制、敏感数据保护等 日常数据库相关开发任务 NineData 智能数据管理平台 NineData 作为新一代的云原生智能数据管理平台&#xf…

Js逆向爬虫基础篇

这里写自定义目录标题 逆向技巧断点一 、请求入口定位1. 关键字搜索2. 请求堆栈3. hook4. JSON.stringify 二、响应入口定位:1. 关键字搜索2. hook3. JSON.parse 逆向技巧 断点 普通断点 条件断点 日志断点 XHR断点 一 、请求入口定位 1. 关键字搜索 key关…

【因果推断python】57_The Difference-in-Differences 3

目录 3) Enlightenment: A Flexible Functional Form Key Concepts 3) Enlightenment: A Flexible Functional Form 有好消息也有坏消息。首先是好消息:我们已经发现问题与函数形式有关,因此我们可以通过修正函数形式来解决这个问题。也就是说&#xf…

竞赛选题 python+大数据校园卡数据分析

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖&am…

短视频最佳时长:成都柏煜文化传媒有限公司

探索时间与内容之间的完美平衡 成都柏煜文化传媒有限公司 在数字媒体日益繁荣的今天,短视频已成为人们获取信息、娱乐休闲的重要形式。然而,关于短视频的最佳时长,一直是一个备受争议的话题。本文将探讨短视频时长的各种考量因素&#xff0…

基于MATLAB对线阵天线进行道尔夫—切比雪夫加权

相控阵天线——基于MATLAB对线阵进行道尔夫—切比雪夫加权 目录 前言 一、阵列天线的综合 二、道尔夫—切比雪夫综合 三、单元间距的改变对切比雪夫阵列方向图的影响 四、单元数的改变对切比雪夫阵列激励分布的影响 五、副瓣电平SLL对切比雪夫阵列激励幅度的影响 六、副…

深入理解Java中的Collectors(Stream流)

引言 在 Java 的 Stream API 中,Collectors 是一个非常强大的工具类,它提供了许多静态方法,用于将 Stream 的元素收集到集合、字符串或其他类型的结果中。使用 Collectors,我们可以轻松地进行数据聚合和转换操作。 文章目录 引言…

小区业主管理系统

摘 要 随着城市化进程的加速和人口的不断增加,小区的数量也在不断增加。小区作为城市居民居住的主要场所,其管理工作也变得越来越重要。传统的小区业主管理方式存在诸多问题,如信息传递不畅、业务处理效率低下等。因此,开发一个高…

Spring底层原理之FactoryBean Bean工厂 单例对象 多例对象

FactoryBean 在 Spring Framework 中,FactoryBean 是一个用于创建其他 Bean 实例的特殊工厂 Bean。它允许开发者自定义 Bean 的创建逻辑,从而更加灵活地管理和配置 Bean 的实例化过程。 FactoryBean 接口 FactoryBean 接口是 Spring 框架中的一个重要…

启动VMWare虚拟机报错

1. 无法打开内核设备“\\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导? 模块“DevicePowerOn”启动失败。 未能启动虚拟机。 解决办法: 解决办法: 将 Ubuntu 64 位.vmx 找到vmci0.present"TRUE"这行改成 vmci0.present "FAL…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容: 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件,在大多数情况下被用于构建硬件。由于该操作特别复杂,因此通常由软件提…

fail2ban自动屏蔽之jumpserver

fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作。 jumpserver是一款开源堡垒机,其拥有一定的防护登录,也可以做登录限制,但是相对于防火…

湖南(用户画像)源点调研 适用于新产品开发的市场调研方法

湖南(上市验证调研)源点咨询认为:其实市场与用户研究的方法不管都什么花哨的名头,本质上只有两种:定量与定性。而对于新产品的开发最重要的就是掌握好定性的研究方法。 问:对于新产品开发我们面对的是什么…

js如何使得四舍五入的百分比之和为100%

在JavaScript中,如果你想要确保一组四舍五入后的百分比之和严格等于100%,那么你不能直接对每个百分比进行四舍五入,因为四舍五入会引入误差。但是,你可以采用一种策略,即先对所有的百分比进行常规的四舍五入&#xff0…

SNEC天合储能秀:全球首发多元场景一站式工商业储能融合解决方案

6月13日-15日,SNEC2024光伏与智慧能源展在上海隆重举行,来自全球95个国家和地区3000家国内外展商齐聚展会,5000行业专家共话产业发展。致力于成为全球光储智慧能源解决方案的领导者,天合光能(展位号:7.2H-E…

线性和二次判别分析

线性判别分析 线性判别分析(Linear Discriminant Analysis,LDA)亦称 Fisher 判别分析。其基本思想是:将训练样本投影到低维超平面上,使得同类的样例尽可能近,不同类的样例尽可能远。在对新样本进行分类时&…

测试行业,你的未来路在何方?失业之外,暗藏的这个危机更可怕!

目前测试行业现状 近期飞书的大规模裁员,无疑为2024年伊始蒙上了一层阴影。再加上“共享员工”模式的兴起,对于身处互联网行业的从业者来说,无疑是雪上加霜。 此外,延续了2023年的情况,在求职平台如BOSS直聘上&#…

基于Java的宠物领养管理系统【附源码】

摘 要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,宠物管理系统利用计算机网络实现信息化管理,使整个宠物领养的发展和服务水平有显著提升。 本文拟采用IDEA开发工具…

《编译原理》阅读笔记:p19-p24

《编译原理》学习第 4 天,p19-p24总结,总计 5 页。 一、技术总结 1.grouping of phases 这里谈到分组(group),那么就会有一个疑问,分组的依据是什么?即根据什么来分组。 (1) front end & back end 编译器包含…