TreeManagement.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <div class="TreeManagement">
  3. <header id="header">
  4. <el-row>
  5. <el-select v-model="id" filterable placeholder="请选择">
  6. <el-option
  7. v-for="item in options"
  8. :key="item.id"
  9. :label="item.nodeName"
  10. :value="item.id"
  11. ></el-option>
  12. </el-select>
  13. <el-button @click="onfind">查找</el-button>
  14. </el-row>
  15. </header>
  16. <section id="section">
  17. <el-tree
  18. :data="dataTree"
  19. node-key="id"
  20. default-expand-all
  21. :expand-on-click-node="false"
  22. :props="defaultProps"
  23. >
  24. <span class="custom-tree-node" slot-scope="{ node, data }">
  25. <span>{{ node.label }}</span>
  26. <span class="right">
  27. <el-tooltip effect="dark" content="添加节点" placement="top-start">
  28. <i class="el-icon-folder-add icon" @click="() => add(data)"></i>
  29. </el-tooltip>
  30. <el-tooltip effect="dark" content="编辑节点" placement="top-start">
  31. <i class="el-icon-edit icon" @click="() => edit(data)" alt="编辑"></i>
  32. </el-tooltip>
  33. <el-tooltip effect="dark" content="删除节点" placement="top-start">
  34. <i class="el-icon-delete icon" @click="() => del(data)"></i>
  35. </el-tooltip>
  36. </span>
  37. </span>
  38. </el-tree>
  39. </section>
  40. <el-dialog
  41. :title="addOrEditThis.nodeName+':'+(isAdd?'添加节点':'编辑节点')"
  42. :visible.sync="showDialog"
  43. >
  44. <el-row type="flex">
  45. <el-col :span="14">
  46. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  47. <el-form-item v-show="isAdd">
  48. <el-switch
  49. @change="switchChange"
  50. style="display: block"
  51. v-model="isAddSubNode"
  52. active-color="#13ce66"
  53. inactive-color="#ff4949"
  54. inactive-text="添加当前节点"
  55. active-text="添加子节点"
  56. ></el-switch>
  57. </el-form-item>
  58. <el-form-item label="子节点名称:" prop="nodeName">
  59. <el-input v-model="form.nodeName"></el-input>
  60. </el-form-item>
  61. <el-form-item label="配置信息:" prop="meta">
  62. <el-input
  63. v-model="form.meta"
  64. type="textarea"
  65. placeholder="请输入内容,JSON格式"
  66. autosize
  67. ></el-input>
  68. </el-form-item>
  69. <el-form-item label="子节点代号:" prop="code">
  70. <el-input v-model="form.code" placeholder="要为这个子节点起个名字吗"></el-input>
  71. </el-form-item>
  72. <el-form-item>
  73. <el-button @click="showDialog=false">取 消</el-button>
  74. <el-button type="primary" @click="submitForm('form')">保 存</el-button>
  75. </el-form-item>
  76. </el-form>
  77. </el-col>
  78. </el-row>
  79. </el-dialog>
  80. </div>
  81. </template>
  82. <script>
  83. import { mapActions } from "vuex";
  84. // 表单验证规则
  85. const rules = {
  86. nodeName: [
  87. { required: true, message: "请输入消息点编码", trigger: "blur" }
  88. ],
  89. meta: [{ required: true, message: "请输入消息点描述", trigger: "blur" }]
  90. };
  91. // tree组件 配置
  92. const defaultProps = { children: "childs", label: "nodeName"};
  93. export default {
  94. name: "TreeManagement",
  95. data() {
  96. return {
  97. options: [],
  98. id: "",
  99. dataTree: [],
  100. defaultProps,
  101. showDialog: false,
  102. isAddSubNode: true, // 是添加子节点还是添加当前节点 的 状态标识
  103. form: {
  104. nodeName: "",
  105. meta: "",
  106. code: ""
  107. },
  108. isAdd: null, // 是添加还是编辑状态
  109. addOrEditThis: {}, // 保存点击的this
  110. rules
  111. };
  112. },
  113. created() {
  114. this.getSubNodeList("-1");
  115. },
  116. methods: {
  117. ...mapActions(["fetch"]),
  118. submitForm(formName) {
  119. this.$refs[formName].validate(valid => {
  120. if (valid) {
  121. console.log(this.dyForm);
  122. // 添加
  123. if (this.isAdd) {
  124. this.form.parentId = this.isAddSubNode
  125. ? this.addOrEditThis.id
  126. : this.addOrEditThis.parentId;
  127. this.reqSave("/publics/treenode/addNode");
  128. } else {
  129. // 编辑
  130. this.reqSave("/publics/treenode/updateNode");
  131. }
  132. } else {
  133. return false;
  134. }
  135. });
  136. },
  137. // 保存事件,包括新增字节点和编辑当前节点
  138. reqSave(api) {
  139. if (!this.form.code) delete this.form.code;
  140. this.fetch({
  141. api,
  142. method: "POST",
  143. data: this.form,
  144. success: res => {
  145. this.getSubNodeList(this.id);
  146. this.$message.success(
  147. this.isAdd
  148. ? "添加" +
  149. (this.isAddSubNode ? "子" : "") +
  150. "节点成功!"
  151. : "编辑节点成功!"
  152. );
  153. this.showDialog = false;
  154. },
  155. fail: err => {
  156. if (err.errMsg) this.$message.error(err.errMsg);
  157. else this.$message.error("服务器发生异常");
  158. }
  159. });
  160. },
  161. // 请求 拿到树列表
  162. getSubNodeList(parentId) {
  163. this.fetch({
  164. api: "/publics/treenode/listNodeByParent",
  165. method: "POST",
  166. data: {
  167. parentId,
  168. hasSub: true
  169. },
  170. success: res => {
  171. parentId == "-1"
  172. ? (this.options = res)
  173. : (this.dataTree = res);
  174. },
  175. fail: err => {
  176. if (err.errMsg) this.$message.error(err.errMsg);
  177. else this.$message.error("服务器发生异常");
  178. }
  179. });
  180. },
  181. //
  182. switchChange() {
  183. console.log(this.isAddSubNode);
  184. },
  185. // 点击查找
  186. onfind() {
  187. console.log(this.id);
  188. this.getSubNodeList(this.id);
  189. },
  190. add(data) {
  191. console.log("add");
  192. console.log(data);
  193. this.showDialog = true;
  194. this.isAdd = true;
  195. this.form.parentId = data.id;
  196. this.addOrEditThis = data; // 保存当前点击者状态
  197. },
  198. edit(data) {
  199. this.showDialog = true;
  200. this.isAdd = false;
  201. this.addOrEditThis = data; // 保存当前点击者状态 此处只为 dialog 的title显示用
  202. delete this.form.parentId;
  203. console.log(data);
  204. this.form = {
  205. id: data.id,
  206. nodeName: data.nodeName,
  207. meta: JSON.stringify(data.meta, null, 2),
  208. code: data.code
  209. };
  210. },
  211. del(data) {
  212. console.log("del");
  213. console.log(data);
  214. this.fetch({
  215. api: "/publics/treenode/deleteNode",
  216. method: "POST",
  217. data: { id: data.id },
  218. success: res => {
  219. this.getSubNodeList(this.id);
  220. console.log(res);
  221. this.$message.success("删除成功!");
  222. },
  223. fail: err => {
  224. console.log(err);
  225. if (err.errMsg) this.$message.error(err.errMsg);
  226. else this.$message.error("服务器发生异常");
  227. }
  228. });
  229. }
  230. }
  231. };
  232. </script>
  233. <style lang="scss" scoped>
  234. .TreeManagement {
  235. #header {
  236. margin-bottom: 15px;
  237. }
  238. }
  239. .custom-tree-node {
  240. flex: 1;
  241. display: flex;
  242. align-items: center;
  243. font-size: 14px;
  244. padding-right: 8px;
  245. .right {
  246. margin-left: 40px;
  247. .icon {
  248. margin-right: 10px;
  249. }
  250. }
  251. }
  252. </style>