Vue如何做按钮级别的权限?

本文共 1,904 字,预计阅读时间 6 分钟

对于权限来说都不陌生,而菜单权限及路由权限都很好控制,但按钮权限就没那么容易了,本文主要说明每个页面的按钮根据其拥有的权限来控制:

1)定义按钮权限的指令

复制代码
import Vue from 'vue'


Vue.directive('has', {
  inserted: function (el, binding, vnode) {
      let isExist = false
      // 从配置获取用户按钮权限
      let btnPermissions = vnode.context.$route.meta.btnPermissions
      if (btnPermissions && btnPermissions.indexOf(binding.value) > -1) {
          isExist = true
      }
      //不存在时删除节点
      if (el.parentNode && !isExist) {
          el.parentNode.removeChild(el)
      }
  }
})
复制代码

此指令是根据路由中配置的权限是否显示节点。

需要注意的是,上述的指令配置是针对Vue2.0的,对于Vue3.0会报错,需要使用下面的方式(这是一个大坑):

复制代码
import App from './App.vue'
const app = createApp(App);

app.directive('button', {
   mounted(el, binding) {
       let isExist = false
       // 从配置获取用户按钮权限
       let btnPermissions = router.currentRoute.value.meta.btnPermissions
       if (btnPermissions && btnPermissions.indexOf(binding.value) > -1) {
           isExist = true
      }
      //不存在时删除节点
      if (el.parentNode && !isExist) {
           el.parentNode.removeChild(el)
       }
   }
})
复制代码

2)定义两个页面,分别是home.vue和test.vue,其内容是一样的

复制代码
<template>
  <div>
    <el-button v-has="'query'">查询</el-button>
    <el-button v-has="'add'">添加</el-button>
    <el-button v-has="'delete'">删除</el-button>
  </div>
</template>
复制代码

需要注意的是,指令中的字符串一定要包含单引号,否则会报错。

3)在router/index.js中配置路由:

复制代码
const routes = [
  {
    path: '/home',
    name: 'home',
    component: () => import('@/views/home'),
    meta: {
      btnPermissions: ['query', 'add', 'delete']
    }
  },
  {
    path: '/test',
    name: 'test',
    component: () => import('@/views/test'),
    meta: {
      btnPermissions: ['query', 'add']
    }
  },

]
复制代码

在每个路由中配置了meta属性,里面包含了每个页面用于的权限。

分别访问/home 和 /test,发现home显示了所有的按钮,而test只显示了两个按钮。此时已经做到了按钮级别的权限。模拟了两个不同的角色可查看的按钮信息。

在正式开发过程中,每个页面的按钮即可通过指令的方式,在后台管理中维护菜单及按钮信息,再将这些权限分配给不同的角色,那么在用户登录后动态渲染路由和菜单,就能达到效果。

posted @   钟小嘿  阅读(2503)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-11-09 postman工具的用法
点击右上角即可分享
微信分享提示