<template> <a-modal title="授权菜单" :width="600" :visible="visible" :confirmLoading="confirmLoading" @ok="handleSubmit" @cancel="handleCancel" > <a-spin :spinning="formLoading"> <a-form :form="form"> <a-form-item label="菜单权限" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-tree v-model="checkedKeys" multiple checkable :auto-expand-parent="autoExpandParent" :expanded-keys="expandedKeys" :tree-data="menuTreeData" :selected-keys="selectedKeys" :replaceFields="replaceFields" @expand="onExpand" @check="onCheck" /> </a-form-item> </a-form> </a-spin> </a-modal> </template> <script> import {SysMenuTreeForGrant} from '@/api/modular/system/menuManage' import {sysRoleOwnMenu, sysRoleGrantMenu} from '@/api/modular/system/roleManage' export default { data() { return { labelCol: { style: {'padding-right': '20px'}, xs: {span: 24}, sm: {span: 5} }, wrapperCol: { xs: {span: 24}, sm: {span: 15} }, menuTreeData: [], expandedKeys: [], checkedKeys: [], visible: false, confirmLoading: false, formLoading: true, autoExpandParent: true, selectedKeys: [], subValues: [], roleEntity: [], replaceFields: { key: 'id' }, form: this.$form.createForm(this), commitKeys: [], leastChilds: [] } }, methods: { // 初始化方法 roleMenu(record) { this.formLoading = true this.roleEntity = record this.visible = true this.getMenuTree() }, /** * 获取菜单列表 */ getMenuTree() { const _this = this SysMenuTreeForGrant().then((res) => { if (res.success) { _this.menuTreeData = res.data _this.getLeastChilds(res.data) // 默认展开目录级 _this.menuTreeData.forEach(item => { _this.expandedKeys.push(item.id) }) _this.expandedMenuKeys(_this.roleEntity) } }) }, getLeastChilds(data){ for (let i = 0; i < data.length; i++) { this.pushLeastChilds(data[i]) } }, pushLeastChilds(e) { if (e.children.length > 0) { this.getLeastChilds(e.children) return } this.leastChilds.push(e.id) }, /** * 此角色已有菜单权限 */ expandedMenuKeys(record) { const _this = this sysRoleOwnMenu({id: record.id}).then((res) => { if (res.success) { _this.pickCheckedKeys(res.data) _this.commitKeys = res.data } _this.formLoading = false }) }, pickCheckedKeys(data){ for (let i = 0; i < data.length; i++) { if (this.leastChilds.includes(data[i])) { this.checkedKeys.push(data[i]) } } }, onExpand(expandedKeys) { this.expandedKeys = expandedKeys this.autoExpandParent = false }, onCheck(checkedKeys, info) { this.checkedKeys = checkedKeys this.commitKeys = checkedKeys.concat(info.halfCheckedKeys); }, onSelect(selectedKeys, info) { console.log(selectedKeys) console.log(info) this.selectedKeys = selectedKeys }, handleSubmit() { const _this = this; const {form: {validateFields}} = this this.confirmLoading = true validateFields((errors, values) => { if (!errors) { sysRoleGrantMenu({id: _this.roleEntity.id, grantMenuIdList: _this.commitKeys}).then((res) => { if (res.success) { _this.$message.success('授权成功') _this.confirmLoading = false _this.$emit('ok', values) _this.handleCancel() } else { _this.$message.error('授权失败:' + res.message) } }).finally((res) => { _this.confirmLoading = false }) } else { _this.confirmLoading = false } }) }, handleCancel() { // 清空已选择的 this.checkedKeys = [] // 清空已展开的 this.expandedKeys = [] this.visible = false } } } </script>