权限控制(vue)

经常会遇到,角色权限控制问题,若是页面控制,倒好说,可如果是当前页面部分可见不可见,这就有些麻烦,如果加上条件就更加苛刻。之前只是简单的v-if进行控制,如今想试试指令(网上一直有这些操作方式)

参考

参考了vue-element-admin -- 指令

应用场景

  • 权限控制

    • dom隐藏(不推荐)
    • 直接从dom节点删除
  • 依据传入的数据动态进行修改

代码

需求:需要实现一个依据动态参数进行修改的模块

  • test.vue

    template

    <div class="test-height">
    <!-- 指令调用,status是动态参数 -->
    <h1 v-permission="{ role: ['so'], status }">test</h1>
    </div>

    js

      import permission from '@/directives/permission'
    export default {
    ...
    directives: { permission },
    data () {
    return {
    status: false
    }
    },
    mounted () {
    // 动态修改参数
    setTimeout(() => {
    this.status = !this.status
    }, 1000)
    }
    }
  • permission.js

      import store from '@/store'
    const permission = (el, binding, vnode, oldVnode) => {
    const { value, oldValue } = binding
    if (!value || (value.role && !Array.isArray(value.role))) {
    throw new Error(`need roles! Like v-permission="{ role: ['admin','editor'], [status 可传 boolean]}"`)
    }
    // 绑定的参数
    const status = value.hasOwnProperty('status') ? value.status : false
    const roles = store.getters && store.getters.roles
    const permissionRoles = value.role || [] const hasPermission = roles.some(role => {
    return permissionRoles.includes(role)
    }) if (!hasPermission || (hasPermission && status)) {
    /**
    * TODO:
    * 1. 给父元素添加唯一id
    * 2. 同时找到子元素当前父元素的第几个位置
    */
    const rid = getRandomId()
    const index = getChildInParentPosition(el)
    el.parentNode.setAttribute('id', rid)
    el.dataset.id = rid
    el.dataset.index = index
    el.parentNode && el.parentNode.removeChild(el)
    }
    // 判断条件
    if (oldValue && oldValue && oldValue.status === true && value.status === false) {
    // 此处会在 update时触发
    const { index, id } = el.dataset
    const parent = document.getElementById(id)
    // 根据index找到需要插入父节点的位置
    parent.insertBefore(el, Array.from(parent.children)[index])
    }
    }
    export default {
    // 此处父元素存在
    inserted: permission,
    // 此处数据更新
    update: permission
    }
    • 随机生成id
        function getRandomId () {
      var randomId = 'yxyxyxxyxyy'.replace(/[xy]/g, function (item) {
      var n = Math.random() * 12 | 0
      var v = item === 'x' ? n : (n & 0x3 | 0x8)
      v = item === 'y' ? 'abcdefghijklmnopqrstuvwsyz'.substr(Math.random() * 26 | 0, 1) : v
      return v.toString(16)
      })
      return randomId
      }
    • 找到子节点在父节点中的位置
        function getChildInParentPosition (node) {
      // 用来保留子元素 【cloneNode(true) 深度克隆】
      const Parent = node.parentNode.cloneNode(true)
      let key = -1
      Array.from(Parent.children).filter((item, index) => {
      // 判断子节点是否相同 【isEqualNode】
      if (item.isEqualNode(node)) {
      key = index
      }
      })
      return key
      }

效果图

  • 默认不显示,数据回来显示

    • 单个元素

    • 多个元素

  • 默认显示,数据回来不显示

    • 单个元素

    • 多个元素

总结

  • 虽然可以解决基本需求,但是还是有问题,若是兄弟元素都有权限控制,恐怕回显时,会错位
  • 因而推荐还是使用v-if
  • 上述方式,只能是应付简单的,复杂的依旧有些吃力
  • 在指令执行时,提前拿到父节点和子节点的对应关系,然后在update时,进行全局获取,因而生成的id必须唯一
  • 若是想使用,适用于其他场景,需要给需要权限控制的添加一个父元素,同时保证子元素唯一即可

知识点

  • cloneNode(true) 使用深度克隆是由于父元素因为实时变化才是用的,可以保留子节点
  • isEqualNode 用来判断两个子节点是否相同(长知识了)
  • update时,需要将节点添加到父节点上,此时 vnode, oldVnodeparent都没有值

权限控制(vue)的更多相关文章

  1. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  2. 基于Vue实现后台系统权限控制

    原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通 ...

  3. Vue + Element UI 实现权限管理系统 前端篇(十三):页面权限控制

    权限控制方案 既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦. 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作 ...

  4. vue项目权限控制

    Vue权限控制有各种方法,大概分为两个方向: 把当前角色对应的权限保存在浏览器本地(容易被恶意修改): 将操作权限保存在vuex中(推荐此种方式:页面一刷新就没了,可以再次向后端请求相关数据,始终保持 ...

  5. vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题.当然解决问题的方法无非两种——前端控制和后端控制.我们公司这边的产品迭代速度较快,所以我们是从前端控制路由迭代到后端控制路由.下面我会分别介绍这 ...

  6. vue中如何实现后台管理系统的权限控制

    vuejs单页应用的权限管理实践 一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单 ...

  7. pc vue 项目中的菜单权限控制

    在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...

  8. vue基于页面中按钮权限控制

    main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ...

  9. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

随机推荐

  1. AJAX - 向服务器发送请求请求

    AJAX - 向服务器发送请求请求 XMLHttpRequest 对象用于和服务器交换数据.直线电机生产厂家 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 ...

  2. pycharm的个性化设置

    1. 调整背景颜色 file -- settings -- Editor -- Color Scheme 2. 调整字体.字号.行间距 file -- settings -- Editor -- Fo ...

  3. VTK 编译过程中出现的hdf5长度(I64)错误解决办法

    最近在使用vtk和cuda做大规模图像处理方面的问题研究,在编译vtk的过程中发现第三方库hdf5不能够解决I64长度的探测识别问题.为了节约大家的时间,现在把我经过实践得到的解决方案共享出来,这里要 ...

  4. js控制手机保持亮屏的库,解决h5移动端,自动息屏问题

    一些说明:我用Laya(ts)开发小游戏,有需要保持手机屏幕常亮的需求(非必须的),然后作为小白的我就在网上找到了这个库,大概了解下,应该是通过播放空视频的原理来保持手机屏幕常亮,然后就放到项目中试了 ...

  5. 自定义input上传图片组件

    自定义input上传图片组件,美化样式 前段时间因为项目需求,做过一个上传图片组件,这里分享下大致思路,希望对有需要的童鞋有所帮助~~~ 功能需求:1.上传图片限制大小.分辨率.类型 2.上传图片支持 ...

  6. 正则表达式中 group groups区别

    先看代码instance: 1 >>> a="123abc456" 2 >>> import re 3 >>> print(r ...

  7. 冲刺周日 Fighting SunDay

    一.SunDay照片 二.项目分工 三.今日份燃尽图 四.项目进展 码云团队协同环境构建完毕 利用Leangoo制作任务分工及生成燃尽图 完成AES加解密部分代码 用代码实现对文件的新建.移动.复制. ...

  8. leetcode-mid- math-166. Fraction to Recurring Decimal

    mycode   73.92% 如何判断同号? 1)res = "-" if ((numerator>0) ^ (denominator>0)) else " ...

  9. C#中winform下利用ArcEngine调用ArcGIS Server发布的服务 AE9.3

    主要使用了AE中的IAGSServerOject接口及IMapServer接口.Private void GetServerTest_Click(object sender, EventArgs e) ...

  10. XML文件解析!!!

    在java   jdk中解析XMl文件使用 org.w3c.dom.Document工具 一下是写入全程: import java.io.File; import java.io.IOExceptio ...