聊一聊vue如何实现角色权限的控制的

news2025/2/22 7:20:26

大家好,我是G探险者。
关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。

菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类按钮控制不到这个粒度。简单来说就是控制看到的菜单多少。

操作权限是指,每个角色对于所看到的数据具有哪些操作权限,就是增删改查这些具体的操作,简单来说就是读写权限。

一套完整的角色访问控制:是应该包含这两种控制的。通常二者也是交叉在一起进行访问控制的。

Vue.js 提供了灵活的方式来实现角色权限控制,本文将深入探讨如何通过 Vue 实现角色权限控制,特别是基于按钮级别的权限控制。

1. 角色权限控制的概述

角色权限控制可以分为两个层面:

  • 菜单权限:决定用户能看到哪些菜单和页面。
  • 操作权限:控制用户对数据的操作权限,例如增、删、改、查等。

在 Vue 中实现角色权限控制,通常是在前端页面中动态渲染菜单和按钮,并通过与后端权限数据的对比,来决定用户是否有权限显示和操作这些元素。本文重点讨论如何实现按钮级别的权限控制,即根据用户的角色来控制他们能执行哪些操作。

2. 基本思路

角色权限控制的核心思想是:

  • 用户权限通过后端接口返回,前端根据这些权限数据来决定页面中哪些按钮显示,哪些禁用,哪些完全移除。
  • Vue 的动态渲染机制允许我们根据不同用户的权限来动态控制按钮的展示和行为,确保用户只能看到和操作他们有权限访问的功能。

3. Vue 实现角色权限控制

3.1 权限控制插件:v-perm-code

为了简化权限控制的实现,我们可以创建一个自定义 Vue 指令 (v-perm-code),该指令根据当前用户的权限动态控制按钮的显示、禁用或移除。

3.1.1 指令的基本实现

首先,我们通过 Vue 的 Vue.directive 注册一个名为 perm-code 的自定义指令,该指令在绑定时检查每个按钮的权限,并根据用户的权限动态调整按钮的状态。

import { isObjectLike } from "lodash-es";
import { btnPermRemove, btnPermControl } from "globalSettings";

export default {
  install(Vue) {
    Vue.directive("perm-code", {
      async bind(el, binding, vnode) {
        // 开发模式下是否关闭按钮级别权限控制
        if (!btnPermControl) return;

        let { value: permCode } = binding;  // 获取按钮的权限码
        if (!permCode) return false;  // 如果没有权限码则退出

        const dom = el;
        const _store = vnode.context.$store;
        let pathnameCurrent = vnode.context.$route.path;
        if (!pathnameCurrent) pathnameCurrent = location.pathname;
        const pathnameStore = _store.state.router.pathname;

        // 动态获取权限码
        if (isObjectLike(permCode)) {
          permCode = Vue.filter(permCode.filter)(permCode.value);
        }

        // 是否显示无权限的按钮但禁用
        const permShow = el.getAttribute("perm-show") === "true";

        // 从store获取权限码列表
        if (pathnameCurrent && pathnameStore !== pathnameCurrent) {
          await _store.dispatch("router/getCurrentPermList", pathnameCurrent);
        }

        const permCodeList = _store.getters["router/permCodeList"];

        // 根据权限控制按钮的显示和状态
        dom.setAttribute("perm-code", permCode);
        if (permCodeList.includes(permCode)) {
          dom.style.display = "inline-block";
          dom.title = `有权限按钮: ${permCode}`;
        } else if (permShow) {
          dom.style.display = "inline-block";
          dom.setAttribute("disabled", "disabled");
        } else {
          dom.title = `无权限按钮: ${permCode}`;
          if (btnPermRemove) {
            setTimeout(() => {
              dom.parentNode.removeChild(el);  // 移除无权限按钮
            }, 0);
          } else {
            dom.style.display = "inline-block";
          }
        }
      },
    });
  },
};
3.1.2 指令的核心逻辑
  • 权限码 (permCode):每个按钮的权限码,通常由后端返回并与前端匹配,用于判断用户是否有权限执行某个操作。
  • 权限列表 (permCodeList):从 Vuex 中获取当前用户的权限列表,这些权限码来自后端接口。
  • 按钮显示/禁用/移除
    • 如果用户有权限(即权限码存在于 permCodeList 中),按钮显示并且可以点击。
    • 如果没有权限,但 perm-show="true",则按钮仍然显示,但禁用。
    • 如果没有权限且 perm-show 不为 true,按钮会被从 DOM 中移除(如果 btnPermRemove 为 true)。

3.2 按钮与权限结合:btnPermCode

在页面组件中,每个按钮都包含一个 btnPermCode 属性,该属性指定了与之关联的权限码。例如:

data() {
  return {
    buttonList: [
      {
        label: "新增",
        type: "add",
        click: this.openAdd,
        btnPermCode: "add",  // 权限码
      },
      {
        label: "删除",
        type: "delete",
        click: this.clickDelete,
        btnPermCode: "delete",  // 权限码
      },
      {
        label: "发布",
        type: "publish",
        click: this.clickPublish,
        btnPermCode: "publish",  // 权限码
      },
      // 更多按钮...
    ],
  };
},

3.3 Vuex 与权限列表管理

用户的权限列表存储在 Vuex 中,通过后端接口动态获取。当用户访问一个页面时,Vuex 会存储与该页面相关的权限码,指令 v-perm-code 会通过 Vuex 获取这些权限,并根据权限决定按钮的展示。

const permCodeList = _store.getters["router/permCodeList"];

通过这种方式,前端可以确保根据当前用户的角色,动态显示和操作相关功能。

3.4 实际应用

在实际应用中,通常会有以下几种按钮操作:

  • 增删改查:用户可以根据权限执行不同的数据操作,如新增、删除、编辑、查看等。
  • 批量操作:例如批量删除、批量发布,前端根据权限判断是否显示这些操作按钮。
  • 导入导出:当用户拥有导入导出的权限时,显示相应的按钮,否则不显示。

4. 总结

通过 Vue 的自定义指令和 Vuex 的权限管理,我们可以在前端实现细粒度的角色权限控制。v-perm-code 指令结合 btnPermCode 和权限码列表,实现了基于权限的按钮显示、禁用、移除等功能。后端返回的权限数据与前端进行匹配,确保用户只能访问和操作他们有权限的功能。这种方式使得前端权限控制更加灵活和可维护,适用于大多数基于角色的权限管理系统。

通过这种方式,我们可以在 Vue 中高效地实现角色权限管理,确保不同角色的用户只看到和操作他们有权限的页面和功能,提高了系统的安全性和用户体验。

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

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

相关文章

TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类

TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类 0. 前言1. CIFAR-10 数据集介绍2. CIFAR-10 图像分类3. 提升模型性能3.1 增加网络深度3.2 数据增强 4. 模型测试相关链接 0. 前言 我们已经学习了卷积神经网络 (Convolutional Neural Network, CNN) 的基本概…

服务器创建conda环境并安装使用jupyter

1.创建conda环境 conda create --name myenv python3.8 conda activate myenv其中 myenv 是您想要创建的环境名称,可以根据需要替换为其他名称。2.安装juypter conda install jupyter3.启动juypter jupyter notebook复制链接到浏览器打开 4.设置jupyter使用的 …

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键,或者扩展按键的需求。亦或者是在某些场景下,禁止用户按下某些按键的业务需求。 这两种需求,鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

【Spring详解五】bean的加载

五、bean的加载 当我们显示或者隐式地调用 getBean() 时,则会触发加载 bean 阶段。示例代码如下: public class AppTest {Testpublic void MyTestBeanTest() {BeanFactory bf new XmlBeanFactory( new ClassPathResource("spring-config.xml"…

ThinkPHP(TP)如何做安全加固,防webshell、防篡改、防劫持、TP漏洞防护

ThinkPHP是一款非常知名的PHP框架,很多知名CMS系统都是采用TP框架进行二次开发而来,当然ThinkPHP本身也可以直接建站,开源免费、功能强大,深受广大用户喜欢。 虽然ThinkPHP非常优秀,但是为了保障网站安全,我…

MySQL(1)基础篇

执行一条 select 语句,期间发生了什么? | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…

分裂栅结构对碳化硅MOSFET重复雪崩应力诱导退化的抑制作用

标题 Suppression Effect of Split-Gate Structure on Repetitive Avalanche Stress Induced Degradation for SiC MOSFETs(TED 24年) 文章的研究内容 这篇文章的研究探讨了重复雪崩应力对碳化硅(SiC)MOSFET器件退化的影响&am…

JavaEE基础之- xml

目录 一、xml概述 1.什么是xml 2.W3C组织 3.XML的作用 4.XML与HTML比较 5.XML和properties(属性文件)比较 二、XML语法概述 1.文档展示 2.XML文档的组成部分 3.xml文档声明 3.1 什么是xml文档声明 3.2 xml文档声明结构 4.xml元素 4.1 xml元素的格…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道(通用路由封装,Generic Routing Encapsulation)协议号47实验:思科:开始实施: 华为:开始实施: eBGP实施思科:华为: GRE隧道(通用路…

RK3568开发板/电脑/ubuntu处于同一网段互通

1.查看无线局域网适配器WLAN winR输入cmd打开电脑终端输入ipconfig或arp -a查看无线局域网IP地址,这就是WIFI. 这里的IPv4是192.168.0.147,默认网关是192.168.0.1,根据网关地址配以太网IP, ubuntu的IP,和rk3568的IP。 且IP范围为192.168.…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例:调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

如何在Jenkins上查看Junit报告

在 Jenkins 上查看 JUnit 报告通常有以下几个步骤: 构建结果页面: 首先,确保你的 Jenkins 构建已经执行完毕,并且成功生成了 JUnit 报告。前往 Jenkins 主页面,点击进入相应的项目或流水线。 构建记录: 选择你想查看的特定构建记…

【深度学习】计算机视觉(CV)-图像生成-风格迁移(Style Transfer)

风格迁移(Style Transfer) 风格迁移是一种计算机视觉技术,可以将一张图像的内容和另一张图像的风格融合在一起,生成一张既保留原始内容,又带有目标风格的全新图像!这种方法常用于艺术创作、图像增强、甚至…

在项目中调用本地Deepseek(接入本地Deepseek)

前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…

JAVA中常用类型

一、包装类 1.1 包装类简介 java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包…

使用 GPTQ 进行 4 位 LLM 量化

权重量化方面的最新进展使我们能够在消费级硬件上运行大量大型语言模型,例如 RTX 3090 GPU 上的 LLaMA-30B 模型。这要归功于性能下降最小的新型 4 位量化技术,例如GPTQ、GGML和NF4。 在本文中,我们将探索流行的 GPTQ 算法,以了解…

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…

CPP集群聊天服务器开发实践(五):nginx负载均衡配置

1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天,为了提升并发量最直观的办法需要水平扩展服务器的数量,三台服务器可以容纳六万左右的客户端。 负载均衡器的作用: 把client的请求按照负载均衡算法分发到具体…

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…

组件库地址

react: https://react-vant.3lang.dev/components/dialoghttps://react-vant.3lang.dev/components/dialog vue用v2的 Vant 2 - Mobile UI Components built on Vue