vue 项目中使用v-permission 实现按钮级权限控制

news/2025/3/18 9:27:02/文章来源:https://www.cnblogs.com/fei686868/p/18232727

在使用 vue-element-admin 框架进行开发时,您可以通过自定义指令来实现按钮级的权限控制。这个自定义指令可以根据用户的权限动态地控制按钮的显示。以下是一个详细的实现步骤:

1、在 src 目录下按照如下目录结构,创建一个权限文件,例如 permission.js

目录结构:src/directive/permission/permission.js

// src/directive/permission/permission.js

import store from '@/store'export default {inserted(el, binding) {const { value } = bindingconst roles = store.getters && store.getters.rolesif (value && value instanceof Array && value.length > 0) {const permissionRoles = valueconst hasPermission = roles.some(role => {return permissionRoles.includes(role)})if (!hasPermission) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`need roles! Like v-permission="['admin','editor']"`)}}
}

2、在同个目录下创建一个指令注册文件,例如 index.js

目录结构:// src/directive/permission/index.js

// src/directive/permission/index.js

import Vue from 'vue'
import permission from './permission'Vue.directive('permission', permission)

3、main.js 文件中引入并注册这个指令

// src/main.js

import Vue from 'vue'
import App from './App.vue'
import store from './store'
import router from './router'
import '@/directive/permission' // 引入权限控制指令new Vue({el: '#app',router,store,render: h => h(App)
})

4、在组件中使用自定义指令

在任何需要权限控制的地方使用 v-permission 指令。例如:

<template><div><button v-permission="['admin']">Admin Button</button><button v-permission="['editor', 'admin']">Editor or Admin Button</button></div>
</template><script>
export default {name: 'PermissionExample'
}
</script>

5、确保在 Vuex Store 中有 roles 的 getter

// src/store/getters.js

const getters = {
roles: state => state.user.roles
// 其他getters...
}
export default getters

并确保在 src/store/modules/user.js 中有 roles 的状态:

// src/store/modules/user.js

const state = {roles: []// 其他状态...
}const mutations = {SET_ROLES: (state, roles) => {state.roles = roles},// 其他mutations...
}const actions = {// 其他actions...
}export default {namespaced: true,state,mutations,actions
}

6、在用户登录后设置用户的权限

// src/store/modules/user.js

const actions = {// 登录后获取用户信息,包括权限
  async getUserInfo({ commit }) {// 假设从 API 获取用户信息const { roles } = await api.getUserInfo()commit('SET_ROLES', roles)}// 其他actions...
}

通过上述步骤,您可以在 vue-element-admin 项目中实现按钮级的权限控制。每个按钮根据 v-permission 指令动态显示或隐藏,确保只有拥有相应权限的用户才能看到和操作这些按钮。

 

5.6 就是确保用户登录后,将角色清单存储在store中的。然后验证时,从store中获取。

 

注我的个人公众号,每日更新,获取更多技术知识

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

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

相关文章

VSCode修改侧边栏以及代码字体大小

1、界面字体大小通过缩放处理 查看-外观-放大(快捷键Ctrl + =) 查看-外观-缩小(快捷键Ctrl + -) 2、编辑器/终端字体大小通过配置调整 文件-首选项-设置参考: https://blog.csdn.net/edward_zcl/article/details/137718199

活动回顾丨AI 原生应用架构专场北京站 PPT 下载

5 月 24 日,飞天技术沙龙首个 AI 原生应用架构专场在北京举办。《AI 原生应用框架发展趋势》、《通义灵码技术解析,打造 AI 原生开发新范式》、《应用容器化托管及工程实践》、《云消息队列的成本治理实践》、《基于日志构建智能化全栈可观测,提速日常运维》5 个议题,分别从…

Qt学习第四篇(主窗口和ui的使用)

QMainWindow QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个停靠部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。菜单栏 一个主窗口最…

ARP协议:网络世界的地址翻译官

一 . 引言在当今快速发展的汽车行业中,车载以太网正逐步成为推动汽车智能化、网联化浪潮的核心技术之一。作为传统以太网技术在汽车领域的创新应用,车载以太网不仅继承了以太网的开放性、成熟性和互操作性,还针对车辆特有的环境和需求进行了优化与定制,为车载内部的复杂数据…

逐梦航天!AIRIOT大学计划暑期训练营来啦!

品质训练营助力“小白”,开启大神之路! AIRIOT大学计划暑期训练营等你来!“产业赋能,教育创新",为了促进物联网产业的纵深发展和创新,推进教育链、产业链与创新链的有机结合,提升理论、实践和创新能力,扩展学生视野,促进学生交流,为中国最有前途的物联网人才成长…

为什么MySQL的information_schema.tables字段index_length显示为0?

为什么MySQL的information_schema.tables字段index_length显示为0?测试版本为:MySQL社区版 8.0.36分情况1:innodb引擎的表是索引组织表,按照主键进行顺序存放。则表是索引,索引是表,index_length不会有值。 如下,创建一个表,并追加主键,查看索引情况。(root@localhost…

etcd-v3.5.9源代码分析

Github上下载etcdv3.5.9源代码,包含server和client两部分。 先放ETCDv3 读写流程图镇楼读流程写流程 Etcd Server server->etcdmain->main.go:Main():startEtcdOrProxyV2() ->etcd.go:startEtcd()->StartEtcd()->etcdserver目录下server.go:NewServer() 初始化…

【长亭雷池WAF】介绍及“动态防护”功能深度体验

一、介绍 什么是雷池 雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。 区别于传统防火墙,WAF 工作在应用层,对基…

Goland无法Debug

起因 今天用goland,Debug代码出现如下报错 其原因是因为正在使用的Delve试调器版本太旧,无法兼容当前的Go语言版本1.22.1 Delve是Go语言的一个调试工具,用于提供源码级别的调试功能 Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已…

2.6倍!WhaleTunnel 客户POC实景对弈DataX

作为阿里早期的开源产品,DataX是一款非常优秀的数据集成工具,普遍被用于多个数据源之间的批量同步,包括类似Apache DolphinScheduler的Task类型也对DataX进行了适配和增强,可以直接在DolphinScheduler里面利用通用的数据源调用DataX进行数据批量同步。 作为DolphinSchedule…

App_Code.dll没有生成问题

场景:VS2019需要生成App_Code.dll,用来更新网站接口,但是【发布/重新生成】网站后,Bin目录里头都没有找到这个App_Code.dll。 解决: 发布的时候勾选一下【在发布前删除所有现有文件】和【在发布期间预编译】即可