vue element admin 权限控制,element角色菜单按钮权限

  vue element admin 权限控制,element角色菜单按钮权限

  本文主要介绍了基于元素按钮权限的vue实现方案,并通过示例代码进行了详细介绍。对大家的学习或工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。

  背景:ERP系统需要增加“按钮权限控制”的功能,权限控制的粒度要推广到按钮级别。

  

预期

  按钮权限控制的交互方式只有两种:“不可见”和“可见不可得”。

  

不可见

  隐形交互比较简单,我们可以用v-if来控制是否显示。用v秀还可以,但是不够安全。毕竟v-show只是把样式改成了显示:none,渲染还是存在于真实的DOM中,所以更推荐v-if来控制不可见性。

  

可见不可点

  “看得见,做不到”。

  样式控制(你要加一个禁止的样式),比如光标:不允许,变灰等等;

  不能点击,就是想禁用或者屏蔽点击事件。似乎应该实施预防违约/停止程序;

  最终的产品需求选择了“看得见看不见”,原因可能是看不见太简单了。( _ )

  

思路探索

  给按钮点击事件的回调函数添加一个包装函数,控制其权限,拦截并触发事件。挺代理的,有点高层的成分(但是现有业务改动太多,每个@click绑定函数都要一个一个修改,所以放弃方案);

  防止按钮点击事件冒泡和触发。似乎可以使用prevent default/stop program。我感觉可以通过指令的方式来监控DOM元素。如果允许,我可以让事件正常执行,但如果不允许,我可以拦截和阻止它们。

  

实践方案

  最后选择指令的方式,扩展最小成本,避免改变现有的业务代码逻辑。

  权限控制需要点击劫持的元素:

  el按钮

  Btn-wrapper(自封装组件)

  Div/span/a和其他标记

  具体实施方案请参见以下内容:

  

权限入口:Vuex 控制,全局使用

  //用户登录后,获取用户权限码,存储在store中。

  这个。$store.commit(SET_AUTH_CODE ,authCodeList);

  SET_AUTH_CODE: (state,acthCode)={

  if (acthCode) {

  state . auto delist=ACTH code;

  }

  setStore({

  名称:“自动提交”,

  content:state . auto delist [],

  });

  }

  

定义权限指令

  const disableClickFn=(event)={

  event event . stop immediate propagation();

  }

  导出常量hasPermission=()={

  Vue.directive(permission ,{

  bind(el,binding) {

  设disalbe=true

  if(auto delist . length auto delist . includes(binding . value)){

  disable=false

  }

  如果(禁用){

  el.classList.add(权限禁用);

  el.setAttribute(disabled , disabled );

  el.addEventListener(click ,disableClickFn,true);

  }

  },

  解除绑定(el)

  el.removeEventListener(click ,disableClickFn);

  }

  });

  };

  首先是addEventListener的第三个参数,我们在捕获阶段使用useCapture为true来触发它,所以这里的事件监听器会优先触发回调到@ click

  其次,stopImmediatePropagation用于防止事件冒泡和触发其他相同的事件侦听器。

  如果多个事件侦听器被附加到同一元素的同一事件类型,当该事件被触发时,它们将按照添加的顺序被调用。如果在其中一个事件侦听器中执行stopImmediatePropagation(),则不会调用其余的事件侦听器。MSDN -立即停止传播

  

增加禁用的 CSS 样式

  。权限-禁用{

  位置:相对;

  光标:不允许!重要;

  指针事件:无;//防止元素成为鼠标事件

  边框:无;

  背景-图像:无;

  *在{

  内容:“”;

  位置:绝对;

  底部:0;

  左:0px

  右:0px

  身高:100%;

  z指数:9;

  背景:rgba(255,255,255,0.5);

  }

  }

  这里使用了一个相当奇怪的CSS属性,指针事件。

  CSS3的pointer-events属性指定在什么情况下(如果有的话)特定的图形元素可以成为鼠标事件的目标。更多用法参考:MSDN指针事件

  这里指针事件的使用只是一个辅助功能,并不意味着元素上的事件监听器永远不会被触发。如果一个后代元素指定了pointer-events并被允许作为事件目标,就可以触发父元素的事件,单纯依靠CSS属性来控制不点击还是有风险的,所以这里只是一个辅助功能。

  

全局 "权限判断" 工具函数

  从“@/util/store”导入{ getStore,};

  const auto delist=get store({ name: auto delist ,}) [];

  导出函数具有权限(authName) {

  回归!(auto delist . length 0 auto delist . includes(authName));

  }

  

具体使用

  //指令模式(oms/order/save这里是对应用户登录时的代码权限代码)

  El-button v-permission= OMS:订单:保存保存/el-button

  //功能模式

  El-button:disabled= has permission( OMS:order:save)/El-button

  关于基于元素按钮权限的vue实现方案的文章到此为止。有关元素按钮权限的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: