Vue项目权限控制
- 第一步:在权限系统配置权限,并在本系统获取权限列表
- 第二步,配置路由
- 第三步,显示有权限的导航
我的项目中主要涉及到的权限控制是:
- 模块的权限;
- 操作按钮的权限;
注意:也要控制直接通过url地址进入无权限的页面
第一步:在权限系统配置权限,并在本系统获取权限列表
在权限系统对不同角色进行赋权操作后,其他系统拿到该账户的信息,包括权限信息,然后将权限信息存进vuex。
App.vue
// 获取用户信息
let userInfo = await this.api.CommonApi.getUser()
// 获取权限信息
let userRight = await this.api.CommonApi.getRight(userid:userInfo.userid)
// 初始化权限数组,并且遍历获取权限识别符
let permissions = []
userRight.forEach(item =>{
permissions.push(item.linkUrl)
})
// 将权限识别符存进vuex
store.commit({
type:'permissions',
amount:permissions
})
第二步,配置路由
在路由里加入这个路由的识别信息,如:
router.js
export default new Router({
routes:[{
path:'/',
name:'首页',
meta:{
permission:'INDEX'
},
component:index
},
{
path:'/model',
name:'模块一',
meta:{
permission:'MODELFirst'
},
component:modelFirst
}]
})
上面的permission就是这个模块的识别信息。
main.js
router.beforeEach((to, from, next) => {
// 如果有目的路由的权限,就可以进入,否则不跳转
if (store.state.permission.includes(to.meta.permission)) {
next()
} else {
next(false)
}
})
最后在mian.js中设置路由守卫,防止用户直接通过链接进入自己并没有权限的地址。
第三步,显示有权限的导航
本系统中的导航都是通过权限配置的,只显示该用户有权限的模块,所以导航信息也要动态加载。
首先我在前端已经写好了一个全权限拥有的导航信息,之后只需要遍历出拥有权限的显示就可以了
nav.vue
视图部分(稍微简化了一点)
<template>
<el-menu>
<div v-for="(menu, key) in menus" :key="key">
<el-menu-item :index="menu.index" v-if="menu.children.length === 0">
<i :class="'icon'+menu.icon"></i>
<span slot="title" v-text="menu.name"></span>
</el-menu-item>
<el-submenu :index="menu.index" v-if="menu.children.length !== 0 && menu.show">
<template slot="title">
<i :class="'icon'+menu.icon"></i>
<span slot="title" v-text="menu.name"></span>
</template>
<el-menu-item :index="menu.index+child.index" v-for="(child,key) in menu.children" :key="key">
<span slot="title" v-text="child.name" v-if="show(child.permission)"></span>
</el-menu-item>
</el-submenu>
</div>
</menu>
</template>
逻辑部分
mounted(){
this.getMenus()
},
methods:{
getMenus(){
this.menus = this.getMenu(this.$enums.MENUS)
},
getMenu(){
let menuTemp = []
// 遍历整个导航数组
menu.forEach(item => {
// 如果有子元素的话,那就再循环
if (item.children.length > 0) {
item.children = this.getMenu(item.children)
}
// 如果有权限,那就显示
if (this.$store.state.permission.includes(item.permission)) {
item.show = true
} else if (!this.childrenAllFalse(item.children)) {
// 如果没权限并且一个子元素都没有的话,也不显示
item.show = false
}
// 然后得到了有权限的导航列表信息
menuTemp.push(item)
})
return menuTemp
}
childrenAllFalse (arr) {
return arr.some(item => {
return item.show === true
})
},
}
这里的逻辑就是渲染有权限的导航。
关于操作的权限控制的话就更简单啦,在公共函数中写:
common.js
function show (str) {
let vuex = store.state.permissions
let permissions = str.split('|')
let visibility = false
permissions.forEach(item => {
// let key = $enum.PERMISSION[item]
if (vuex[item]) {
visibility = true
}
})
return visibility
}
在要控制的操作按钮那里调用 v-if="show(‘权限识别符’)"就可以了。
可能代码有些错误,有些纯手打的,有些贴的项目代码。大概是这个意思了。