<template>
|
<GlobalWindow
|
class="menu-config-dialog"
|
:visible.sync="visible"
|
:confirm-working="isWorking"
|
width="576px"
|
title="授权菜单"
|
@confirm="confirm"
|
>
|
<p class="tip" v-if="role != null">为角色 <em>{{role.name}}</em> 配置可访问的菜单</p>
|
<el-tree
|
ref="menuTree"
|
:data="menus"
|
show-checkbox
|
node-key="id"
|
default-expand-all
|
:default-checked-keys="selectedIds"
|
:expand-on-click-node="false"
|
:check-on-click-node="true"
|
:props="{children: 'children',label: 'name'}">
|
</el-tree>
|
</GlobalWindow>
|
</template>
|
|
<script>
|
import GlobalWindow from '@/components/common/GlobalWindow'
|
import { createRoleMenu } from '@/api/system/role'
|
import { fetchTree1 } from '@/api/system/menu'
|
import { mapState } from 'vuex'
|
export default {
|
name: 'MenuConfigWindow',
|
components: { GlobalWindow },
|
data () {
|
return {
|
visible: false,
|
isWorking: false,
|
// 角色
|
role: null,
|
// 所有菜单
|
menus: [],
|
// 已选中的菜单
|
selectedIds: []
|
}
|
},
|
computed: {
|
...mapState(['userInfo'])
|
},
|
methods: {
|
/**
|
* @role 角色对象
|
*/
|
open (role) {
|
fetchTree1(0)
|
.then(records => {
|
this.role = role
|
this.menus = records
|
// 如果为固定角色,则固定菜单不可更改
|
this.__resetDisabled(this.menus, this.role)
|
// 找出叶节点
|
role.menus = role.menus.filter(menu => role.menus.findIndex(m => m.parentId === menu.id) === -1)
|
// 初始化选中
|
this.selectedIds = role.menus.map(r => r.id)
|
this.visible = true
|
})
|
.catch(e => {
|
this.$tip.apiFailed(e)
|
})
|
// }
|
// else {
|
// fetchMenuList()
|
// .then(records => {
|
// this.role = role
|
// this.menus = records
|
// // 如果为固定角色,则固定菜单不可更改
|
// this.__resetDisabled(this.menus, this.role)
|
// // 找出叶节点
|
// role.menus = role.menus.filter(menu => role.menus.findIndex(m => m.parentId === menu.id) === -1)
|
// // 初始化选中
|
// this.selectedIds = role.menus.map(r => r.id)
|
// this.visible = true
|
// })
|
// .catch(e => {
|
// this.$tip.apiFailed(e)
|
// })
|
// }
|
|
},
|
// 确认选择菜单
|
confirm () {
|
const selectedMenus = this.$refs.menuTree.getCheckedNodes(false, true)
|
this.isWorking = true
|
createRoleMenu({
|
roleId: this.role.id,
|
menuIds: selectedMenus.map(menu => menu.id)
|
})
|
.then(() => {
|
this.$tip.apiSuccess('菜单授权成功')
|
this.visible = false
|
this.$emit('success')
|
})
|
.catch(e => {
|
this.$tip.apiFailed(e)
|
})
|
.finally(() => {
|
this.isWorking = false
|
})
|
},
|
// 重置disabled
|
__resetDisabled (menus, role) {
|
if (menus == null || menus.length === 0) {
|
return
|
}
|
for (const menu of menus) {
|
menu.disabled = false
|
if (role.fixed && menu.fixed) {
|
menu.disabled = true
|
}
|
this.__resetDisabled(menu.children, role)
|
}
|
}
|
}
|
}
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/assets/style/variables.scss";
|
.global-window {
|
.tip {
|
margin-bottom: 12px;
|
em {
|
font-style: normal;
|
color: $primary-color;
|
font-weight: bold;
|
}
|
}
|
}
|
</style>
|