聊一聊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 中高效地实现角色权限管理,确保不同角色的用户只看到和操作他们有权限的页面和功能,提高了系统的安全性和用户体验。
相关文章:

聊一聊vue如何实现角色权限的控制的
大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…...
Python连接MySQL数据库图文教程,Python连接数据库MySQL入门教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1. 环境准备1.1安装 Python1.2选择开发环境1.3安装 MySQL 数据库1.4 安装 pymysql 库 2. 连接数据库3. 数据库基本操作3.1 创建数据库3.2 创建表3.3 插入数据3.…...

懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)
1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1M6rdYEEog/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成&…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
LeetCode 2595.奇偶位数:位运算
【LetMeFly】2595.奇偶位数:位运算 力扣题目链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示…...

一周学会Flask3 Python Web开发-response响应格式
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中,数据可以通过多种格式传输。大多数情况下,我们会使用HTML格式,这也是Flask中…...

uni-app开发app时 使用uni.chooseLocation遇到的问题
问题一:不显示 问题二:选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明,使用腾讯的话需要开启云服务,具体可看官网,这就是为什么使用时直接不显示的原因,所以我使用的高德,但又出现…...

Android Hal AIDL 简介 (一)
Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_组件截图(@ohos.arkui.componentSnapshot (组件截图) )
前言: 这个模块可以截取组件的图片,无论组件是否已加载。截图只能拍到组件本身的大小区域。 如果组件或其子组件画得超出了自己的区域,超出的部分不会出现在截图中。截图不会拍到与当前组件平级的(兄弟)组件。 模块简…...

华为昇腾910b服务器部署DeepSeek翻车现场
最近到祸一台HUAWEI Kunpeng 920 5250,先看看配置。之前是部署的讯飞大模型,发现资源利用率太低了。把5台减少到3台,就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘,500G的系统盘, 2块3T固态…...

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植
最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台,现在已经移植了,尝试了下效果,降噪效果很显著,噪声带被显著抑制了 降噪前: 降噪后:...

golang内存泄漏
golang也用了好几年了,趁着有空 整理归纳下,以后忘了好看下 一般认为 Go 10次内存泄漏,8次goroutine泄漏,1次是真正内存泄漏,还有1次是cgo导致的内存泄漏 1:环境 go1.20 win10 2:goroutine泄漏 单个Goroutine占用内存&…...

安科瑞能源物联网平台助力企业实现绿色低碳转型
安科瑞顾强 随着全球能源结构的转型和“双碳”目标的推进,能源管理正朝着智能化、数字化的方向快速发展。安科瑞电气股份有限公司推出的微电网智慧能源管理平台(EMS 3.0),正是这一趋势下的创新解决方案。该平台集成了物联网&…...

Android Http-server 本地 web 服务
时间:2025年2月16日 地点:深圳.前海湾 需求 我们都知道 webview 可加载 URI,他有自己的协议 scheme: content:// 标识数据由 Content Provider 管理file:// 本地文件 http:// 网络资源 特别的,如果你想直接…...

腾讯的webUI怎样实现deepseek外部调用 ; 腾讯云通过API怎样调用deepseek
腾讯的webUI怎样实现deepseek外部调用 目录 腾讯的webUI怎样实现deepseek外部调用腾讯云通过API怎样调用deepseekhtml方式curl方式python方式腾讯云通过API怎样调用deepseek 重点说明:不需要SK,仅仅使用ip和端口号 html方式 <!DOCTYPE html> <html lang="e…...
DeepSeek VS ChatGPT-速度、准确性和成本
撰写本文时马斯克刚刚发布了聊天机器人Grok2,10万张算卡体现了马斯克的财大气粗。近年来,人工智能模型取得了长足的发展,每个模型都力求在速度、准确性和成本效率方面超越其他模型。在本文中,我将深入研究比较中美在AI的焦点模型上…...

内外网隔离文件传输解决方案|系统与钉钉集成+等保合规,安全提升70%
一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 1. **安全性风险**:内外网直连可能导致病毒传播、数据泄露。 2. **操作繁琐**:传统方式需频繁切…...

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)
Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种: 下载到程序的源代码,自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。(不解决依赖关系)通过apt进行安装软件。 小知识点…...

最新版IDEA下载安装教程
一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…...

MacOS 15.3 卸载系统内置软件
1、关闭系统完整性(SIP) 进入恢复模式(recovery) 如果您使用的是黑苹果或者白苹果,可以选择 重启按住CommandR 进入,如果是M系列芯片,长按开机键,进入硬盘选择界面进入。 我是MacMini M4芯片,关…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...