<template> <a-drawer :title="title" :maskClosable="true" width=650 placement="right" :closable="true" @close="close" :visible="visible" style="overflow: auto;padding-bottom: 53px;"> <a-form> <a-form-item label='所拥有的权限'> <a-tree checkable @check="onCheck" :checkedKeys="checkedKeys" :treeData="treeData" @expand="onExpand" @select="onTreeNodeSelect" :selectedKeys="selectedKeys" :expandedKeys="expandedKeysss" :checkStrictly="checkStrictly"> <span slot="hasDatarule" slot-scope="{slotTitle,ruleFlag}"> {{ slotTitle }}<a-icon v-if="ruleFlag" type="align-left" style="margin-left:5px;color: red;"></a-icon> </span> </a-tree> </a-form-item> </a-form> <div class="drawer-bootom-button"> <a-dropdown style="float: left" :trigger="['click']" placement="topCenter"> <a-menu slot="overlay"> <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item> <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item> <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item> <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item> <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item> <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item> </a-menu> <a-button> 树操作 <a-icon type="up"/> </a-button> </a-dropdown> <a-popconfirm title="确定放弃编辑?" @confirm="close" okText="确定" cancelText="取消"> <a-button style="margin-right: .8rem">取消</a-button> </a-popconfirm> <a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 0.8rem">仅保存 </a-button> <a-button @click="handleSubmit(true)" type="primary" :loading="loading">保存并关闭</a-button> </div> <role-datarule-modal ref="datarule"></role-datarule-modal> </a-drawer> </template> <script> import {queryTreeListForRole, queryRolePermission, saveRolePermission} from '@/api/api' import RoleDataruleModal from './RoleDataruleModal.vue' export default { name: "RoleModal", components: { RoleDataruleModal }, data() { return { roleId: "", treeData: [], defaultCheckedKeys: [], checkedKeys: [], expandedKeysss: [], allTreeKeys: [], autoExpandParent: true, checkStrictly: true, title: "角色权限配置", visible: false, loading: false, selectedKeys: [] } }, methods: { onTreeNodeSelect(id) { if (id && id.length > 0) { this.selectedKeys = id } this.$refs.datarule.show(this.selectedKeys[0], this.roleId) }, onCheck(o) { if (this.checkStrictly) { this.checkedKeys = o.checked; } else { this.checkedKeys = o } }, show(roleId) { this.roleId = roleId this.visible = true; }, close() { this.reset() this.$emit('close'); this.visible = false; }, onExpand(expandedKeys) { this.expandedKeysss = expandedKeys; this.autoExpandParent = false }, reset() { this.expandedKeysss = [] this.checkedKeys = [] this.defaultCheckedKeys = [] this.loading = false }, expandAll() { this.expandedKeysss = this.allTreeKeys }, closeAll() { this.expandedKeysss = [] }, checkALL() { this.checkedKeys = this.allTreeKeys }, cancelCheckALL() { //this.checkedKeys = this.defaultCheckedKeys this.checkedKeys = [] }, switchCheckStrictly(v) { if (v == 1) { this.checkStrictly = false } else if (v == 2) { this.checkStrictly = true } }, handleCancel() { this.close() }, handleSubmit(exit) { let that = this; let params = { roleId: that.roleId, permissionIds: that.checkedKeys.join(","), lastpermissionIds: that.defaultCheckedKeys.join(","), }; that.loading = true; console.log("请求参数:", params); saveRolePermission(params).then((res) => { if (res.success) { that.$message.success(res.message); that.loading = false; if (exit) { that.close() } } else { that.$message.error(res.message); that.loading = false; if (exit) { that.close() } } this.loadData(); }) }, loadData() { queryTreeListForRole().then((res) => { this.treeData = res.result.treeList this.allTreeKeys = res.result.ids queryRolePermission({roleId: this.roleId}).then((res) => { this.checkedKeys = [...res.result]; this.defaultCheckedKeys = [...res.result]; this.expandedKeysss = this.allTreeKeys; console.log(this.defaultCheckedKeys) }) }) } }, watch: { visible() { if (this.visible) { this.loadData(); } } } } </script> <style lang="less" scoped> .drawer-bootom-button { position: absolute; bottom: 0; width: 100%; border-top: 1px solid #e8e8e8; padding: 10px 16px; text-align: right; left: 0; background: #fff; border-radius: 0 0 2px 2px; } </style>