需求小能手——按钮权限功能

前言

最近很多项目都做了权限功能,并且都细分到了按钮级别,本节就来介绍一下如何实现按钮级别的权限。

按钮权限

说起权限,首先想到的是菜单权限,项目中是通过权限码控制菜单,每个菜单对应一个权限码,在addRoute时,获取当前用户的权限码,根据权限码去添加对应的菜单,而按钮权限也可以沿用此思路。

自定义指令

将按钮功能当作一个权限码,比如导出功能,对应一个导出权限码,导出按钮就用此权限码判断,页面上的效果我们可以通过v-if去实现,总结下来按钮权限就是两步:

  • 将按钮功能总结出来,形成一个权限码,获取当前用户的权限,与按钮权限码进行对比。
  • 按钮添加v-if,对应的value值就是权限对比结果。
    第一步需要跟后端合作,权限码对比的方法项目中用到的页面会多一点,所以我们就可以写到vuex里面,在需要用到的页面引入进来。这是最简单的思路,在此基础上我们可以把权限对比、v-if结合起来,自定义一个指令,该指令的参数、效果如下:
  • 参数:接收权限码参数。
  • 效果:当前用户拥有此权限码就展示,否则隐藏。
    公司项目用的vue2,所以这里用vue2技术栈实现。vue2自定义指令方法为directives,自定义指令包含好几个钩子函数,这里我们选用inserted ,相当于生命周期中的mounted。钩子函数有四个参数,重点是以下两个参数:
    • el:绑定的元素。
    • binding:指令信息对象,包括name------指令名;value------绑定值;modifiers------修饰符对象。
      我们就用directives写出一个v-permission指令,首先就是进行权限的判断,我们给指令绑定一个权限码数组,通过binding获取绑定值,然后通过接口获取角色拥有的权限,最后利用数组的some方法去判断该用户是否有按钮权限。
js 复制代码
export const permission = {
inserted(el, binding) {
const { value } = binding
// 获取角色权限码
const roles = UserInfo.roles
// 绑定值权限码数组
if (value && value instanceof Array && value.length > 0) {
const permissions = value
const hasPermission = roles.some(role => {
return permissions.includes(role)
})
}
}

当用户没有此按钮权限,我们利用el参数,调用父元素的removeChild方法,移除此dom,达到隐藏效果,这个刚好与v-if也对应上。

js 复制代码
if (!hasPermission) {
el.parentNode && el.parentNode.removeChild(el)
}

利用Vue.directive绑定此函数,就能得到v-permission,在权限按钮使用此指令。

js 复制代码
<el-button v-permission=['1','2']></el-button>

如果我们不想要隐藏效果而是禁用效果,将移除元素的逻辑修改一下即可。注意,项目中运用了element ui所以禁用效果我们只需在元素的class列表中添加is-disabled类名。当然两者功能可以结合起来,我们在v-permission指令上添加一个disabled修饰符,通过binding中的modifiers修饰对象去判断。

总结

以上就是按钮权限功能的实现,通过自定义指令方便快捷的实现此功能,并且可以根据需要添加其他功能。当然如果是列表操作列当中的按钮,可以交由后端处理,让其返回一个权限字段。

相关推荐
酷炫码神9 分钟前
Day 2|CSS 盒模型:把昨天的骨架,变成能看的页面
前端·css
Amos_Web14 分钟前
我做了一个 Chrome 插件,专治“这篇文章我明明看过,但重点去哪了?”
前端·浏览器
abcyuu16 分钟前
用友 U8 Cloud 生产制造模块深度解析:从 BOM 建立到成本核算的技术实现
前端·数据库·制造
零基础12319 分钟前
为什么 Agent 用 SQLite 数据库?
前端·人工智能·sqlite·开源
xuyanzhuqing30 分钟前
如何在一周内将一个巨石工程实现国际化
前端
数据掘金36 分钟前
小程序埋点方案的埋点覆盖率怎么算?
前端
true80336 分钟前
跨端开发的相册选择:弃用 uni-app 原生选图 API,直调 Android MediaStore 实现自定义相册架构
前端
数据掘金36 分钟前
多AI平台回答快照的差异校验
前端
于航43 分钟前
从 Multi-Agent 到 Skill+CLI:个人助理 1.0 → 2.0 架构演进
前端
2301_786756601 小时前
2026 JCR 秋季数据重载解读:影响因子为什么会变?附期刊影响力数据批量追踪方案
java·服务器·前端