From 8460d91255f5ff11a6c9a8199c313226b21f815a Mon Sep 17 00:00:00 2001
From: lxl <lixuliang_hd@126.com>
Date: 星期四, 13 十月 2022 18:03:57 +0800
Subject: [PATCH] 11

---
 src/views/maintenance/menuSettings.vue |  436 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 344 insertions(+), 92 deletions(-)

diff --git a/src/views/maintenance/menuSettings.vue b/src/views/maintenance/menuSettings.vue
index 7f9b71b..0aea3ee 100644
--- a/src/views/maintenance/menuSettings.vue
+++ b/src/views/maintenance/menuSettings.vue
@@ -2,9 +2,9 @@
   <div class="menuSettings_box">
     <div class="menuSettings_tree">
       <My-bread :list="['杩愮淮绠$悊', '鑿滃崟璁剧疆']"></My-bread>
-      <el-button class="saveBtn" type="primary" size="mini" @click="sendChange"
+      <!-- <el-button class="saveBtn" type="primary" size="mini" @click="sendChange"
         >淇濆瓨</el-button
-      >
+      > -->
       <el-divider />
       <div class="menuTreeBox">
         <el-tree
@@ -21,6 +21,22 @@
         >
           <span class="custom-tree-node" slot-scope="{ node, data }">
             <span>{{ node.label }}</span>
+            <span class="btnBox">
+              <el-button
+                type="text"
+                size="mini"
+                @click="() => append(node, data)"
+              >
+                <i class="el-icon-circle-plus"></i>
+              </el-button>
+              <el-button
+                type="text"
+                size="mini"
+                @click="() => remove(node, data)"
+              >
+                <i class="el-icon-delete-solid"></i>
+              </el-button>
+            </span>
           </span>
         </el-tree>
       </div>
@@ -30,38 +46,139 @@
         <h4>璇︾粏淇℃伅</h4>
       </div>
       <div class="form_box">
-        <el-form :model="itemdetail">
-          <el-form-item label="鑻辨枃鍚嶇О" :label-width="formLabelWidth">
+        <el-form :model="itemdetail" ref="itemdetail" :rules="rules">
+          <el-form-item
+            prop="enName"
+            label="鑻辨枃鍚嶇О"
+            :label-width="formLabelWidth"
+          >
             <el-input v-model="itemdetail.enName" autocomplete="off"></el-input>
           </el-form-item>
-          <el-form-item label="涓枃鍚嶇О" :label-width="formLabelWidth">
+          <el-form-item
+            prop="cnName"
+            label="涓枃鍚嶇О"
+            :label-width="formLabelWidth"
+          >
             <el-input v-model="itemdetail.cnName" autocomplete="off"></el-input>
           </el-form-item>
           <el-form-item label="鍥炬爣" :label-width="formLabelWidth">
             <el-input v-model="itemdetail.icon" autocomplete="off"></el-input>
           </el-form-item>
-          <el-form-item label="鏄惁鏄剧ず" :label-width="formLabelWidth">
-            <el-input v-model="itemdetail.isShow" autocomplete="off"></el-input>
+          <el-form-item
+            prop="isShow"
+            label="鏄惁鏄剧ず"
+            :label-width="formLabelWidth"
+          >
+            <el-select v-model="itemdetail.isShow" placeholder="">
+              <el-option
+                v-for="item in options1"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
-          <el-form-item label="鑿滃崟Url" :label-width="formLabelWidth">
+          <el-form-item
+            prop="url"
+            label="鑿滃崟Url"
+            :label-width="formLabelWidth"
+          >
             <el-input v-model="itemdetail.url" autocomplete="off"></el-input>
           </el-form-item>
           <el-form-item label="鎺堟潈" :label-width="formLabelWidth">
             <el-input v-model="itemdetail.perms" autocomplete="off"></el-input>
           </el-form-item>
-          <el-form-item label="绫诲瀷" :label-width="formLabelWidth">
-            <el-input v-model="itemdetail.type" autocomplete="off"></el-input>
+          <el-form-item label="绫诲瀷" prop="type" :label-width="formLabelWidth">
+            <el-select v-model="itemdetail.type" placeholder="璇烽�夋嫨绫诲瀷">
+              <el-option
+                v-for="item in options2"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
           <el-form-item label="澶囨敞" :label-width="formLabelWidth">
             <el-input v-model="itemdetail.bak" autocomplete="off"></el-input>
           </el-form-item>
           <div class="btnBox">
-            <el-button type="primary" @click="updMenu">淇濆瓨</el-button>
-            <el-button type="primary" @click="reset">鍙栨秷</el-button>
+            <el-button type="primary" @click="updMenu('itemdetail')"
+              >淇濆瓨</el-button
+            >
+            <el-button type="primary" @click="reset('itemdetail')"
+              >鍙栨秷</el-button
+            >
           </div>
         </el-form>
       </div>
     </div>
+    <el-dialog title="鏂板瀛愯彍鍗�" :visible.sync="dialogFormVisible">
+      <el-form :model="ruleForm" ref="ruleForm" :rules="rules">
+        <el-form-item
+          prop="enName"
+          label="鑻辨枃鍚嶇О"
+          :label-width="formLabelWidth"
+        >
+          <el-input v-model="ruleForm.enName" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item
+          prop="cnName"
+          label="涓枃鍚嶇О"
+          :label-width="formLabelWidth"
+        >
+          <el-input v-model="ruleForm.cnName" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="鍥炬爣" :label-width="formLabelWidth">
+          <el-input v-model="ruleForm.icon" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item
+          prop="isShow"
+          label="鏄惁鏄剧ず"
+          :label-width="formLabelWidth"
+        >
+          <el-select v-model="ruleForm.isShow" placeholder="">
+            <el-option
+              v-for="item in options1"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="url" label="鑿滃崟Url" :label-width="formLabelWidth">
+          <el-input v-model="ruleForm.url" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺堟潈" :label-width="formLabelWidth">
+          <el-input v-model="ruleForm.perms" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷" prop="type" :label-width="formLabelWidth">
+          <el-select v-model="ruleForm.type" placeholder="璇烽�夋嫨绫诲瀷">
+            <el-option
+              v-for="item in options2"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囨敞" :label-width="formLabelWidth">
+          <el-input v-model="ruleForm.bak" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="resetForm('ruleForm')">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          @click="submitForm('ruleForm')"
+          v-loading.fullscreen.lock="fullscreenLoading"
+          >鎻愪氦</el-button
+        >
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -72,19 +189,21 @@
   updateMenuTree,
   updateMenuTrees,
   queryMaxId,
+  insertMenu,
+  deleteMenu,
 } from "../../api/api";
 export default {
   //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
   components: {
     MyBread,
   },
-
   data() {
     return {
       defaultProps: {
         children: "children",
         label: "cnName",
       },
+      fullscreenLoading: false,
       oriData: [], //鍘熷鏍戞暟鎹�
       menuList: [], //el鏍戞暟鎹�
       old_dirDat: [], //el鏍戞暟鎹�(鎷栧姩鍓�)
@@ -99,8 +218,75 @@
         type: null,
         bak: "",
       },
-      backUpData: {},
-      formLabelWidth: "170px",
+      backUpData: "",
+      formLabelWidth: "130px",
+      delChildID: "",
+      delChildIDs: [],
+      dialogFormVisible: false,
+      ruleForm: {
+        level: null,
+        orderNum: null,
+        pid: null,
+        enName: "",
+        cnName: "",
+        icon: "",
+        isShow: null,
+        url: "",
+        perms: null,
+        type: null,
+        bak: "",
+      },
+      rules: {
+        enName: [
+          { required: true, message: "璇疯緭鍏ヨ嫳鏂囧悕绉�", trigger: "blur" },
+        ],
+        cnName: [
+          { required: true, message: "璇疯緭鍏ヤ腑鏂囧悕绉�", trigger: "blur" },
+        ],
+        url: [
+          { required: true, message: "璇疯緭鍏ヨ彍鍗曡烦杞殑鍦板潃", trigger: "blur" },
+        ],
+        isShow: [
+          {
+            required: true,
+            message: "璇烽�夋嫨鏄惁鏄剧ず",
+            trigger: "change",
+          },
+        ],
+        type: [
+          {
+            required: true,
+            message: "璇烽�夋嫨鑺傜偣绫诲瀷",
+            trigger: "change",
+          },
+        ],
+      },
+      // 涓嬫媺鐨刼ption閲岄潰鐨剉alue瀹氫箟鎴�0,1锛屼笉鑳藉畾涔夋垚鈥�0鈥�,'1鈥欏瓧绗︿覆锛�
+      // 濡傛灉瑕佸畾涔夋垚瀛楃涓诧紝鍚庡彴闇�瑕佽繑鍥炵殑涔熸槸瀛楃涓�
+      options1: [
+        {
+          value: 0,
+          label: "闅愯棌",
+        },
+        {
+          value: 1,
+          label: "鏄剧ず",
+        },
+      ],
+      options2: [
+        {
+          value: 0,
+          label: "鏍圭洰褰�",
+        },
+        {
+          value: 1,
+          label: "鑿滃崟",
+        },
+        {
+          value: 2,
+          label: "鎸夐挳",
+        },
+      ],
     };
   },
   methods: {
@@ -125,38 +311,55 @@
         // 寰幆鎵�鏈夐」
         let branchArr = cloneData.filter((child) => father.id == child.pid); // 瀵规瘮ID锛屽垎鍒笂涓嬬骇鑿滃崟锛屽苟杩斿洖鏁版嵁
         branchArr.length > 0 ? (father.children = branchArr) : ""; // 缁欑埗绾ф坊鍔犱竴涓猚hildren灞炴�э紝骞惰祴鍊�
-        return father.pid == 1; // 杩斿洖涓�绾ц彍鍗�
+        return father.pid == 0; // 杩斿洖涓�绾ц彍鍗�
       });
     },
-    append(data) {
-      this.$prompt("璇疯緭鍏ュ悕绉�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-      })
-        .then(({ value }) => {
-          const newChild = {
-            id: this.id + 1,
-            name: value,
-            pid: data.id,
-            // children: [],
-            orderNum: data.children ? data.children.length + 1 : 1,
-          };
-          this.id = newChild.id; //淇敼鏂扮殑鏈�澶
-          console.log(newChild);
-
-          if (!data.children) {
-            this.$set(data, "children", []);
+    append(node, data) {
+      this.dialogFormVisible = true;
+      this.ruleForm.pid = data.id;
+      this.ruleForm.orderNum = node.childNodes.length + 1;
+      this.ruleForm.level = data.level + 1;
+    },
+    resetForm(formName) {
+      this.dialogFormVisible = false;
+      this.$nextTick(() => {
+        this.$refs[formName].resetFields();
+        this.ruleForm = {};
+      });
+    },
+    submitForm(formName) {
+      this.$nextTick(() => {
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.fullscreenLoading = true;
+            insertMenu(this.ruleForm)
+              .then((res) => {
+                setTimeout(() => {
+                  this.fullscreenLoading = false;
+                  if (res.code == 200) {
+                    this.$message({
+                      message: "娣诲姞鎴愬姛",
+                      type: "success",
+                    });
+                    this.itemdetail = {};
+                    this.ruleForm = {};
+                    this.dialogFormVisible = false;
+                    this.$refs[formName].resetFields();
+                  }
+                }, 500);
+              })
+              .catch((res) => {
+                this.itemdetail = {};
+                this.$message.error("娣诲姞澶辫触");
+                this.fullscreenLoading = false;
+                console.log(res);
+              });
+          } else {
+            // alert("鐩綍鍚嶇О涓嶈兘涓虹┖");
+            return false;
           }
-          data.children.push(newChild);
-          this.newData.push(newChild);
-          // this.sendChange();
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "鍙栨秷杈撳叆",
-          });
         });
+      });
     },
     remove(node, data) {
       this.$confirm("姝ゆ搷浣滃皢鍒犻櫎璇ヨ妭鐐�, 鏄惁缁х画?", "鎻愮ず", {
@@ -165,41 +368,61 @@
         type: "warning",
       })
         .then(() => {
+          //鍏勫紵閲嶆柊鎺掑簭
           const parent = node.parent;
           const children = parent.data.children || parent.data;
-          const index = children.findIndex((d) => d.id === data.id);
-          let res = children.splice(index, 1);
-          var std = [];
-          for (var i in res) {
-            std.push(res[i].id);
-          }
-          // deleteDirTree(std);
-          this.getDirTree();
-          this.$message({
-            type: "success",
-            message: "鍒犻櫎鎴愬姛!",
+          children.splice(data.orderNum - 1, 1);
+          children.forEach((item, index) => {
+            item.orderNum = index + 1;
           });
+
+          this.traverseArr(data); //鑾峰彇鍒犻櫎鐨勫瓙ID
+          this.delChildIDs.push(data.id); //瑕佸垹闄ょ殑鍏ㄩ儴ID
+          let delIDs = this.delChildIDs;
+          Promise.all([
+            deleteMenu({ ids: delIDs.toString() }),
+            updateMenuTrees(children),
+          ])
+            .then((res) => {
+              console.log(res);
+              if (res[0].code == 200 && res[1].code == 200) {
+                this.$message({
+                  type: "success",
+                  message: "鍒犻櫎鎴愬姛!",
+                });
+                this.itemdetail = {};
+              } else if (res[0].code == 200) {
+                this.$message.error("鍒犻櫎鎴愬姛锛屼綅缃皟鏁村け璐�");
+              } else if (res[1].code == 200) {
+                this.$message.error("鍒犻櫎澶辫触,浣嶇疆璋冩暣鎴愬姛");
+              } else {
+                this.$message.error("鍒犻櫎澶辫触");
+              }
+            })
+            .catch(() => {
+              this.$message({
+                type: "error",
+                message: "鍒犻櫎澶辫触",
+              });
+            });
+
+          //閲嶇疆瑕佸垹闄ょ殑瀛怚D
+          this.delChildIDs = [];
         })
         .catch(() => {
-          this.$message({
-            type: "info",
-            message: "宸插彇娑堝垹闄�",
-          });
+          this.$message("宸插彇娑堝垹闄�");
         });
-      // this.dialogMessage="鏄惁鍒犻櫎"
-      // this.dialogFlag = 1;
-      // this.dialogFrom ={
-      //   node:node,
-      //   val:data
-      // }
-      //   this.dialogVisible=true;//鐩綍鏍戞洿鏀瑰脊绐�
-      // const parent = node.parent;
-      // const children = parent.data.children || parent.data;
-      // const index = children.findIndex((d) => d.id === data.id);
-      // let res = children.splice(index, 1);
-      // // console.log(res);
-      // // console.log(data);
-      // console.log(this.flaten(res));
+    },
+    traverseArr(obj) {
+      if (obj.children) {
+        return obj.children.forEach((item) => {
+          // console.log(item.id + "---" + item.name);
+          // this.delChildID += "id=" + item.id + "&";
+          this.delChildIDs.push(item.id);
+          this.traverseArr(item);
+        });
+      }
+      return;
     },
     flaten(arr) {
       return arr.reduce((p, v, i) => {
@@ -215,7 +438,7 @@
       this.old_dirDat = JSON.parse(JSON.stringify(this.menuList)); //灏嗗浠界殑dir閲嶆柊璧嬪��
     },
     handleDrop(draggingNode, dropNode, dropType, ev) {
-      this.$confirm("鏄惁璋冩暣鑷宠浣嶇疆?", "鎻愮ず", {
+      this.$confirm("姝ゆ搷浣滃皢淇濆瓨鐩綍鏇存敼, 鏄惁缁х画?", "鎻愮ず", {
         confirmButtonText: "纭畾",
         cancelButtonText: "鍙栨秷",
         type: "warning",
@@ -240,7 +463,7 @@
             }
             item.orderNum = i + 1;
           });
-          console.log(nodeData);
+          // console.log(nodeData);
           //鏇存柊鍘熷鏁翠綋鏁版嵁
           let arr = [];
           this.oriData.forEach((e) => {
@@ -250,6 +473,7 @@
             arr.push(e);
           });
           this.newData = arr;
+          this.sendChange();
         })
         .catch(() => {
           this.$message({
@@ -260,33 +484,61 @@
         });
     },
     sendChange() {
-      updateMenuTrees(this.newData).then((res) => {
-        if (res.code == 200) {
-          alert("鏇存敼瀹屾垚銆傝鍙婃椂鍒锋柊椤甸潰锛�");
-          return;
-        } else {
-          alert("淇敼澶辫触锛岃閲嶈瘯锛�");
+      this.newData.forEach((item) => {
+        if (item.pid == 0) {
+          item.type = 0;
         }
       });
+      updateMenuTrees(this.newData)
+        .then((res) => {
+          if (res.code == 200) {
+            alert("璋冩暣瀹屾垚銆傝鍙婃椂鍒锋柊椤甸潰锛�");
+            return;
+          } else {
+            alert("璋冩暣澶辫触锛岃閲嶈瘯锛�");
+          }
+        })
+        .catch(() => {
+          alert("淇敼澶辫触锛岃閲嶈瘯锛�");
+        });
     },
     handleNodeClick(data) {
       // console.log(data);
       this.backUpData = JSON.stringify(data);
       this.itemdetail = JSON.parse(JSON.stringify(data));
     },
-    updMenu() {
-      updateMenuTree(this.itemdetail).then((res) => {
-        // console.log(res);
-        if (res.code == 200) {
-          alert("淇敼瀹屾垚锛岃鍙婃椂鍒锋柊椤甸潰锛�");
-          return;
-        } else {
-          alert("淇敼澶辫触锛岃閲嶈瘯锛�");
-        }
+    updMenu(formName) {
+      this.$nextTick(() => {
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.fullscreenLoading = true;
+            updateMenuTree(this.itemdetail)
+              .then((res) => {
+                setTimeout(() => {
+                  this.fullscreenLoading = false;
+                  if (res.code == 200) {
+                    alert("淇敼瀹屾垚锛岃鍙婃椂鍒锋柊椤甸潰锛�");
+                    this.itemdetail = {};
+                    this.dialogFormVisible = false;
+                    this.$refs[formName].resetFields();
+                  }
+                }, 500);
+              })
+              .catch((res) => {
+                alert("淇敼澶辫触锛岃閲嶈瘯锛�");
+                this.fullscreenLoading = false;
+              });
+          } else {
+            return false;
+          }
+        });
       });
     },
-    reset() {
-      this.itemdetail = JSON.parse(this.backUpData);
+    reset(formName) {
+      this.$refs[formName].resetFields();
+      if (this.backUpData != "") {
+        this.itemdetail = JSON.parse(this.backUpData);
+      }
     },
   },
   mounted() {
@@ -340,7 +592,7 @@
           background-color: rgb(153, 153, 153);
         }
         .btnBox {
-          margin-left: 5px;
+          margin: 0 10px 0 5px;
           .el-button + .el-button {
             margin-left: 5px;
           }

--
Gitblit v1.9.3