TreeManagement.vue 10 KB

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