DeviceType.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <div class="DeviceType">
  3. <el-button size="mini" type="primary" @click="isShowDialog=true">新建分类</el-button>
  4. <el-tree
  5. class="filter-tree"
  6. :data="typeDataTree"
  7. :props="defaultProps"
  8. @node-click="handleNodeClick"
  9. ref="tree"
  10. ></el-tree>
  11. <el-dialog title="新建分类" :visible.sync="isShowDialog" append-to-body>
  12. <el-form :model="formData" label-width="100px">
  13. <el-form-item label="父分类:">
  14. <el-select
  15. :disabled="isRoot"
  16. v-for="(arrItem,key) in selectList"
  17. :key="key"
  18. v-model="selectArr[key]"
  19. filterable
  20. placeholder="请选择"
  21. value-key="id"
  22. @change="selectedEvt"
  23. @focus="position=key"
  24. >
  25. <el-option
  26. v-for="item in arrItem"
  27. :key="item.id"
  28. :value="item.id"
  29. :label="item.name"
  30. ></el-option>
  31. </el-select>
  32. <el-checkbox v-model="isRoot" style="margin-left: 10px">根目录</el-checkbox>
  33. </el-form-item>
  34. <el-form-item label="分类名称:">
  35. <el-input v-model="formData.name" placeholder="请输入名称"></el-input>
  36. </el-form-item>
  37. <el-form-item label="配置数据:">
  38. <el-input type="textarea" v-model="formData.meta" autosize placeholder="请输入内容,JSON格式"></el-input>
  39. </el-form-item>
  40. </el-form>
  41. <div slot="footer">
  42. <el-button @click="isShowDialog=false">取 消</el-button>
  43. <el-button type="primary" @click="handleSave">保 存</el-button>
  44. </div>
  45. </el-dialog>
  46. </div>
  47. </template>
  48. <script>
  49. import { mapActions } from "vuex";
  50. // tree配置选项
  51. const defaultProps = { children: "children", label: "name" };
  52. export default {
  53. name: "DeviceType",
  54. data() {
  55. return {
  56. isShowDialog: false,
  57. isRoot: false,
  58. position: null,
  59. selectArr: [],
  60. selectList: [],
  61. formData: {
  62. name: "",
  63. meta: ""
  64. },
  65. typeDataTree: [], // tree 数据
  66. selectedItem: null,
  67. // tree配置选项
  68. defaultProps
  69. };
  70. },
  71. mounted() {
  72. this.loadTypes(); //根级别分类
  73. },
  74. watch: {
  75. filterText(val) {
  76. this.$refs.tree.filter(val);
  77. },
  78. selectArr(ov, nv) {
  79. console.log("selectArr", ov, nv);
  80. },
  81. isRoot(ov, nv) {
  82. console.log("isRoot", ov, nv);
  83. if (ov) {
  84. //清理所有选择
  85. this.selectList.splice(1, this.selectList.length);
  86. this.selectArr.splice(0, this.selectArr.length);
  87. }
  88. }
  89. },
  90. methods: {
  91. ...mapActions(["fetch"]),
  92. loadTypes(pid) {
  93. this.fetch({
  94. api: "/device/device-type/list-parent",
  95. method: "GET",
  96. data: { parentId: pid },
  97. success: res => {
  98. console.log(res)
  99. if (pid > 0) {
  100. let p = this.findTypesByid(
  101. { id: -1, children: this.typeDataTree },
  102. pid
  103. );
  104. if (p) this.$set(p, "children", res);
  105. //这里的切入点很特别,需要等待截取数据后再加入
  106. let arr = [];
  107. for (let i = 0; i < res.length; i++) {
  108. arr.push({ id: res[i].id, name: res[i].name });
  109. }
  110. if (arr.length > 0)
  111. this.selectList.splice(
  112. this.position + 1,
  113. this.selectList.length,
  114. arr
  115. );
  116. else
  117. this.selectList.splice(
  118. this.position + 1,
  119. this.selectList.length
  120. );
  121. this.selectArr.splice(
  122. this.position + 1,
  123. this.selectArr.length
  124. );
  125. } else {
  126. this.typeDataTree = res;
  127. // 初始化第一级
  128. let arr = [];
  129. for (let i = 0; i < res.length; i++) {
  130. arr.push({ id: res[i].id, name: res[i].name });
  131. }
  132. this.selectList.push(arr);
  133. }
  134. },
  135. fail: err => {
  136. console.log("loadTypes");
  137. console.log(err);
  138. if (err.errMsg) this.$message.error(err.errMsg);
  139. else this.$message.error("服务器发生异常");
  140. }
  141. });
  142. },
  143. findTypesByid(root, id) {
  144. if (!root) return null;
  145. else if (root.id === id) return root;
  146. else if (root.children) {
  147. for (let i = 0; i < root.children.length; i++) {
  148. let ret = this.findTypesByid(root.children[i], id);
  149. if (ret) return ret;
  150. }
  151. return null;
  152. } else return null;
  153. },
  154. // 节点被点击时的回调
  155. handleNodeClick(e) {
  156. console.log(e);
  157. // 获取下一级列表
  158. this.loadTypes(e.id);
  159. setTimeout(() => {
  160. // this.handleNodeClick(e)
  161. }, 1000);
  162. // let count = 0
  163. // if(count++ == 0) {
  164. // this.handleNodeClick()
  165. // }else return
  166. },
  167. selectedEvt(item) {
  168. console.log("看看啥", item, this.position);
  169. // 获取下一级列表
  170. this.loadTypes(item);
  171. },
  172. handleSave(e) {
  173. console.log(e);
  174. let data = { name: this.formData.name, meta: this.formData.meta };
  175. if (!this.isRoot)
  176. data.parentId = this.selectArr[this.selectArr.length - 1];
  177. this.fetch({
  178. api: "/device/device-type/add",
  179. data,
  180. success: res => {
  181. console.log(res);
  182. this.$message.info("添加成功!");
  183. this.isShowDialog = false; //关闭
  184. //页面所有数据初始化
  185. this.init();
  186. },
  187. fail: err => {
  188. console.log(err);
  189. if (err.errMsg) this.$message.error(err.errMsg);
  190. else this.$message.error("服务器发生异常");
  191. }
  192. });
  193. },
  194. init() {
  195. this.selectArr.splice(0, this.selectArr.length);
  196. this.selectList.splice(0, this.selectList.length);
  197. this.position = null;
  198. this.loadTypes(-1); //加载根
  199. }
  200. }
  201. };
  202. </script>
  203. <style lang="scss" scoped>
  204. </style>