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