vue 按钮级别权限的实现

本文介绍如何在Vue项目中实现按钮级别的权限控制。通过自定义指令v-has,并在后端定义按钮标识符如添加=Add、修改=Update、删除=Delete等,在页面加载时获取这些权限并存储,利用hasPermission.js文件中的方法判断当前用户是否拥有该权限。

# vue 按钮级别权限的实现

  1. 按钮级的权限

    1.1前后端共同规定每种按钮的标识符 添加=>Add 修改=>Update 删除=>Delete

    ​ 在每次加载页面的时候请求接口,拿到按钮级别的权限,存放在Session里面或者公共存储里面

    ​ 然后通过自定义v-has=”{class:’Add’}”去控制显示和隐藏

  2. 使用

    2.1在src下的utils里面把js文件放进去,随后在main.js里面引入,

    ​ import { has } from “./utils/hasPermission”;

    2.2 在页面的按钮级权限的里面v-has="{class:‘admin’}" 去控制

** 在src下创建util文件夹创建hasPermission.js文件**

import Vue from "vue";
/**
 * 按钮级别的权限控制 -- 比对元素 -- 元素绑定角色值---登录后获取角色的值
 * 元素绑定角色值,接收字符串或者数组
 */
/** 权限指令 */
let has = Vue.directive("has", {
	inserted: function(el, binding) {
		//注意使用inserted周期,不要使用bind 不然无法删除元素
		let ClassName = binding.value.class; //v-has 接收数组对象
		if (el.parentNode && !Vue.prototype.$_has(ClassName)) {
			el.parentNode.removeChild(el);
		}
	},
});
// 元素指令值与角色值对比,如果不匹配,返回false
// 权限检查
Vue.prototype.$_has = function(val) {
	let isShow = false;
	let bthPerminnions = sessionStorage.getItem("bthPermissions");
	if (bthPerminnions === undefined || bthPerminnions == null) {
		return false;
	}
	if (typeof val === "string") {
		if (val === bthPerminnions) {
			isShow = true;
		}
		return isShow;
	} else {
		for (let i = 0; i < val.length; i++) {
			const showIs = val[i];
			if (showIs === bthPerminnions) {
				isShow = true;
			}
		}
		return isShow;
	}
};
export { has };

我是放在了session里面,如果放在vuex中直接修改js文件即可,同理.根据情况而定

### Vue Element Plus 按钮级别权限控制实现方案 在 Vue 3 和 Element Plus 的项目中,可以通过动态渲染的方式实现按钮级别权限控制。以下是具体的实现方法: #### 权限控制逻辑设计 为了实现按钮级别权限控制,可以定义一个全局的权限校验函数,在模板中通过 `v-if` 或者自定义指令来判断当前用户是否有操作该按钮权限。 #### 示例代码 以下是一个完整的示例,展示如何在 Vue 3 中结合 Element Plus 实现按钮级别权限控制功能。 ##### 定义权限校验工具函数 创建一个文件用于存储用户的权限列表并提供校验方法。 ```javascript // permission.js export function hasPermission(permissions, targetPermission) { return permissions.some(permission => permission === targetPermission); } ``` ##### 组件中的使用方式 在组件内部调用此工具函数完成权限验证。 ```vue <template> <div> <!-- 使用 v-if 判断 --> <el-button type="primary" @click="handleAdd" v-if="hasPermission(['admin', 'editor'], 'add')">新增</el-button> <!-- 自定义指令方式 (可选) --> <el-button type="danger" @click="handleDelete">删除</el-button> </div> </template> <script> import { hasPermission } from '@/utils/permission'; export default { data() { return { userPermissions: ['admin'] // 用户拥有的权限列表 }; }, methods: { handleAdd() { console.log('执行新增操作'); }, handleDelete() { if (!this.hasPermission(this.userPermissions, 'delete')) { alert('您无权进行删除操作'); return; } console.log('执行删除操作'); } }, computed: { hasPermission() { return (permissions, targetPermission) => hasPermission(permissions, targetPermission); } } }; </script> ``` 以上代码展示了两种常见的权限控制手段:一种是直接利用条件渲染 (`v-if`);另一种是在事件触发前增加额外的权限检查逻辑[^1]。 ##### 路由守卫集成 如果希望在整个应用层面统一处理未授权访问的情况,则可以在路由导航过程中加入拦截机制。 ```javascript // router/index.js import { createRouter, createWebHistory } from 'vue-router'; import { hasPermission } from '@/utils/permission'; const routes = [ { path: '/example', name: 'ExamplePage', meta: { requiresAuth: true, requiredPermissions: ['view_example_page'] }, component: () => import('@/views/example.vue') } ]; const router = createRouter({ history: createWebHistory(), routes, }); router.beforeEach((to, from, next) => { const isAuthenticated = !!localStorage.getItem('token'); // 替换为实际认证状态获取方式 if(to.meta.requiresAuth && !isAuthenticated){ next('/login'); }else{ let currentRolePermissions = JSON.parse(localStorage.getItem('user_permissions')); if(to.meta.requiredPermissions && !hasPermission(currentRolePermissions , to.meta.requiredPermissions)){ next('/no-access'); }else{ next(); } } }); export default router; ``` 这里不仅考虑到了页面级别权限管理还兼顾到更细粒度的操作许可判定[^4]。 ### 总结 通过上述介绍可以看出,在 Vue 3 结合 Element Plus 开发的应用程序里实施按钮层次上的安全防护措施并不复杂。只需要合理规划数据结构以及灵活运用框架特性即可达成目标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值