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