当前位置: 首页 > ds >正文

Vue3.5 企业级管理系统实战(二十三):权限指令

在实际应用场景中,常常需要依据用户角色对按钮的操作权限实施控制。实现这一控制主要有两种方式:一种是借助前端指令基于角色进行权限管控,另一种是通过后台返回对应的权限属性来实现精细化控制。本文聚焦于前端权限指令展开探讨。

1 权限指令

在 src/directives/permission.ts 中实现权限指令,代码如下:

//src/directives/permission.ts 
import { useUserStore } from "@/stores/user";
import type { DirectiveBinding } from "vue";/*** 检查元素权限:根据用户角色判断是否有权限显示元素* @param el - 当前指令绑定的DOM元素* @param bindings - 指令绑定的值和参数*/
function checkPermission(el: HTMLElement, bindings: DirectiveBinding) {// 获取指令绑定的值(权限数组)const { value } = bindings;// 获取用户状态管理仓库const store = useUserStore();// 计算属性:获取用户拥有的角色名称数组const roles = computed(() => store.state.roles.map((role) => role.name));// 校验权限配置格式if (value && Array.isArray(value)) {// 判断用户是否拥有任一所需角色const hasPermission = roles.value.some((item) => value.includes(item));// 无权限则移除DOM元素if (!hasPermission) {el.parentNode?.removeChild(el);}} else {// 抛出异常提示正确用法throw new Error(`请提供权限,如:v-permission="['admin','editor']"`);}
}/*** 权限指令:Vue3自定义指令,用于元素级权限控制* 使用方式:v-permission="['admin','editor']"*/
const permission = (el: HTMLElement, bindings: DirectiveBinding) => {// 元素插入DOM时执行权限检查checkPermission(el, bindings);
};export default permission;

在 src/directives/index.ts 中引入 permission.ts(如果有其他全局指令也在该文件中引入),代码如下:

//src/directives/index.ts
import type { App } from "vue";
import permision from "./permission"; // 导入权限判断核心逻辑/*** 权限指令插件:用于在Vue应用中注册自定义权限指令* 使用方式:在main.js中通过app.use()安装*/
const install = (app: App) => {// 注册全局自定义指令v-permission// 指令名称:permission// 指令实现:permision函数(来自permission模块)app.directive("permission", permision);
};export default install;

2 指令引入

在 src/main.ts 中引入directive,代码如下:

//src/main.ts
import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import "normalize.css/normalize.css";
import { createPinia } from "pinia";
import element from "./plugins/element";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
import "./permission";
import directives from "./directives/index";// import ElementPlus from "element-plus";
// import "element-plus/dist/index.css";
import "@/style/index.scss";
import "uno.css";
const app = createApp(App);
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate); // 安装持久化插件
app.use(router);
app.use(pinia);
app.use(element);
// app.use(ElementPlus);
app.use(directives);
app.mount("#app");

3 权限指令应用

在需要进行权限控制的组件上使用 v-permission 指令,并传入所需角色数组,例如:v-permission="['admin','editor']"。系统会自动检查用户角色,仅当用户拥有 admin 或 editor 角色时显示该组件,其他用户将无法看到或操作此元素。示例代码如下:

<el-button v-permission="['admin','editor']" type="primary" @click="handleEdit">编辑
</el-button>

以上就是权限指令的所有内容。

~完~ 

http://www.xdnf.cn/news/12449.html

相关文章:

  • 【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】
  • 根据指定日期和cron表达式生成下一周期的执行时间
  • C++类二
  • 吞咽与营养并重:进行性核上性麻痹患者的饮食管理方案
  • 龙虎榜——20250605
  • ubuntu安装NVIDIA驱动没有网络
  • 【GESP真题解析】第 12 集 GESP 三级 2024 年 6 月编程题 1:移位
  • Spring Cloud 2025 正式发布,你的灾难要来了
  • 系统思考持续训练
  • 前端面试题之浏览器存储技术Cookie、LocalStorage、SessionStorage、indexDB
  • FEMFAT许可管理软件推荐
  • js 比较两个对象的值,不相等就push对象的key
  • 图像去雾数据集总汇
  • Python基于方差-协方差方法实现投资组合风险管理的VaR与ES模型项目实战
  • Qt/C++学习系列之QButtonGroup的简单使用
  • w10激活方法
  • Linux免杀方案汇总(C语言)
  • 【cmder】--- Windows 下 cmder 经典常用快捷键 显著提高效率
  • 第十三节:第四部分:集合框架:HashMap、LinkedHashMap、TreeMap
  • 是否存在路径(FIFOBB算法)
  • JupyterNotebook全能指南:从入门到精通
  • LangchainRAG you need - 段落拆分
  • Setting搜索 ===》了解是如何初始搜索索引以及去掉控件搜索
  • exp1_code
  • 腾讯云服务器端口怎么全部打开?CVM和轻量端口开通教程
  • 【杂谈】-吉卜力化(Ghiblified ) AI 图像:艺术与隐私的交织
  • 06.最长连续序列
  • 我的创作纪念日——聊聊我想成为一个创作者的动机
  • 总结这几个月来我和AI一起开发并上线第一个应用的使用经验
  • 数据融合是什么?进行数据融合的4大关键环节!