vue 权限应用

news2025/4/2 22:34:32

目录

一、系统菜单栏权限

二、系统页面按钮权限 


在企业开发中,不同的用户所扮演的角色不一样,角色拥有权限,所以用户拥有角色,就会有角色对应的权限。例如,张三是系统管理员角色,登录后就拥有整个系统的权限;李四是财务角色,登录后就拥有薪资相关的权限。员工拥有角色,角色拥有权限。那么如何控制系统导航栏的左侧菜单是否显示呢?这就涉及到动态路由了。

一、系统菜单栏权限

不同用户拥有的菜单栏权限不一样

静态路由:将所有人员共有的页面设置成静态路由,如登录页,注册页,个人信息页 

动态路由:需要权限才能访问的都设置成动态路由。这里把动态路由都是模块化的

在哪个位置筛选用户所拥有的权限呢?

在路由前置守卫中获取,因为这里每跳转一个页面都会请求用户信息

如何匹配呢?

用户登录后,会携带相关的信息,其中包含了自身所拥有的权限名。只需要为每个一级路由设置 name 属性,过滤掉动态路由中用户没有拥有的权限,剩下的就是用户拥有的权限,再将这些权限重新添加到路由信息中即可。

步骤

1. Vuex 的用户模块返回用户信息

2. 在派发用户信息的时候,就会接收到一个返回值,这个返回值就是用户信息

注:dispatch('模块名/派发方法'),模块名前面不能加 /

 

3.  为所有动态路由的一级路由添加 name 名称,这里的 name 名称和用户携带的权限名必须要一致。

 

4. 在前置路由中筛选出用户拥有的路由权限

5. 使用 addRoutes 动态添加路由,添加完后必须要转发一下,这是已知的缺点

 

6. 为了解决 404 问题,动态添加 404 页面,然后去 /router/index 文件中找到静态路由,将 404 路由删除

 权限应用整体代码

 // 如果没有获取到userId, 则发请求
      if (!store.getters.userId) {
        const { roles } = await store.dispatch('user/getUserInfo')
        // console.log(roles.menus) // 数组 不确定 可能是8个 1个 0个
        // console.log(asyncRoutes) // 数组 8个
        // 筛选用户所拥有的权限, 如果 是 true则会返回数据,false 不返回
        const filterRoutes = asyncRoutes.filter(item => {
          // return true/false
          return roles.menus.includes(item.name)
        }) // 筛选后的路由
        store.commit('user/setRoutes', filterRoutes)  // 调用了 user.js 中的 action
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }]) // 添加动态路由信息到路由表
        // router添加动态路由之后 需要转发一下
        next(to.path) // 目的是让路由拥有信息 router的已知缺陷
      } else {
        next() // 放过
      }

 这样我们就已经筛选好路由了,但是登录系统发现菜单栏并没有显示响应的路由菜单。原来是动态添加的路由不具备响应式,需要使用 Vuex 共享路由信息。

1. Vuex 用户模块声明 state 和 mutation

 

mutation 

 

2. 使用 getters 简化 state 属性

 

 3. 左侧菜单栏引用 gettes (Layout/components/Sidebar/index.vue)

但是会有一个bug, 张三登录后有10个权限,退出后李四登录,张三的10个权限还在。虽然在系统的菜单栏是正常的,但在浏览器中输入一个张三没有的权限却能访问。

 需要在退出登录时调用清除路由的方法。

二、系统页面按钮权限 

虽然上面已经做过权限,但只是对菜单栏的权限。在一些场景中,不同用户对页面中的操作权限也有控制。例如在员工列表页面,管理员可以新增用户,但普通的用户不能新增。

那用户权限标识从何而来呢?

可以在添加权限时进行判断为其区分,当 type = 1 时为页面路由权限,当 type = 2 时为 按钮权限。

自定义指令封装按钮功能权限

在 vue 入口文件自定义指令, 

// 封装自定义指令, 用于控制操作权
Vue.directive('permission', {
  // 在使用指令的元素插入到页面后生效
  // el 是当前指令作用的元素对象
  // binding 是 v-permission="表达式"  表达式的信息
  inserted(el, binding) {
    // console.log(el, binding)
    // store.state.user.userInfo?.roles?.points 的 ? 表示 可选链,防止为空
    // || [] 表示如果前面的表达式为空,还是可以让 points 这个变量是个 数组
    const points = store.state.user.userInfo?.roles?.points || [] // 当前用户信息的操作权
    if (!points.includes(binding.value)) {
      // 不存在就要删除或者禁用
      el.remove() // 删除元素
      // el.disabled = true
      // 线上的权限数据和线下的代码进行对应
    }
  }
})

在页面上对需要添加权限的按钮使用自定义指令。这样就设置好了。 

 

有权限 

 

无权限

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

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

相关文章

鸿蒙HarmonyOS NEXT设备升级应用数据迁移流程

数据迁移是什么 什么是数据迁移,对用户来讲就是本地数据的迁移,终端设备从HarmonyOS 3.1 Release API 9及之前版本(单框架)迁移到HarmonyOS NEXT(双框架)后保证本地数据不丢失。例如,我在某APP…

利用 PCI-Express 交换机实现面向未来的推理服务器

在数据中心系统的历史上,没有比被 Nvidia 选为其 AI 系统的组件供应商更高的赞誉了。 这就是为什么新兴的互连芯片制造商 Astera Labs 感到十分高兴,因为该公司正在 PCI-Express 交换机、PCI-Express 重定时器和 CXL 内存控制器方面与 Broadcom 和 Marv…

Python if else while for 学习笔记

一.if,else if语句用于根据条件执行代码块 else语句可与if语句结合,当if判断为假时执行else语句 x10 if x>5:print("x大于5") y3 if y>5:print("y大于5") else:print("y小于等于5")结果: 二.while循环…

正则化是什么?

正则化(Regularization)是机器学习中用于防止模型过拟合(Overfitting)的一种技术,通过在模型训练过程中引入额外的约束或惩罚项,降低模型的复杂度,从而提高其泛化能力(即在未见数据上…

搜索-BFS

马上蓝桥杯了,最近刷了广搜,感觉挺有意思的,广搜题类型都差不多,模板也一样,大家写的时候可以直接套模板 这里给大家讲一个比较经典的广搜题-迷宫 题目问问能否走到 (n,m) 位置,假设最后一个点是我们的&…

《边缘计算风云录:FPGA与MCU的算力之争》

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:边城烽烟——数据洪流压境****第二章:寒铁剑匣——FPGA的千机变****第三章:枯木禅杖——MCU的至简道****第四章:双生契…

R-GCN-Modeling Relational Data with GraphConvolutional Networks(论文笔记)

CCF等级:B 发布时间:2018年6月 25年3月31日交 目录 一、简介 二、原理 1.整体 2.信息交换与更新 2.1基分解 2.2块对角矩阵 3.实体分类或链接预测 3.1实体分类 3.2链接预测 三、结论和未来工作 一、简介 RGCN通过允许不同关系类型之间的信息…

【C++初阶】----模板初阶

1.泛型函数 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型…

Pycharm(七):几个简单案例

一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…

gnvm切换node版本号

1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…

PyTorch 深度学习实战(29):目标检测与 YOLOv12 实战

在上一篇文章中,我们探讨了对比学习与自监督表示学习。本文将深入计算机视觉的核心任务之一——目标检测,重点介绍最新的 YOLOv12 (You Only Look Once v12) 算法。我们将使用 PyTorch 实现 YOLOv12 模型,并在 COCO 数据集上进行训练和评估。…

【区块链安全 | 第五篇】DeFi概念详解

文章目录 DeFi1. DeFi 生态概览2. 去中心化交易所(DEX)2.1 AMM(自动做市商)模型2.2 订单簿模式(现货交易) 3. 借贷协议3.1 Aave3.2 使用闪电贷(Flash Loan) 4. 稳定币(St…

【初探数据结构】归并排序与计数排序的序曲

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感…

基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)

一、数据库的设计一定注意不要用关键字 数据库是同学设计的,但是在实践过程中,发现,生成的代码一直报错,结果发现数据库里面商品表里面的商品类别竟然设置成class, 注意:: class 是 Java 中的关键字&…

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点? 开发模式和环境搭建: 注册接口 1.Lombok 2.开发流程 1.controller层,这个层会指明访问路径和要执行的逻辑: 2.我们把返回结果根据接口文档包装成一个类result&a…

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务: (1)终端输入: sudo apt-get install vsftpd(2)安装完成后: 终端输入: /etc 是 Linux 系统的全局配置文件目录,存储系统和应用程序的配置信息…

java面向对象从入门到入土

面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…

linux ACL权限控制之用户权限控制程序设计

linux中的ACL(Access Control List,访问控制列表)是一种比传统UNIX权限更细粒度的权限控制机制,允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…

Java多线程与JConsole实践:从线程状态到性能优化!!!

目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态(New)2.2就绪状态(Ready)2.3运行状态(Running)2.4 阻塞状态(Blocked)2.5. 等待状态(Waiting&#xff…

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务,然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…