DeviceType.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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" 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. <p>d</p>
  48. <p>d</p>
  49. <p>d</p>
  50. <p>d</p>
  51. <p>d</p>
  52. <p>d</p>
  53. <p>d</p>
  54. <p>d</p>
  55. <p>d</p>
  56. <p>d</p>
  57. <p>d</p>
  58. <p>d</p>
  59. <p>d</p>
  60. <p>d</p>
  61. <p>d</p>
  62. <p>d</p>
  63. <p>1</p>
  64. <p>d</p>
  65. <p>d</p>
  66. <p>d</p>
  67. <p>d</p>
  68. <p>d</p>
  69. <p>d</p>
  70. <p>d</p>
  71. <p>d</p>
  72. <p>d</p>
  73. <p>d</p>
  74. <p>d</p>
  75. <p>d</p>
  76. <p>d</p>
  77. <p>d</p>
  78. <p>d</p>
  79. <p>d</p>
  80. <p>d</p>
  81. <p>d</p>
  82. <p>d</p>
  83. <p>d</p>
  84. <p>d</p>
  85. <p>d</p>
  86. <p>d</p>
  87. <p>d</p>
  88. <p>d</p>
  89. <p>d</p>
  90. <p>22</p>
  91. </div>
  92. </div>
  93. </template>
  94. <script>
  95. import { mapActions } from "vuex";
  96. // tree配置选项
  97. const defaultProps = { children: "children", label: "name" };
  98. export default {
  99. name: "DeviceType",
  100. data() {
  101. return {
  102. isShowDialog: false,
  103. isRoot: false,
  104. position: null,
  105. selectArr: [],
  106. selectList: [],
  107. formData: {
  108. name: "",
  109. meta: ""
  110. },
  111. typeDataTree: [], // tree 数据
  112. selectedItem: null,
  113. // tree配置选项
  114. defaultProps
  115. };
  116. },
  117. mounted() {
  118. this.loadTypes(-1); //根级别分类
  119. },
  120. watch: {
  121. filterText(val) {
  122. this.$refs.tree.filter(val);
  123. },
  124. selectArr(ov, nv) {
  125. console.log("selectArr", ov, nv);
  126. },
  127. isRoot(ov, nv) {
  128. console.log("isRoot", ov, nv);
  129. if (ov) {
  130. //清理所有选择
  131. this.selectList.splice(1, this.selectList.length);
  132. this.selectArr.splice(0, this.selectArr.length);
  133. }
  134. }
  135. },
  136. methods: {
  137. ...mapActions(["fetch"]),
  138. loadTypes(pid) {
  139. this.fetch({
  140. api: "/device/device-type/list-parent",
  141. method: "GET",
  142. data: { parentId: pid },
  143. success: res => {
  144. console.log(res);
  145. if (pid > 0) {
  146. let p = this.findTypesByid(
  147. { id: -1, children: this.typeDataTree },
  148. pid
  149. );
  150. if (p) this.$set(p, "children", res);
  151. //这里的切入点很特别,需要等待截取数据后再加入
  152. let arr = [];
  153. for (let i = 0; i < res.length; i++) {
  154. arr.push({ id: res[i].id, name: res[i].name });
  155. }
  156. if (arr.length > 0)
  157. this.selectList.splice(
  158. this.position + 1,
  159. this.selectList.length,
  160. arr
  161. );
  162. else
  163. this.selectList.splice(
  164. this.position + 1,
  165. this.selectList.length
  166. );
  167. this.selectArr.splice(
  168. this.position + 1,
  169. this.selectArr.length
  170. );
  171. } else {
  172. this.typeDataTree = res;
  173. // 初始化第一级
  174. let arr = [];
  175. for (let i = 0; i < res.length; i++) {
  176. arr.push({ id: res[i].id, name: res[i].name });
  177. }
  178. this.selectList.push(arr);
  179. }
  180. },
  181. fail: err => {
  182. console.log("loadTypes");
  183. console.log(err);
  184. if (err.errMsg) this.$message.error(err.errMsg);
  185. else this.$message.error("服务器发生异常");
  186. }
  187. });
  188. },
  189. findTypesByid(root, id) {
  190. if (!root) return null;
  191. else if (root.id === id) return root;
  192. else if (root.children) {
  193. for (let i = 0; i < root.children.length; i++) {
  194. let ret = this.findTypesByid(root.children[i], id);
  195. if (ret) return ret;
  196. }
  197. return null;
  198. } else return null;
  199. },
  200. // 节点被点击时的回调
  201. handleNodeClick(e) {
  202. console.log(e);
  203. // 获取下一级列表
  204. this.loadTypes(e.id);
  205. setTimeout(() => {
  206. // this.handleNodeClick(e)
  207. }, 1000);
  208. // let count = 0
  209. // if(count++ == 0) {
  210. // this.handleNodeClick()
  211. // }else return
  212. },
  213. selectedEvt(item) {
  214. console.log("看看啥", item, this.position);
  215. // 获取下一级列表
  216. this.loadTypes(item);
  217. },
  218. handleSave(e) {
  219. console.log(e);
  220. let data = { name: this.formData.name, meta: this.formData.meta };
  221. if (!this.isRoot)
  222. data.parentId = this.selectArr[this.selectArr.length - 1];
  223. this.fetch({
  224. api: "/device/device-type/add",
  225. data,
  226. success: res => {
  227. console.log(res);
  228. this.$message.info("添加成功!");
  229. this.isShowDialog = false; //关闭
  230. //页面所有数据初始化
  231. this.init();
  232. },
  233. fail: err => {
  234. console.log(err);
  235. if (err.errMsg) this.$message.error(err.errMsg);
  236. else this.$message.error("服务器发生异常");
  237. }
  238. });
  239. },
  240. init() {
  241. this.selectArr.splice(0, this.selectArr.length);
  242. this.selectList.splice(0, this.selectList.length);
  243. this.position = null;
  244. this.loadTypes(-1); //加载根
  245. }
  246. }
  247. };
  248. </script>
  249. <style lang="scss" scoped>
  250. </style>