后台项目 Express-Mysql-Vue3-TS-Pinia 实现按钮权限

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

实现按钮权限

引言

通过之前一段时间 ExpressMysql 的学习

这里尝试来搭建一个 后台系统 来巩固下学习的技术。

实现按钮权限

上一节,我们学习了什么是 自定义指令,并且如何进行使用

这一节,进行 按钮权限 的实现

实现

首先在项目中进行 注册我们的 自定义指令,这里选择 全局注册,毕竟用到的地方很多

main.ts 中进行注册

import { permission } from '@/directives/permission'

app.directive('permission', permission)

这里先想好,自定义指令,如何使用 以及 如何判断显示与否

再进行一下补充,v-permission 也可以传递一个对象,然后我们会在 binding.value 中获取到这个值,根据这个值,与这个用户所拥有的按钮权限做查找,如果存在,则显示,不存在则隐藏。

<button v-permission="{action:'sys:menu:add'}">新增</button>

那么在 src/directives/permission.ts 中进行权限代码的编写

import { ObjectDirective } from 'vue'
import { hasPermission } from '@/utils/common'

const permission: ObjectDirective = {
  mounted(el, binding) {
    const { action } = binding.value

    if (!hasPermission(action)) {
      el.remove()
    }
  },
}

通过上面的代码就可以轻松的搞定了我们的 按钮权限问题

但是这里呢,提出一个疑问,因为我们这里是直接将这个按钮元素给 remove 删除了,可能会影响页面的布局

此时我又想将其 disabled 禁用掉。

这里给出一个简单的方案,但是不怎么不是很安全

  • 首先是再给一个属性为 effect 效果的意思,值为 disabled,书写方式如下

    v-permission="{ action: 'sys:menu:add', effect: 'disabled' }"
    
  • 一旦 action 没有找到,那么就判断effect 是否是 disabled

    • 如果不是,则直接进行 remove 删除掉

    • 如果是,则将样式进行处理

    if (!hasPermission(action)) {
      if (effect === 'disabled') {
        el.style.pointerEvents = 'none'
        el.style.background = '#ccc'
      } else {
        el.remove()
      }
    }
    

总结

通过 Express-Mysql-Vue3-TS-Pinia 做出一个 后台系统 项目

这一节,通过 自定义指令 实现 按钮权限 的功能