|
@@ -1,48 +1,70 @@
|
|
|
<template>
|
|
|
<div class="role-setting">
|
|
|
- <a-card
|
|
|
- :body-style="{padding: '24px 32px'}"
|
|
|
- :bordered="false"
|
|
|
- title="权限配置"
|
|
|
- >
|
|
|
- <a-row :gutter="[18]">
|
|
|
- <a-col :span="8">
|
|
|
- <a-card
|
|
|
- :body-style="{padding: '24px 32px'}"
|
|
|
- title="菜单权限"
|
|
|
- >
|
|
|
- <tree
|
|
|
- checkable
|
|
|
- :tree-data="treeData"
|
|
|
- :default-expanded-keys="['0-0-0', '0-0-1']"
|
|
|
- :default-selected-keys="['0-0-0', '0-0-1']"
|
|
|
- :default-checked-keys="['0-0-0', '0-0-1']"
|
|
|
- @select="onSelect"
|
|
|
- @check="onCheck"
|
|
|
- />
|
|
|
- </a-card>
|
|
|
|
|
|
- </a-col>
|
|
|
- <!-- <a-col :span="1">
|
|
|
- <a-divider type="vertical"/>
|
|
|
- </a-col> -->
|
|
|
- <a-col :span="12">
|
|
|
- <a-card
|
|
|
- :body-style="{padding: '24px 32px'}"
|
|
|
- title="操作权限"
|
|
|
- >
|
|
|
- <template slot="extra">
|
|
|
- <a-checkbox :indeterminate="indeterminate" :checked="checkAll" @change="onCheckAllChange">
|
|
|
- 全选
|
|
|
- </a-checkbox>
|
|
|
- </template>
|
|
|
+ <a-spin :spinning="spinning">
|
|
|
+ <a-card
|
|
|
+ :body-style="{padding: '24px 32px'}"
|
|
|
+ :bordered="false"
|
|
|
+ title="权限配置"
|
|
|
+ >
|
|
|
+ <template slot="extra">
|
|
|
+ <a-button type="primary" :loading="loading" @click="editRoleAuth"> {{ loading? '分配权限中' : '确定分配' }} </a-button>
|
|
|
+ </template>
|
|
|
+ <a-row :gutter="[18]">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-card
|
|
|
+ :body-style="{padding: '24px 32px'}"
|
|
|
+ title="菜单权限"
|
|
|
+ >
|
|
|
+ <!-- :selected-keys="selectedKeys" -->
|
|
|
+ <tree
|
|
|
+ v-if="treeData && treeData.length > 0"
|
|
|
+ checkable
|
|
|
+ v-model="checkedKeys"
|
|
|
+ :tree-data="treeData"
|
|
|
+ :defaultExpandAll="true"
|
|
|
+ :replaceFields="replaceFields"
|
|
|
+ :default-checked-keys="defaultCheckedKey"
|
|
|
+ @select="onSelect"
|
|
|
+ @check="onCheck"
|
|
|
+ >
|
|
|
+ <span :slot="item.id" v-for="item in flatTreeData" :key="item.id">
|
|
|
+ <div>
|
|
|
+ <span @click="clickLabel(item)">{{ item.label }}</span>
|
|
|
+ <a-icon
|
|
|
+ v-if="currentClickNode === item.id"
|
|
|
+ type="check-circle"
|
|
|
+ theme="twoTone"
|
|
|
+ two-tone-color="#52c41a"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </span>
|
|
|
+ </tree>
|
|
|
+ </a-card>
|
|
|
|
|
|
- <br />
|
|
|
- <a-checkbox-group v-model="checkedList" :options="plainOptions" @change="onChange" />
|
|
|
- </a-card>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-card>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="12">
|
|
|
+ <a-card
|
|
|
+ :body-style="{padding: '24px 32px'}"
|
|
|
+ title="操作权限"
|
|
|
+ >
|
|
|
+ <template slot="extra">
|
|
|
+ <a-checkbox :indeterminate="indeterminate" :checked="checkAll" @change="onCheckAllChange">
|
|
|
+ 全选
|
|
|
+ </a-checkbox>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <br />
|
|
|
+ <a-checkbox-group
|
|
|
+ v-model="checkedList"
|
|
|
+ :options="tranferCheckboxList"
|
|
|
+ @change="onChange" />
|
|
|
+ </a-card>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-card>
|
|
|
+
|
|
|
+ </a-spin>
|
|
|
|
|
|
<!-- 重命名 -->
|
|
|
</div>
|
|
@@ -50,62 +72,162 @@
|
|
|
|
|
|
<script>
|
|
|
import { Tree } from 'ant-design-vue'
|
|
|
-const treeData = [
|
|
|
- {
|
|
|
- title: '全校区1',
|
|
|
- key: '0-0',
|
|
|
- slots: { title: '0-0' },
|
|
|
- children: [
|
|
|
- {
|
|
|
- title: '教练部',
|
|
|
- key: '0-0-0',
|
|
|
- slots: { title: '0-0-0' },
|
|
|
- disabled: true,
|
|
|
- children: [
|
|
|
- { title: '销售一部', key: '0-0-0-0', slots: { title: '0-0-0-0' }, disableCheckbox: true },
|
|
|
- { title: '销售二部', key: '0-0-0-1', slots: { title: '0-0-0-1' } }
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- title: '市场部',
|
|
|
- key: '0-0-1',
|
|
|
- slots: { title: '0-0-1' },
|
|
|
- children: [{ key: '0-0-1-0', title: '市场大王', slots: { title: '0-0-1-0' } }]
|
|
|
- }
|
|
|
- ]
|
|
|
- }
|
|
|
-]
|
|
|
-const plainOptions = ['Apple', 'Pear', 'Orange', 'Apple', 'Pear', 'Orange', 'Apple', 'Pear', 'Orange']
|
|
|
-const defaultCheckedList = ['Apple', 'Orange']
|
|
|
+import { getRoleMenu, getRoleButton, editRoleAuth } from '@/api/role'
|
|
|
+
|
|
|
export default {
|
|
|
name: 'RoleSetting',
|
|
|
components: {
|
|
|
Tree
|
|
|
},
|
|
|
+ props: {
|
|
|
+ roleId: {
|
|
|
+ type: String,
|
|
|
+ required: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ replaceFields () {
|
|
|
+ return { children: 'children', title: 'label', key: 'id', value: 'label' }
|
|
|
+ },
|
|
|
+ tranferCheckboxList () {
|
|
|
+ return this.checkboxList.map(item => {
|
|
|
+ return item.label
|
|
|
+ })
|
|
|
+ },
|
|
|
+ tranferCheckedListId () {
|
|
|
+ return this.checkboxList.filter(item => {
|
|
|
+ if (this.checkedList.includes(item.label)) {
|
|
|
+ return item
|
|
|
+ }
|
|
|
+ }).map(item => item.id)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ roleId () {
|
|
|
+ this.getRoleMenu()
|
|
|
+ },
|
|
|
+ currentClickNode () {
|
|
|
+ this.getRoleButton()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted () {
|
|
|
+ },
|
|
|
data () {
|
|
|
return {
|
|
|
- treeData,
|
|
|
- checkedList: defaultCheckedList,
|
|
|
+ loading: false,
|
|
|
indeterminate: true,
|
|
|
- checkAll: false,
|
|
|
- plainOptions
|
|
|
+ spinning: false, // 加载loading
|
|
|
+ treeData: [],
|
|
|
+ checkedKeys: [], // 选择的父节点
|
|
|
+ defaultSelectedKey: [], // 默认选中的节点
|
|
|
+ defaultCheckedKey: [], // 默认已经勾选的节点
|
|
|
+ pageTreeKey: [], // 父页面, 这样的页面不允许点击
|
|
|
+ currentClickNode: '', // 当前点击的树节点
|
|
|
+ flatTreeData: [], // 拍平树状结构
|
|
|
+ // ----------------------------- 页面按钮数据
|
|
|
+ checkboxList: [],
|
|
|
+ checkedList: [],
|
|
|
+ checkAll: false
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
+ // 点击标题
|
|
|
+ clickLabel () {
|
|
|
+ console.log('ccc')
|
|
|
+ },
|
|
|
+ // 编辑菜单权限 和 按钮权限
|
|
|
+ async editRoleAuth () {
|
|
|
+ const $par = {
|
|
|
+ buttonId: this.tranferCheckedListId,
|
|
|
+ menuId: this.checkedKeys,
|
|
|
+ roleId: this.roleId
|
|
|
+ }
|
|
|
+ this.loading = true
|
|
|
+ const { code, data } = await editRoleAuth($par)
|
|
|
+ this.loading = false
|
|
|
+ if (code === 0) {
|
|
|
+ console.log(data)
|
|
|
+ data ? this.$message.success('分配成功') : this.$message.error('分配失败')
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 查询权限按钮
|
|
|
+ async getRoleButton () {
|
|
|
+ const $par = {
|
|
|
+ menuId: this.currentClickNode,
|
|
|
+ roleId: this.roleId
|
|
|
+ }
|
|
|
+
|
|
|
+ const { code, data } = await getRoleButton($par)
|
|
|
+
|
|
|
+ if (code === 0) {
|
|
|
+ console.log(data)
|
|
|
+ this.checkboxList = data
|
|
|
+ this.checkedList = data.map(item => {
|
|
|
+ if (item.check) {
|
|
|
+ return item.label
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 查询权限菜单
|
|
|
+ async getRoleMenu () {
|
|
|
+ this.spinning = true
|
|
|
+ const { code, data } = await getRoleMenu({ roleId: this.roleId })
|
|
|
+ this.spinning = false
|
|
|
+ if (code === 0) {
|
|
|
+ console.log(data)
|
|
|
+ this.treeData = data
|
|
|
+ this.flatTreeData = []
|
|
|
+ this.defaultCheckedKey = []
|
|
|
+ this.checkedKeys = []
|
|
|
+ this.currentClickNode = ''
|
|
|
+ this.recursionTreeData(this.treeData)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 获取默认选中的树节点
|
|
|
+ recursionTreeData (treeData) {
|
|
|
+ treeData.forEach(item => {
|
|
|
+ if (Array.isArray(item.children) && item.children.length > 0) {
|
|
|
+ this.recursionTreeData(item.children)
|
|
|
+ }
|
|
|
+ if (item.check) {
|
|
|
+ console.log('我不执行??')
|
|
|
+ this.defaultCheckedKey.push(item.id)
|
|
|
+ this.checkedKeys.push(item.id)
|
|
|
+ }
|
|
|
+ // 自定义tree节点
|
|
|
+
|
|
|
+ // 将父级页面节点禁用
|
|
|
+ if (item.children !== null) {
|
|
|
+ // item.disableCheckbox = true
|
|
|
+ this.pageTreeKey.push(item.id)
|
|
|
+ } else {
|
|
|
+ item.slots = { title: item.id }
|
|
|
+ this.flatTreeData.push(item)
|
|
|
+ if (this.currentClickNode) return
|
|
|
+ this.currentClickNode = item.id
|
|
|
+ }
|
|
|
+ console.log(item, 'item')
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 按钮单个变化
|
|
|
onChange (checkedList) {
|
|
|
- this.indeterminate = !!checkedList.length && checkedList.length < plainOptions.length
|
|
|
- this.checkAll = checkedList.length === plainOptions.length
|
|
|
+ this.indeterminate = !!checkedList.length && checkedList.length < this.checkboxList.length
|
|
|
+ this.checkAll = checkedList.length === this.checkboxList.length
|
|
|
},
|
|
|
+ // 全选所有
|
|
|
onCheckAllChange (e) {
|
|
|
+ console.log(e.target.checked, ' e.target.checked ')
|
|
|
Object.assign(this, {
|
|
|
- checkedList: e.target.checked ? plainOptions : [],
|
|
|
+ checkedList: e.target.checked ? this.tranferCheckboxList : [],
|
|
|
indeterminate: false,
|
|
|
checkAll: e.target.checked
|
|
|
})
|
|
|
},
|
|
|
// 当前选中的树节点的key
|
|
|
onSelect (selectedKeys, info) {
|
|
|
- console.log('selected', selectedKeys, info)
|
|
|
+ console.log(selectedKeys)
|
|
|
+ if (this.pageTreeKey.includes(selectedKeys[0])) return // 这里是父页面就不允许点击
|
|
|
this.currentClickNode = selectedKeys[0]
|
|
|
},
|
|
|
onCheck (checkedKeys, info) {
|
|
@@ -115,5 +237,16 @@ export default {
|
|
|
}
|
|
|
</script>
|
|
|
<style scoped lang="less">
|
|
|
+::v-deep .anticon-check-circle {
|
|
|
+ margin-left: 10px;
|
|
|
+}
|
|
|
|
|
|
+::v-deep .ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected {
|
|
|
+ background-color: #fff;
|
|
|
+}
|
|
|
+.disabled {
|
|
|
+ pointer-events: none;
|
|
|
+ cursor: default;
|
|
|
+ opacity: 0.6;
|
|
|
+}
|
|
|
</style>
|