From 6cc81f9de0c87c40a9f1181ab35e8dff792a1884 Mon Sep 17 00:00:00 2001 From: Fixiaobai <fixiaobai@163.com> Date: 星期一, 28 八月 2023 09:17:21 +0800 Subject: [PATCH] 动态路由 --- src/views/laboratory/role/index.vue | 483 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 467 insertions(+), 16 deletions(-) diff --git a/src/views/laboratory/role/index.vue b/src/views/laboratory/role/index.vue index a56cda7..c4f696c 100644 --- a/src/views/laboratory/role/index.vue +++ b/src/views/laboratory/role/index.vue @@ -8,7 +8,7 @@ </el-input> </el-form-item> <el-form-item class="rightBtn"> - <el-button type="primary">鏌ヨ</el-button> + <el-button type="primary" @click="searchRole">鏌ヨ</el-button> <el-button type="primary" plain>閲嶇疆</el-button> </el-form-item> </el-form> @@ -16,7 +16,6 @@ <el-form-item class="rightBtn"> <el-button type="primary" @click="addClickRole" icon="el-icon-plus">鏂板瑙掕壊</el-button> </el-form-item> - </el-form> </el-form> </div> <div class="library-table"> @@ -30,8 +29,9 @@ <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="20%" /> <el-table-column label="鎿嶄綔" min-width="12%"> <template slot-scope="scope"> - <el-button type="text" size="small">缂栬緫</el-button> - <el-button type="text" size="small">鍒犻櫎</el-button> + <el-button type="text" @click="selectRoleInfo(scope)" size="small">鏌ョ湅</el-button> + <el-button type="text" @click="upRole(scope)" size="small">缂栬緫</el-button> + <el-button type="text" @click="removeRole(scope)" size="small">鍒犻櫎</el-button> </template> </el-table-column> </el-table> @@ -67,10 +67,10 @@ :default-expand-all="false" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> <el-table-column highlight-current-row prop="parentId" label="鑿滃崟绫诲瀷" sortable width="180"> <template slot-scope="scope"> - <span v-if="scope.row.parentId == 0 && scope.row.children != undefined" style="color: #409eff;">涓昏彍鍗�</span> - <span v-if="scope.row.parentId == 0 && scope.row.children === undefined" style="color: #409eff;"> + <span v-if="scope.row.parentId == 0" style="color: #409eff;">涓昏彍鍗�</span> + <!-- <span v-if="scope.row.parentId == 0 && scope.row.children === undefined" style="color: #409eff;"> 涓昏彍鍗� - </span> + </span> --> </template> </el-table-column> <el-table-column prop="name" label="鑿滃崟鍚�" sortable width="180"> @@ -103,11 +103,125 @@ <el-button type="primary" @click="addRole">纭� 瀹�</el-button> </span> </el-dialog> + + <el-dialog top="5vh" title="缂栬緫瑙掕壊" :visible.sync="dialogTableVisibleUpdate" width="50%"> + <el-form :model="updateRole" ref="updateRole" label-position="right" label-width="100px"> + <el-col :span="24" style="display: flex;justify-content: space-between;"> + <el-form-item :rules="nameaRules" label="瑙掕壊鍚�:"> + <el-input @blur="assertUpName" style="width: 300px" v-model="updateRole.roleName" placeholder="璇疯緭鍏ヨ鑹插悕"> + </el-input> + </el-form-item> + <!-- <el-form-item label="鑿滃崟閫夋嫨:"> + <el-cascader style="width: 300px" collapse-tags size="medium " filterable :props="props" + v-model="roleAdd.menuData" :options="menuInfo"> + <template slot-scope="{ data }"> + <span>{{ data.label }}</span> + </template> + </el-cascader> + </el-form-item> --> + </el-col> + </el-form> + <el-col :span="24"> + <el-table height="500" :data="menuUpdateInfo" style="width: 100%;margin-bottom: 20px;" row-key="id" + :default-expand-all="true" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> + <el-table-column highlight-current-row prop="parentId" label="鑿滃崟绫诲瀷" sortable width="180"> + <template slot-scope="scope"> + <span v-if="scope.row.parentId == 0" style="color: #409eff;">涓昏彍鍗�</span> + <!-- <span v-if="scope.row.parentId == 0 && scope.row.children === undefined" style="color: #409eff;"> + 涓昏彍鍗� + </span> --> + </template> + </el-table-column> + <el-table-column prop="name" label="鑿滃崟鍚�" sortable width="180"> + <template slot-scope="scope"> + <el-col v-if="scope.row.parentId == 0"> + <span style="color: #409eff;">{{ scope.row.name }}</span> + </el-col> + <el-col v-else> + <span style="color: #40b815;">{{ scope.row.name }}</span> + </el-col> + </template> + </el-table-column> + <el-table-column prop="id" label="鎿嶄綔鏉冮檺"> + <template slot-scope="scope"> + <el-col v-if="scope.row.parentId == 0 && scope.row.children != undefined"> + <!-- <el-checkbox v-model="scope.row.select">鏌ヨ</el-checkbox> --> + </el-col> + <el-col v-else> + <el-checkbox size="medium" v-model="scope.row.selected" @change="chekSelect(scope)">鏌ヨ</el-checkbox> + <el-checkbox size="medium" v-model="scope.row.added" @change="chekAdd(scope)">娣诲姞</el-checkbox> + <el-checkbox size="medium" v-model="scope.row.updated" @change="chekUpdate(scope)">淇敼</el-checkbox> + <el-checkbox size="medium" v-model="scope.row.deleted" @change="chekDelet(scope)">鍒犻櫎</el-checkbox> + </el-col> + </template> + </el-table-column> + </el-table> + </el-col> + <span slot="footer" class="dialog-footer"> + <el-button @click="clearUPAll">鍙� 娑�</el-button> + <el-button type="primary" @click="cilckUP">纭� 瀹�</el-button> + </span> + </el-dialog> + + <el-dialog top="5vh" title="瑙掕壊瀵熺湅" :visible.sync="dialogTableSelectVisible" width="50%"> + <el-form :model="selectMenuInfo" ref="selectMenuInfo" label-position="right" label-width="100px"> + <el-col :span="24" style="display: flex;justify-content: space-between;"> + <el-form-item label="瑙掕壊鍚�:"> + <el-input style="width: 300px" v-model="selectMenuInfo.roleName" readonly> + </el-input> + </el-form-item> + <!-- <el-form-item label="鑿滃崟閫夋嫨:"> + <el-cascader style="width: 300px" collapse-tags size="medium " filterable :props="props" + v-model="roleAdd.menuData" :options="menuInfo"> + <template slot-scope="{ data }"> + <span>{{ data.label }}</span> + </template> + </el-cascader> + </el-form-item> --> + </el-col> + </el-form> + <el-col :span="24"> + <el-table height="500" :data="selectMenuInfo.menuData" style="width: 100%;margin-bottom: 20px;" row-key="menuId" + :default-expand-all="true" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> + <el-table-column highlight-current-row prop="parentId" label="鑿滃崟绫诲瀷" sortable width="180"> + <template slot-scope="scope"> + <span v-if="scope.row.parentId == 0" style="color: #409eff;">涓昏彍鍗�</span> + <!-- <span v-if="scope.row.parentId == 0 && scope.row.children === undefined" style="color: #409eff;"> + 涓昏彍鍗� + </span> --> + </template> + </el-table-column> + <el-table-column prop="menuName" label="鑿滃崟鍚�" sortable width="180"> + <template slot-scope="scope"> + <el-col v-if="scope.row.parentId == 0"> + <span style="color: #409eff;">{{ scope.row.menuName }}</span> + </el-col> + <el-col v-else> + <span style="color: #40b815;">{{ scope.row.menuName }}</span> + </el-col> + </template> + </el-table-column> + <el-table-column prop="menuId" label="鎿嶄綔鏉冮檺"> + <template slot-scope="scope"> + <el-col v-if="scope.row.parentId == 0 && scope.row.children.length > 0"> + <!-- <el-checkbox v-model="scope.row.select">鏌ヨ</el-checkbox> --> + </el-col> + <el-col id="selectRoleCheck" class="selectRoleCheck" v-else> + <el-checkbox size="medium" disabled v-model="scope.row.selected">鏌ヨ</el-checkbox> + <el-checkbox size="medium" disabled v-model="scope.row.added">娣诲姞</el-checkbox> + <el-checkbox size="medium" disabled v-model="scope.row.updated">淇敼</el-checkbox> + <el-checkbox size="medium" disabled v-model="scope.row.deleted">鍒犻櫎</el-checkbox> + </el-col> + </template> + </el-table-column> + </el-table> + </el-col> + </el-dialog> </div> </template> <script> -import { getMenusTree, addRoleInfo, assertRepeat, getAllRoleAndMenuInfo } from '@/api/laboratory/role' +import { getMenusTree, addRoleInfo, assertRepeat, getAllRoleAndMenuInfo, deleteRole, updateRoleMenu } from '@/api/laboratory/role' import { default as menuPower } from './menuPower.vue' export default { components: { @@ -116,6 +230,15 @@ data() { return { props: { multiple: true }, + dialogTableVisibleUpdate: false, + updateRole: { + roleId: null, + roleName: null, + lastName: null, + menuData: null, + lastMenuSelect: null + }, + selectRole: [], roleAdd: { roleName: null, menuData: null @@ -124,10 +247,14 @@ menuTableTree: null, searchData: { roleName: '', - permission: '' }, assertRepeatName: true, menuInfo: [], + menuUpdateInfo: [], + selectMenuInfo: { + roleName: null, + menuData: null + }, roleTable: [], updateData: { oldPassWord: '', @@ -135,6 +262,8 @@ confirmPassWord: '' }, dialogTableVisible: false, + dialogTableSelectVisible: false, + addOrUp: false, currentPage: 1, pageSize: 5, total: 20 @@ -147,13 +276,169 @@ this.start() }, methods: { - chekSelect(scope) { + selectRoleInfo(scope) { + this.selectMenuInfo.roleName = scope.row.roleName + this.selectMenuInfo.menuData = scope.row.roleMenuList + console.log(this.selectMenuInfo.menuData); + this.dialogTableSelectVisible = true + }, + searchRole() { + this.start() + }, + clearUPAll() { + this.updateRole = { + roleId: null, + roleName: null, + lastName: null, + menuData: null, + lastMenuSelect: null + } + this.menuUpdateInfo = [] + this.dialogTableVisibleUpdate = false + }, + async cilckUP() { + if (this.updateRole.roleName == null || this.updateRole.roleName == '') { + this.$message({ + message: '璇疯緭鍏ヨ鑹插悕', + type: 'warning' + }); + return + } + if (!this.assertRepeatName) { + this.$message({ + message: '瑙掕壊鍚嶉噸澶嶏紝璇烽噸鏂拌緭鍏�', + type: 'warning' + }); + return + } + this.menuUpdateInfo.forEach(item => { + if (item.children != undefined) { + item.children.forEach(c => { + if (c.added) { + item.selected = true + } + if (c.selected) { + item.selected = true + } + if (c.updated) { + item.selected = true + } + if (c.deleted) { + item.selected = true + } + }) + } + }) + console.log(this.menuUpdateInfo); + this.updateRole.menuData = JSON.parse(JSON.stringify(this.menuUpdateInfo)); + this.updateRole.menuData.forEach(item => { + if (item.children != undefined) { + let child = item.children.filter(c => { + return c.added == true || c.selected == true || c.deleted == true || c.updated === true + }) + item.children = child + } + }) + this.updateRole.menuData = this.updateRole.menuData.filter(item => { + return item.selected == true + }) + this.assertDeleteOrUp() + console.log(this.updateRole); + let up = await updateRoleMenu(this.updateRole) + if (up.data) { + this.$message({ + type: 'success', + message: '缂栬緫鎴愬姛!' + }); + this.start() + this.clearUPAll() + } else { + this.$message.error('缂栬緫澶辫触锛佽閲嶆柊鎿嶄綔'); + } }, + async upRole(scope) { + console.log(scope); + this.updateRole.roleId = scope.row.roleId + this.updateRole.roleName = scope.row.roleName + this.updateRole.lastName = scope.row.roleName + let menuSelect = scope.row.roleMenuList + this.updateRole.lastMenuSelect = scope.row.roleMenuList + console.log(menuSelect); + let res = await getMenusTree(); + this.menuUpdateInfo = res.data + this.menuUpdateInfo.forEach(item => { + this.$set(item, 'added', false); + this.$set(item, 'updated', false); + this.$set(item, 'deleted', false); + this.$set(item, 'selected', false); + if (item.children.length == 0) { + delete item['children'] + } else { + item.children.forEach(c => { + this.$set(c, 'selected', false); + this.$set(c, 'added', false); + this.$set(c, 'updated', false); + this.$set(c, 'deleted', false); + if (c.children.length == 0) { + delete c['children'] + } + }) + } + }) + console.log(this.menuUpdateInfo); + menuSelect.forEach(ms => { + this.menuUpdateInfo.forEach(item => { + if (ms.menuName === item.name) { + item.selected = ms.selected + item.added = ms.added + item.deleted = ms.deleted + item.updated = ms.updated + ms.children.forEach(msc => { + if (item.children != undefined) { + item.children.forEach(itemc => { + if (itemc.name === msc.menuName) { + itemc.selected = msc.selected + itemc.added = msc.added + itemc.deleted = msc.deleted + itemc.updated = msc.updated + } + }) + } + }) + } + }) + }) + this.dialogTableVisibleUpdate = true + }, + removeRole(scope) { + this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ヨ鑹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(async () => { + this.roleTable = this.roleTable.filter(item => { + return item.roleId != scope.row.roleId + }); + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }); + await deleteRole({ id: scope.row.roleId }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, async start() { - let res = await getAllRoleAndMenuInfo() - this.roleTable = res.data - console.log(res); + let res = await getAllRoleAndMenuInfo({ currentPage: this.currentPage, pageSize: this.pageSize, name: this.searchData.roleName }) + res.data.list.forEach(item => { + item.roleId = String(item.roleId) + }) + this.roleTable = res.data.list + this.total = res.data.total }, async assertName() { if (this.roleAdd.roleName == null || this.roleAdd.roleName == '') { @@ -175,13 +460,81 @@ } }, chekAdd(scope) { - scope.row.selected = true + if (scope.row.added) { + scope.row.selected = true + } + this.updateFatherState(scope) }, chekUpdate(scope) { - scope.row.selected = true + if (scope.row.updated) { + scope.row.selected = true + } + this.updateFatherState(scope) }, chekDelet(scope) { - scope.row.selected = true + if (scope.row.deleted) { + scope.row.selected = true + } + this.updateFatherState(scope) + }, + chekSelect(scope) { + this.updateFatherState(scope) + }, + updateFatherState(scope) { + if (this.menuUpdateInfo != []) { + this.menuUpdateInfo.forEach(item => { + if (item.id == scope.row.parentId) { + if (item.children != undefined) { + let childrenFalse = item.children.length * 4; + let countFalse = 0; + item.children.forEach(c => { + if (c.added == false) { + countFalse++; + } + if (c.deleted == false) { + countFalse++; + } + if (c.updated == false) { + countFalse++; + } + if (c.selected == false) { + countFalse++; + } + }) + if (childrenFalse === countFalse) { + item.selected = false + } + } + } + }) + } + if (this.menuInfo != []) { + this.menuInfo.forEach(item => { + if (item.id == scope.row.parentId) { + if (item.children != undefined) { + let childrenFalse = item.children.length * 4; + let countFalse = 0; + item.children.forEach(c => { + if (c.added == false) { + countFalse++; + } + if (c.deleted == false) { + countFalse++; + } + if (c.updated == false) { + countFalse++; + } + if (c.selected == false) { + countFalse++; + } + }) + if (childrenFalse === countFalse) { + item.selected = false + } + } + } + }) + } }, async addClickRole() { let res = await getMenusTree(); @@ -254,6 +607,7 @@ return item.selected == true }) let res = await addRoleInfo(this.roleAdd); + this.start() if (res.data) { this.$message({ message: '娣诲姞瑙掕壊鎴愬姛', @@ -287,6 +641,92 @@ this.menuInfo = [] this.assertRepeatName = true this.dialogTableVisible = false + }, + assertDeleteOrUp() { + console.log("---------"); + console.log(this.updateRole.menuData); + this.updateRole.lastMenuSelect + this.updateRole.menuData + let newTree = [] + let oldTree = [] + this.updateRole.menuData.forEach(item => { + const obj = { + menuId: item.id, + menuName: item.name, + added: item.added, + parentId: item.parentId, + deleted: item.deleted, + updated: item.updated, + selected: item.selected + } + newTree.push(obj) + if (item.children != undefined && obj.selected != false) { + item.children.forEach(c => { + const objc = { + menuId: c.id, + menuName: c.name, + parentId: c.parentId, + added: c.added, + deleted: c.deleted, + updated: c.updated, + selected: c.selected + } + newTree.push(objc) + }) + } + }) + console.log(newTree); + // this.updateRole.lastMenuSelect.forEach(item => { + // const obj = { + // menuId: item.menuId, + // menuName: item.menuName, + // added: item.added, + // deleted: item.deleted, + // updated: item.updated, + // selected: item.selected + // } + // if (obj.selected) { + // oldTree.push(obj) + // } + // if (item.children != [] && obj.selected != false) { + // item.children.forEach(c => { + // const objc = { + // menuId: c.menuId, + // menuName: c.menuName, + // added: c.added, + // deleted: c.deleted, + // updated: c.updated, + // selected: c.selected + // } + // oldTree.push(objc) + // }) + // } + // }) + console.log(oldTree); + // this.updateRole.lastMenuSelect = oldTree + this.updateRole.menuData = newTree + }, + async assertUpName() { + if (this.updateRole.roleName == null || this.updateRole.roleName == '') { + this.$message({ + message: '璇疯緭鍏ヨ鑹插悕绉帮紒', + type: 'warning' + }); + return + } + if (this.updateRole.roleName === this.updateRole.lastName) { + return + } + let res = await assertRepeat({ roleName: this.updateRole.roleName }) + if (!res.data) { + this.assertRepeatName = false + this.$message({ + message: '瑙掕壊鍚嶉噸澶嶏紝璇烽噸鏂拌緭鍏ワ紒', + type: 'warning' + }); + } else { + this.assertRepeatName = true + } } } } @@ -336,5 +776,16 @@ justify-content: end; margin-top: 20px } + } </style> + +<style> +#selectRolecheck .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after { + border-color: #fff !important; +} +#selectRoleCheck .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner { + background-color: #409EFF; + border-color: #409EFF; +} +</style> \ No newline at end of file -- Gitblit v1.9.3