[update] 内部工作组左侧树一级节点的新增删除和二级节点的编辑删除走角色管理,二级新增和三级编辑删除权限按一级新增时的管理权限走

This commit is contained in:
lideqin
2023-11-08 15:11:37 +08:00
parent 1323edc080
commit ea6aac0329
5 changed files with 224 additions and 30 deletions
+3 -1
View File
@@ -62,7 +62,9 @@ module.exports = {
post: 'Position',
templateName: 'Internal workgroup table template',
exportName: 'Internal workgroup table',
nodeName: 'Node Name',
nodeName: '分会名称',
adminAuthority: '管理权限',
workGroupName: '工作组名称',
user: 'User',
pleaseSelectASystem: 'Please select the left system'
},
+3 -1
View File
@@ -63,7 +63,9 @@ module.exports = {
post: '岗位',
templateName: '内部工作组表模板',
exportName: '内部工作组表',
nodeName: '节点名称',
nodeName: '分会名称',
adminAuthority: '管理权限',
workGroupName: '工作组名称',
user: '用户',
pleaseSelectASystem: '请选择左侧体系'
},
@@ -15,8 +15,8 @@
:replaceFields="{children: 'subset', title: 'name', key: 'id'}"
:default-expand-all="defaultExpandAll"
@select="treeSelect">
<!-- 没有删除 -->
<template #customNoDelete="record">
<!-- 第一级没有删除 -->
<template #oneCustom="record">
<div class="tree-operate-node" @mouseenter="handleTreeMouseover(record.id)" @mouseleave="handleTreeMouseout(record.id)">
<a-icon class="parent-node-icon" type="folder" v-if="record.subset && record.subset.length > 0" />
<a-tooltip>
@@ -26,16 +26,41 @@
<span class="tree-node-custom-title">{{ record.name }}</span>
</a-tooltip>
<div class="tree-operate-node-btn-box" :class="{'tree-operate-node-btn-box-hide': record.id !== mouseInNodeKey}">
<!-- 新增-->
<!-- 新增 -->
<a-button icon="plus" class="tree-operate-node-btn" @click="handleTreeAdd" v-has="'sys:innerWorkingGroup:tree:add'"></a-button>
<!-- 编辑-->
<a-button class="tree-operate-node-btn" @click="handleTreeEdit(record.name)" v-has="'sys:innerWorkingGroup:tree:edit'">
<!-- 编辑 -->
<a-button class="tree-operate-node-btn" @click="handleTreeEdit(record)" v-has="'sys:innerWorkingGroup:tree:edit'">
<i class="iconfont icon-bianji" style="color: @primary-color"></i>
</a-button>
</div>
</div>
</template>
<!-- 第二级 新增权限根据授权人员决定编辑删除走角色授权 -->
<template #twoCustom="record">
<div class="tree-operate-node" @mouseenter="handleTreeMouseover(record.id)" @mouseleave="handleTreeMouseout(record.id)">
<a-icon class="parent-node-icon" type="folder" v-if="record.subset && record.subset.length > 0" />
<a-tooltip>
<template #title>
{{ record.name }}
</template>
<span class="tree-node-custom-title">{{ record.name }}</span>
</a-tooltip>
<div class="tree-operate-node-btn-box" :class="{'tree-operate-node-btn-box-hide': record.id !== mouseInNodeKey}">
<!-- 新增 -->
<a-button v-if="record.userId === currentUserId" icon="plus" class="tree-operate-node-btn" @click="handleWorkGroupAdd"></a-button>
<!-- 编辑 -->
<a-button class="tree-operate-node-btn" @click="handleTreeEdit(record)" v-has="'sys:innerWorkingGroup:tree:edit'">
<i class="iconfont icon-bianji" style="color: @primary-color"></i>
</a-button>
<!-- 删除 -->
<a-button class="tree-operate-node-btn" @click="handleTreeDelete" v-has="'sys:innerWorkingGroup:tree:delete'">
<i class="iconfont icon-shanchu_" style="color: @primary-color"></i>
</a-button>
</div>
</div>
</template>
<!-- 第三级 编辑删除按授权人员决定 -->
<template #custom="record">
<div class="tree-operate-node" @mouseenter="handleTreeMouseover(record.id)" @mouseleave="handleTreeMouseout(record.id)">
<a-icon class="parent-node-icon" type="folder" v-if="record.subset && record.subset.length > 0" />
@@ -45,15 +70,13 @@
</template>
<span class="tree-node-custom-title">{{ record.name }}</span>
</a-tooltip>
<div class="tree-operate-node-btn-box" :class="{'tree-operate-node-btn-box-hide': record.id !== mouseInNodeKey}">
<!-- 新增-->
<a-button icon="plus" class="tree-operate-node-btn" @click="handleTreeAdd" v-has="'sys:innerWorkingGroup:tree:add'"></a-button>
<!-- 编辑-->
<a-button class="tree-operate-node-btn" @click="handleTreeEdit(record.name)" v-has="'sys:innerWorkingGroup:tree:edit'">
<div v-if="record.userId === currentUserId" class="tree-operate-node-btn-box" :class="{'tree-operate-node-btn-box-hide': record.id !== mouseInNodeKey}">
<!-- 编辑 -->
<a-button class="tree-operate-node-btn" @click="handleWorkGroupEdit(record)">
<i class="iconfont icon-bianji" style="color: @primary-color"></i>
</a-button>
<!-- 删除-->
<a-button class="tree-operate-node-btn" @click="handleTreeDelete" v-has="'sys:innerWorkingGroup:tree:delete'">
<!-- 删除 -->
<a-button class="tree-operate-node-btn" @click="handleTreeDelete">
<i class="iconfont icon-shanchu_" style="color: @primary-color"></i>
</a-button>
</div>
@@ -104,18 +127,19 @@
</div>
<div class="table-operator">
<!-- 当前登录人是当前左侧树选中节点的管理人员才有新增导入删除权限 -->
<!-- 新增-->
<a-button icon="plus" type="primary" @click="handleAdd" v-has="'sys:innerWorkingGroup:add'">{{ $t('newlyAdded') }}</a-button>
<a-button v-if="currentNodeObj.userId === currentUserId" icon="plus" type="primary" @click="handleAdd">{{ $t('newlyAdded') }}</a-button>
<!-- 导入-->
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :data="importData" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" icon="import" ghost @click="handleImport" v-has="'sys:innerWorkingGroup:import'">{{ $t('import') }}</a-button>
<a-button v-if="currentNodeObj.userId === currentUserId" type="primary" icon="import" ghost @click="handleImport">{{ $t('import') }}</a-button>
</a-upload>
<!-- 导出-->
<a-button icon="export" type="primary" ghost @click="handleExportXls($t('system.internalWorkGroup.exportName'))" v-has="'sys:innerWorkingGroup:export'">
{{ $t('export') }}
</a-button>
<!-- 模板下载-->
<a-button type="primary" icon="download" ghost @click="downTemplate($t('system.internalWorkGroup.templateName'))" v-has="'sys:innerWorkingGroup:downTemplate'">
<a-button v-if="currentNodeObj.userId === currentUserId" type="primary" icon="download" ghost @click="downTemplate($t('system.internalWorkGroup.templateName'))">
{{ $t('templateDownload') }}
</a-button>
</div>
@@ -133,15 +157,18 @@
@change="handleTableChange">
<template v-slot:action="{text, record}">
<a @click="handleDelete(record.id)" v-has="'sys:innerWorkingGroup:delete'">{{ $t('delete') }}</a>
<!-- 当前登录人是当前左侧树选中节点的管理人员才有新增导入删除权限 -->
<a v-if="currentNodeObj.userId === currentUserId" @click="handleDelete(record.id)">{{ $t('delete') }}</a>
</template>
</j-table>
</div>
</div>
<!-- 新增编辑左侧树节点 -->
<!-- 根节点新增二级节点编辑左侧树节点 -->
<tree-node-modal ref="treeNodeModal" @ok="treeNodeModalOk"></tree-node-modal>
<!-- 二级节点新增三级节点编辑左侧树节点 -->
<tree-node-work-group-modal ref="treeNodeWorkGroupModal" @ok="treeNodeModalOk"></tree-node-work-group-modal>
<!-- 新增弹框 -->
<working-group-modal ref="modalForm" @ok="modalFormOk"></working-group-modal>
</a-card>
@@ -154,10 +181,13 @@ import TreeNodeModal from './modules/TreeNodeModal'
import { postAction, downFile } from '@/api/manage'
import WorkingGroupModal from './modules/WorkingGroupModal'
import { getWorkGroupTreeList } from '@/api/api'
import TreeNodeWorkGroupModal from './modules/TreeNodeWorkGroupModal'
import Vue from 'vue'
import { USER_INFO } from '../../../store/mutation-types'
export default {
name: 'WorkingGroupList',
components: { WorkingGroupModal, TreeNodeModal, JTable },
components: { TreeNodeWorkGroupModal, WorkingGroupModal, TreeNodeModal, JTable },
mixins: [JeroListMixin],
data () {
return {
@@ -218,11 +248,14 @@ export default {
exportXlsUrl: '/sys/lawsWorkingGroupUser/export',
delete: '/sys/lawsWorkingGroupUser/delete',
downTemplateUrl: '/sys/lawsWorkingGroupUser/download/template'
}
},
currentUserId: '',
currentNodeObj: {} // 当前左侧树节点对象
}
},
mounted () {
this.initTreeData()
this.currentUserId = Vue.ls.get(USER_INFO).id
},
methods: {
// 获取左侧树数据
@@ -231,7 +264,7 @@ export default {
getWorkGroupTreeList(params).then(res => {
if (res.success) {
this.treeData = this.dealTreeData(res.result)
this.treeData[0].scopedSlots = { title: 'customNoDelete' }
this.treeData[0].scopedSlots = { title: 'oneCustom' }
} else {
this.treeData = []
}
@@ -245,8 +278,8 @@ export default {
// 处理左侧树数据结构
dealTreeData (treeData) {
return treeData.map(item => {
item.scopedSlots = { title: item.level === 2 ? 'twoCustom' : 'custom' }
if (item.subset && item.subset.length > 0) {
item.scopedSlots = { title: 'custom' }
item.subset = this.dealTreeData(item.subset)
}
return item
@@ -267,15 +300,25 @@ export default {
this.mouseInNodeKey = null
}
},
// 左侧树点击新增
// 左侧树点击新增(根节点新增)
handleTreeAdd () {
this.$refs.treeNodeModal.title = this.$t('newlyAdded')
this.$refs.treeNodeModal.add(this.mouseInNodeKey)
},
// 左侧树点击编辑
handleTreeEdit (name) {
// 左侧树点击编辑(二级节点编辑)
handleTreeEdit (record) {
this.$refs.treeNodeModal.title = this.$t('edit')
this.$refs.treeNodeModal.edit(this.mouseInNodeKey, name)
this.$refs.treeNodeModal.edit(this.mouseInNodeKey, record)
},
// 左侧树新增(二级节点的新增)
handleWorkGroupAdd () {
this.$refs.treeNodeWorkGroupModal.title = this.$t('newlyAdded')
this.$refs.treeNodeWorkGroupModal.add(this.mouseInNodeKey)
},
// 左侧树编辑(三级节点的编辑)
handleWorkGroupEdit (record) {
this.$refs.treeNodeWorkGroupModal.title = this.$t('edit')
this.$refs.treeNodeWorkGroupModal.edit(this.mouseInNodeKey, record)
},
// 左侧树点击删除
handleTreeDelete () {
@@ -300,9 +343,23 @@ export default {
treeNodeModalOk () {
this.initTreeData()
},
// 根据当前节点key设置当前节点对象
setCurrNodeObjByKey (treeData) {
for (const item of treeData) {
if (item.id === this.currentTreeNode) {
this.currentNodeObj = item
break
}
if (item.subset && item.subset.length > 0) {
this.setCurrNodeObjByKey(item.subset)
}
}
},
// 左侧树点击选中
treeSelect (selectedKeys) {
this.currentTreeNode = selectedKeys
// 设置当前左侧树节点对象,为了右侧表格操作判断权限
this.setCurrNodeObjByKey()
this.queryParam.workingGroupId = selectedKeys[0]
this.loadData()
},
@@ -11,12 +11,19 @@
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<!-- 分会名称 -->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('system.internalWorkGroup.nodeName')">
<a-input :placeholder="$t('pleaseEnter') + $t('system.internalWorkGroup.nodeName')"
:maxLength="50"
@change="event => event.target.value = event.target.value.trim()"
v-decorator.trim="[ 'name', validatorRules.name ]" />
</a-form-item>
<!-- 管理权限 -->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('system.internalWorkGroup.adminAuthority')">
<user-selection :placeholder="$t('pleaseSelect') + $t('system.internalWorkGroup.adminAuthority')"
type="radio"
v-decorator="['userId', validatorRules.userId]" />
</a-form-item>
</a-form>
</a-spin>
@@ -26,9 +33,11 @@
<script>
import pick from 'lodash.pick'
import { postAction } from '@/api/manage'
import UserSelection from '@/components/selection/UserSelection'
export default {
name: 'TreeNodeModal',
components: { UserSelection },
data () {
return {
title: '',
@@ -50,6 +59,12 @@ export default {
{ required: true, message: this.$t('pleaseEnter') + this.$t('system.internalWorkGroup.nodeName') }
],
validateTrigger: 'blur'
},
userId: {
rules: [
{ required: true, message: this.$t('pleaseSelect') + this.$t('system.internalWorkGroup.adminAuthority') }
],
validateTrigger: 'change'
}
},
url: {
@@ -64,13 +79,13 @@ export default {
this.form.resetFields()
this.model.pid = parentNodeKey
},
edit (nodeKey, name) {
edit (nodeKey, record) {
this.visible = true
this.form.resetFields()
this.model = Object.assign({}, record)
this.model.id = nodeKey
this.model.name = name
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'name'))
this.form.setFieldsValue(pick(this.model, 'name', 'userId'))
})
},
close () {
@@ -87,6 +102,7 @@ export default {
this.confirmLoading = true
const param = Object.assign({}, this.model)
param.name = values.name
param.userId = values.userId
let url = ''
if (this.model.id) {
url = this.url.edit
@@ -0,0 +1,117 @@
<template>
<j-modal
:title="title"
:maskClosable="true"
:width="500"
:closable="true"
switchFullscreen
@cancel="handleCancel"
@ok="handleOk"
:visible="visible">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<!-- 工作组名称 -->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('system.internalWorkGroup.workGroupName')">
<a-input :placeholder="$t('pleaseEnter') + $t('system.internalWorkGroup.workGroupName')"
:maxLength="50"
@change="event => event.target.value = event.target.value.trim()"
v-decorator.trim="[ 'name', validatorRules.name ]" />
</a-form-item>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { postAction } from '@/api/manage'
export default {
name: 'TreeNodeWorkGroupModal',
data () {
return {
title: '',
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
validatorRules: {
name: {
rules: [
{ required: true, message: this.$t('pleaseEnter') + this.$t('system.internalWorkGroup.workGroupName') }
],
validateTrigger: 'blur'
}
},
url: {
add: '/sys/lawsWorkingGroup/add',
edit: '/sys/lawsWorkingGroup/edit'
}
}
},
methods: {
add (parentNodeKey) {
this.visible = true
this.form.resetFields()
this.model.pid = parentNodeKey
},
edit (nodeKey, record) {
this.visible = true
this.form.resetFields()
this.model = Object.assign({}, record)
this.model.id = nodeKey
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'name'))
})
},
close () {
this.visible = false
this.model = {}
},
handleCancel () {
this.close()
},
handleOk () {
if (this.confirmLoading) return
this.form.validateFields((err, values) => {
if (!err) {
this.confirmLoading = true
const param = Object.assign({}, this.model)
param.name = values.name
let url = ''
if (this.model.id) {
url = this.url.edit
} else {
url = this.url.add
}
postAction(url, param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.$emit('ok')
this.close()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.confirmLoading = false
})
}
})
}
}
}
</script>
<style scoped>
</style>