vue中封装权限按钮

需求:

在后台管理系统中,一般除了菜单配置权限,很多按钮也需要具备一定的权限,比如新增,修改,查询等等

步骤

首先可以在src>components中创建一个Permisssion文件,里面配置权限按钮的组件,比如我需要有一个叫做ktButton的组件
ktButton.vue组件内容如下

<template>
  <el-button
    :size="size"
    :type="type"
    class="filter-item"
    :icon="icon"
    :loading="loading"
    :disabled="!( hasPerms(perms) && !disabled )"
    @click="handleClick"
  >
    {{ label }}
  </el-button>
</template>

<script>
  // 禁用标识
  // :disabled="!hasPerms(perms)"
import { hasPermission } from '../Permission/index.js'
import debounce from '../../utils/debounce.js'
export default {
  name: 'KtButton',
  props: {
    icon: { // 按钮图标
      type: String,
      default: null
    },
    label: { // 按钮显示文本
      type: String,
      default: 'Button'
    },
    size: { // 按钮尺寸
      type: String,
      default: 'mini'
    },
    type: { // 按钮类型
      type: String,
      default: null
    },
    loading: { // 按钮加载标识
      type: Boolean,
      default: false
    },
    disabled: { // 按钮是否禁用
      type: Boolean,
      default: false
    },
    perms: { // 按钮权限标识,外部使用者传入
      type: String,
      default: null
    },
    isDebounce: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
    }
  },
  methods: {
    handleClick: function() {
      if (!this.isDebounce) {
        this.$emit('click', {})
      } else {
        debounce(() => {
          // 按钮操作处理函数
          this.$emit('click', {})
        }, 500)
      }
    },
    hasPerms: function(perms) {
      // 根据权限标识和外部指示状态进行权限判断
      return hasPermission(perms) // !this.disabled
    }
  }
}
</script>
<style>

</style>
代码片

可以看出这是对el-button进行的二次封装,是否禁用是根据hasPerms()这个函数的返回值决定的,
于是我们可以在同级目录下封装一个判断是否有权限的函数index.js

/**
 * 判断是否有权限。根据传入的权限标识,查看是否存在于用户的权限标识集合内。
 */
export function hasPermission(perms) {
	let hasPermission = false;
	let permission = JSON.parse(sessionStorage.getItem('permission'));
	//当然此处还可以使用indexOf方法,不使用for循环,indexOf性能也更好
	for (var i = 0; i < permission.length; i++) {
		if (permission[i] === perms) {
			hasPermission = true;
			break;
		}
	}
	return hasPermission;
}

在**sessionStorage.getItem(‘permission’)**中就保存了用户所有的按钮权限,一般在登录的时候就获取到了用户的这些信息

在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: {
		name: '',
		//设置属性,用于保存后台接口返回的权限数据
		permission: [],
	},
	mutations: {
		SET_NAME: (state, name) => {
			state.name = name
			},
		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
            );

在页面上需要显示权限的用法如下

比如一个新增按钮,传入的perms值device:equipment:add就是和后端商量好的,如果获取的权限信息有就可以使用,否则按钮就是被禁用的

  <KtButton
          size="mini"
          label="新增"
          perms="device:equipment:add"
          type="primary"
          icon="el-icon-plus"
          @click="openAddDialog"
        />

此时页面上你就可以配置权限按钮了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多看书少吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值