Vue3实现按钮级别权限的几种方式
使用v-if指令:根据用户的权限信息,在模板中使用v-if条件渲染,只显示用户有权限操作的按钮。自定义指令:创建一个自定义指令,通过该指令在元素上进行权限判断,控制按钮是否可见或可点击。插件配合鉴权方法:结合插件和鉴权方法,在全局范围内对按钮进行权限验证。可以在组件挂载前或路由跳转前进行鉴权,禁用没有权限的按钮。这些方法都能实现按钮级别的权限管理,具体选用哪种方法取决于项目的需求和开发者的偏好。
·
按钮级别的权限管理
1、通过公用的hasPermission方法配合v-if、v-show指令,或者disbaled属性控制按钮的是否渲染或禁用
实现按钮级别的权限有很多方法,比如:在vue中可以封装一个公共的方法,将该按钮所需的权限与该用户拥有的权限进行比较,若该用户的权限码列表包含该按钮的所需权限码,则该方法返回ture,否则返回false。
例如:
<van-button type="success" v-if="hasPermission(["1001", "1002"])">新增</van-button>
通过hasPermission传入的按钮所需权限,进行判断该用户是否有该按钮的权限,是否渲染该按钮。
用户登录成功之后,后端会返回该用户的token、按钮权限码列表,再将这些信息存入store中。
hasPermission方法,首先从store中获取该用户的权限码,与该按钮所需的权限码做对比。
function hasPermission(requiredPermissions) {
// 假设当前用户的权限存储在变量 userPermissions 中
const userPermissions = ["1001", "1002", "1003"];
// 检查用户权限是否包含所需权限
for (const permission of requiredPermissions) {
if (!userPermissions.includes(permission)) {
return false;
}
}
// 所有所需权限都存在于用户权限中
return true;
}
使用ts封装
// permissionUtil.ts
import { useUserStore } from "@/store/user"
// import { PermissionCode } from "@/types/data"
export type PermissionCode = "1001" | "1002" | "1003"
export const hasPermission = (btnPermissions: PermissionCode | PermissionCode[]) => {
// 用户的权限码
const userStore = useUserStore()
const userPermission = userStore.permission as PermissionCode[]
// 按钮所需单个权限code
if (!Array.isArray(btnPermissions)) {
return userPermission.indexOf(btnPermissions) !== -1
}
// 按钮所需多个权限code
for (const btnPermissionCode of btnPermissions) {
if (!userPermission.includes(btnPermissionCode)) {
return false;
}
}
return true
}
2、自定义指令的方式
通过公用的hasPermission方法配合自定义指令(v-isAuth)配置
<van-button v-isAuth="['1001', '1002']" type="default">默认按钮</van-button>
// main.ts
app.directive("isAuth", {
mounted(el: HTMLElement, binding){
// 按钮所需权限码
const btnCodes = binding.value
const isAuth = hasPermission(btnCodes)
// 无权限
if(!isAuth){
el.parentNode?.removeChild(el)
}
}
})
3、插件的方式
如果觉得在main.ts中注册全局指令不够优雅,也可以使用插件的方式,将逻辑单独放在一个ts文件里
<van-button v-isAuth="['1001', '1002']" type="default">默认按钮</van-button>
// btnPermissionDirective.ts
import { App, DirectiveBinding } from 'vue';
import { hasPermission } from '@/utils/permissionUtil';
import { PermissionCode } from "@/types/data"
const isAuthDirective = {
mounted(el: HTMLElement, binding: DirectiveBinding<string[]>) {
const btnCodes = binding.value as PermissionCode[];
const isAuth = hasPermission(btnCodes);
if (!isAuth) {
el.parentNode?.removeChild(el);
}
}
};
// 这里会默认导出一个 isAuthDirective方法
export default {
install(app: App, options: any) {
app.directive('isAuth', isAuthDirective);
}
};
在main.ts中使用
// main.js
import isAuthDirective from '@/directives/btnPermissionDirective';
const app = createApp(App)
// 注册插件
app.use(isAuthDirective)
app.mount('#app')
更多推荐
已为社区贡献2条内容
所有评论(0)