vue实现按钮功能级权限控制

13 篇文章 0 订阅

1、store下新建一个js,或者直接使用user.js

import db from '@/utils/localstorage'

const state = {
    permissions: db.get('PERMISSIONS') || [],
}

const mutations = {
    SET_PERMISSION (state, val) {
        db.save('PERMISSIONS', val)
        state.permissions = val
    },
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}

2、合适的位置接口获取权限信息,比如登录接口

####这里简化了代码######
function _queryPermissionList(to, next) {
    return new Promise((resolve, reject) => {
        queryPermissionList().then(res => {
            let permissionsList = res.permissionList;
            store.commit("user/SET_PERMISSION", permissionsList ? permissionsList : []);
            resolve()
        }).catch(err => {
            reject(err)
        })
    })
}

3、定义按钮鉴权标签,这里采用插件的形式

// 定义一些和权限有关的 Vue指令

// 必须包含列出的所有权限,元素才显示
export const hasPermission = {
    install(Vue) {
        Vue.directive('hasPermission', {
            bind(el, binding, vnode) {
                const permissions = vnode.context.$store.state.user.permissions
                const value = binding.value
                let flag = true
                for (const v of value) {
                    if (!permissions.includes(v)) {
                        flag = false
                    }
                }
                if (!flag) {
                    if (!el.parentNode) {
                        el.style.display = 'none'
                    } else {
                        el.parentNode.removeChild(el)
                    }
                }
            }
        })
    }
}

// 当不包含列出的权限时,渲染该元素
export const hasNoPermission = {
    install(Vue) {
        Vue.directive('hasNoPermission', {
            bind(el, binding, vnode) {
                const permissions = vnode.context.$store.state.user.permissions

                const value = binding.value
                let flag = true
                for (const v of value) {
                    if (permissions.includes(v)) {
                        flag = false
                    }
                }
                if (!flag) {
                    if (!el.parentNode) {
                        el.style.display = 'none'
                    } else {
                        el.parentNode.removeChild(el)
                    }
                }
            }
        })
    }
}

// 只要包含列出的任意一个权限,元素就会显示
export const hasAnyPermission = {
    install(Vue) {
        Vue.directive('hasAnyPermission', {
            bind(el, binding, vnode) {
                const permissions = vnode.context.$store.state.user.permissions
                const value = binding.value
                let flag = false
                for (const v of value) {
                    if (permissions.includes(v)) {
                        flag = true
                    }
                }
                if (!flag) {
                    if (!el.parentNode) {
                        el.style.display = 'none'
                    } else {
                        el.parentNode.removeChild(el)
                    }
                }
            }
        })
    }
}

4、安装插件,在main.js中

import { hasPermission, hasNoPermission, hasAnyPermission } from '@/utils/permissionDirect'

const Plugins = [
    hasPermission,
    hasNoPermission,
    hasAnyPermission
]

Plugins.map((plugin) => {
    Vue.use(plugin)
})

5、使用,如List.vue中

<el-button icon="el-icon-edit-outline" v-has-permission="['sys/user:edit']" title="编辑" size="mini" type="primary" plain @click="editItem(row)"/>

v-has-permission:是否含该权限
v-has-no-permission:是否不含该权限
v-has-any-permission:是否含该列出权限的任意一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有一只柴犬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值