| | |
| | | overflow-y: auto;overflow-x:hidden;" |
| | | :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}" |
| | | @scroll="scrollLeftScroll()" |
| | | @mouseover="changeScrollLeftFlag(false)" |
| | | @mouseover="changeScrollLeftFlag('left')" |
| | | > |
| | | <div style=" "> |
| | | <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 菜单权限 |
| | |
| | | style="border-right: 1px solid rgba(0,0,0,0.2);width: 500px;padding-left: 10px;overflow-y: auto" |
| | | :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}" |
| | | @scroll="scrollCenterScroll()" |
| | | @mouseover="changeScrollLeftFlag(true)" |
| | | @mouseover="changeScrollLeftFlag('center')" |
| | | > |
| | | <div style=" "> |
| | | <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 按钮权限 |
| | | </div> |
| | | |
| | | <el-checkbox |
| | | v-model="buttonIsChecked" |
| | | style="height: 26px;display:flex;align-items: center;margin-top:10px;width:200px" |
| | | @change="handleCheckAllChange" |
| | | @change="val=>handleCheckAllChange(val,'button')" |
| | | >全选 |
| | | </el-checkbox> |
| | | |
| | | <div v-for="item in treeCenter[0].children" :key="item.label"> |
| | | <div |
| | | v-if="item.checkedButton" |
| | | style="margin-left: 40px;height:26px;display: flex;" |
| | | /> |
| | | <div v-if="treeCenter.length>0"> |
| | | <div v-for="item in treeCenter[0].children" :key="item.code"> |
| | | <div |
| | | v-if="item.display" |
| | | style="margin-left: 40px;height:26px;display: flex;" |
| | | /> |
| | | |
| | | <el-checkbox-group |
| | | v-for="it in item.children" |
| | | v-if="item.expanded" |
| | | :key="it.code" |
| | | v-model="it.checkedButton" |
| | | style="margin-left: 40px;height:26px;display: flex" |
| | | @change="val=>handleCheckedButtonChange(val,it.code,it.checkedButton)" |
| | | > |
| | | <el-checkbox-group |
| | | v-for="it in item.children" |
| | | v-if="item.expanded" |
| | | :key="it.code" |
| | | v-model="it.checkedButton" |
| | | style="margin-left: 40px;height:26px;display: flex" |
| | | @change="val=>handleCheckedButtonChange(val,it.code)" |
| | | > |
| | | |
| | | <el-checkbox |
| | | v-for="i in it.itemButton" |
| | | :key="i" |
| | | :label="i" |
| | | style="display:flex;align-items: center" |
| | | >{{ i }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | <el-checkbox |
| | | v-for="i in it.itemButton" |
| | | :key="i" |
| | | :label="i" |
| | | style="display:flex;align-items: center" |
| | | /> |
| | | </el-checkbox-group> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <div |
| | | ref="scrollRight" |
| | | style="width: 360px;padding-left: 10px;overflow-y: auto" |
| | | :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}" |
| | | @scroll="scrollRightScroll()" |
| | | @mouseover="changeScrollLeftFlag('right')" |
| | | > |
| | | <div style=" "> |
| | | <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 数据权限 |
| | | </div> |
| | | |
| | | <el-checkbox |
| | | v-model="dataIsChecked" |
| | | style="height: 26px;display:flex;align-items: center;margin-top:10px;width:200px" |
| | | @change="val=>handleCheckAllChange(val,'data')" |
| | | >全选 |
| | | </el-checkbox> |
| | | |
| | | <div v-if="treeCenter.length>0"> |
| | | <div v-for="item in treeCenter[0].children" :key="item.code"> |
| | | <div |
| | | v-if="item.display" |
| | | style="margin-left: 40px;height:26px;display: flex;" |
| | | /> |
| | | |
| | | <el-radio-group |
| | | v-for="it in item.children" |
| | | v-if="item.expanded" |
| | | :key="it.code" |
| | | v-model="it.checkedData" |
| | | style="margin-left: 40px;height:26px;display: flex" |
| | | @change="val=>handleCheckedDataChange(val,it.code)" |
| | | > |
| | | <el-radio |
| | | v-for="i in it.itemData" |
| | | :key="i" |
| | | style="display:flex;align-items: center" |
| | | :label="i" |
| | | /> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | </el-tab-pane> |
| | | <el-tab-pane label="APP端" name="APP端">大大</el-tab-pane> |
| | | <el-tab-pane label="工控端" name="工控端">工控端</el-tab-pane> |
| | |
| | | import ImportPicker from '@/components/ImportPicker' |
| | | import elDragDialog from '@/directive/el-drag-dialog' |
| | | import waves from '@/directive/waves' |
| | | import { RolePermissionSearchRole, RolePermissionSearchRoleMenu } from '@/api/basicSettings' |
| | | import { |
| | | RolePermissionSearchRole, |
| | | RolePermissionSearchRoleMenu, |
| | | RolePermissionSearchRoleMenuButton |
| | | } from '@/api/basicSettings' |
| | | import arrayToTree from 'array-to-tree' |
| | | |
| | | export default { |
| | |
| | | page: 1, // 第几页 |
| | | rows: 20 // 每页多少条 |
| | | }, |
| | | treeLeft: [ |
| | | { |
| | | code: '2000', |
| | | label: '浙江新凯迪数字科技股份有限公司', |
| | | children: [{ |
| | | code: '2001', |
| | | label: '所有人' |
| | | }, { |
| | | code: '2002', |
| | | label: '金工车间员工' |
| | | }] |
| | | } |
| | | ], |
| | | treeCenter: [ |
| | | { |
| | | label: 'PC端页面', |
| | | code: '1000', |
| | | children: [{ |
| | | code: '2000', |
| | | label: '基础设置', |
| | | children: [{ |
| | | code: '2001', |
| | | label: '组织架构' |
| | | }, { |
| | | code: '2002', |
| | | label: '角色权限' |
| | | }] |
| | | }, { |
| | | label: '设备管理', |
| | | code: '3000', |
| | | children: [{ |
| | | code: '3001', |
| | | label: '设备清单' |
| | | }, { |
| | | code: '3002', |
| | | label: '设备保养' |
| | | }] |
| | | }] |
| | | } |
| | | ], |
| | | treeLeft: [], |
| | | treeCenter: [], |
| | | defaultPropsLeft: { |
| | | children: 'roles', |
| | | label: 'name' |
| | | }, |
| | | defaultPropsCenter: { |
| | | children: 'children', |
| | | label: 'label' |
| | | label: 'name' |
| | | }, |
| | | activeName: 'PC端', |
| | | |
| | | buttonIsChecked: false, |
| | | |
| | | // itemButton: ['新增', '修改', '删除', '下载', '上传'], |
| | | // checkedButton: ['新增', '修改'], |
| | | dataIsChecked: false, |
| | | |
| | | menuCheckedCodeArr: [], // 菜单权限数组选中的 |
| | | |
| | | isScroll: false |
| | | allButtonData: [], // 所有的按钮加权限 |
| | | |
| | | isScroll: 'left' |
| | | |
| | | } |
| | | }, |
| | |
| | | mounted() { |
| | | window.addEventListener('resize', this.getHeight) |
| | | this.getHeight() |
| | | |
| | | this.treeCenter[0].children.forEach(item => { |
| | | if (item.children && item.children.length) { |
| | | item.children.forEach(it => { |
| | | it.itemButton = ['新增', '修改', '删除', '下载', '上传'] |
| | | // it.checkedButton = ['新增', '修改'] |
| | | it.checkedButton = [] |
| | | }) |
| | | item.itemButton = [] |
| | | item.checkedButton = [] |
| | | item.expanded = true |
| | | } |
| | | }) |
| | | console.log(JSON.parse(JSON.stringify(this.treeCenter))) |
| | | }, |
| | | methods: { |
| | | |
| | |
| | | this.$nextTick(() => { // 默认选中第一个 |
| | | this.$refs.treeLeftRef.setCurrentKey(res[0].roles[0].code) // 默认选中节点第一个 |
| | | }) |
| | | await this.getRolePermissionSearchRoleMenuButton(res[0].roles[0].code) |
| | | await this.getRolePermissionSearchRoleMenu(res[0].roles[0].code) |
| | | } else { |
| | | this.$notify.error('请先建相对应的角色!') |
| | | } |
| | | }, |
| | | |
| | | async getRolePermissionSearchRoleMenuButton(rolecode) { |
| | | const { data: res } = await RolePermissionSearchRoleMenuButton({ rolecode }) |
| | | this.allButtonData = res |
| | | }, |
| | | |
| | | async getRolePermissionSearchRoleMenu(rolecode) { |
| | | const { data: res } = await RolePermissionSearchRoleMenu({ rolecode, type: 'PC' }) |
| | | |
| | |
| | | childrenProperty: 'children' |
| | | }) |
| | | |
| | | const aaa = [ |
| | | this.menuCheckedCodeArr = [] |
| | | |
| | | result.forEach(item => { |
| | | if (item.children && item.children.length) { |
| | | item.children.forEach(it => { |
| | | // 按钮权限回显 |
| | | const buttonAll = this.allButtonData.tButton.filter(j => j.menucode === it.code).map(j => j.name) |
| | | const buttonChecked = this.allButtonData.tButton.filter(j => |
| | | j.menucode === it.code && j.flag === 'Y' |
| | | ).map(j => j.name) |
| | | it.itemButton = buttonAll |
| | | it.checkedButton = buttonChecked |
| | | |
| | | // 数据权限回显 |
| | | const dataAll = this.allButtonData.tData.filter(j => j.menucode === it.code).map(j => j.name) |
| | | const dataChecked = this.allButtonData.tData.filter(j => j.menucode === it.code && j.flag === 'Y').name |
| | | console.log(dataAll, dataChecked, 2) |
| | | it.itemData = dataAll |
| | | it.checkedData = dataChecked |
| | | |
| | | // 用作菜单勾选回显 |
| | | if (buttonChecked && buttonChecked.length > 0) { |
| | | this.menuCheckedCodeArr.push(it.code) |
| | | } |
| | | }) |
| | | item.display = true |
| | | item.expanded = true |
| | | } |
| | | }) |
| | | |
| | | console.log(JSON.parse(JSON.stringify(result)), 8) |
| | | |
| | | this.treeCenter = [ |
| | | { code: '-1', name: '全部', flag: result.every(i => i.flag === 'Y') ? 'Y' : 'N', children: result } |
| | | ] |
| | | |
| | | console.log(JSON.parse(JSON.stringify(aaa))) |
| | | // aaa数组给菜单树形 然后再做按钮类的 |
| | | this.buttonIsChecked = result.every(i => i.flag === 'Y') |
| | | |
| | | // console.log(this.menuCheckedCodeArr, 2) |
| | | this.$nextTick(() => { |
| | | this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr) |
| | | }) |
| | | |
| | | // console.log(this.treeCenter[0].children) |
| | | }, |
| | | |
| | | // 左边滚动条滑动时 |
| | | scrollLeftScroll() { |
| | | if (!this.isScroll) { |
| | | if (this.isScroll === 'left') { |
| | | this.$refs.scrollCenter.scrollTop = this.$refs.scrollLeft.scrollTop |
| | | this.$refs.scrollRight.scrollTop = this.$refs.scrollLeft.scrollTop |
| | | } |
| | | }, |
| | | // 中间边滚动条滑动时 |
| | | scrollCenterScroll() { |
| | | if (this.isScroll) { |
| | | if (this.isScroll === 'center') { |
| | | this.$refs.scrollLeft.scrollTop = this.$refs.scrollCenter.scrollTop |
| | | this.$refs.scrollRight.scrollTop = this.$refs.scrollCenter.scrollTop |
| | | } |
| | | }, |
| | | // 右侧滚动条滑动时 |
| | | scrollRightScroll() { |
| | | if (this.isScroll === 'right') { |
| | | this.$refs.scrollLeft.scrollTop = this.$refs.scrollRight.scrollTop |
| | | this.$refs.scrollCenter.scrollTop = this.$refs.scrollRight.scrollTop |
| | | } |
| | | }, |
| | | |
| | |
| | | }, |
| | | |
| | | // 全选改变 |
| | | handleCheckAllChange(val) { |
| | | handleCheckAllChange(val, belong) { |
| | | const checkedKeys = this.$refs.treeCenterRef.getCheckedKeys() |
| | | |
| | | if (val) { |
| | |
| | | if (item.children && item.children.length) { |
| | | item.children.forEach(it => { |
| | | if (checkedKeys.includes(it.code)) { |
| | | it.checkedButton = it.itemButton |
| | | if (belong === 'button') { |
| | | it.checkedButton = it.itemButton |
| | | } |
| | | if (belong === 'data') { |
| | | it.checkedData = '全部' |
| | | } |
| | | } |
| | | }) |
| | | } |
| | |
| | | if (item.children && item.children.length) { |
| | | item.children.forEach(it => { |
| | | if (checkedKeys.includes(it.code)) { |
| | | it.checkedButton = [] |
| | | if (belong === 'button') { |
| | | it.checkedButton = [] |
| | | } |
| | | if (belong === 'data') { |
| | | it.checkedData = undefined |
| | | } |
| | | } |
| | | }) |
| | | } |
| | |
| | | |
| | | console.log(this.treeCenter[0].children, 20) |
| | | }, |
| | | // 单个按钮改变 oldValue 更新前的值 code 对应的菜单编码 newValue 更新后的值 |
| | | handleCheckedButtonChange(oldValue, code, newValue) { |
| | | // 单个按钮改变 |
| | | handleCheckedButtonChange(value, code) { |
| | | // 判断是否包含在内 |
| | | if (!this.menuCheckedCodeArr.includes(code) && oldValue.length === 0 && newValue.length === 1) { // 否 |
| | | if (!this.menuCheckedCodeArr.includes(code) && value.length === 1) { // 否 |
| | | this.menuCheckedCodeArr.push(code) |
| | | } else if (this.menuCheckedCodeArr.includes(code) && oldValue.length === 1 && newValue.length === 0) { // 是 |
| | | } else if (this.menuCheckedCodeArr.includes(code) && value.length === 0) { // 是 |
| | | this.menuCheckedCodeArr = this.menuCheckedCodeArr.filter(i => i !== code) |
| | | } |
| | | |
| | |
| | | this.$forceUpdate() |
| | | }, |
| | | |
| | | // 获取树形节点node |
| | | getLeftTreeNode(data, Node, VueComponent) { |
| | | console.log(data, Node, VueComponent, 2221) |
| | | console.log(Node.expanded) |
| | | this.treeCenter[0].children.forEach(item => { |
| | | // console.log(item, 'item') |
| | | if (item.label === data.label) { |
| | | if (item.name === data.name) { |
| | | item.expanded = Node.expanded |
| | | } |
| | | }) |
| | | if (data.label === 'PC端页面') { |
| | | if (data.code === '-1') { |
| | | Node.expanded = true // 暂时先写成这个 |
| | | // this.treeCenter[0].children.forEach(item => { |
| | | // item.expanded = Node.expanded |
| | |
| | | handleTreeCenterCheck(obj, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys }) { |
| | | // console.log(obj, checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys) |
| | | }, |
| | | // 处理树形选中值改变 |
| | | handleTreeCenterCheckChange(obj, selfChecked, selfChildrenTreeCheck) { |
| | | // console.log(obj, selfChecked, selfChildrenTreeCheck) |
| | | if (!selfChildrenTreeCheck) { |
| | |
| | | item.children.forEach(it => { |
| | | if (it.code === obj.code) { |
| | | it.checkedButton = [] |
| | | it.checkedData = undefined |
| | | } |
| | | }) |
| | | } |
| | |
| | | } |
| | | }, |
| | | |
| | | // 单选框按钮改变 |
| | | handleCheckedDataChange(value, code) { |
| | | console.log(value, code) |
| | | |
| | | this.menuCheckedCodeArr.push(code) |
| | | this.menuCheckedCodeArr = [...new Set(this.menuCheckedCodeArr)] |
| | | |
| | | this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr) |
| | | |
| | | // 这里是判断全选radio 是否选中 |
| | | let count = 0 |
| | | let childrenLength = 0 |
| | | this.treeCenter[0].children.forEach(item => { |
| | | if (item.children && item.children.length) { |
| | | item.children.forEach(it => { |
| | | if (it.checkedData) { |
| | | count++ |
| | | } |
| | | childrenLength++ |
| | | }) |
| | | } |
| | | }) |
| | | this.dataIsChecked = count === childrenLength |
| | | this.$forceUpdate() |
| | | }, |
| | | |
| | | // 获取页面高度 |
| | | getHeight() { |
| | | this.$nextTick(() => { |