|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <GlobalWindow | 
|---|
|  |  |  | class="permission-config-dialog" | 
|---|
|  |  |  | :visible.sync="visible" | 
|---|
|  |  |  | :confirm-working="isWorking" | 
|---|
|  |  |  | width="582px" | 
|---|
|  |  |  | title="配置角色权限" | 
|---|
|  |  |  | width="576px" | 
|---|
|  |  |  | title="授权权限" | 
|---|
|  |  |  | @confirm="confirm" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <p class="tip" v-if="role != null">为角色 <em>{{role.name}}</em> 配置权限</p> | 
|---|
|  |  |  | <p class="tip-warn"><i class="el-icon-warning"></i>提醒:权限配置后需重新登录后生效</p> | 
|---|
|  |  |  | <el-transfer | 
|---|
|  |  |  | ref="permissionTransfer" | 
|---|
|  |  |  | v-model="selectedIds" | 
|---|
|  |  |  | filterable | 
|---|
|  |  |  | class="transfer" | 
|---|
|  |  |  | :filter-method="filterPermissions" | 
|---|
|  |  |  | :titles="['未授权权限', '已授权权限']" | 
|---|
|  |  |  | :props="{ | 
|---|
|  |  |  | key: 'id', | 
|---|
|  |  |  | label: 'name' | 
|---|
|  |  |  | }" | 
|---|
|  |  |  | :data="permissions"> | 
|---|
|  |  |  | </el-transfer> | 
|---|
|  |  |  | <el-tree | 
|---|
|  |  |  | ref="tree" | 
|---|
|  |  |  | :data="permissions" | 
|---|
|  |  |  | 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 { createRolePermission } from '@/api/system/role' | 
|---|
|  |  |  | import { fetchAll } from '@/api/system/permission' | 
|---|
|  |  |  | import { fetchTree } from '@/api/system/permission' | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: 'PermissionConfigWindow', | 
|---|
|  |  |  | components: { GlobalWindow }, | 
|---|
|  |  |  | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @role 角色对象 | 
|---|
|  |  |  | * 打开窗口 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param role 目标角色 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | open (role) { | 
|---|
|  |  |  | if (this.$refs.permissionTransfer) { | 
|---|
|  |  |  | this.$refs.permissionTransfer.clearQuery('left') | 
|---|
|  |  |  | this.$refs.permissionTransfer.clearQuery('right') | 
|---|
|  |  |  | } | 
|---|
|  |  |  | fetchAll() | 
|---|
|  |  |  | fetchTree() | 
|---|
|  |  |  | .then(records => { | 
|---|
|  |  |  | this.role = role | 
|---|
|  |  |  | this.permissions = records | 
|---|
|  |  |  | // 如果为固定角色,则固定权限不可更改 | 
|---|
|  |  |  | if (this.role.fixed) { | 
|---|
|  |  |  | for (const perm of this.permissions) { | 
|---|
|  |  |  | if (perm.fixed) { | 
|---|
|  |  |  | perm.disabled = true | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.__handleFixedPermissions(this.permissions) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.selectedIds = role.permissions.map(r => r.id) | 
|---|
|  |  |  | this.visible = true | 
|---|
|  |  |  | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 确认选择权限 | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 确认选择权限 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | confirm () { | 
|---|
|  |  |  | const selectedPermissions = this.$refs.tree.getCheckedNodes(false, true).filter(item => item.type !== 'module').map(item => item.id) | 
|---|
|  |  |  | this.isWorking = true | 
|---|
|  |  |  | createRolePermission({ | 
|---|
|  |  |  | roleId: this.role.id, | 
|---|
|  |  |  | permissionIds: this.selectedIds | 
|---|
|  |  |  | permissionIds: selectedPermissions | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.$tip.apiSuccess('权限配置成功,用户重新登录后生效') | 
|---|
|  |  |  | this.visible = false | 
|---|
|  |  |  | this.$emit('success') | 
|---|
|  |  |  | setTimeout(() => { | 
|---|
|  |  |  | this.$dialog.attentionConfirm('权限配置成功,用户需重新登录后生效').then(() => {}) | 
|---|
|  |  |  | }, 300) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | 
|---|
|  |  |  | this.isWorking = false | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 搜索权限 | 
|---|
|  |  |  | filterPermissions (query, item) { | 
|---|
|  |  |  | const lowerCaseQuery = query.toLowerCase() | 
|---|
|  |  |  | return item.code.toLowerCase().indexOf(lowerCaseQuery) > -1 || item.name.toLowerCase().indexOf(lowerCaseQuery) > -1 | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 处理固定权限 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param permissions 权限列表 | 
|---|
|  |  |  | * @param module 所属模块 | 
|---|
|  |  |  | * @private | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | __handleFixedPermissions (permissions, module) { | 
|---|
|  |  |  | if (permissions == null) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (const permission of permissions) { | 
|---|
|  |  |  | if (permission.type !== 'module') { | 
|---|
|  |  |  | if (permission.fixed) { | 
|---|
|  |  |  | permission.disabled = true | 
|---|
|  |  |  | if (module != null) { | 
|---|
|  |  |  | module.disabled = true | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.__handleFixedPermissions(permission.children, permission) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | color: $primary-color; | 
|---|
|  |  |  | font-weight: bold; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .tip-warn { | 
|---|
|  |  |  | margin: 4px 0 12px 0; | 
|---|
|  |  |  | font-size: 12px; | 
|---|
|  |  |  | color: #999; | 
|---|
|  |  |  | i { | 
|---|
|  |  |  | color: orange; | 
|---|
|  |  |  | margin-right: 4px; | 
|---|
|  |  |  | font-size: 14px; | 
|---|
|  |  |  | position: relative; | 
|---|
|  |  |  | top: 1px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .transfer { | 
|---|
|  |  |  | height: 600px; | 
|---|
|  |  |  | width: 100%; | 
|---|
|  |  |  | display: flex; | 
|---|
|  |  |  | justify-content: center; | 
|---|
|  |  |  | align-items: center; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep .el-transfer-panel { | 
|---|
|  |  |  | flex: 1; | 
|---|
|  |  |  | height: 100%; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep .el-transfer-panel__body { | 
|---|
|  |  |  | height: 500px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep .el-transfer-panel__list.is-filterable { | 
|---|
|  |  |  | height: 480px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </style> | 
|---|