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

大家好,我是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.mzph.cn/pingmian/70637.shtml

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

相关文章

HTML之JavaScript DOM操作元素(2)

HTML之JavaScript DOM操作元素(2) 4.增删元素var element document.createElement("元素名") 创建新元素父元素.appendChild(子元素) 在父元素中追加子元素父元素.insertBefore(新元素,参照元素) 在特定元素之前新增元…

解决华硕主板的Boot界面无法设置M.2的系统启动盘问题

一、问题描述 当我们的华硕主板电脑开机后,发现电脑无法正常进入Windows系统界面,直接显示PXE网络网络信息;且知道我们进入到BIOS界面也无法找到选择系统盘,界面只显示【UEFI:PXE IP4 Intel(R) Ethernet】、【UEFI:PXE IP6 Intel(…

音视频封装格式:多媒体世界的“容器”与“桥梁”

一、音视频封装格式的核心概念 音视频封装格式(容器)是一种将编码后的视频、音频、字幕等数据按规则整合的文件格式,其本质是多媒体数据容器,核心作用包含: 同步多轨道数据:通过时间戳(PTS/DTS)实现音画同步。组织数据流:统一管理视频流、音频流、字幕流等,并存储元…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind:凭证类型 Username with password: 配置 用…

Unity 3D模型边缘锯齿严重

Unity开发3D游戏时候,模型边缘会显示严重锯齿,这需要设置抗锯齿,同时也会增加显卡负担,是适配不同硬件的自定义配置选项 摄像机对象检查器中找到[渲染]设置"抗锯齿"为FXAA或者SMAA项目设置->图形->点选正在使用的渲染管线->定位到管线文件后,查看管线的检查…

Docker:Docker从入门到精通(一)- Docker简介

一、前言 通过本专栏的学习,我们将了解   1. 掌握Docker基础知识,能够理解Docker镜像与容器的概念   2. 完成Docker安装与启动   3. 掌握Docker镜像与容器相关命令   4. 掌握Tomcat Nginx 等软件的常用应用的安装   5. 掌握docker迁移与备份相…

【面试系列】Java开发--AI常见面试题

文章目录 1、实际工作或学习中用过哪些Ai工具1.1、AI编程1.2、AI对话聊天1.3、AI图像工具1.4、AI办公工具 2、谈谈你知道的AI领域的一些常见词汇及其含义的理解? 例如AIGC、LLM、DeepLearning分别是什么意思?2.1、AIGC(Artificial Intelligen…

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key,呆会vscode要用,不然401. 打开vscod,电脑能上网。下插件。 下好要配置 点它一下。 要配置,全…

【Ubuntu】GPU显存被占用,但显示没有使用GPU的进程

文章目录 一、问题描述二、解决方案2.1 寻找问题进程2.2 尝试杀死相关进程2.3 投放核弹,一键全杀2.4 再次查看GPU使用情况 参考资料 一、问题描述 今天使用服务器的时候发现gpu被占了很多内存,但是使用 nvidia-smi 命令并没有发现占这么多显存的进程&am…

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

Redis 如何实现消息队列?

在当今的分布式系统架构中,消息队列起着至关重要的作用,它能够帮助系统实现异步通信、解耦组件以及缓冲流量等功能。Redis,作为一款高性能的键值对存储数据库,也为我们提供了便捷的方式来构建消息队列。今天,咱们就深入…

【多线程-第三天-NSOperation的练习-tableView异步下载网络图片-下载操作缓存池 Objective-C语言】

一、下载操作缓存池 1.下面我们来看操作缓存池,我们先演示一下问题,看看为什么要加这么一个操作缓存池,什么是操作缓存池,不用管呢,我们先来看啊,首先有什么问题, 看这个问题之前,我这儿写一个touch,点击屏幕的时候调用, 额,不能点击屏幕啊,因为现在屏幕点不着,我…

【2025深度学习环境搭建-1】在Win11上用WSL2和Docker解锁GPU加速

建议有: 较新的win11电脑,GPU是nvidia一点点Linux基础一点点Docker基础 一、安装WSL2 【控制面板】》【程序】》【启用或关闭Windows功能】 打开三个功能:【Hyper-V】【Virtual Machine Platform】【适用于Linux的Windows子系统】 可能看…

深入探索 DeepSeek 在数据分析与可视化中的应用

在数据驱动的时代,快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具,凭借其强大的数据处理和可视化能力,正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前,数据预处理…

C#基础:类的三大特性 之 封装

一、封装、继承、多态关系说明 封装、继承、多态这三大特性是相互关联的,封装和继承几乎都是为多态而准备的。 封装是基础,继承是关键,多态性是补充。 多态性存在于继承性之中,它是继承性的进一步扩展,没有继承就没…

vscode无法预览Markdown在线图片链接

问题:在VSCode中,打开MarkDown文件,存在在线图片链接, 但是在预览时却无法显示。 原因:因为Visual Studio Code中的MarkDown默认配置中只允许载入安全内容 解决方法: 1、输入快捷键 Ctrl Shift P 打开…

mongodb的并发优化

MongoDB的锁模式 MongoDB的锁设计 MongoDB的高性能表现离不开它的多粒度锁机制。多粒度主要可以针对不同层级的数据库对象进行枷锁,通过避免全局性的互斥来提升并发能力。从整个数据库层面看,MongoDB的并发锁的分层如下图所示: 从上往下是一…

Python 环境管理介绍

pip pip 是 Python 的标准包管理工具&#xff0c;用于安装和管理 Python 软件包。它允许你从 Python 包索引&#xff08;PyPI&#xff09;下载并安装第三方库&#xff0c;并能自动解决依赖问题。 第三方库的安装与卸载 pip install <package>pip uninstall <packag…

oracle apex post接口

日常记录 使用到了apex_json方式接收 、、、1 首先&#xff0c;接口通过body传递过来&#xff0c;成功接收到&#xff0c; 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…

PLC通讯

PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口&#xff0c;通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备&#xff0c;从站设备响应&#xff0c;从站不能主动发出信息。主站…