From c327574106f470c72638e9f34c7f8cd26d78a2bf Mon Sep 17 00:00:00 2001 From: ludc Date: 星期三, 24 一月 2024 23:48:36 +0800 Subject: [PATCH] 分类授权,数据授权接口修改 --- Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue | 528 +++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 340 insertions(+), 188 deletions(-) diff --git a/Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue b/Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue index dd2cac3..9a32e26 100644 --- a/Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue +++ b/Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue @@ -1,11 +1,16 @@ <template> - <el-dialog - v-dialogDrag - :close-on-click-modal="false" - :visible.sync="isShowDialog" - @close="closeDialog" - append-to-body title="鍒嗙被鎺堟潈"> + <el-dialog + v-dialogDrag + :close-on-click-modal="false" + :visible.sync="isShowDialog" + append-to-body + class="avue-dialog avue-dialog--top" + title="鍒嗙被鎺堟潈" + top="-45px" + @close="closeDialog" + > <el-table + :key="itemKey" ref="dataTable" v-loading="isLoading" :data="classifyAuthData" @@ -13,20 +18,14 @@ :height="tableHeight" border class="cus-table" - @select="handleSelection" @row-click="handleRowClick" @select-all="handleSelectionAll" @selection-change="handleSelectionChange" - @sort-change="sortChange" > + <el-table-column type="selection" width="55"></el-table-column> <el-table-column - fixed - type="selection" - width="55" - ></el-table-column> - <el-table-column - v-if="classifyAuthHeader.length !== 0" v-for="(item, index) in classifyAuthHeader" + v-if="classifyAuthHeader.length !== 0" :key="index" :label="item.label" :prop="item.prop" @@ -39,6 +38,7 @@ v-if="item.type === 'select'" slot="prepend" v-model="row[item.prop]" + @change="selectChange(row.roleData, row)" > <el-option v-for="optionItem in roleList" @@ -50,32 +50,52 @@ </el-select> <el-input v-if="item.type === 'text'" - type="text" - readonly v-model="row[item.prop]" + readonly + type="text" > </el-input> - <el-checkbox + <el-checkbox v-if="item.type === 'checkbox'" - v-model="row[item.prop]"> + v-model="row[item.prop]" + :disabled="row.authButton.allDisabled ? true : row.authButton[item.code]" + > </el-checkbox> </template> </el-table-column> </el-table> <div slot="footer" class="dialog-footer"> - <el-button type="success" class="el-icon-plus" @click="addClassifyAuth"></el-button> - <el-button type="warning" class="el-icon-minus" @click="subClassifyAuth"></el-button> - <el-button type="primary" @click="submit">鎻� 浜�</el-button> - <el-button type="danger" @click="isShowDialog = false">鍏� 闂�</el-button> + <el-button plain type="info" @click="selectAllButton">鎸夐挳鍏ㄩ��</el-button> + <el-button + class="el-icon-plus" + plain + type="success" + @click="addClassifyAuth" + ></el-button> + <el-button + class="el-icon-minus" + plain + type="warning" + @click="subClassifyAuth" + ></el-button> + <el-button plain type="primary" @click="submit">鎻� 浜�</el-button> + <el-button plain type="danger" @click="isShowDialog = false" + >鍏� 闂�</el-button + > </div> </el-dialog> </template> <script> -import { getButtonByParentCode } from "@/api/system/menu" -import { getPage } from "@/api/system/role" -import { saveOrUpdate,getClassifyAuthList } from "@/api/system/classifyAuth" -import { v4 as uuidv4 } from 'uuid'; +import { getButtonByParentCode } from "@/api/system/menu"; +import { getPage } from "@/api/system/role"; +import { + saveOrUpdate, + getClassifyAuthList, + getButtonsByRoleId, +} from "@/api/system/classifyAuth"; +import { v4 as uuidv4 } from "uuid"; + export default { name: "classifyAuthDialog.vue", props: { @@ -94,7 +114,7 @@ // 瀵硅瘽妗嗘樉绀烘帶鍒� isShowDialog: this.visible, isLoading: false, - tableHeight: 'calc(100vh - 550px)', + tableHeight: "calc(100vh - 550px)", classifyAuthData: [], //鍒楀ご classifyAuthHeader: [], @@ -104,15 +124,249 @@ roleList: [], //褰撳墠閫変腑鐨勮〃鏍艰 selectList: [], + itemKey: "", + addIndex: Number, + currentRow: {}, }; }, + computed: {}, + mounted() {}, + created() {}, watch: { // 鐩戝惉鐖剁粍浠朵紶鐨勭獥鍙f樉绀洪殣钘忕殑鍊� - visible (){ - if(this.visible){ + visible() { + if (this.visible) { this.isShowDialog = this.visible; - return new Promise((resolve, reject) => { - getButtonByParentCode({code:"classifyTree"}).then(res=>{ + this.loadAuthPage(); + } + }, + }, + methods: { + roleHandlerMethods(id, type, index) { + if (this.classifyAuthData.length < 0) { + return; + } + getButtonsByRoleId({ roleId: id, code: "classifyTree" }).then((res) => { + // 鎵惧埌this.classifyAuthButton涓病鏈夊搴旂殑灞炴�� + const filteredItems = this.classifyAuthButton.filter((item) => { + return !res.data.data.find((x) => x.id === item.id); + }); + + this.classifyAuthHeader.forEach((item) => { + const isMatched = filteredItems.some((x) => x.id === item.prop); + this.$nextTick(() => { + if (this.classifyAuthData[index]) { + if (isMatched) { + Object.keys(this.classifyAuthData[index]).forEach((key) => { + this.$set(this.classifyAuthData[index].authButton,item.code,true); + }); + } else { + Object.keys(this.classifyAuthData[index]).forEach((key) => { + this.$set(this.classifyAuthData[index].authButton,item.code,false); + }); + } + } + }); + }); + //娣诲姞 鈥滄煡鐪嬪叏閮ㄧ鐢ㄦ潯浠垛�� + if (this.classifyAuthData) { + this.classifyAuthData.forEach((classkey, classIndex) => { + if (classkey.authButton.classify_view) { + this.$set(this.classifyAuthData[classIndex].authButton,"allDisabled",true); + } else { + this.classifyAuthData[classIndex].authButton.allDisabled = false; + } + }); + } + //寮哄埗鍒锋柊琛ㄦ牸 + this.itemKey = uuidv4(); + }); + }, + async selectChange(row, currentRow) { + try { + this.currentRow = currentRow; + const res = await getButtonsByRoleId({ + roleId: row, + code: "classifyTree", + }); + + const filteredItems = this.classifyAuthButton.filter((item) => { + return !res.data.data.find((x) => x.id === item.id); + }); + + this.classifyAuthHeader.forEach((item) => { + const isMatched = filteredItems.some((x) => x.id === item.prop); + this.$nextTick(() => { + if (currentRow) { + if (isMatched) { + Object.keys(currentRow).forEach((key) => { + currentRow.authButton[item.code] = true; + if (!currentRow.authButton.classify_view) { + currentRow.authButton.allDisabled = false; + } + }); + } else { + Object.keys(currentRow).forEach((key) => { + currentRow.authButton[item.code] = false; + if (!currentRow.authButton.classify_view) { + currentRow.authButton.allDisabled = false; + } + }); + } + } + + this.itemKey = uuidv4(); // 寮哄埗鍒锋柊琛ㄦ牸 + }); + }); + } catch (error) { + console.error(error); + } + }, + // 鍏抽棴瀵硅瘽妗� + closeDialog() { + this.$emit("update:visible", false); + this.classifyAuthData = []; + }, + // 澧炲姞琛� + addClassifyAuth() { + if (this.roleList.length <= 0) { + this.$message.warning("褰撳墠绉熸埛涓嶅瓨鍦ㄨ鑹蹭俊鎭紒"); + return; + } + // console.log('this.roleList', this.roleList) + this.addIndex++; //鑷畾涔夌敓鎴愭坊鍔犺涓嬫爣 + let item = { + roleData: this.roleList[0].id, + classifyItem: this.classifyData.label, + authButton:{}, + index: this.addIndex, + uuid: uuidv4(), //鐢熸垚鍞竴鐨刬d + }; + //灏嗘寜閽缃繘鍘� + this.classifyAuthButton.forEach((data) => { + Vue.set(item, data.id, false); + }); + this.classifyAuthData.push(item); + this.roleHandlerMethods(this.roleList[0].id, "add", this.addIndex); + }, + // 鍒犻櫎琛� + subClassifyAuth() { + for (let item of this.selectList) { + let index = this.classifyAuthData.findIndex( + (data) => data.index === item.index + ); + if (index !== -1) { + this.classifyAuthData.splice(index, 1); + } + } + }, + handleRowClick(row, column) { + this.selectList.push(row); + this.$refs.dataTable.toggleRowSelection(row); + }, + // 澶氶�� + handleSelectionChange(list) { + this.selectList = list; + //console.log("澶氶��"); + }, + // 閫夋嫨鍏ㄩ儴 + handleSelectionAll(list) { + this.selectList = list; + }, + // 淇濆瓨鍒嗙被鎺堟潈淇℃伅 + async submit() { + let form = { + classifyAuthList: [], + isCLear: false, //榛樿鏄竻绌� + classifyId: this.classifyData.oid, + }; + let isRepeat = false; + if(this.classifyAuthData.length > 0){ + // 閬嶅巻鏁扮粍锛屾瘮杈冨悗闈㈢殑瀵硅薄鐨剅oleData鏄惁涓庡墠闈㈢殑瀵硅薄鐩哥瓑 + for (let i = 0; i < this.classifyAuthData.length - 1; i++) { + let currentRoleId = this.classifyAuthData[i].roleData; + for (let j = i + 1; j < this.classifyAuthData.length; j++) { + if (currentRoleId === this.classifyAuthData[j].roleData) { + isRepeat = true; + break; + } + } + if (isRepeat) { + break; + } + } + + if (isRepeat) { + this.$message.warning("瑙掕壊鍜屽垎绫诲凡缁忓瓨鍦紝璇烽噸鏂伴厤缃紒"); + return; + } + + let flag = false; + this.classifyAuthData.forEach((item) => { + let itemButtonList = []; + //绛涢�夊嚭鎸夐挳鍕鹃�変负true鐨勫垪 + for (let key in item) { + if (item[key] === true) { + itemButtonList.push(key); + } + } + /**濡傛灉itemButtonList涓虹┖璇佹槑鏄紝 + 娣诲姞浜嗚鑹蹭絾鏄病鍕鹃�変换浣曠殑鎸夐挳*/ + if (itemButtonList.length <= 0) { + flag = true; + return; + } + let data = { + oid: item.oid, + roleId: item.roleData, + classifyId: this.classifyData.oid, + buttonIds: itemButtonList.join(","), + authType: "classify_auth", + }; + form.classifyAuthList.push(data); + }); + if (flag) { + this.$message.warning("鏈夋湭鍕鹃�夋搷浣滅殑鏉冮檺锛屼笉鍏佽鎺堟潈"); + return; + } + }else { + // 涓虹┖璇佹槑鏄竻绌烘巿鏉冨垪琛� + form.isCLear = true; + } + // console.log(JSON.stringify(form)) + // 璋冪敤淇濆瓨鍒嗙被鎺堟潈鐨勬帴鍙� + await saveOrUpdate(form).then( + (res) => { + this.$message({ + type: "success", + message: res.data.msg, + }); + // this.isShowDialog = false + }, + (error) => { + window.console.log(error); + } + ); + this.classifyAuthData = []; + this.loadAuthPage(); + }, + // 鍏ㄩ�夋寜閽� + selectAllButton() { + if (this.selectList.length !== 1) { + this.$message.warning("璇峰彧閫夋嫨涓�琛岄渶瑕佸叏閫夌殑鎸夐挳鐨勬暟鎹锛�"); + return; + } + this.classifyAuthButton.forEach((item) => { + //console.log("item",item); + Vue.set(this.selectList[0], item.id, true); + }); + //console.log("this.selectList",this.selectList); + }, + // 鍔犺浇鎺堟潈鍒楄〃 + loadAuthPage() { + return new Promise((resolve, reject) => { + getButtonByParentCode({ code: "classifyTree" }) + .then((res) => { // 璁板綍鎸夐挳鏁版嵁 this.classifyAuthButton = res.data.data; const list = res.data.data; @@ -131,180 +385,78 @@ type: "text", width: 180, }); - list.forEach(item => { + list.forEach((item) => { let columnItem = { label: item.name, prop: item.id, + code: item.code, type: "checkbox", width: 180, }; tempData.push(columnItem); - }) - this.classifyAuthHeader = tempData + }); + this.classifyAuthHeader = tempData; resolve(); - }).catch(err => { - reject(err) + }) + .catch((err) => { + reject(err); }); - // 鑾峰彇瑙掕壊鍒楄〃 - getPage(1,-1,null).then(res => { - this.roleList = res.data.data.records; - }); - // 鑾峰彇璇ュ垎绫讳笅宸叉巿鏉冪殑鍒嗙被鎺堟潈淇℃伅 - getClassifyAuthList({classifyId:this.classifyData.oid}).then(res => { - //console.log(res.data.data); - let authDatas = res.data.data; - if (authDatas.length > 0) { - authDatas.forEach(authData=>{ - let item = { - oid: authData.oid, - roleData: authData.roleId, - classifyItem: this.classifyData.text, - uuid: uuidv4(),//鐢熸垚鍞竴鐨刬d - } - //灏嗘寜閽缃繘鍘� - authData.buttonIdList.forEach(data=>{ - Vue.set(item,data,true); - }); - //console.log(item) - this.classifyAuthData.push(item); - }) - } - }); + // 鑾峰彇瑙掕壊鍒楄〃 + getPage(1, -1, null).then((res) => { + this.roleList = res.data.data.records; }); - } - }, - }, - computed: {}, - mounted() {}, - created() {}, - methods: { - // 鍏抽棴瀵硅瘽妗� - closeDialog(){ - this.$emit('update:visible', false); - this.classifyAuthData = []; - }, - // 澧炲姞琛� - addClassifyAuth(){ - let item = { - roleData: this.roleList[0].id, - classifyItem: this.classifyData.text, - uuid: uuidv4(),//鐢熸垚鍞竴鐨刬d - } - //灏嗘寜閽缃繘鍘� - this.classifyAuthButton.forEach(data=>{ - Vue.set(item,data.id,false); - }) - //console.log(item) - this.classifyAuthData.push(item) - // console.log(this.classifyAuthData); - }, - // 鍒犻櫎琛� - subClassifyAuth(){ - for (let item of this.selectList) { - let index = this.classifyAuthData.findIndex(data => data.index === item.index); - if (index !== -1) { - this.classifyAuthData.splice(index, 1); - } - } - }, - handleRowClick(row, column) { - this.selectList.push(row); - this.$refs.dataTable.toggleRowSelection(row); - }, - // 澶氶�� - handleSelectionChange(list) { - this.selectList = list; - //console.log("澶氶��"); - }, - // 閫夋嫨鍏ㄩ儴 - handleSelectionAll(list) { - this.selectList = list; - }, - // 淇濆瓨鍒嗙被鎺堟潈淇℃伅 - submit(){ - if(this.classifyAuthData.length <= 0){ - this.$message.warning('鎺堟潈鍒楄〃涓虹┖锛�') - return; - } - let isRepeat = false; - // 閬嶅巻鏁扮粍锛屾瘮杈冨悗闈㈢殑瀵硅薄鐨剅oleData鏄惁涓庡墠闈㈢殑瀵硅薄鐩哥瓑 - for (let i = 0; i < this.classifyAuthData.length - 1; i++) { - let currentRoleId = this.classifyAuthData[i].roleData; - for (let j = i + 1; j < this.classifyAuthData.length; j++) { - if (currentRoleId === this.classifyAuthData[j].roleData) { - isRepeat = true; - break; - } - } - if(isRepeat){ - break; - } - } - if(isRepeat) { - this.$message.warning("瑙掕壊鍜屽垎绫诲凡缁忓瓨鍦紝璇烽噸鏂伴厤缃紒"); - return; - } - let form = []; - let flag = false; - this.classifyAuthData.forEach(item => { - let itemButtonList = []; - //绛涢�夊嚭鎸夐挳鍕鹃�変负true鐨勫垪 - for (let key in item) { - if (item[key] === true) { - itemButtonList.push(key); - } - } - /**濡傛灉itemButtonList涓虹┖璇佹槑鏄紝 - 娣诲姞浜嗚鑹蹭絾鏄病鍕鹃�変换浣曠殑鎸夐挳*/ - if(itemButtonList.length <= 0) { - flag = true; - return; - } - let data = { - oid: item.oid, - roleId: item.roleData, + // 鑾峰彇璇ュ垎绫讳笅宸叉巿鏉冪殑鍒嗙被鎺堟潈淇℃伅 + getClassifyAuthList({ classifyId: this.classifyData.oid, - buttonIds: itemButtonList.join(","), - } - form.push(data); - }); - if(flag) { - this.$message.warning('鏈夋湭鍕鹃�夋搷浣滅殑鏉冮檺锛屼笉鍏佽鎺堟潈') - return; - } - // console.log(form) - // 璋冪敤淇濆瓨鍒嗙被鎺堟潈鐨勬帴鍙� - saveOrUpdate(form).then(res=>{ - this.$message({ - type: "success", - message: res.data.msg, + authType: "classify_auth", + }).then((res) => { + //console.log(res.data.data); + let authDatas = res.data.data; + if (authDatas.length > 0) { + authDatas.forEach((authData, index) => { + let item = { + oid: authData.oid, + roleData: authData.roleId, + classifyItem: this.classifyData.label, + authButton:{}, + index: index, + uuid: uuidv4(), //鐢熸垚鍞竴鐨刬d + }; + //灏嗘寜閽缃繘鍘� + authData.buttonIdList.forEach((data) => { + Vue.set(item, data, true); + }); + this.classifyAuthData.push(item); + this.addIndex = this.classifyAuthData.length - 1; //娣诲姞琛屼笅鏍囩瓑浜巆lassifyAuthData鐨勯暱搴�-1 + this.roleHandlerMethods(authData.roleId, "create", index); + // console.log('index', index) + }); + } }); - // this.isShowDialog = false - },(error) => { - window.console.log(error); - }) + }); }, }, }; </script> <style lang="scss" scoped> +// 婊氬姩鏉℃牱寮忎慨鏀� +// 婊氬姩鏉$殑瀹藉害 +/deep/ .el-table__body-wrapper::-webkit-scrollbar { + height: 15px; // 绾靛悜婊氬姩鏉� 蹇呭啓 + background: white; + border: white; + width: 10px; +} - // 婊氬姩鏉℃牱寮忎慨鏀� - // 婊氬姩鏉$殑瀹藉害 - /deep/ .el-table__body-wrapper::-webkit-scrollbar { - height: 15px; // 绾靛悜婊氬姩鏉� 蹇呭啓 - background: white; - border: white; - width: 10px; +// 婊氬姩鏉$殑婊戝潡 +/deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb { + background-color: #ececec; + border-radius: 20px; + border: #ececec; +} - } - - // 婊氬姩鏉$殑婊戝潡 - /deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb { - background-color: #ececec; - border-radius: 20px; - border: #ececec; - } - -</style> \ No newline at end of file +/deep/ .el-table__body-wrapper { + height: calc(100% - 50px) !important; +} +</style> -- Gitblit v1.9.3