vue 按钮权限

项目中按钮的操作权限我们可以直接使用 v-if 判断就行,但是每个页面都要写一堆判断不太雅观。
所以,可以写一个全局函数或者自定义指令 ,两种方式优雅的实现。

一、全局函数

一般在登陆接口中后台就把权限列表信息提供了,可以把他存到缓存或者vuex里。

vuex中设置权限数据,具体代码如下

import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import tagsView from './modules/tagsView'
import { constantRoutes } from '../router/index'

Vue.use(Vuex)

const store = new Vuex.Store({
	state: {
		//设置属性,用于保存后台接口返回的权限数据
		permission: [],
	},
	mutations: {
		SET_PERMISSION(state, permission) { //permission 为传入的权限标识集合
			// 传入的权限集合 赋值给状态中的 permission
			sessionStorage.setItem('permission', JSON.stringify(permission));
		},
	},
	actions: { // 官方不推荐直接修改mutation, 可使用actions来提交 mutation
		SET_PERMISSION(context, permission) {
			// 提交到 mutation 中的 SET_PERMISSION 函数
			// context.commit("SET_PERMISSION", permission);
			sessionStorage.setItem('permission', JSON.stringify(permission));
		},
	}
})

export default store

在登录的页面,获取用户权限信息的时候就可以触发SET_PERMISSION这个方法

//res.data.data.menuPermission就是相应的权限数据
this.$store.dispatch(
	"SET_PERMISSION",
	res.data.data.menuPermission
);

在 utils 文件夹创建一个 permission.js 文件

import store from '../store/index.js'
/**
 * 判断是否有权限。根据传入的权限标识,查看是否存在于用户的权限标识集合内。
 */
export function hasPermission (perms) {
  let hasPermission = false;
  let permission = store.state.user.role.rights
  for (let item of permission) {
    if (item === perms) {
      hasPermission = true;
      break;
    }
  }
  return hasPermission;
}

在需要用到的组件引用

<template>
  <el-button :disabled="!hasPerms('edit')">编辑</el-button>
</template>

<script>
  // 禁用标识
  // :disabled="!hasPerms(perms)"
import { hasPermission } from '@utils/Permission/index.js'
export default {
  data() {
    return {
    }
  },
  methods: {
      hasPerms(perms) {
      // 根据权限标识和外部指示状态进行权限判断
      return hasPermission(perms) // !this.disabled
    }
  }
}
</script>

二、自定义指令

创建 premission.js 文件

import Vue from 'vue'
import store from '../store/index.js'
//自定义指令,用来控制按钮权限
Vue.directive('permission', {
  inserted (el, binding) {
    // 当前按钮传递的值( v-permission="'add'" 中的值)
    const currentTag = binding.value.action
    const effect = binding.value.effect
    // 获取到存放在 store 中的权限数据
    const currentRight = store.state.user.role.rights
    // 判断是否存在对应的按钮权限
    let item = currentRight.filter((item) => {
      return item === currentTag
    })
    //不具备权限则删除(隐藏)或者禁用该按钮 (el.parentNode 获取当前节点的父节点),根据在芫荽绑定的值去决定
    if (item.length === 0) {
      if (effect === 'disabled') {
        el.disabled = true
        el.classList.add('is-disabled')
      } else {
        el.parentNode.removeChild(el)
      }
    }
  }
})

在页面中使用按钮时, 用上自定义的 v-premission 指令

<el-button v-permission="{action:'edit',effect:'disabled'}">编辑</el-button>

注意:在vue3中,使用方式有所不同
permission.js文件

import App from './App.vue'
import store from '../store/index.js'
const app = createApp(App);

app.directive('permission', {
   mounted(el, binding) {
      // 当前按钮传递的值( v-permission="'add'" 中的值)
	    const currentTag = binding.value.action
	    const effect = binding.value.effect
	    // 获取到存放在 store 中的权限数据
	    const currentRight = store.state.user.role.rights
       // 判断是否存在对应的按钮权限
	    let item = currentRight.filter((item) => {
	      return item === currentTag
	    })
	    //不具备权限则删除(隐藏)或者禁用该按钮 (el.parentNode 获取当前节点的父节点),根据在芫荽绑定的值去决定
	    if (item.length === 0) {
	      if (effect === 'disabled') {
	        el.disabled = true
	        el.classList.add('is-disabled')
	      } else {
	        el.parentNode.removeChild(el)
	      }
    	}
   }
})

### Vue按钮级别权限控制的实现 在 Vue 项目中,为了实现按钮级别的权限控制,可以采用多种方式。一种常见的方式是在视图层通过条件渲染来决定是否展示特定按钮。 #### 使用 `v-if` 指令 对于较为简单的场景,可以直接利用 `v-if` 指令基于用户的权限属性来控制组件或元素的可见性[^1]: ```html <template> <div> <!-- 只有拥有 'edit' 权限的用户才能看到此按钮 --> <button v-if="hasPermission('edit')" @click="handleEdit">编辑</button> </div> </template> <script setup> import { computed } from 'vue'; // 假设 permission 是从 Vuex Store 或其他地方获取到的对象 const hasPermission = (perm) => computed(() => permission.value.includes(perm)); </script> ``` 这种方法简单直观,但对于大量不同类型的权限检查来说不够优雅高效。 #### 创建自定义指令 `v-has` 针对复杂的应用程序,建议封装成可重用的自定义指令,比如命名为 `v-has` 的全局指令,这样可以在模板里更加简洁地表达意图[^2]: ```javascript app.directive('has', { mounted(el, binding, vnode){ let permValue = binding.value; let currentPerms = vnode.appContext.config.globalProperties.$store.state.user.permissions; if(!currentPerms.some(p=>p===permValue)){ el.style.display='none'; // 隐藏无权访问的内容 } }, }); ``` 使用该指令时只需指定所需权限名称即可: ```html <!-- 如果当前用户具有 edit 权限时才会显示这个按钮 --> <button v-has="'edit'" class="btn btn-primary" @click="onEdit()">编辑</button> ``` 此外,在某些情况下可能还需要考虑实时监听权限变更的情况,这时可以在自定义指令内部加入响应式的处理机制,确保即使在运行期间修改了权限配置也能及时反映到界面上[^3]。 最后需要注意的是,除了前端层面的安全措施外,任何敏感操作都应当配合服务端验证以防止潜在的安全风险[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值