Vue3后台管理系统之权限管理-按钮权限

前言

在做后台管理系统时,需要根据用户的身份展示对应的页面、资源、按钮等。比如超级管理员在某个页面中具备新增、删除、编辑、查询、下载等按钮操作,部长具备新增、编辑、查询、下载按钮操作,而普通用户只具备查询、下载按钮操作。

思路

  1. 利用自定义指令v-directive。假设现在是sys系统设置页面中的删除按钮,order订单页面中的编辑按钮,在按钮上使用v-permission指令,判断当前用户是否具备该操作权限,渲染按钮。
  2. 使用v-if指令,判断用户是否拥有该按钮权限。与上面的做法差不多,只不过v-if不要直接使用在组件上。

创建自定义指令

首先,创建一个名为v-perm的自定义指令。这个指令会接收一个参数,即页面按钮编码,然后根据角色身份判断是否拥有此按钮的操作权限,在页面中动态渲染该按钮。

ts 复制代码
// directives/permission.js
import { DirectiveBinding } from 'vue';

export default {
  mounted(el: HTMLElement, binding: DirectiveBinding<string>) {
    const hasPermission = checkPermission(binding.value);
    if (!hasPermission) {
          el.parentNode && el.parentNode.removeChild(el); // 如果没有权限,移除该元素
    }
  },
}
export const checkPermission = ()=>{
    const userPermission = getUserPermission()
    return userPermission.includes(permission)
}
export const getUserPermission = async ()=>{
    //向后端请求获取用户的权限
    const [err,res] = await getUserInfo('admin')
    ...
}

全局注册指令

main.jsapp.js全局注册这个自定义指令。

ts 复制代码
import { createApp } from 'vue';
import permissionDirective from './directives/permission';

const app = createApp(App);
// 全局注册指令
app.directive('perm', permissionDirective);
app.mount('#app');

使用自定义指令

html 复制代码
<button v-permission="'sys_delete'" > 删除 </button>
<button v-permission="'order_edit'" > 编辑 </button>

使用v-if指令

html 复制代码
<button v-if="hasPerm('sys_delete')" > 删除 </button>
<button v-if="hasPerm('order_edit')" > 编辑 </button>
ts 复制代码
const hasPerm = async (btn_code)=>{
    const userRole = localStorage.getItem('role')
    const [err,res] = await getUserBtnPermisson(userRole)//获取该角色拥有的所有按钮操作权限
    //res = ['sys_delete','sys_edit','order_edit']
    return res.includes(btn_code)
}
相关推荐
可乐鸡翅yeah_7 分钟前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
tedcloud12327 分钟前
Wand-Enhancer:如何搭建一套远程开发与测试环境
前端·人工智能·macos·开源·流程图
掘金挖土1 小时前
前端手摸手跑路之 AI 应用开发(三)
前端·后端
计算机魔术师1 小时前
OpenAI 宣称破解千禧年难题,数学家却说是「反例搜索」?
前端
志尊宝1 小时前
Vue3 零基础每日笔记(015):条件渲染 v-if 与 v-show——控制 DOM 生死还是控制显隐
前端·vue.js·笔记
掘金者阿豪1 小时前
OceanBase 和金仓怎么选?别只看分布式,复杂查询更考验架构取舍
前端·后端·架构
Bug修理工Bubble1 小时前
Swift ARC:一个对象到底什么时候才会被释放?
前端
ClouGence1 小时前
GPT-6 做 UI 自动化测试:Demo 惊艳,但真的适合长期回归吗?
前端·chatgpt·测试
阿酷tony2 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
Bs_MoneyMagnet2 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物