实现原理
在按钮上设置标签数值,利用 vue 的指令功能获取按钮实例对象和按钮上绑定的标签数值,与从接口拿到的按钮权限数据进行匹配,如果匹配成功,说明有权限,反之没有权限。则在指令处理函数中编写代码移除(隐藏)该按钮。
const state = {
permissions: []
};
const getters = {
custinfo: state => {
return {
permissions:state.permissions,
}
}
};
const mutations = {
setPermissions: (state, permissions) => {
state.permissions = permissions
window.sessionStorage.setItem('filler_Permissions',JSON.stringify(permissions));
},
getPermissions(state) {
let editTab = window.sessionStorage.getItem('filler_Permissions');
state.permissions = JSON.parse(editTab);
},
};
const actions = {
setPermissions({
commit
},value) {
commit("setPermissions",value);
},
getPermissions({
commit
}) {
commit("getPermissions");
}
};
export default {
namespaced: true,
state,
getters,
actions,
mutations
};
缓存权限数据
this.$store.dispatch('menus/setPermissions', permsArray)
- 这里先触发action,再由action触发mutations,将数据缓存
指令实现
export default {
//被绑定元素插入父节点时调用
inserted(el, binding, vnode) {
console.log(binding.value);
const authCode = binding.value
if (!authCode) {
return;
}
const auth = window.sessionStorage.getItem('filler_Permissions') || '[]'
let flag = true
if (Array.isArray(authCode)) flag = auth.includes(authCode[0])
else flag = auth.includes(authCode)
// flag为false,则表示没有权限
if (!flag) el.style.display = 'none'
也可以在渲染时直接移除元素
//el.parentNode && el.parentNode.removeChild(el)
}
import hasPermi from './permission/hasPermi';
const install = function (Vue) {
Vue.directive('hasPermi', hasPermi)
}
if (window.Vue) {
window['hasPermi'] = hasPermi
Vue.use(install);
}
export default install
在main.js文件中全局挂载
Vue.use(directive)
页面使用
在v-button按钮中加入
v-hasPermi="'system:alarmrule:edit'" //命名的权限名称 system:alarmrule:edit