vue按钮级权限控制及权限按钮的封装

设计原理

对于vue按钮级权限控制主要是先给按钮设定一个权限吗,然后从数据库取出用户权限进行对比,如果用户权限中包含这个按钮的权限则按钮可用,不然就禁用。

获取用户所有权限

// 获取用户菜单
  getMenu({ commit, state }) {
    return new Promise((resolve, reject) => {
      getMenu().then(res => {
        const menu = res
        if (!menu) {
          reject('Verification failed, please Login again.')
        }
        // 获取按钮权限
        const perms = getOptionPremission(menu)
        // 将按钮权限存入vuex
        commit('SET_PREMS', perms)
        // 获取菜单权限
        const newMenu = converter(menu)
        const MenuTree = getMenuTree(newMenu)
        MenuTree.push(errorRouter)
        resetRouter()
        router.options.routes = MenuTree
        router.addRoutes(MenuTree)
        resolve(menu)
      }).catch(error => {
        reject(error)
      })
    })
  }

对比权限的方法

import store from '@/store'
/**
 * 判断用户是否拥有操作权限
 * 根据传入的权限标识,查看是否存在用户权限标识集合
 * @param perms
 */
export function hasPermission(perms) {
  let hasPermission = false
  const permissions = store.state.user.perms
  for (let i = 0, len = permissions.length; i < len; i++) {
    if (permissions[i] === perms) {
      hasPermission = true
      break
    }
  }
  return hasPermission
}

按钮封装设计

<template>
  <el-button
    :size="size"
    :type="type"
    :circle="circle"
    :icon="icon"
    :disabled="!hasPerms(perms)"
    @click="handleClick"
  >
    <span v-if="label!=null">{{ label }}</span>
  </el-button>
</template>

<script>
import { hasPermission } from '@/utils/permission.js'
export default {
  name: 'PermsButton',
  props: {
    label: {// 按钮显示文本
      type: String,
      default: null
    },
    size: {// 按钮尺寸
      type: String,
      default: 'mini'
    },
    type: {// 按钮类型
      type: String,
      default: 'primary'
    },
    disabled: {// 按钮是否禁用
      type: Boolean,
      default: false
    },
    perms: {// 按钮权限标识,外部使用者传入
      type: String,
      default: null
    },
    circle: {// 按钮图形
      type: Boolean,
      default: false
    },
    icon: {// 按钮所带有的图标
      type: String,
      default: null
    }
  },
  data() {
    return {
    }
  },
  methods: {
    handleClick() {
      // 按钮操作处理函数
      this.$emit('click', {})
    },
    hasPerms(perms) {
      // 根据权限标识和外部指示状态进行权限判断
      return hasPermission(perms) & !this.disabled
    }
  }
}
</script>

<style scoped>
</style>

封装按钮的引入与使用

引入

import PermsButton from '@/components/PermsButton/index'
export default {
	components: { PermsButton },
}

使用

<perms-button type="success" perms="saveResource" label="增加" icon="el-icon-circle-plus-outline" @click="saveResource()" />
<perms-button type="danger" perms="deleteResource" label="删除" icon="el-icon-delete" @click="delSelectResource()" />
<perms-button type="warning" perms="updateResource" label="修改" icon="el-icon-edit" @click="updateSelectResource()" />
perms就是按钮的权限,拥有这个权限的用户才能使用

效果图

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值