@arkxos/arkos-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/README.md +36 -0
  2. package/ark_dist/664d11f069eab128.css +2 -0
  3. package/ark_dist/ArkOsConfig.js +136 -0
  4. package/ark_dist/ark-meta.json +92 -0
  5. package/ark_dist/ark_userChunk_1.js +3 -0
  6. package/ark_dist/ark_userChunk_2.js +5 -0
  7. package/ark_dist/ark_userChunk_3.js +49 -0
  8. package/ark_dist/config.js +75 -0
  9. package/ark_dist/css/views/views-flow-flow.ca26b106.css +5784 -0
  10. package/ark_dist/favicon.ico +0 -0
  11. package/ark_dist/fonts/bpmn.5d33bee4.eot +0 -0
  12. package/ark_dist/fonts/bpmn.67058807.woff2 +0 -0
  13. package/ark_dist/fonts/bpmn.b5c9250d.ttf +0 -0
  14. package/ark_dist/fonts/bpmn.e9e7d076.woff +0 -0
  15. package/ark_dist/img/404.png +0 -0
  16. package/ark_dist/img/auth_banner.jpg +0 -0
  17. package/ark_dist/img/avatar.jpg +0 -0
  18. package/ark_dist/img/avatar2.gif +0 -0
  19. package/ark_dist/img/avatar3.gif +0 -0
  20. package/ark_dist/img/bpmn.74eea12b.svg +224 -0
  21. package/ark_dist/img/loginbg.svg +1 -0
  22. package/ark_dist/img/logo-r.png +0 -0
  23. package/ark_dist/img/logo.png +0 -0
  24. package/ark_dist/img/mobile-bg.d055fadc.png +0 -0
  25. package/ark_dist/img/no-widgets.svg +57 -0
  26. package/ark_dist/img/tasks-example.png +0 -0
  27. package/ark_dist/img/ver.svg +236 -0
  28. package/ark_dist/index.html +118 -0
  29. package/ark_dist/js/app.e39a548a.js +1 -0
  30. package/ark_dist/js/views/views-flow-flow.84dc5300.js +3 -0
  31. package/ark_dist/js/views/views-flow-flow.84dc5300.js.LICENSE.txt +182 -0
  32. package/ark_dist/js/views/views-flow-flow.84dc5300.js.map +1 -0
  33. package/ark_proxy/entry.js +28 -0
  34. package/ark_proxy_es/entry.js +16 -0
  35. package/package.json +173 -0
  36. package/scripts/check.js +13 -0
  37. package/scripts/meta.js +21 -0
  38. package/scripts/prepublishOnly.js +28 -0
  39. package/src/admin/App.vue +13 -0
  40. package/src/admin/bpmn/custom/context-pad.js +405 -0
  41. package/src/admin/bpmn/custom/index.js +8 -0
  42. package/src/admin/bpmn/custom/palette.js +159 -0
  43. package/src/admin/bpmn/properties-panel/PropertiesView.vue +620 -0
  44. package/src/admin/bpmn/translate.js +23 -0
  45. package/src/admin/bpmn/translations.js +211 -0
  46. package/src/admin/components/affix/index.vue +385 -0
  47. package/src/admin/components/area-select/index.vue +52 -0
  48. package/src/admin/components/buttons/index.vue +47 -0
  49. package/src/admin/components/checkbox/index.vue +83 -0
  50. package/src/admin/components/code/code.js +149 -0
  51. package/src/admin/components/code/index.vue +450 -0
  52. package/src/admin/components/color/index.vue +30 -0
  53. package/src/admin/components/color-picker/index.vue +57 -0
  54. package/src/admin/components/color-scheme/index.vue +234 -0
  55. package/src/admin/components/condition-list/index.vue +170 -0
  56. package/src/admin/components/date/index.vue +29 -0
  57. package/src/admin/components/datetime/index.vue +45 -0
  58. package/src/admin/components/default-value-tips/index.vue +44 -0
  59. package/src/admin/components/dict-buttons/index.vue +53 -0
  60. package/src/admin/components/dict-checkbox/index.vue +45 -0
  61. package/src/admin/components/dict-radio/index.vue +68 -0
  62. package/src/admin/components/dict-select/index.vue +93 -0
  63. package/src/admin/components/dict-selects/index.vue +105 -0
  64. package/src/admin/components/dict-switch/index.vue +64 -0
  65. package/src/admin/components/dict-tree/index.vue +17 -0
  66. package/src/admin/components/dm-tree/index.vue +224 -0
  67. package/src/admin/components/edit-table/index.vue +171 -0
  68. package/src/admin/components/employee-tree/index.vue +247 -0
  69. package/src/admin/components/employees-tree/index.vue +80 -0
  70. package/src/admin/components/entp-tree/index.vue +266 -0
  71. package/src/admin/components/file/index.vue +310 -0
  72. package/src/admin/components/form/index.vue +141 -0
  73. package/src/admin/components/icon/index.vue +77 -0
  74. package/src/admin/components/icon-buttons/index.vue +52 -0
  75. package/src/admin/components/icon-select/index.vue +140 -0
  76. package/src/admin/components/image/index.vue +207 -0
  77. package/src/admin/components/index.js +16 -0
  78. package/src/admin/components/input/index.vue +41 -0
  79. package/src/admin/components/local-img/index.vue +49 -0
  80. package/src/admin/components/multiple-input/index.vue +64 -0
  81. package/src/admin/components/multiple-number/index.vue +70 -0
  82. package/src/admin/components/number/index.vue +134 -0
  83. package/src/admin/components/organization/index.vue +303 -0
  84. package/src/admin/components/organization-tree/index.vue +269 -0
  85. package/src/admin/components/page/index.vue +149 -0
  86. package/src/admin/components/password/index.vue +21 -0
  87. package/src/admin/components/radio/index.vue +46 -0
  88. package/src/admin/components/region-tree/index.vue +269 -0
  89. package/src/admin/components/remote-select/index.vue +315 -0
  90. package/src/admin/components/rich-editor/index.vue +152 -0
  91. package/src/admin/components/role-select/index.vue +58 -0
  92. package/src/admin/components/script-input/index.vue +97 -0
  93. package/src/admin/components/select/index.vue +105 -0
  94. package/src/admin/components/selects/index.vue +100 -0
  95. package/src/admin/components/style-list/index.vue +500 -0
  96. package/src/admin/components/switch/index.vue +54 -0
  97. package/src/admin/components/table/index.vue +920 -0
  98. package/src/admin/components/textarea/index.vue +28 -0
  99. package/src/admin/components/tree/index.vue +247 -0
  100. package/src/admin/components/tree-selects/index.vue +66 -0
  101. package/src/admin/components/unit-tree/index.vue +269 -0
  102. package/src/admin/console/index.vue +122 -0
  103. package/src/admin/layout/console/index.vue +15 -0
  104. package/src/admin/layout/fullscreen/index.vue +32 -0
  105. package/src/admin/layout/home/index.vue +11 -0
  106. package/src/admin/layout/index.vue +139 -0
  107. package/src/admin/layout/menu/index.vue +102 -0
  108. package/src/admin/layout/personnel/index.vue +166 -0
  109. package/src/admin/layout/search/index.vue +78 -0
  110. package/src/admin/main.js +30 -0
  111. package/src/admin/pinia/router.js +179 -0
  112. package/src/admin/router.js +91 -0
  113. package/src/admin/visual/comp-data.vue +1107 -0
  114. package/src/admin/visual/comp-event.vue +1677 -0
  115. package/src/admin/visual/components/app/list/goods/double.vue +184 -0
  116. package/src/admin/visual/components/app/list/nav/image.vue +114 -0
  117. package/src/admin/visual/components/app/list/nav/text.vue +130 -0
  118. package/src/admin/visual/components/button/index.vue +58 -0
  119. package/src/admin/visual/components/container/index.vue +37 -0
  120. package/src/admin/visual/components/custom-list/index.vue +127 -0
  121. package/src/admin/visual/components/data/index.vue +46 -0
  122. package/src/admin/visual/components/data-table/index.vue +203 -0
  123. package/src/admin/visual/components/echarts/annular.vue +140 -0
  124. package/src/admin/visual/components/echarts/bar.vue +115 -0
  125. package/src/admin/visual/components/echarts/funnel.vue +115 -0
  126. package/src/admin/visual/components/echarts/gauge.vue +158 -0
  127. package/src/admin/visual/components/echarts/line.vue +110 -0
  128. package/src/admin/visual/components/echarts/map.vue +150 -0
  129. package/src/admin/visual/components/echarts/pie.vue +114 -0
  130. package/src/admin/visual/components/echarts/radar.vue +145 -0
  131. package/src/admin/visual/components/echarts/scatter.vue +106 -0
  132. package/src/admin/visual/components/edit-table/index.vue +71 -0
  133. package/src/admin/visual/components/form/affix.vue +107 -0
  134. package/src/admin/visual/components/form/area.vue +76 -0
  135. package/src/admin/visual/components/form/buttons.vue +90 -0
  136. package/src/admin/visual/components/form/checkbox.vue +85 -0
  137. package/src/admin/visual/components/form/date-range.vue +61 -0
  138. package/src/admin/visual/components/form/date.vue +59 -0
  139. package/src/admin/visual/components/form/datetime.vue +59 -0
  140. package/src/admin/visual/components/form/employee-tree.vue +88 -0
  141. package/src/admin/visual/components/form/employees-tree.vue +6 -0
  142. package/src/admin/visual/components/form/image.vue +103 -0
  143. package/src/admin/visual/components/form/index.vue +59 -0
  144. package/src/admin/visual/components/form/input.vue +84 -0
  145. package/src/admin/visual/components/form/item.vue +68 -0
  146. package/src/admin/visual/components/form/number.vue +130 -0
  147. package/src/admin/visual/components/form/organization-tree.vue +88 -0
  148. package/src/admin/visual/components/form/password.vue +74 -0
  149. package/src/admin/visual/components/form/radio.vue +87 -0
  150. package/src/admin/visual/components/form/rate.vue +66 -0
  151. package/src/admin/visual/components/form/region-tree.vue +88 -0
  152. package/src/admin/visual/components/form/rich-editor.vue +94 -0
  153. package/src/admin/visual/components/form/select.vue +156 -0
  154. package/src/admin/visual/components/form/switch.vue +85 -0
  155. package/src/admin/visual/components/form/textarea.vue +62 -0
  156. package/src/admin/visual/components/form/unit-tree.vue +88 -0
  157. package/src/admin/visual/components/icon/index.vue +65 -0
  158. package/src/admin/visual/components/image/index.vue +170 -0
  159. package/src/admin/visual/components/index.js +44 -0
  160. package/src/admin/visual/components/list/block.vue +160 -0
  161. package/src/admin/visual/components/list/button.vue +80 -0
  162. package/src/admin/visual/components/list/card.vue +101 -0
  163. package/src/admin/visual/components/list/custom.vue +150 -0
  164. package/src/admin/visual/components/list/image.vue +116 -0
  165. package/src/admin/visual/components/list/news.vue +138 -0
  166. package/src/admin/visual/components/page/index.vue +88 -0
  167. package/src/admin/visual/components/page-comp/index.vue +110 -0
  168. package/src/admin/visual/components/portal-menu/index.vue +92 -0
  169. package/src/admin/visual/components/qrcode/index.vue +77 -0
  170. package/src/admin/visual/components/router-view/index.vue +12 -0
  171. package/src/admin/visual/components/row/index.vue +139 -0
  172. package/src/admin/visual/components/search/index.vue +40 -0
  173. package/src/admin/visual/components/tabs/index.vue +125 -0
  174. package/src/admin/visual/components/text/index.vue +64 -0
  175. package/src/admin/visual/components/video/index.vue +41 -0
  176. package/src/admin/visual/draggable.vue +49 -0
  177. package/src/admin/visual/editor.vue +602 -0
  178. package/src/admin/visual/js/app-form.config.js +1301 -0
  179. package/src/admin/visual/js/app.config.js +86 -0
  180. package/src/admin/visual/js/common.config.js +687 -0
  181. package/src/admin/visual/js/component.config.js +741 -0
  182. package/src/admin/visual/js/echarts.config.js +2440 -0
  183. package/src/admin/visual/js/form.config.js +2837 -0
  184. package/src/admin/visual/js/list.config.js +578 -0
  185. package/src/admin/visual/js/menu.config.js +62 -0
  186. package/src/admin/visual/js/visual-comp.js +48 -0
  187. package/src/admin/visual/tool.vue +1223 -0
  188. package/src/assets/images/background.jpg +0 -0
  189. package/src/assets/images/login-bg.jpg +0 -0
  190. package/src/assets/images/mobile-bg.png +0 -0
  191. package/src/assets/images/no-data.png +0 -0
  192. package/src/assets/style/base.css +48 -0
  193. package/src/assets/style/business.css +5 -0
  194. package/src/assets/style/code.css +36 -0
  195. package/src/assets/style/codeless.css +195 -0
  196. package/src/assets/style/flow.css +12 -0
  197. package/src/assets/style/global/blue.css +83 -0
  198. package/src/assets/style/global/default.css +71 -0
  199. package/src/assets/style/global/green.css +83 -0
  200. package/src/assets/style/global/purple.css +83 -0
  201. package/src/assets/style/global/red.css +83 -0
  202. package/src/assets/style/main.css +608 -0
  203. package/src/assets/style/menu/black.css +9 -0
  204. package/src/assets/style/menu/default.css +9 -0
  205. package/src/assets/style/menu/grey.css +9 -0
  206. package/src/assets/style/visual.css +204 -0
  207. package/src/auto-imports.d.ts +307 -0
  208. package/src/business/App.vue +131 -0
  209. package/src/business/components/dict-select/index.vue +88 -0
  210. package/src/business/components/index.js +13 -0
  211. package/src/business/components/input/index.vue +38 -0
  212. package/src/business/components/table/index.vue +928 -0
  213. package/src/business/home/index.vue +45 -0
  214. package/src/business/iframe/index.vue +63 -0
  215. package/src/business/layout/aside/history/history.vue +518 -0
  216. package/src/business/layout/aside/index.vue +116 -0
  217. package/src/business/layout/aside/menu/index.vue +47 -0
  218. package/src/business/layout/aside/menu/menuItem.vue +83 -0
  219. package/src/business/layout/aside/menu/submenu.vue +88 -0
  220. package/src/business/layout/fullscreen/index.vue +41 -0
  221. package/src/business/layout/header/index.vue +81 -0
  222. package/src/business/layout/header/menu/index.vue +47 -0
  223. package/src/business/layout/header/menu/menuItem.vue +43 -0
  224. package/src/business/layout/header/menu/submenu.vue +34 -0
  225. package/src/business/layout/home/index.vue +20 -0
  226. package/src/business/layout/index.vue +330 -0
  227. package/src/business/layout/message/index.vue +250 -0
  228. package/src/business/layout/personnel/index.vue +549 -0
  229. package/src/business/layout/search/index.vue +75 -0
  230. package/src/business/layout/subsystem/index.vue +124 -0
  231. package/src/business/main.js +36 -0
  232. package/src/business/pinia/menuBadge.js +58 -0
  233. package/src/business/pinia/router.js +190 -0
  234. package/src/business/router.js +98 -0
  235. package/src/choose/App.vue +203 -0
  236. package/src/choose/main.js +22 -0
  237. package/src/choose/router.js +33 -0
  238. package/src/codeless/components/affix/index.vue +393 -0
  239. package/src/codeless/components/affix-view/index.vue +244 -0
  240. package/src/codeless/components/buttons/index.vue +59 -0
  241. package/src/codeless/components/checkbox/index.vue +107 -0
  242. package/src/codeless/components/date/index.vue +105 -0
  243. package/src/codeless/components/datetime/index.vue +65 -0
  244. package/src/codeless/components/dialog-select/index.vue +170 -0
  245. package/src/codeless/components/dict-buttons/index.vue +97 -0
  246. package/src/codeless/components/dict-radio/index.vue +94 -0
  247. package/src/codeless/components/dict-select/index.vue +181 -0
  248. package/src/codeless/components/dict-selects/index.vue +145 -0
  249. package/src/codeless/components/dict-switch/index.vue +94 -0
  250. package/src/codeless/components/dict-tree/index.vue +116 -0
  251. package/src/codeless/components/edit-table/index.vue +160 -0
  252. package/src/codeless/components/employee-tree/index.vue +254 -0
  253. package/src/codeless/components/employees-tree/index.vue +87 -0
  254. package/src/codeless/components/entp-tree/index.vue +261 -0
  255. package/src/codeless/components/entps-tree/index.vue +93 -0
  256. package/src/codeless/components/icon/index.vue +65 -0
  257. package/src/codeless/components/image/index.vue +298 -0
  258. package/src/codeless/components/index.js +16 -0
  259. package/src/codeless/components/input/index.vue +63 -0
  260. package/src/codeless/components/number/index.vue +150 -0
  261. package/src/codeless/components/organization-tree/index.vue +262 -0
  262. package/src/codeless/components/organizations-tree/index.vue +79 -0
  263. package/src/codeless/components/password/index.vue +42 -0
  264. package/src/codeless/components/radio/index.vue +57 -0
  265. package/src/codeless/components/region-tree/index.vue +262 -0
  266. package/src/codeless/components/remote-distinct/index.vue +354 -0
  267. package/src/codeless/components/remote-select/index.vue +363 -0
  268. package/src/codeless/components/rich-editor/index.vue +159 -0
  269. package/src/codeless/components/roles/index.vue +68 -0
  270. package/src/codeless/components/select/index.vue +95 -0
  271. package/src/codeless/components/selects/index.vue +116 -0
  272. package/src/codeless/components/show-dict/index.vue +52 -0
  273. package/src/codeless/components/show-employees/index.vue +29 -0
  274. package/src/codeless/components/show-organizations/index.vue +29 -0
  275. package/src/codeless/components/show-roles/index.vue +45 -0
  276. package/src/codeless/components/signature-pad/index.vue +224 -0
  277. package/src/codeless/components/switch/index.vue +56 -0
  278. package/src/codeless/components/textarea/index.vue +37 -0
  279. package/src/codeless/components/tree/index.vue +244 -0
  280. package/src/codeless/components/unit-tree/index.vue +262 -0
  281. package/src/codeless/components/units-tree/index.vue +93 -0
  282. package/src/codeless/components/video/index.vue +255 -0
  283. package/src/codeless/components/video-view/index.vue +130 -0
  284. package/src/codeless/js/codeless.js +47 -0
  285. package/src/codeless/view/form-auto.vue +192 -0
  286. package/src/codeless/view/form-custom.vue +10 -0
  287. package/src/codeless/view/form-model.vue +421 -0
  288. package/src/codeless/view/form-query.vue +171 -0
  289. package/src/codeless/view/form.vue +575 -0
  290. package/src/codeless/view/page-comp.vue +1318 -0
  291. package/src/codeless/view/page.vue +280 -0
  292. package/src/codeless/view/table-edit-item.vue +184 -0
  293. package/src/codeless/view/table-edit.vue +490 -0
  294. package/src/codeless/view/table.vue +1606 -0
  295. package/src/codeless/view/tree.vue +431 -0
  296. package/src/configs/subApp.ts +9 -0
  297. package/src/directives/collapse/index.js +123 -0
  298. package/src/directives/drag/index.js +43 -0
  299. package/src/directives/index.js +9 -0
  300. package/src/directives/resize/index.js +23 -0
  301. package/src/entrance/libProperties.ts +24 -0
  302. package/src/entrance/libTypes.ts +26 -0
  303. package/src/error/404.vue +23 -0
  304. package/src/flow/chart.vue +130 -0
  305. package/src/flow/deal.vue +776 -0
  306. package/src/flow/signature.vue +216 -0
  307. package/src/flow/start.vue +18 -0
  308. package/src/http/api.js +192 -0
  309. package/src/http/request.js +81 -0
  310. package/src/login/App.vue +421 -0
  311. package/src/login/main.js +30 -0
  312. package/src/login/router.js +33 -0
  313. package/src/main.ts +20 -0
  314. package/src/mobile/App.vue +51 -0
  315. package/src/mobile/home/index.vue +34 -0
  316. package/src/mobile/main.js +26 -0
  317. package/src/mobile/router.js +101 -0
  318. package/src/mobile/view/page.vue +99 -0
  319. package/src/pinia/index.js +5 -0
  320. package/src/pinia/modules/dataField.js +77 -0
  321. package/src/pinia/modules/dataForm.js +46 -0
  322. package/src/pinia/modules/dataTable.js +46 -0
  323. package/src/pinia/modules/dictionary.js +66 -0
  324. package/src/pinia/modules/employee.js +46 -0
  325. package/src/pinia/modules/icon.js +46 -0
  326. package/src/pinia/modules/keepAlive.js +35 -0
  327. package/src/pinia/modules/organization.js +189 -0
  328. package/src/pinia/modules/page.js +46 -0
  329. package/src/pinia/modules/pageButton.js +44 -0
  330. package/src/pinia/modules/pageComp.js +46 -0
  331. package/src/pinia/modules/role.js +46 -0
  332. package/src/pinia/modules/setting.js +56 -0
  333. package/src/pinia/modules/subsystem.js +64 -0
  334. package/src/pinia/modules/user.js +177 -0
  335. package/src/plugins/index.ts +24 -0
  336. package/src/portal/App.vue +27 -0
  337. package/src/portal/home/index.vue +52 -0
  338. package/src/portal/main.js +31 -0
  339. package/src/portal/page/index.vue +39 -0
  340. package/src/portal/pinia/router.js +176 -0
  341. package/src/portal/router.js +86 -0
  342. package/src/router/constantRoutes.ts +13 -0
  343. package/src/router/loadComponent.ts +29 -0
  344. package/src/router/readme.txt +21 -0
  345. package/src/sso/sso.js +19 -0
  346. package/src/sso/sso.vue +138 -0
  347. package/src/types/axios.d.ts +13 -0
  348. package/src/types/func.ts +14 -0
  349. package/src/types/global.d.ts +108 -0
  350. package/src/types/layout.d.ts +59 -0
  351. package/src/types/mitt.d.ts +40 -0
  352. package/src/types/pinia.d.ts +93 -0
  353. package/src/types/views.d.ts +27 -0
  354. package/src/types/window.d.ts +8 -0
  355. package/src/utils/aes.js +75 -0
  356. package/src/utils/browser.js +13 -0
  357. package/src/utils/bus.js +4 -0
  358. package/src/utils/cache.js +6 -0
  359. package/src/utils/codeless.js +92 -0
  360. package/src/utils/color.js +274 -0
  361. package/src/utils/date.js +180 -0
  362. package/src/utils/loading.js +22 -0
  363. package/src/utils/page.js +36 -0
  364. package/src/utils/progress.js +19 -0
  365. package/src/utils/system.js +92 -0
  366. package/src/utils/theme.js +79 -0
  367. package/src/utils/tool.js +431 -0
  368. package/src/utils/websocket.js +124 -0
  369. package/src/views/codeless/appVersion.vue +593 -0
  370. package/src/views/codeless/dataFormEdit.vue +1463 -0
  371. package/src/views/codeless/dataModel.vue +2584 -0
  372. package/src/views/codeless/dataModelPage.vue +535 -0
  373. package/src/views/codeless/dataTableEdit.vue +1678 -0
  374. package/src/views/codeless/datasource.vue +308 -0
  375. package/src/views/codeless/interface.vue +833 -0
  376. package/src/views/codeless/interfaceToken.vue +255 -0
  377. package/src/views/codeless/page.vue +752 -0
  378. package/src/views/codeless/pageButton.vue +255 -0
  379. package/src/views/codeless/pageCompEdit.vue +2330 -0
  380. package/src/views/codeless/pageEdit.vue +661 -0
  381. package/src/views/codeless/relationPage.vue +349 -0
  382. package/src/views/codeless/scriptGroovy.vue +736 -0
  383. package/src/views/codeless/scriptGroovyEdit.vue +248 -0
  384. package/src/views/codeless/scriptGroovyExecute.vue +212 -0
  385. package/src/views/codeless/scriptGroovySimple.vue +1057 -0
  386. package/src/views/codeless/scriptTool.vue +563 -0
  387. package/src/views/codeless/subsystem.vue +309 -0
  388. package/src/views/codeless/template.vue +739 -0
  389. package/src/views/codeless/variable.vue +727 -0
  390. package/src/views/codeless/view.vue +738 -0
  391. package/src/views/codeless/viewEdit.vue +244 -0
  392. package/src/views/codeless/viewSimple.vue +1034 -0
  393. package/src/views/collect/task.vue +898 -0
  394. package/src/views/collect/taskLog.vue +238 -0
  395. package/src/views/dictionary/dictionary.vue +866 -0
  396. package/src/views/employee/employee.vue +355 -0
  397. package/src/views/flow/flow.vue +369 -0
  398. package/src/views/flow/flowInst.vue +73 -0
  399. package/src/views/flow/flowLineBranch.vue +406 -0
  400. package/src/views/flow/flowNodeMan.vue +426 -0
  401. package/src/views/flow/flowOpinion.vue +188 -0
  402. package/src/views/icon/icon.vue +242 -0
  403. package/src/views/log/loginLog.vue +41 -0
  404. package/src/views/log/operatorLog.vue +176 -0
  405. package/src/views/menu/menu.vue +883 -0
  406. package/src/views/menu/menuList.vue +858 -0
  407. package/src/views/message/message.vue +299 -0
  408. package/src/views/mobile/editor.vue +1100 -0
  409. package/src/views/mobile/mobile.vue +568 -0
  410. package/src/views/mobile/tool.vue +1258 -0
  411. package/src/views/monitor/database.vue +11 -0
  412. package/src/views/monitor/details-diskspace.vue +56 -0
  413. package/src/views/monitor/details-gc.vue +93 -0
  414. package/src/views/monitor/details-memory.vue +143 -0
  415. package/src/views/monitor/details-process.vue +132 -0
  416. package/src/views/monitor/details-threads.vue +106 -0
  417. package/src/views/monitor/line-chart.vue +93 -0
  418. package/src/views/monitor/mem-chart.vue +22 -0
  419. package/src/views/monitor/panel.vue +90 -0
  420. package/src/views/monitor/performance.vue +36 -0
  421. package/src/views/monitor/threads-chart.vue +16 -0
  422. package/src/views/operation/backup.vue +593 -0
  423. package/src/views/operation/center.vue +420 -0
  424. package/src/views/operation/restore.vue +94 -0
  425. package/src/views/organization/organization.vue +366 -0
  426. package/src/views/role/role.vue +502 -0
  427. package/src/views/schedule/schedule.vue +338 -0
  428. package/src/views/schedule/scheduleLog.vue +40 -0
  429. package/src/views/sequence/sequence.vue +283 -0
  430. package/src/views/setting/setting.vue +371 -0
  431. package/src/visual/components/app/list/goods/double.vue +241 -0
  432. package/src/visual/components/app/list/nav/image.vue +135 -0
  433. package/src/visual/components/app/list/nav/text.vue +159 -0
  434. package/src/visual/components/button/index.vue +95 -0
  435. package/src/visual/components/container/index.vue +128 -0
  436. package/src/visual/components/data/index.vue +60 -0
  437. package/src/visual/components/data-table/index.vue +260 -0
  438. package/src/visual/components/echarts/annular.vue +173 -0
  439. package/src/visual/components/echarts/bar.vue +172 -0
  440. package/src/visual/components/echarts/funnel.vue +167 -0
  441. package/src/visual/components/echarts/gauge.vue +186 -0
  442. package/src/visual/components/echarts/line.vue +172 -0
  443. package/src/visual/components/echarts/map.vue +206 -0
  444. package/src/visual/components/echarts/pie.vue +158 -0
  445. package/src/visual/components/echarts/radar.vue +196 -0
  446. package/src/visual/components/echarts/scatter.vue +153 -0
  447. package/src/visual/components/edit-table/index.vue +71 -0
  448. package/src/visual/components/form/affix.vue +440 -0
  449. package/src/visual/components/form/area.vue +134 -0
  450. package/src/visual/components/form/buttons.vue +120 -0
  451. package/src/visual/components/form/checkbox.vue +126 -0
  452. package/src/visual/components/form/date-range.vue +97 -0
  453. package/src/visual/components/form/date.vue +88 -0
  454. package/src/visual/components/form/datetime.vue +87 -0
  455. package/src/visual/components/form/employee-tree.vue +300 -0
  456. package/src/visual/components/form/employees-tree.vue +91 -0
  457. package/src/visual/components/form/image.vue +440 -0
  458. package/src/visual/components/form/index.vue +85 -0
  459. package/src/visual/components/form/input.vue +116 -0
  460. package/src/visual/components/form/item.vue +68 -0
  461. package/src/visual/components/form/number.vue +157 -0
  462. package/src/visual/components/form/organization-tree.vue +300 -0
  463. package/src/visual/components/form/password.vue +103 -0
  464. package/src/visual/components/form/radio.vue +122 -0
  465. package/src/visual/components/form/rate.vue +93 -0
  466. package/src/visual/components/form/region-tree.vue +300 -0
  467. package/src/visual/components/form/rich-editor.vue +114 -0
  468. package/src/visual/components/form/select.vue +172 -0
  469. package/src/visual/components/form/switch.vue +105 -0
  470. package/src/visual/components/form/textarea.vue +91 -0
  471. package/src/visual/components/form/unit-tree.vue +300 -0
  472. package/src/visual/components/icon/index.vue +73 -0
  473. package/src/visual/components/image/index.vue +445 -0
  474. package/src/visual/components/index.js +26 -0
  475. package/src/visual/components/list/block.vue +234 -0
  476. package/src/visual/components/list/button.vue +123 -0
  477. package/src/visual/components/list/card.vue +129 -0
  478. package/src/visual/components/list/custom.vue +214 -0
  479. package/src/visual/components/list/image.vue +182 -0
  480. package/src/visual/components/list/news.vue +174 -0
  481. package/src/visual/components/page-comp/index.vue +67 -0
  482. package/src/visual/components/portal-menu/index.vue +191 -0
  483. package/src/visual/components/qrcode/index.vue +98 -0
  484. package/src/visual/components/router-view/index.vue +51 -0
  485. package/src/visual/components/row/index.vue +175 -0
  486. package/src/visual/components/search/index.vue +96 -0
  487. package/src/visual/components/tabs/index.vue +103 -0
  488. package/src/visual/components/text/index.vue +111 -0
  489. package/src/visual/components/video/index.vue +93 -0
  490. package/src/visual/js/echarts.js +220 -0
  491. package/src/visual/js/event.js +476 -0
  492. package/src/visual/js/visual-comp.js +48 -0
  493. package/src/visual/js/visual.js +508 -0
  494. package/src/visual/view/page.vue +357 -0
@@ -0,0 +1,2584 @@
1
+ <template>
2
+ <div class="page-container">
3
+ <el-container>
4
+ <el-aside class="page-aside" width="280px" v-drag v-collapse>
5
+ <div class="title">
6
+ <div class="title-content">目录</div>
7
+ <div class="title-button">
8
+ <div class="button-list">
9
+ <div class="button-item">
10
+ <ac-icon
11
+ iconId="018dca412c4e207388f7"
12
+ :style="'cursor: pointer;color: ' + (treeCheck ? 'rgb(0,133,246)' : '#999') + ';font-size: 18px;'"
13
+ :title="treeCheck ? '导入模式' : '导出模式'"
14
+ @click.stop="treeCheck = !treeCheck"
15
+ />
16
+ </div>
17
+ <div class="button-item">
18
+ <ac-icon
19
+ iconId="018ece4f749ec5911772"
20
+ style="cursor: pointer;color: rgb(0,133,246); font-size: 18px;"
21
+ title="导出数据模型"
22
+ @click.stop="handleExport"
23
+ />
24
+ </div>
25
+ <div class="button-item">
26
+ <el-upload
27
+ action=""
28
+ :http-request="handleImport"
29
+ :show-file-list="false"
30
+ accept=".dat"
31
+ >
32
+ <ac-icon
33
+ iconId="018ece4f70fcf0627f81"
34
+ style="cursor: pointer;color: rgb(0,133,246); font-size: 18px;"
35
+ title="导入数据模型"
36
+ />
37
+ </el-upload>
38
+ </div>
39
+ <div class="button-item">
40
+ <ac-icon
41
+ iconId="018dc9c3efed1f464d38"
42
+ style="cursor: pointer;color: rgb(0,133,246); font-size: 16px;"
43
+ title="下载数据模型配置模板"
44
+ @click.stop="downloadTpl"
45
+ />
46
+ </div>
47
+ <div class="button-item">
48
+ <el-upload
49
+ action=""
50
+ :http-request="handleUpload"
51
+ :show-file-list="false"
52
+ accept=".xls,.xlsx,.csv"
53
+ >
54
+ <ac-icon
55
+ iconId="018dc9c3efd2131ecc10"
56
+ style="cursor: pointer;color: rgb(0,133,246); font-size: 16px;"
57
+ title="上传数据模型配置"
58
+ />
59
+ </el-upload>
60
+ </div>
61
+ </div>
62
+ <el-dropdown trigger="hover">
63
+ <span class="title-button-box">
64
+ <ac-icon
65
+ iconId="018dc9c3efed46e8b927"
66
+ style="cursor: pointer;font-size: 18px;"
67
+ @click.stop
68
+ />
69
+ </span>
70
+ <template #dropdown>
71
+ <el-dropdown-menu>
72
+ <el-dropdown-item
73
+ v-for="(item, index) in plusButtons"
74
+ :key="index"
75
+ @click.stop="clickPlusItem(item.type, {})"
76
+ :divided="item.divider || false"
77
+ >
78
+ <ac-icon :iconId="item.iconId" :color="item.iconColor" style="margin-right: 5px" />{{item.name}}
79
+ </el-dropdown-item>
80
+ </el-dropdown-menu>
81
+ </template>
82
+ </el-dropdown>
83
+ </div>
84
+ </div>
85
+ <div class="filter-box">
86
+ <el-input placeholder="搜索" v-model="filterText" clearable />
87
+ </div>
88
+ <div class="page-aside-grow">
89
+ <el-tree
90
+ ref="tree"
91
+ class="tree"
92
+ node-key="id"
93
+ v-loading="treeLoading"
94
+ element-loading-text="数据加载中..."
95
+ :data="treeData"
96
+ :props="treeProps"
97
+ :highlight-current="true"
98
+ :default-expanded-keys="treeExpand"
99
+ :expand-on-click-node="!treeCheck"
100
+ :filter-node-method="filterNode"
101
+ :show-checkbox="treeCheck"
102
+ @node-click="nodeClick"
103
+ >
104
+ <template v-slot="{ node, data }">
105
+ <div class="node-item">
106
+ <span v-if="data.type === 'folder'" class="icon">
107
+ <ac-icon v-if="node.expanded" style="color: orange" iconId="018dc9c3efedbb59d0b3" />
108
+ <ac-icon v-else style="color: orange" iconId="018dc9c3efed6d208a59" />
109
+ </span>
110
+ <span v-else class="icon">
111
+ <ac-icon v-if="data.type === 'model'" iconId="018dc9c3efb74ac607cb" style="color: #0085f6" />
112
+ </span>
113
+ <span class="node-label" :title="data.text"><span>{{data.text}}</span></span>
114
+ <div class="node-button">
115
+ <el-dropdown trigger="hover" placement="bottom-start">
116
+ <span class="node-button-item">
117
+ <ac-icon iconId="018dca6283a1e534a046" @click.stop />
118
+ </span>
119
+ <template #dropdown>
120
+ <el-dropdown-menu>
121
+ <div v-if="data.type === 'folder'">
122
+ <el-dropdown-item
123
+ v-for="(item, index) in plusButtons"
124
+ :key="index"
125
+ @click.stop="clickPlusItem(item.type, data)"
126
+ >
127
+ <ac-icon
128
+ :iconId="item.iconId"
129
+ :style="{
130
+ 'margin-right': '5px',
131
+ 'color': item.iconColor
132
+ }"
133
+ />
134
+ {{item.name}}
135
+ </el-dropdown-item>
136
+ </div>
137
+ <el-dropdown-item @click="updateNode(data.type, data.data)">
138
+ <ac-icon iconId="018dca6db20c6a3aaf68" style="color: #0085f6;margin-right: 5px" />
139
+ 修改{{data.type === 'folder' ? '目录' : '数据模型'}}
140
+ </el-dropdown-item>
141
+ <el-dropdown-item v-if="data.type === 'model'" @click="copyNode(data.type, data.data)">
142
+ <ac-icon iconId="018dc9c3efb82f31c161" style="color: #67c23a;margin-right: 5px" />
143
+ 复制数据模型
144
+ </el-dropdown-item>
145
+ <el-dropdown-item @click="moveNode(data.type, data.data)">
146
+ <ac-icon iconId="018dca444e0754edef13" style="color: #FF6600;margin-right: 5px" />
147
+ 移动{{data.type === 'folder' ? '目录' : '数据模型'}}
148
+ </el-dropdown-item>
149
+ <el-dropdown-item @click="deleteNode(data.type, data.data)">
150
+ <ac-icon iconId="018dc9c3efd3a0502886" style="color: #F56C6C;margin-right: 5px" />
151
+ 删除{{data.type === 'folder' ? '目录' : '数据模型'}}
152
+ </el-dropdown-item>
153
+ </el-dropdown-menu>
154
+ </template>
155
+ </el-dropdown>
156
+ </div>
157
+ </div>
158
+ </template>
159
+ </el-tree>
160
+ </div>
161
+ </el-aside>
162
+ <el-main class="page-main">
163
+ <div
164
+ v-if="dataModelShow"
165
+ class="fit-container"
166
+ style="height: 100%;"
167
+ >
168
+ <el-form
169
+ ref="dataModelForm"
170
+ label-width="85px"
171
+ :model="dataModelData"
172
+ :rules="dataModelRules"
173
+ style="height: 100%;display: flex;flex-direction: column;"
174
+ >
175
+ <el-row style="margin-top: 10px;">
176
+ <el-col :span="6">
177
+ <el-form-item label="模型编码" prop="code">
178
+ <el-input v-model="dataModelData.code" :disabled="true" placeholder="系统自动生成" />
179
+ </el-form-item>
180
+ </el-col>
181
+ <el-col :span="6">
182
+ <el-form-item label="模型名称" prop="name">
183
+ <el-input v-model="dataModelData.name"></el-input>
184
+ </el-form-item>
185
+ </el-col>
186
+ <el-col :span="6">
187
+ <el-form-item label="目录" prop="folderId">
188
+ <ac-tree
189
+ v-model="dataModelData.folderId"
190
+ dataUrl="/system/dataFolder/queryTree"
191
+ :leafSelect="false"
192
+ />
193
+ </el-form-item>
194
+ </el-col>
195
+ <el-col :span="6">
196
+ <el-form-item label="模型类型" prop="type">
197
+ <ac-dict-buttons
198
+ v-model="dataModelData.type"
199
+ dictCode="dictModelType"
200
+ @change="dataModelData.sourceId = ''"
201
+ :disabled="!!dataModelData.id"
202
+ />
203
+ </el-form-item>
204
+ </el-col>
205
+ <el-col :span="6" v-if="dataModelData.type === '2'">
206
+ <el-form-item label="视图名称" prop="sourceId">
207
+ <ac-remote-select
208
+ v-model="dataModelData.sourceId"
209
+ dataUrl="/system/view/queryPage"
210
+ :option="{id: dataModelData.sourceId, name: dataModelData.sourceName}"
211
+ />
212
+ </el-form-item>
213
+ </el-col>
214
+ <el-col :span="6" v-if="dataModelData.type === '2'">
215
+ <el-button
216
+ style="margin-left: 15px;"
217
+ type="success"
218
+ size="default"
219
+ :disabled="!dataModelData.sourceId"
220
+ :loading="viewLoading"
221
+ @click="loadView"
222
+ >加载视图字段</el-button>
223
+ </el-col>
224
+ </el-row>
225
+ <el-tabs
226
+ v-model="tabName"
227
+ element-loading-text="数据加载中..."
228
+ class="fit-tab fit-box"
229
+ >
230
+ <el-tab-pane label="字段管理" name="field" class="fit-box">
231
+ <el-table
232
+ ref="sortTable"
233
+ v-loading="dataFieldLoading"
234
+ element-loading-text="数据加载中..."
235
+ :show-overflow-tooltip="false"
236
+ class="field-table fit-table edit-table"
237
+ width="100%"
238
+ :data="dataFieldList"
239
+ :border="true"
240
+ :stripe="false"
241
+ :row-key="getFieldRowKey"
242
+ :row-class-name="getRowClassName"
243
+ >
244
+ <el-table-column
245
+ header-align="center"
246
+ label="字段名称"
247
+ :min-width="100"
248
+ prop="fieldName"
249
+ >
250
+ <template #default="scope">
251
+ <el-input
252
+ v-model="scope.row.fieldName"
253
+ :disabled="scope.row.builtin === '1'"
254
+ />
255
+ </template>
256
+ </el-table-column>
257
+ <el-table-column
258
+ header-align="center"
259
+ label="显示名称"
260
+ :min-width="120"
261
+ prop="showName"
262
+ >
263
+ <template #default="scope">
264
+ <el-input
265
+ v-model="scope.row.showName"
266
+ :disabled="scope.row.builtin === '1'"
267
+ />
268
+ </template>
269
+ </el-table-column>
270
+ <el-table-column
271
+ v-if="dataModelData.type === '2'"
272
+ header-align="center"
273
+ align="center"
274
+ label="是否主键"
275
+ :width="80"
276
+ prop="primaryKey"
277
+ >
278
+ <template #default="scope">
279
+ <ac-dict-switch
280
+ v-model="scope.row.primaryKey"
281
+ dictCode="dictYesNo"
282
+ />
283
+ </template>
284
+ </el-table-column>
285
+ <el-table-column
286
+ header-align="center"
287
+ align="center"
288
+ label="字段类型"
289
+ :width="110"
290
+ prop="fieldType"
291
+ >
292
+ <template #default="scope">
293
+ <ac-select
294
+ v-model="scope.row.fieldType"
295
+ options="字符,整数,小数,日期,时间,图片,视频,附件,联动,派生,大文本"
296
+ :disabled="scope.row.builtin === '1'"
297
+ @change="() => changeFieldType(scope.row)"
298
+ />
299
+ </template>
300
+ </el-table-column>
301
+ <el-table-column
302
+ header-align="center"
303
+ align="center"
304
+ label="字段长度"
305
+ :width="90"
306
+ prop="fieldSize"
307
+ >
308
+ <template #default="scope">
309
+ <ac-number
310
+ v-model="scope.row.fieldSize"
311
+ :disabled="scope.row.builtin === '1'
312
+ || '整数,时间,图片,视频,附件,联动,派生,大文本'.indexOf(scope.row.fieldType) >= 0"
313
+ :point="0"
314
+ />
315
+ </template>
316
+ </el-table-column>
317
+ <el-table-column
318
+ header-align="center"
319
+ align="center"
320
+ label="字段精度"
321
+ :width="80"
322
+ prop="fieldPrecision"
323
+ >
324
+ <template #default="scope">
325
+ <ac-number
326
+ v-model="scope.row.fieldPrecision"
327
+ :disabled="scope.row.builtin === '1' || scope.row.fieldType !== '小数'"
328
+ :point="0"
329
+ />
330
+ </template>
331
+ </el-table-column>
332
+ <el-table-column
333
+ header-align="center"
334
+ align="center"
335
+ label="文本框类型"
336
+ :width="120"
337
+ >
338
+ <template #default="scope">
339
+ <ac-select
340
+ v-if="scope.row.autoCreate === '0'
341
+ && scope.row.enumerate === '0'
342
+ && scope.row.fieldType === '字符'"
343
+ v-model="scope.row.inputType"
344
+ options="单行文本框,密码文本框,多行文本框"
345
+ :disabled="scope.row.builtin === '1'"
346
+ />
347
+ <ac-select
348
+ v-else-if="scope.row.fieldType === '日期'"
349
+ v-model="scope.row.inputType"
350
+ options="日期单选框,日期多选框"
351
+ :disabled="scope.row.builtin === '1'"
352
+ />
353
+ <ac-select
354
+ v-else-if="scope.row.fieldType === '大文本'"
355
+ v-model="scope.row.inputType"
356
+ options="多行文本框,富文本框"
357
+ :disabled="scope.row.builtin === '1'"
358
+ />
359
+ <el-input v-else :disabled="true" />
360
+ </template>
361
+ </el-table-column>
362
+ <el-table-column
363
+ v-if="dataModelData.type === '1'"
364
+ header-align="center"
365
+ align="center"
366
+ label="是否必填"
367
+ :width="80"
368
+ prop="required"
369
+ >
370
+ <template #default="scope">
371
+ <ac-dict-switch
372
+ v-model="scope.row.required"
373
+ dictCode="dictYesNo"
374
+ :disabled="scope.row.builtin === '1'"
375
+ />
376
+ </template>
377
+ </el-table-column>
378
+ <el-table-column
379
+ header-align="center"
380
+ label="默认值"
381
+ :width="100"
382
+ prop="defaultValue"
383
+ >
384
+ <template #header>
385
+ <span style="margin-right: 5px">默认值</span>
386
+ <ac-default-value-tips />
387
+ </template>
388
+ <template #default="scope">
389
+ <el-input
390
+ v-model="scope.row.defaultValue"
391
+ :disabled="scope.row.builtin === '1'"
392
+ />
393
+ </template>
394
+ </el-table-column>
395
+ <el-table-column
396
+ header-align="center"
397
+ align="center"
398
+ label="操作"
399
+ :width="200"
400
+ fixed="right"
401
+ >
402
+ <template #default="scope">
403
+ <el-button
404
+ type="primary"
405
+ @click="editDataField(scope.row)"
406
+ link
407
+ >编辑</el-button>
408
+ <el-button
409
+ type="success"
410
+ @click="copyDataField(scope.row)"
411
+ link
412
+ >复制</el-button>
413
+ <el-button
414
+ v-if="scope.row.fieldType === '联动' && scope.row.relevanceType === '数据模型'"
415
+ type="success"
416
+ @click="deriveDataField(scope.row)"
417
+ link
418
+ >派生</el-button>
419
+ <el-button
420
+ v-if="scope.row.builtin === '0' || !scope.row.builtin"
421
+ type="danger"
422
+ @click="deleteDataField(scope.row)"
423
+ link
424
+ >删除</el-button>
425
+ </template>
426
+ </el-table-column>
427
+ </el-table>
428
+ </el-tab-pane>
429
+ <el-tab-pane label="表格设计" name="table" class="fit-box" v-if="dataModelData.id">
430
+ <el-table
431
+ :show-overflow-tooltip="false"
432
+ tooltip-effect="light"
433
+ class="field-table fit-table"
434
+ width="100%"
435
+ :data="dataTableList"
436
+ :border="true"
437
+ :stripe="false"
438
+ >
439
+ <el-table-column
440
+ header-align="center"
441
+ label="名称"
442
+ :min-width="120"
443
+ prop="name"
444
+ />
445
+ <el-table-column
446
+ header-align="center"
447
+ label="更新时间"
448
+ :width="160"
449
+ prop="updateTime"
450
+ >
451
+ <template #default="scope">
452
+ {{date.formatLongDate(scope.row.updateTime)}}
453
+ </template>
454
+ </el-table-column>
455
+ <el-table-column
456
+ header-align="center"
457
+ align="center"
458
+ label="操作"
459
+ :width="200"
460
+ >
461
+ <template #default="scope">
462
+ <el-button
463
+ type="primary"
464
+ @click="editDataTable(scope.row)"
465
+ link
466
+ >编辑</el-button>
467
+ <el-button
468
+ type="success"
469
+ @click="copyDataTable(scope.row)"
470
+ link
471
+ >复制</el-button>
472
+ <el-button
473
+ type="info"
474
+ @click="previewDataTable(scope.row)"
475
+ link
476
+ >预览</el-button>
477
+ <el-button
478
+ type="danger"
479
+ @click="deleteDataTable(scope.row)"
480
+ link
481
+ >删除</el-button>
482
+ </template>
483
+ </el-table-column>
484
+ </el-table>
485
+ </el-tab-pane>
486
+ <el-tab-pane label="表单设计" name="form" class="fit-box" v-if="dataModelData.id">
487
+ <el-table
488
+ :show-overflow-tooltip="false"
489
+ tooltip-effect="light"
490
+ class="field-table fit-table"
491
+ width="100%"
492
+ :data="dataFormList"
493
+ :border="true"
494
+ :stripe="false"
495
+ >
496
+ <el-table-column
497
+ header-align="center"
498
+ label="名称"
499
+ :min-width="120"
500
+ prop="name"
501
+ />
502
+ <el-table-column
503
+ header-align="center"
504
+ label="更新时间"
505
+ :width="160"
506
+ prop="updateTime"
507
+ >
508
+ <template #default="scope">
509
+ {{date.formatLongDate(scope.row.updateTime)}}
510
+ </template>
511
+ </el-table-column>
512
+ <el-table-column
513
+ header-align="center"
514
+ align="center"
515
+ label="操作"
516
+ :width="200"
517
+ >
518
+ <template #default="scope">
519
+ <el-button
520
+ type="primary"
521
+ @click="editDataForm(scope.row)"
522
+ link
523
+ >编辑</el-button>
524
+ <el-button
525
+ type="success"
526
+ @click="copyDataForm(scope.row)"
527
+ link
528
+ >复制</el-button>
529
+ <el-button
530
+ type="info"
531
+ @click="previewDataForm(scope.row)"
532
+ link
533
+ >预览</el-button>
534
+ <el-button
535
+ type="danger"
536
+ @click="deleteDataForm(scope.row)"
537
+ link
538
+ >删除</el-button>
539
+ </template>
540
+ </el-table-column>
541
+ </el-table>
542
+ </el-tab-pane>
543
+ <el-tab-pane
544
+ v-if="dataModelData.id && dataModelData.type==='1'"
545
+ label="索引管理"
546
+ name="index"
547
+ class="fit-box"
548
+ >
549
+ <el-table
550
+ ref="sortTableIndex"
551
+ v-loading="dataIndexLoading"
552
+ element-loading-text="数据加载中..."
553
+ :show-overflow-tooltip="false"
554
+ class="field-table fit-table edit-table"
555
+ width="100%"
556
+ :data="dataIndexList"
557
+ :border="true"
558
+ :stripe="false"
559
+ :row-key="getIndexRowKey"
560
+ >
561
+ <el-table-column
562
+ header-align="center"
563
+ label="索引名称"
564
+ :min-width="120"
565
+ prop="indexName"
566
+ >
567
+ <template #header>
568
+ <span style="margin-right: 5px">索引名称</span>
569
+ <el-tooltip content="索引名称相同时,建联合索引,由排列确定联合索引的顺序。">
570
+ <ac-icon iconId="018dca8ec9890493be26" />
571
+ </el-tooltip>
572
+ </template>
573
+ <template #default="scope">
574
+ <el-input v-model="scope.row.indexName" />
575
+ </template>
576
+ </el-table-column>
577
+ <el-table-column
578
+ header-align="center"
579
+ align="center"
580
+ label="索引字段"
581
+ :min-width="120"
582
+ prop="indexFieldId"
583
+ >
584
+ <template #default="scope">
585
+ <ac-select v-model="scope.row.indexFieldId" :options="dataFieldOptions" />
586
+ </template>
587
+ </el-table-column>
588
+ <el-table-column
589
+ header-align="center"
590
+ align="center"
591
+ label="唯一索引"
592
+ :width="80"
593
+ prop="indexUnique"
594
+ >
595
+ <template #default="scope">
596
+ <ac-dict-switch v-model="scope.row.indexUnique" dictCode="dictYesNo" />
597
+ </template>
598
+ </el-table-column>
599
+ <el-table-column
600
+ header-align="center"
601
+ align="center"
602
+ label="排序方式"
603
+ :width="200"
604
+ >
605
+ <template #default="scope">
606
+ <ac-radio
607
+ v-model="scope.row.indexOrdinal"
608
+ options="升序,降序"
609
+ />
610
+ </template>
611
+ </el-table-column>
612
+ <el-table-column
613
+ header-align="center"
614
+ align="center"
615
+ label="操作"
616
+ :width="90"
617
+ fixed="right"
618
+ >
619
+ <template #default="scope">
620
+ <el-button
621
+ type="danger"
622
+ @click="deleteDataIndex(scope.row)"
623
+ link
624
+ >删除</el-button>
625
+ </template>
626
+ </el-table-column>
627
+ </el-table>
628
+ </el-tab-pane>
629
+ <el-tab-pane label="触发器" name="trigger" class="fit-box" v-if="dataModelData.type==='1'">
630
+ <el-row>
631
+ <el-col :span="8">
632
+ <el-form-item label="新增前触发脚本" prop="beforeInsertId" label-width="130px">
633
+ <ac-tree
634
+ v-model="dataModelData.beforeInsertId"
635
+ data-url="/system/scriptGroovy/queryTree"
636
+ type-select="script"
637
+ />
638
+ </el-form-item>
639
+ </el-col>
640
+ <el-col :span="8">
641
+ <el-form-item label="新增后触发脚本" prop="afterInsertId" label-width="130px">
642
+ <ac-tree
643
+ v-model="dataModelData.afterInsertId"
644
+ data-url="/system/scriptGroovy/queryTree"
645
+ type-select="script"
646
+ />
647
+ </el-form-item>
648
+ </el-col>
649
+ </el-row>
650
+ <el-row>
651
+ <el-col :span="8">
652
+ <el-form-item label="更新前触发脚本" prop="beforeUpdateId" label-width="130px">
653
+ <ac-tree
654
+ v-model="dataModelData.beforeUpdateId"
655
+ data-url="/system/scriptGroovy/queryTree"
656
+ type-select="script"
657
+ />
658
+ </el-form-item>
659
+ </el-col>
660
+ <el-col :span="8">
661
+ <el-form-item label="更新后触发脚本" prop="afterUpdateId" label-width="130px">
662
+ <ac-tree
663
+ v-model="dataModelData.afterUpdateId"
664
+ data-url="/system/scriptGroovy/queryTree"
665
+ type-select="script"
666
+ />
667
+ </el-form-item>
668
+ </el-col>
669
+ </el-row>
670
+ <el-row>
671
+ <el-col :span="8">
672
+ <el-form-item label="删除前触发脚本" prop="beforeDeleteId" label-width="130px">
673
+ <ac-tree
674
+ v-model="dataModelData.beforeDeleteId"
675
+ data-url="/system/scriptGroovy/queryTree"
676
+ type-select="script"
677
+ />
678
+ </el-form-item>
679
+ </el-col>
680
+ <el-col :span="8">
681
+ <el-form-item label="删除后触发脚本" prop="afterDeleteId" label-width="130px">
682
+ <ac-tree
683
+ v-model="dataModelData.afterDeleteId"
684
+ data-url="/system/scriptGroovy/queryTree"
685
+ type-select="script"
686
+ />
687
+ </el-form-item>
688
+ </el-col>
689
+ </el-row>
690
+ </el-tab-pane>
691
+ </el-tabs>
692
+ <el-row style="margin-top: 8px;">
693
+ <el-col :span="24" style="text-align: right; margin-right: 10px;;align-content: center;">
694
+ <el-button
695
+ v-if="tabName === 'field' && !sortableInst && (dataFieldList || []).length > 1"
696
+ type="primary"
697
+ @click="sortDataField"
698
+ >开启排序</el-button>
699
+ <el-button
700
+ v-if="tabName === 'field' && sortableInst"
701
+ type="info"
702
+ @click="unSortDataField"
703
+ >关闭排序</el-button>
704
+ <el-button
705
+ v-if="tabName === 'index' && !sortableIndexInst && (dataIndexList || []).length > 1"
706
+ type="primary"
707
+ @click="sortDataIndex"
708
+ >开启排序</el-button>
709
+ <el-button
710
+ v-if="tabName === 'index' && sortableIndexInst"
711
+ type="info"
712
+ @click="unSortDataIndex"
713
+ >关闭排序</el-button>
714
+ <el-button v-if="tabName==='field'" type="success" @click="addSimpleField">添加字段</el-button>
715
+ <el-button v-if="tabName==='field'" type="success" @click="addDataField">添加字段(弹窗)</el-button>
716
+ <el-button v-if="tabName==='table'" type="success" @click="addDataTable">添加表格</el-button>
717
+ <el-button v-if="tabName==='form'" type="success" @click="addDataForm">添加表单</el-button>
718
+ <el-button v-if="tabName==='index'" type="success" @click="addDataIndex">添加索引</el-button>
719
+ <el-button :loading="dataModelLoading" type="primary" @click="submitModelForm">保存</el-button>
720
+ </el-col>
721
+ </el-row>
722
+ </el-form>
723
+ </div>
724
+ </el-main>
725
+ </el-container>
726
+ </div>
727
+
728
+ <!--新增编辑目录界面-->
729
+ <el-dialog
730
+ v-model="folderVisible"
731
+ :title="folderTitle"
732
+ width="500px"
733
+ :close-on-click-modal="false"
734
+ destroy-on-close
735
+ draggable
736
+ >
737
+ <el-form
738
+ ref="folderForm"
739
+ label-width="120px"
740
+ label-position="right"
741
+ :model="folderData"
742
+ :rules="folderRules"
743
+ >
744
+ <el-row>
745
+ <el-col :span="24">
746
+ <el-form-item label="目录名称" prop="name">
747
+ <el-input v-model="folderData.name" auto-complete="off"></el-input>
748
+ </el-form-item>
749
+ </el-col>
750
+ </el-row>
751
+ <el-row>
752
+ <el-col :span="24">
753
+ <el-form-item label="上级目录" prop="parentId">
754
+ <ac-tree
755
+ v-model="folderData.parentId"
756
+ dataUrl="/system/dataFolder/queryTree"
757
+ :leafSelect="false"
758
+ :disabled="true"
759
+ />
760
+ </el-form-item>
761
+ </el-col>
762
+ </el-row>
763
+ </el-form>
764
+ <template #footer>
765
+ <el-button
766
+ size="default"
767
+ type="info"
768
+ @click="folderVisible=false"
769
+ >取消</el-button>
770
+ <el-button
771
+ type="primary"
772
+ size="default"
773
+ :loading="folderLoading"
774
+ @click="submitFolderForm"
775
+ >提交</el-button>
776
+ </template>
777
+ </el-dialog>
778
+
779
+ <!--移动编辑目录/数据模型界面-->
780
+ <el-dialog
781
+ v-model="moveVisible"
782
+ :title="moveTitle"
783
+ width="500px"
784
+ :close-on-click-modal="false"
785
+ destroy-on-close
786
+ draggable
787
+ >
788
+ <el-form
789
+ ref="moveForm"
790
+ label-width="120px"
791
+ label-position="right"
792
+ :model="moveData"
793
+ >
794
+ <el-row>
795
+ <el-col :span="24">
796
+ <el-form-item :label="moveData.labelName">
797
+ <ac-input
798
+ v-model="moveData.name"
799
+ :disabled="true"
800
+ />
801
+ </el-form-item>
802
+ </el-col>
803
+ </el-row>
804
+ <el-row>
805
+ <el-col :span="24">
806
+ <el-form-item label="移动到" prop="folderId">
807
+ <ac-tree
808
+ v-model="moveData.folderId"
809
+ dataUrl="/system/dataFolder/queryTree"
810
+ :leafSelect="false"
811
+ />
812
+ </el-form-item>
813
+ </el-col>
814
+ </el-row>
815
+ </el-form>
816
+ <template #footer>
817
+ <el-button
818
+ size="default"
819
+ type="info"
820
+ @click="moveVisible=false"
821
+ >取消</el-button>
822
+ <el-button
823
+ type="primary"
824
+ size="default"
825
+ :loading="moveLoading"
826
+ @click="submitMoveForm"
827
+ >提交</el-button>
828
+ </template>
829
+ </el-dialog>
830
+
831
+ <!-- 新增数据模型字段 -->
832
+ <el-dialog
833
+ v-model="fieldVisible"
834
+ title="字段编辑"
835
+ :close-on-click-modal="false"
836
+ destroy-on-close
837
+ fullscreen
838
+ draggable
839
+ >
840
+ <el-form
841
+ ref="fieldForm"
842
+ label-width="140px"
843
+ :model="fieldData"
844
+ :rules="fieldRules"
845
+ style="height: 100%;width: 100%"
846
+ >
847
+ <el-row>
848
+ <el-col :span="8">
849
+ <el-form-item label="字段名称" prop="fieldName">
850
+ <el-input
851
+ v-model="fieldData.fieldName"
852
+ auto-complete="off"
853
+ :disabled="fieldData.builtin === '1'"
854
+ ></el-input>
855
+ </el-form-item>
856
+ </el-col>
857
+ <el-col :span="8">
858
+ <el-form-item label="显示名称" prop="showName">
859
+ <el-input
860
+ v-model="fieldData.showName"
861
+ auto-complete="off"
862
+ :disabled="fieldData.builtin === '1'"
863
+ ></el-input>
864
+ </el-form-item>
865
+ </el-col>
866
+ <el-col :span="8">
867
+ <el-form-item label="是否必填" prop="required">
868
+ <ac-dict-switch v-model="fieldData.required" dictCode="dictYesNo" />
869
+ </el-form-item>
870
+ </el-col>
871
+ <el-col :span="8">
872
+ <el-form-item label="字段类型" prop="fieldType">
873
+ <ac-select
874
+ v-model="fieldData.fieldType"
875
+ options="字符,整数,小数,日期,时间,图片,视频,附件,联动,派生,大文本"
876
+ @change="changeFieldType(fieldData)"
877
+ />
878
+ </el-form-item>
879
+ </el-col>
880
+ <el-col :span="8" v-if="fieldData.fieldType === '派生'">
881
+ <el-form-item label="来源字段" prop="sourceFieldId">
882
+ <ac-select
883
+ v-model="fieldData.sourceFieldId"
884
+ :options="dataFieldIdOptions[fieldData.nativeFieldId]"
885
+ />
886
+ </el-form-item>
887
+ </el-col>
888
+ <el-col
889
+ v-if="fieldData.fieldType === '联动' || fieldData.fieldType === '派生'"
890
+ :span="8"
891
+ >
892
+ <el-form-item label="联动类型" :prop="fieldData.fieldType === '派生' ? '' : 'relevanceType'">
893
+ <ac-select
894
+ v-model="fieldData.relevanceType"
895
+ options="数据模型,区划树,单位树,企业树,部门树,人员树,字典树,字典开关,字典单选框,字典下拉框"
896
+ />
897
+ </el-form-item>
898
+ </el-col>
899
+ <el-col :span="8" v-if="(fieldData.fieldType === '联动' || fieldData.fieldType === '派生')
900
+ && fieldData.relevanceType
901
+ && fieldData.relevanceType.startsWith('字典')"
902
+ >
903
+ <el-form-item label="联动字典" :prop="fieldData.fieldType === '派生' ? '' : 'relevanceDict'">
904
+ <ac-tree
905
+ v-model="fieldData.relevanceDict"
906
+ data-url="/system/dictionary/queryTree"
907
+ :leafSelect="false"
908
+ />
909
+ </el-form-item>
910
+ </el-col>
911
+ <el-col :span="8" v-if="fieldData.fieldType === '派生' || (fieldData.nativeFieldId && fieldData.nativeFieldName)">
912
+ <el-form-item label="原生字段" prop="nativeFieldName">
913
+ <el-input v-model="fieldData.nativeFieldName" :disabled="true" />
914
+ </el-form-item>
915
+ </el-col>
916
+ <el-col :span="8" v-if="'字符,小数,日期'.indexOf(fieldData.fieldType) >= 0">
917
+ <el-form-item label="字段长度" prop="fieldSize">
918
+ <ac-number
919
+ v-model="fieldData.fieldSize"
920
+ :point="0"
921
+ :disabled="fieldData.builtin === '1'"
922
+ />
923
+ </el-form-item>
924
+ </el-col>
925
+ <el-col
926
+ v-if="fieldData.fieldType === '小数'"
927
+ :span="8"
928
+ >
929
+ <el-form-item label="字段精度" prop="fieldPrecision">
930
+ <ac-number
931
+ v-model="fieldData.fieldPrecision"
932
+ :point="0"
933
+ :disabled="fieldData.builtin === '1'"
934
+ />
935
+ </el-form-item>
936
+ </el-col>
937
+ <el-col v-if="fieldData.fieldType === '日期'" :span="8">
938
+ <el-form-item label="日期框类型" prop="inputType">
939
+ <ac-select v-model="fieldData.inputType" options="日期单选框,日期多选框" />
940
+ </el-form-item>
941
+ </el-col>
942
+ <el-col
943
+ v-if="fieldData.fieldType === '大文本'"
944
+ :span="8"
945
+ >
946
+ <el-form-item label="文本框类型" prop="inputType">
947
+ <ac-select v-model="fieldData.inputType" options="多行文本框,富文本框" />
948
+ </el-form-item>
949
+ </el-col>
950
+ <el-col
951
+ v-if="fieldData.fieldType === '大文本' && fieldData.inputType === '多行文本框'"
952
+ :span="8"
953
+ >
954
+ <el-form-item label="文本框行数" prop="rowLine">
955
+ <ac-number v-model="fieldData.rowLine" :point="0" />
956
+ </el-form-item>
957
+ </el-col>
958
+ <el-col :span="8" v-if="fieldData.fieldType === '日期'">
959
+ <el-form-item label="格式" prop="format">
960
+ <template #label>
961
+ <span style="margin-right: 5px">格式</span>
962
+ <el-tooltip effect="dark" popper-class="padding-10-15">
963
+ <template #content>
964
+ <ul class="tips-box">
965
+ <li>YYYY:4位年份</li>
966
+ <li>MM:2位月份</li>
967
+ <li>DD:2位日期</li>
968
+ <li v-if="fieldData.inputType === '日期单选框'">HH:2位小时</li>
969
+ <li v-if="fieldData.inputType === '日期单选框'">mm:2位分钟</li>
970
+ <li v-if="fieldData.inputType === '日期单选框'">ss:2位秒数</li>
971
+ <li v-if="fieldData.inputType === '日期单选框'">示例:YYYY-MM-DD HH:mm:ss 2025-01-01 23:59:00</li>
972
+ <li v-if="fieldData.inputType === '日期多选框'">示例:YYYY-MM-DD 2025-01-01</li>
973
+ <li>默认格式为:YYYY-MM-DD</li>
974
+ </ul>
975
+ </template>
976
+ <ac-icon iconId="018dca8ec9890493be26" />
977
+ </el-tooltip>
978
+ </template>
979
+ <el-input v-model="fieldData.format" auto-complete="off"></el-input>
980
+ </el-form-item>
981
+ </el-col>
982
+ <el-col :span="8" v-if="'字符,整数,小数,日期,时间,联动'.indexOf(fieldData.fieldType) >= 0">
983
+ <el-form-item label="默认值" prop="defaultValue">
984
+ <template #label>
985
+ <span style="margin-right: 5px">默认值</span>
986
+ <ac-default-value-tips />
987
+ </template>
988
+ <el-input v-model="fieldData.defaultValue" auto-complete="off"></el-input>
989
+ </el-form-item>
990
+ </el-col>
991
+ </el-row>
992
+ <el-row v-if="fieldData.fieldType === '字符'">
993
+ <el-col :span="8">
994
+ <el-form-item label="自动生成" prop="autoCreate">
995
+ <ac-dict-switch v-model="fieldData.autoCreate" dictCode="dictYesNo" />
996
+ </el-form-item>
997
+ </el-col>
998
+ <el-col :span="8" v-if="fieldData.autoCreate === '1'">
999
+ <el-form-item label="自动生成序" prop="autoSequenceId">
1000
+ <ac-remote-select
1001
+ v-model="fieldData.autoSequenceId"
1002
+ dataUrl="/system/sequence/queryPage"
1003
+ :option="{id: fieldData.autoSequenceId, name: fieldData.autoSequenceName}"
1004
+ />
1005
+ </el-form-item>
1006
+ </el-col>
1007
+ <el-col :span="8">
1008
+ <el-form-item v-if="fieldData.autoCreate === '0'" label="是否枚举" prop="enumerate">
1009
+ <ac-dict-switch v-model="fieldData.enumerate" dictCode="dictYesNo" />
1010
+ </el-form-item>
1011
+ </el-col>
1012
+ <el-col :span="8" v-if="fieldData.autoCreate === '0' && fieldData.enumerate === '1'">
1013
+ <el-form-item label="枚举类型" prop="enumerateType">
1014
+ <ac-select
1015
+ v-model="fieldData.enumerateType"
1016
+ options="开关,单选框,多选框,下拉框,多选下拉框,单位多选,企业多选,部门多选,人员多选,角色多选"
1017
+ />
1018
+ </el-form-item>
1019
+ </el-col>
1020
+ <el-col
1021
+ :span="8"
1022
+ v-if="fieldData.autoCreate === '0'
1023
+ && fieldData.enumerate === '1'
1024
+ && fieldData.enumerateType !== '单位多选'
1025
+ && fieldData.enumerateType !== '企业多选'
1026
+ && fieldData.enumerateType !== '部门多选'
1027
+ && fieldData.enumerateType !== '人员多选'
1028
+ && fieldData.enumerateType !== '角色多选'"
1029
+ >
1030
+ <el-form-item label="枚举值" prop="enumerateValue">
1031
+ <el-input v-model="fieldData.enumerateValue" auto-complete="off"></el-input>
1032
+ </el-form-item>
1033
+ </el-col>
1034
+ <el-col
1035
+ v-if="fieldData.autoCreate === '0' && fieldData.enumerate === '0' && fieldData.fieldType === '字符'"
1036
+ :span="8"
1037
+ >
1038
+ <el-form-item label="文本框类型" prop="inputType">
1039
+ <ac-select v-model="fieldData.inputType" options="单行文本框,密码文本框,多行文本框" />
1040
+ </el-form-item>
1041
+ </el-col>
1042
+ <el-col
1043
+ v-if="fieldData.autoCreate === '0'
1044
+ && fieldData.enumerate === '0'
1045
+ && fieldData.fieldType === '字符'
1046
+ && fieldData.inputType === '多行文本框'"
1047
+ :span="8"
1048
+ >
1049
+ <el-form-item label="文本框行数" prop="rowLine">
1050
+ <ac-number v-model="fieldData.rowLine" :point="0" />
1051
+ </el-form-item>
1052
+ </el-col>
1053
+ <el-col
1054
+ v-if="fieldData.autoCreate === '0' && fieldData.enumerate === '0' && fieldData.fieldType === '字符'"
1055
+ :span="8"
1056
+ >
1057
+ <el-form-item label="删除前后空格" prop="trimBlank">
1058
+ <ac-dict-switch v-model="fieldData.trimBlank" dictCode="dictYesNo" />
1059
+ </el-form-item>
1060
+ </el-col>
1061
+ </el-row>
1062
+ <el-row v-if="'整数,小数'.indexOf(fieldData.fieldType) >= 0">
1063
+ <el-col :span="8">
1064
+ <el-form-item label="最小值" prop="minValue">
1065
+ <ac-number v-model="fieldData.minValue" :point="0" />
1066
+ </el-form-item>
1067
+ </el-col>
1068
+ <el-col :span="8">
1069
+ <el-form-item label="最大值" prop="maxValue">
1070
+ <ac-number v-model="fieldData.maxValue" :point="0" />
1071
+ </el-form-item>
1072
+ </el-col>
1073
+ </el-row>
1074
+ <el-row v-if="'整数,小数'.indexOf(fieldData.fieldType) >= 0">
1075
+ <el-col :span="8">
1076
+ <el-form-item label="包含最小值" prop="containMinValue">
1077
+ <ac-dict-switch v-model="fieldData.containMinValue" dictCode="dictYesNo" />
1078
+ </el-form-item>
1079
+ </el-col>
1080
+ <el-col :span="8">
1081
+ <el-form-item label="包含最大值" prop="containMaxValue">
1082
+ <ac-dict-switch v-model="fieldData.containMaxValue" dictCode="dictYesNo" />
1083
+ </el-form-item>
1084
+ </el-col>
1085
+ </el-row>
1086
+ <el-row v-if="fieldData.fieldType === '图片' || fieldData.fieldType === '视频'">
1087
+ <el-col :span="8" v-if="fieldData.fieldType === '图片'">
1088
+ <el-form-item :label="fieldData.fieldType + '样式'" prop="imageStyle">
1089
+ <ac-radio v-model="fieldData.imageStyle" options="长方形,圆形" />
1090
+ </el-form-item>
1091
+ </el-col>
1092
+ <!--
1093
+ <el-col :span="8">
1094
+ <el-form-item :label="fieldData.fieldType + '数量限制'" prop="imageLimit">
1095
+ <ac-number v-model="fieldData.imageLimit" :point="0" />
1096
+ </el-form-item>
1097
+ </el-col>
1098
+ -->
1099
+ <el-col :span="8">
1100
+ <el-form-item :label="fieldData.fieldType + '宽度'" prop="imageWidth">
1101
+ <ac-number v-model="fieldData.imageWidth" :point="0" />
1102
+ </el-form-item>
1103
+ </el-col>
1104
+ <el-col :span="8">
1105
+ <el-form-item :label="fieldData.fieldType + '高度'" prop="imageHeight">
1106
+ <ac-number v-model="fieldData.imageHeight" :point="0" />
1107
+ </el-form-item>
1108
+ </el-col>
1109
+ <el-col :span="8" v-if="fieldData.fieldType === '图片'">
1110
+ <el-form-item label="开启手绘" prop="handDraw">
1111
+ <ac-dict-switch v-model="fieldData.handDraw" dictCode="dictYesNo" />
1112
+ </el-form-item>
1113
+ </el-col>
1114
+ <el-col :span="8">
1115
+ <el-form-item :label="fieldData.fieldType + '大小限制(M)'" prop="imageMaxSize">
1116
+ <ac-number v-model="fieldData.imageMaxSize" :point="0" />
1117
+ </el-form-item>
1118
+ </el-col>
1119
+ </el-row>
1120
+ <el-row v-if="fieldData.fieldType === '联动' && fieldData.relevanceType === '数据模型'">
1121
+ <el-col :span="24">
1122
+ <el-form-item label="联动配置">
1123
+ <div style="width: 100%;">
1124
+ <div >
1125
+ <el-button
1126
+ type="success"
1127
+ @click="addFieldRelevance"
1128
+ >添加联动层级</el-button>
1129
+ </div>
1130
+ <div style="padding-top: 5px">
1131
+ <el-table
1132
+ ref="sortFieldTable"
1133
+ :show-overflow-tooltip="false"
1134
+ tooltip-effect="light"
1135
+ class="field-table edit-table"
1136
+ width="100%"
1137
+ :data="fieldData.relevanceList"
1138
+ :border="true"
1139
+ :stripe="false"
1140
+ >
1141
+ <el-table-column
1142
+ header-align="center"
1143
+ label="数据模型"
1144
+ :min-width="120"
1145
+ >
1146
+ <template #default="scope">
1147
+ <ac-tree
1148
+ v-model="scope.row.dataModelId"
1149
+ data-url="/system/dataModel/queryTree"
1150
+ type-select="model"
1151
+ @change="loadDataFieldOptions(scope.row)"
1152
+ />
1153
+ </template>
1154
+ </el-table-column>
1155
+ <el-table-column
1156
+ header-align="center"
1157
+ label="节点字段"
1158
+ :min-width="120"
1159
+ >
1160
+ <template #default="scope">
1161
+ <ac-select v-model="scope.row.nodeFieldId" :options="scope.row.fieldOptions"/>
1162
+ </template>
1163
+ </el-table-column>
1164
+ <el-table-column
1165
+ header-align="center"
1166
+ label="父节点字段"
1167
+ :min-width="120"
1168
+ >
1169
+ <template #header>
1170
+ <el-tooltip>
1171
+ <template #content>
1172
+ <div>
1173
+ <div>
1174
+ 当层级为一层时:如果未录入此字段,则使用下拉框的形式选择联动数据,
1175
+ 否则使用树形控件形式选择联动数据。
1176
+ </div>
1177
+ <div>
1178
+ 当层级有多层时:第一层不用录入此字段,
1179
+ 第二层开始此字段应录入上一层级主键对应的字段,
1180
+ 使用树形控件形式选择联动数据
1181
+ </div>
1182
+ </div>
1183
+ </template>
1184
+ <span>
1185
+ <span style="margin-right: 5px">父节点字段</span>
1186
+ <ac-icon iconId="018dca8ec9890493be26" />
1187
+ </span>
1188
+ </el-tooltip>
1189
+ </template>
1190
+ <template #default="scope">
1191
+ <ac-select v-model="scope.row.parentFieldId" :options="scope.row.fieldOptions"/>
1192
+ </template>
1193
+ </el-table-column>
1194
+ <el-table-column
1195
+ header-align="center"
1196
+ label="显示字段"
1197
+ :min-width="120"
1198
+ >
1199
+ <template #default="scope">
1200
+ <ac-select v-model="scope.row.showFieldId" :options="scope.row.fieldOptions"/>
1201
+ </template>
1202
+ </el-table-column>
1203
+ <el-table-column
1204
+ header-align="center"
1205
+ label="排序字段"
1206
+ :min-width="120"
1207
+ >
1208
+ <template #default="scope">
1209
+ <ac-select v-model="scope.row.ordinalFieldId" :options="scope.row.fieldOptions"/>
1210
+ </template>
1211
+ </el-table-column>
1212
+ <el-table-column
1213
+ header-align="center"
1214
+ label="过滤字段"
1215
+ :min-width="120"
1216
+ >
1217
+ <template #default="scope">
1218
+ <ac-select v-model="scope.row.filterFieldId" :options="scope.row.fieldOptions"/>
1219
+ </template>
1220
+ </el-table-column>
1221
+ <el-table-column
1222
+ header-align="center"
1223
+ label="过滤值字段"
1224
+ :min-width="120"
1225
+ >
1226
+ <template #default="scope">
1227
+ <ac-select v-model="scope.row.filterValueFieldId" :options="dataFieldOptions"/>
1228
+ </template>
1229
+ </el-table-column>
1230
+ <el-table-column
1231
+ header-align="center"
1232
+ align="center"
1233
+ label="操作"
1234
+ width="80"
1235
+ prop="width"
1236
+ >
1237
+ <template #default="scope">
1238
+ <el-button
1239
+ type="danger"
1240
+ @click="deleteFieldRelevance(scope.row)"
1241
+ link
1242
+ >删除</el-button>
1243
+ </template>
1244
+ </el-table-column>
1245
+ </el-table>
1246
+ </div>
1247
+ </div>
1248
+ </el-form-item>
1249
+ </el-col>
1250
+ </el-row>
1251
+ <el-row>
1252
+ <el-col :span="24">
1253
+ <el-form-item label="字段描述" prop="description">
1254
+ <el-input v-model="fieldData.description" type="textarea" :rows="5" auto-complete="off"></el-input>
1255
+ </el-form-item>
1256
+ </el-col>
1257
+ </el-row>
1258
+ </el-form>
1259
+ <template #footer>
1260
+ <el-button
1261
+ size="default"
1262
+ type="info"
1263
+ @click="fieldVisible=false"
1264
+ >取消</el-button>
1265
+ <el-button
1266
+ type="primary"
1267
+ size="default"
1268
+ @click="submitFieldForm"
1269
+ >确定</el-button>
1270
+ </template>
1271
+ </el-dialog>
1272
+
1273
+ <!-- 新增/编辑表格 -->
1274
+ <el-dialog
1275
+ v-model="tableVisible"
1276
+ title="编辑表格"
1277
+ class="no-padding"
1278
+ :close-on-click-modal="false"
1279
+ destroy-on-close
1280
+ fullscreen
1281
+ draggable
1282
+ >
1283
+ <DataTableEdit ref="tableComp" :options="tableData" @afterSubmit="afterTableSubmit"/>
1284
+ <template #footer>
1285
+ <el-button
1286
+ size="default"
1287
+ type="info"
1288
+ @click="tableVisible=false"
1289
+ >取消</el-button>
1290
+ <el-button
1291
+ type="primary"
1292
+ size="default"
1293
+ @click="submitTableForm"
1294
+ >提交</el-button>
1295
+ </template>
1296
+ </el-dialog>
1297
+
1298
+ <!-- 新增/编辑表单 -->
1299
+ <el-dialog
1300
+ v-model="formVisible"
1301
+ title="编辑表单"
1302
+ class="no-padding"
1303
+ :close-on-click-modal="false"
1304
+ destroy-on-close
1305
+ fullscreen
1306
+ draggable
1307
+ >
1308
+ <DataFormEdit ref="formComp" :options="formData" @afterSubmit="afterFormSubmit"/>
1309
+ <template #footer>
1310
+ <el-button
1311
+ size="default"
1312
+ type="info"
1313
+ @click="formVisible=false"
1314
+ >取消</el-button>
1315
+ <el-button
1316
+ type="primary"
1317
+ size="default"
1318
+ @click="submitFormForm"
1319
+ >提交</el-button>
1320
+ </template>
1321
+ </el-dialog>
1322
+
1323
+ <!-- 预览 -->
1324
+ <el-dialog
1325
+ v-model="previewVisible"
1326
+ :title="previewTitle"
1327
+ :close-on-click-modal="false"
1328
+ class="no-padding"
1329
+ destroy-on-close
1330
+ fullscreen
1331
+ draggable
1332
+ >
1333
+ <div :class="['preview-container', previewPadding ? 'padding20' : 'padding10']">
1334
+ <component :is="previewComp" v-bind="previewOptions" />
1335
+ </div>
1336
+ </el-dialog>
1337
+ </template>
1338
+
1339
+ <script setup>
1340
+ import { ref, nextTick, watch, onMounted, markRaw } from 'vue';
1341
+ import { ElMessage, ElMessageBox } from 'element-plus';
1342
+ import Sortable from 'sortablejs';
1343
+ import api from '@/http/api';
1344
+ import tool from '@/utils/tool';
1345
+ import DataTableEdit from '@/views/codeless/dataTableEdit.vue';
1346
+ import DataFormEdit from '@/views/codeless/dataFormEdit.vue';
1347
+ import Table from '@/codeless/view/table.vue';
1348
+ import Form from '@/codeless/view/form.vue';
1349
+ import loading from '@/utils/loading';
1350
+ import date from '@/utils/date';
1351
+ import { clearCache } from '@/utils/codeless';
1352
+
1353
+ const plusButtons = [
1354
+ { type: 'model', name: '新建模型', iconId: '018dc9c3efb74ac607cb', iconColor: '#67C23A' },
1355
+ { type: 'folder', name: '新建目录', iconId: '018dc9c3efed6d208a59', iconColor: 'orange', divider: true },
1356
+ ];
1357
+
1358
+ const tree = ref();
1359
+ const filterText = ref('');
1360
+ const treeLoading = ref(false);
1361
+ const treeKey = ref('');
1362
+ const treeData = ref([]);
1363
+ const treeExpand = ref([]);
1364
+ const treeProps = ref({
1365
+ children: 'children',
1366
+ label: function(data) {
1367
+ return data.text +
1368
+ (data.data.code !== undefined && data.data.code != null
1369
+ ? ' [' + data.data.code + '] '
1370
+ : ' ')
1371
+ }
1372
+ });
1373
+ const treeCheck = ref(false);
1374
+
1375
+ const folderTitle = ref('');
1376
+ const folderVisible = ref(false);
1377
+ const folderLoading = ref(false);
1378
+ const folderForm = ref();
1379
+ const folderData = ref({});
1380
+ const folderRules = ref({
1381
+ name: [{ required: true, message: '请输入目录名称', trigger: ['blur', 'change'] }],
1382
+ });
1383
+
1384
+ const moveTitle = ref('');
1385
+ const moveVisible = ref(false);
1386
+ const moveLoading = ref(false);
1387
+ const moveForm = ref();
1388
+ const moveData = ref({});
1389
+
1390
+ const fieldFlag = ref(1);
1391
+ const fieldVisible = ref(false);
1392
+ const fieldForm = ref();
1393
+ const fieldData = ref({});
1394
+ const fieldRules = ref({
1395
+ fieldName: [
1396
+ { required: true, message: '请输入字段名称', trigger: ['change', 'blur'] },
1397
+ { max: 50, message: '长度必须小于等于 50 个字符!', trigger: ['change', 'blur'] }
1398
+ ],
1399
+ showName: [
1400
+ { required: true, message: '请输入显示名称', trigger: ['change', 'blur'] },
1401
+ { max: 100, message: '长度必须小于等于 100 个字符!', trigger: ['change', 'blur'] }
1402
+ ],
1403
+ required: [
1404
+ { required: true, message: '请选择是否必填', trigger: ['change', 'blur'] },
1405
+ ],
1406
+ fieldType: [
1407
+ { required: true, message: '请选择字段类型', trigger: ['change', 'blur'] },
1408
+ ],
1409
+ fieldSize: [
1410
+ { required: true, message: '请输入字段长度', trigger: ['change', 'blur'] }
1411
+ ],
1412
+ fieldPrecision: [
1413
+ { required: true, message: '请输入字段精度', trigger: ['change', 'blur'] }
1414
+ ],
1415
+ defaultValue: [
1416
+ { max: 100, message: '长度必须小于等于 100 个字符!', trigger: ['change', 'blur'] }
1417
+ ],
1418
+ enumerate: [
1419
+ { required: true, message: '请输入是否枚举', trigger: ['change', 'blur'] },
1420
+ ],
1421
+ enumerateType: [
1422
+ { required: true, message: '请选择枚举选择类型', trigger: ['change', 'blur'] },
1423
+ ],
1424
+ enumerateValue: [
1425
+ { required: true, message: '请输入枚举值', trigger: ['change', 'blur'] },
1426
+ { max: 1000, message: '长度必须小于等于 1000 个字符!', trigger: ['change', 'blur'] }
1427
+ ],
1428
+ autoCreate: [
1429
+ { required: true, message: '请选择自动生成', trigger: ['change', 'blur'] },
1430
+ ],
1431
+ autoSequenceId: [
1432
+ { required: true, message: '请选择自动生成序', trigger: ['change', 'blur'] },
1433
+ ],
1434
+ relevanceType: [
1435
+ { required: true, message: '请选择联动类型', trigger: ['change', 'blur'] },
1436
+ ],
1437
+ relevanceDict: [
1438
+ { required: true, message: '请选择联动字典', trigger: ['change', 'blur'] },
1439
+ ],
1440
+ inputType: [
1441
+ { required: true, message: '请选择文本框类型', trigger: ['change', 'blur'] },
1442
+ ],
1443
+ trimBlank: [
1444
+ { required: true, message: '请选择是否删除前后空格', trigger: ['change', 'blur'] },
1445
+ ],
1446
+ imageStyle: [
1447
+ { required: true, message: '请选择样式', trigger: ['change', 'blur'] },
1448
+ ],
1449
+ imageHeight: [
1450
+ { required: true, message: '请输入高度', trigger: ['change', 'blur'] }
1451
+ ],
1452
+ imageWidth: [
1453
+ { required: true, message: '请输入宽度', trigger: ['change', 'blur'] }
1454
+ ],
1455
+ imageLimit: [
1456
+ { required: true, message: '请输入数量限制', trigger: ['change', 'blur'] }
1457
+ ],
1458
+ imageMaxSize: [
1459
+ { required: true, message: '请输入大小限制,单位为:M', trigger: ['change', 'blur'] }
1460
+ ],
1461
+ description: [
1462
+ { max: 1000, message: '长度必须小于等于 1000 个字符!', trigger: ['change', 'blur'] }
1463
+ ],
1464
+ });
1465
+
1466
+ const viewLoading = ref(false);
1467
+
1468
+ const dataModelShow = ref(false);
1469
+ const dataModelId = ref('');
1470
+ const dataModelForm = ref();
1471
+ const dataModelLoading = ref(false);
1472
+ const dataModelData = ref({});
1473
+ const dataModelRules = ref({
1474
+ name: [
1475
+ { required: true, message: '请输入数据模型名称', trigger: ['blur', 'change'] },
1476
+ { min: 1, max: 100, message: '数据模型名称长度最多为100个字符', trigger: ['blur', 'change'] },
1477
+ ],
1478
+ type: [
1479
+ { required: true, message: '请选择数据模型类型', trigger: ['blur', 'change'] },
1480
+ ],
1481
+ });
1482
+
1483
+ const tabName = ref('field')
1484
+ const dataFieldLoading = ref(false);
1485
+ const dataFieldList = ref([]);
1486
+ const dataIndexLoading = ref(false);
1487
+ const dataIndexList = ref([]);
1488
+ const sortTable = ref();
1489
+ const sortTableIndex = ref();
1490
+ const sortableInst = ref();
1491
+ const sortableIndexInst = ref();
1492
+ const dataTableList = ref([]);
1493
+ const dataFormList = ref([]);
1494
+
1495
+ const tableComp = ref();
1496
+ const tableVisible = ref(false);
1497
+ const tableData = ref({});
1498
+
1499
+ const formComp = ref();
1500
+ const formVisible = ref(false);
1501
+ const formData = ref({});
1502
+
1503
+ const previewVisible = ref(false);
1504
+ const previewPadding = ref(false);
1505
+ const previewTitle = ref('');
1506
+ const previewOptions = ref({});
1507
+ const previewComp = ref();
1508
+
1509
+ const rowFlag = ref(0);
1510
+
1511
+ const sortDataField = () => {
1512
+ if (sortableInst.value) {
1513
+ sortableInst.value.destroy();
1514
+ }
1515
+
1516
+ if (sortTable.value) {
1517
+ const el = sortTable.value.$el.querySelector('.el-table__body-wrapper tbody');
1518
+ sortableInst.value = Sortable.create(el, {
1519
+ handle: '.el-table__row',
1520
+ onEnd: ({ newIndex, oldIndex }) => {
1521
+ const list = tool.deepClone(dataFieldList.value);
1522
+ const currRow = list.splice(oldIndex, 1)[0];
1523
+ list.splice(newIndex, 0, currRow);
1524
+ nextTick(() => {
1525
+ dataFieldList.value = list;
1526
+ });
1527
+ },
1528
+ onMove(e) {
1529
+ return e.related.className.indexOf('builtin') === -1;
1530
+ }
1531
+ });
1532
+ }
1533
+ };
1534
+
1535
+ const unSortDataField = () => {
1536
+ if (sortableInst.value) {
1537
+ sortableInst.value.destroy();
1538
+ }
1539
+ sortableInst.value = null;
1540
+ };
1541
+
1542
+ const sortDataIndex = () => {
1543
+ if (sortableIndexInst.value) {
1544
+ sortableIndexInst.value.destroy();
1545
+ }
1546
+
1547
+ if (sortTableIndex.value) {
1548
+ const el = sortTableIndex.value.$el.querySelector('.el-table__body-wrapper tbody');
1549
+ sortableIndexInst.value = Sortable.create(el, {
1550
+ handle: '.el-table__row',
1551
+ onEnd: ({ newIndex, oldIndex }) => {
1552
+ const list = tool.deepClone(dataIndexList.value);
1553
+ const currRow = list.splice(oldIndex, 1)[0];
1554
+ list.splice(newIndex, 0, currRow);
1555
+ nextTick(() => {
1556
+ dataIndexList.value = list;
1557
+ });
1558
+ }
1559
+ });
1560
+ }
1561
+ };
1562
+
1563
+ const unSortDataIndex = () => {
1564
+ if (sortableIndexInst.value) {
1565
+ sortableIndexInst.value.destroy();
1566
+ }
1567
+ sortableIndexInst.value = null;
1568
+ };
1569
+
1570
+ const filterNode = (value, data) => {
1571
+ if (!value) return true;
1572
+ return data.text.indexOf(value) >= 0 ||
1573
+ (data.data.code != null && data.data.code.indexOf(value) >= 0);
1574
+ };
1575
+
1576
+ const currNode = ref();
1577
+ const nodeClick = (data, treeNode) => {
1578
+ unSortDataField();
1579
+ dataFieldList.value = [];
1580
+
1581
+ if (currNode.value && currNode.value.id === data.id) {
1582
+ treeNode.checked = !treeNode.checked;
1583
+ } else {
1584
+ treeNode.checked = true;
1585
+ }
1586
+
1587
+ if (treeNode.checked) {
1588
+ currNode.value = data;
1589
+ if (data.type === 'folder') {
1590
+ dataModelId.value = '';
1591
+ dataModelShow.value = false;
1592
+ dataModelLoading.value = false;
1593
+ } else {
1594
+ dataModelShow.value = true;
1595
+ dataModelId.value = data.id;
1596
+ loadDataModel(dataModelId.value);
1597
+ nextTick(() => {
1598
+ dataModelForm.value && dataModelForm.value.clearValidate();
1599
+ });
1600
+ }
1601
+ } else {
1602
+ tree.value.setCurrentKey(null);
1603
+ dataModelId.value = '';
1604
+ dataModelShow.value = false;
1605
+ dataModelLoading.value = false;
1606
+ }
1607
+ };
1608
+
1609
+ const initDataModel = (data) => {
1610
+ dataModelShow.value = true;
1611
+ tabName.value = 'field';
1612
+ dataModelId.value = data.id || '';
1613
+ dataModelForm.value && dataModelForm.value.resetFields();
1614
+ dataModelData.value = { folderId: data.folderId || '', type: data.type || '1' };
1615
+ dataModelLoading.value = false;
1616
+ dataFieldLoading.value = false;
1617
+ dataIndexLoading.value = false;
1618
+ dataFieldList.value = [];
1619
+ dataIndexList.value = [];
1620
+
1621
+ unSortDataField();
1622
+ loadDataModel(dataModelId.value);
1623
+ nextTick(() => {
1624
+ dataModelForm.value && dataModelForm.value.clearValidate();
1625
+ });
1626
+ };
1627
+
1628
+ const loadDataModel = (id) => {
1629
+ if (!id) {
1630
+ currNode.value = null;
1631
+ tree.value.setCurrentKey(null);
1632
+ return;
1633
+ }
1634
+
1635
+ dataModelLoading.value = true;
1636
+ api.post('/system/dataModel/queryBy', { id: id }).then(res => {
1637
+ dataModelLoading.value = false;
1638
+ dataModelData.value = res.data;
1639
+ loadDataField(res.data.id);
1640
+ loadDataIndex(res.data.id);
1641
+ loadDataTable(res.data.id);
1642
+ loadDataForm(res.data.id);
1643
+ }).catch(() => {
1644
+ dataModelLoading.value = false;
1645
+ });
1646
+ };
1647
+
1648
+ const loadDataTable = (modelId) => {
1649
+ dataTableList.value = [];
1650
+ api.post('/system/dataTable/queryList', { modelId: modelId }).then(res => {
1651
+ dataTableList.value = res.data;
1652
+ });
1653
+ };
1654
+
1655
+ const loadDataForm = (modelId) => {
1656
+ dataFormList.value = [];
1657
+ api.post('/system/dataForm/queryList', { modelId: modelId }).then(res => {
1658
+ dataFormList.value = res.data;
1659
+ });
1660
+ };
1661
+
1662
+ const dataFieldOptions = ref([]);
1663
+ const loadDataField = (modelId) => {
1664
+ dataFieldLoading.value = true;
1665
+ api.post('/system/dataField/queryList', { modelId: modelId }).then(res => {
1666
+ dataFieldList.value = res.data || [];
1667
+ dataFieldLoading.value = false;
1668
+ dataFieldOptions.value = [];
1669
+ dataFieldList.value.forEach(data => {
1670
+ dataFieldOptions.value.push({ key: data.id, value: data.showName });
1671
+ });
1672
+ }).catch(() => {
1673
+ dataFieldLoading.value = false;
1674
+ });
1675
+ };
1676
+
1677
+ const loadDataIndex = (modelId) => {
1678
+ dataIndexLoading.value = true;
1679
+ api.post('/system/dataIndex/queryList', { modelId: modelId }).then(res => {
1680
+ dataIndexList.value = res.data || [];
1681
+ dataIndexLoading.value = false;
1682
+ }).catch(() => {
1683
+ dataIndexLoading.value = false;
1684
+ });
1685
+ };
1686
+
1687
+ const loadView = () => {
1688
+ viewLoading.value = true;
1689
+ api.post('/system/view/queryColumn', { id: dataModelData.value.sourceId }).then(res => {
1690
+ viewLoading.value = false;
1691
+
1692
+ (res.data.columnList || []).forEach(column => {
1693
+ if (!dataFieldList.value.find(field => field.fieldName === column.columnLabel)) {
1694
+ const fieldType = column.dataType || '字符';
1695
+ dataFieldList.value.push({
1696
+ fieldFlag: ++fieldFlag.value,
1697
+ fieldName: column.columnLabel,
1698
+ showName: column.columnLabel,
1699
+ fieldSize: fieldType === '小数'
1700
+ ? column.columnSize
1701
+ : (fieldType === '字符' || fieldType === '整数' ? column.columnSize : null),
1702
+ fieldPrecision: fieldType === '小数' ? column.columnPrecision : null,
1703
+ fieldType: fieldType,
1704
+ inputType: fieldType === '字符' ? '单行文本框' : null,
1705
+ trimBlank: fieldType === '字符' ? '1' : null,
1706
+ });
1707
+ }
1708
+ });
1709
+ }).catch(e => {
1710
+ console.log(e)
1711
+ viewLoading.value = false;
1712
+ });
1713
+ };
1714
+
1715
+ const submitModelForm = () => {
1716
+ if (!dataFieldList.value || dataFieldList.value.length === 0) {
1717
+ ElMessage.error('字段不能为空!')
1718
+ return;
1719
+ }
1720
+
1721
+ const fieldNames = {};
1722
+ for (const field of dataFieldList.value) {
1723
+ if (!field.fieldName) {
1724
+ ElMessage.error('字段名称不能为空!');
1725
+ return;
1726
+ }
1727
+ if (fieldNames[field.fieldName]) {
1728
+ ElMessage.error('【' + field.fieldName + '】字段名称重复!');
1729
+ return;
1730
+ }
1731
+ fieldNames[field.fieldName] = true;
1732
+ if (!field.showName) {
1733
+ ElMessage.error('【' + field.fieldName + '】显示名称不能为空!');
1734
+ return;
1735
+ }
1736
+ if (field.fieldType === '字符' && !field.fieldSize) {
1737
+ ElMessage.error('【' + field.fieldName + '】字段长度不能为空!');
1738
+ return;
1739
+ }
1740
+ if (field.fieldType === '小数' && (!field.fieldSize || !field.fieldPrecision)) {
1741
+ ElMessage.error('【' + field.fieldName + '】字段长度/精度不能为空!');
1742
+ return;
1743
+ }
1744
+ if (field.fieldType === '联动' && !field.relevanceType) {
1745
+ ElMessage.error('【' + field.fieldName + '】字段联动类型不能为空!');
1746
+ return;
1747
+ }
1748
+ }
1749
+
1750
+ dataModelForm.value && dataModelForm.value.validate((valid) => {
1751
+ if (valid) {
1752
+ ElMessageBox.confirm('请确认是否提交?', '提示', { type: 'info' }).then(() => {
1753
+ const data = Object.assign({}, dataModelData.value);
1754
+ data.fieldList = tool.deepClone(dataFieldList.value || []);
1755
+ data.fieldList.forEach(field => clearDataModelData(field));
1756
+ data.indexList = tool.deepClone(dataIndexList.value || []);
1757
+
1758
+ dataModelLoading.value = true;
1759
+ api.post('/system/dataModel/save', data).then(res => {
1760
+ ElMessage.success(res.message);
1761
+ dataModelLoading.value = false;
1762
+ dataModelData.value = res.data;
1763
+ dataModelId.value = res.data.id;
1764
+ loadDataModel(res.data.id);
1765
+
1766
+ treeExpand.value.push(res.data.id || '0');
1767
+ treeKey.value = res.data.id || '0';
1768
+ loadTreeData();
1769
+ }).catch(() => {
1770
+ dataModelLoading.value = false;
1771
+ });
1772
+ }).catch(() => {});
1773
+ }
1774
+ });
1775
+ };
1776
+
1777
+ const clearDataModelData = (data) => {
1778
+ if ('字符,整数,小数,日期,时间,联动'.indexOf(data.fieldType) < 0) {
1779
+ data.defaultValue = null;
1780
+ }
1781
+ if ('字符,日期,小数'.indexOf(data.fieldType) < 0) {
1782
+ data.fieldSize = null;
1783
+ }
1784
+ if ('字符,日期,大文本'.indexOf(data.fieldType) < 0) {
1785
+ data.inputType = null;
1786
+ }
1787
+ if (data.fieldType !== '字符') {
1788
+ data.trimBlank = null;
1789
+ data.enumerate = null;
1790
+ }
1791
+ if (data.autoCreate === '1') {
1792
+ data.enumerate = null;
1793
+ data.enumerateType = null;
1794
+ data.enumerateValue = null;
1795
+ } else {
1796
+ data.autoSequenceId = null;
1797
+ }
1798
+ if (data.enumerate !== '1') {
1799
+ data.enumerateType = null;
1800
+ data.enumerateValue = null;
1801
+ }
1802
+ if (data.fieldType !== '小数') {
1803
+ data.fieldPrecision = null;
1804
+ }
1805
+ if ('整数,小数'.indexOf(data.fieldType) < 0) {
1806
+ data.minValue = null;
1807
+ data.maxValue = null;
1808
+ data.containMinValue = null;
1809
+ data.containMaxValue = null;
1810
+ }
1811
+ if (data.fieldType !== '图片' && data.fieldType !== '视频') {
1812
+ data.imageStyle = null;
1813
+ data.imageLimit = null;
1814
+ data.imageWidth = null;
1815
+ data.imageHeight = null;
1816
+ data.imageMaxSize = null;
1817
+ }
1818
+ if (data.fieldType !== '联动') {
1819
+ data.relevanceList = [];
1820
+ }
1821
+ return data;
1822
+ };
1823
+
1824
+ const getFieldRowKey = row => {
1825
+ return row.id || row.fieldFlag;
1826
+ };
1827
+
1828
+ const getRowClassName = row => {
1829
+ return row.row.builtin === '1' ? 'builtin' : '';
1830
+ };
1831
+
1832
+ const getIndexRowKey = row => {
1833
+ return row.id || row.indexFlag;
1834
+ };
1835
+
1836
+ const addDataIndex = () => {
1837
+ const data = {
1838
+ isNew: false,
1839
+ indexFlag: ++fieldFlag.value,
1840
+ indexUnique: '0',
1841
+ indexOrdinal: '升序',
1842
+ };
1843
+ dataIndexList.value.push(data);
1844
+ };
1845
+
1846
+ const deleteDataIndex = (data) => {
1847
+ const tips = data.fieldName ? ('请确认是否删除【' + data.indexName + '】?') : '请确认是否删除?';
1848
+ ElMessageBox.confirm(tips, '提示', { type: 'warning' }).then(() => {
1849
+ const index = dataIndexList.value.findIndex(item =>
1850
+ (data.id && item.id === data.id) || (item.indexFlag > 0 && item.indexFlag === data.indexFlag));
1851
+ dataIndexList.value.splice(index, 1);
1852
+ }).catch(() => {});
1853
+ };
1854
+
1855
+ const addSimpleField = () => {
1856
+ const data = {
1857
+ isNew: false,
1858
+ fieldFlag: ++fieldFlag.value,
1859
+ required: '0',
1860
+ fieldType: '字符',
1861
+ fieldSize: 255,
1862
+ fieldPrecision: null,
1863
+ autoCreate: '0',
1864
+ enumerate: '0',
1865
+ enumerateType: '下拉框',
1866
+ inputType: '单行文本框',
1867
+ trimBlank: '1',
1868
+ imageStyle: '长方形',
1869
+ imageHeight: 200,
1870
+ imageWidth: 200,
1871
+ imageLimit: 1,
1872
+ imageMaxSize: 10,
1873
+ };
1874
+ const index = dataFieldList.value.findIndex(item => item.ordinal >= 9900);
1875
+ if (index > 0) {
1876
+ dataFieldList.value.splice(index, 0, data);
1877
+ } else {
1878
+ dataFieldList.value.push(data);
1879
+ }
1880
+ };
1881
+
1882
+ const addDataField = () => {
1883
+ fieldData.value = {
1884
+ isNew: true,
1885
+ fieldFlag: ++fieldFlag.value,
1886
+ required: '0',
1887
+ fieldType: '字符',
1888
+ fieldSize: 255,
1889
+ fieldPrecision: 2,
1890
+ autoCreate: '0',
1891
+ enumerate: '0',
1892
+ enumerateType: '下拉框',
1893
+ inputType: '单行文本框',
1894
+ trimBlank: '1',
1895
+ imageStyle: '长方形',
1896
+ imageHeight: 200,
1897
+ imageWidth: 200,
1898
+ imageLimit: 1,
1899
+ imageMaxSize: 10,
1900
+ };
1901
+ fieldVisible.value = true;
1902
+ };
1903
+
1904
+ const changeFieldType = (data) => {
1905
+ if (data.fieldType === '字符') {
1906
+ data.fieldSize = 255;
1907
+ data.fieldPrecision = null;
1908
+ } else if (data.fieldType === '小数') {
1909
+ data.fieldSize = 18;
1910
+ data.fieldPrecision = 2;
1911
+ } else if (data.fieldType === '日期') {
1912
+ data.fieldSize = 20;
1913
+ data.inputType = '日期单选框';
1914
+ } else {
1915
+ data.fieldSize = null;
1916
+ data.fieldPrecision = null;
1917
+ }
1918
+ };
1919
+
1920
+ const editDataField = async(field) => {
1921
+ fieldData.value = tool.deepClone(field);
1922
+ for (const item of fieldData.value.relevanceList || []) {
1923
+ await loadDataFieldOptions(item);
1924
+ }
1925
+ if (fieldData.value.fieldType === '派生' || fieldData.value.nativeFieldId) {
1926
+ const nativeField = dataFieldList.value
1927
+ .find(item => fieldData.value.nativeFieldId === (item.id || ('temp_' + item.fieldFlag + '')));
1928
+ if (nativeField && nativeField.relevanceList && nativeField.relevanceList.length > 0) {
1929
+ await loadDataFieldIdOptions(
1930
+ nativeField.id || ('temp_' + nativeField.fieldFlag),
1931
+ nativeField.relevanceList[nativeField.relevanceList.length - 1]);
1932
+ }
1933
+ fieldData.value.nativeFieldName = nativeField?.fieldName || '';
1934
+ }
1935
+ fieldVisible.value = true;
1936
+ };
1937
+
1938
+ const copyDataField = async(field) => {
1939
+ const data = tool.deepClone(field || {});
1940
+ data.id = null;
1941
+ data.isNew = true;
1942
+ data.fieldName = (data.fieldName || '') + '_copy';
1943
+ data.showName = (data.showName || '') + '_copy';
1944
+ data.fieldFlag = ++fieldFlag.value;
1945
+ for (const item of data.relevanceList || []) {
1946
+ await loadDataFieldOptions(item);
1947
+ }
1948
+ fieldData.value = data;
1949
+ fieldVisible.value = true;
1950
+ };
1951
+
1952
+ const deriveDataField = async(field) => {
1953
+ const data = {};
1954
+ data.id = null;
1955
+ data.isNew = false;
1956
+ data.required = '0';
1957
+ data.fieldType = '派生';
1958
+ data.fieldSize = null;
1959
+ data.enumerate = '0';
1960
+ data.inputType = '单行文本框';
1961
+ data.fieldName = (field.fieldName || '') + '_派生';
1962
+ data.showName = (field.showName || '') + '_派生';
1963
+ data.nativeFieldId = field.id || ('temp_' + field.fieldFlag + '');
1964
+ data.fieldFlag = ++fieldFlag.value;
1965
+
1966
+ const index = dataFieldList.value.findIndex(item =>
1967
+ (field.id && item.id === field.id) || (item.fieldFlag > 0 && item.fieldFlag === field.fieldFlag));
1968
+ dataFieldList.value.splice(index + 1, 0, data);
1969
+ };
1970
+
1971
+ const deriveDept = async(field) => {
1972
+ const find = dataFieldList.value.find(item => item.nativeFieldId && item.nativeFieldId === (field.id || ('temp_' + field.fieldFlag + '')));
1973
+ if (find) return;
1974
+
1975
+ const data = {};
1976
+ data.id = null;
1977
+ data.isNew = false;
1978
+ data.required = '0';
1979
+ data.fieldType = '联动';
1980
+ data.relevanceType = '部门树';
1981
+ data.fieldSize = null;
1982
+ data.enumerate = '';
1983
+ data.inputType = '';
1984
+ data.fieldName = (field.fieldName || '') + '_部门';
1985
+ data.showName = (field.showName || '') + '_部门';
1986
+ data.nativeFieldId = field.id || ('temp_' + field.fieldFlag);
1987
+ data.fieldFlag = ++fieldFlag.value;
1988
+
1989
+ const index = dataFieldList.value.findIndex(item =>
1990
+ (field.id && item.id === field.id) || (item.fieldFlag > 0 && item.fieldFlag === field.fieldFlag));
1991
+ dataFieldList.value.splice(index + 1, 0, data);
1992
+ };
1993
+
1994
+ const deleteDataField = (data) => {
1995
+ const tips = data.fieldName ? ('请确认是否删除【' + data.fieldName + '】?') : '请确认是否删除?';
1996
+ ElMessageBox.confirm(tips, '提示', { type: 'warning' }).then(() => {
1997
+ const index = dataFieldList.value.findIndex(item =>
1998
+ (data.id && item.id === data.id) || (item.fieldFlag > 0 && item.fieldFlag === data.fieldFlag));
1999
+ dataFieldList.value.splice(index, 1);
2000
+ fieldVisible.value = false;
2001
+ }).catch(() => {});
2002
+ };
2003
+
2004
+ const submitFieldForm = () => {
2005
+ if (fieldData.value.fieldType === '字符' && fieldData.value.fieldSize && fieldData.value.fieldSize > 4000) {
2006
+ ElMessage.error('字段【字符长度】的最大值:4000!');
2007
+ return;
2008
+ } else if (fieldData.value.fieldType === '整数' && fieldData.value.maxValue && fieldData.value.maxValue > 2147483647) {
2009
+ ElMessage.error('字段【最大值】的最大值为:2147483647!');
2010
+ return;
2011
+ }
2012
+
2013
+ fieldForm.value && fieldForm.value.validate((valid) => {
2014
+ if (valid) {
2015
+ if (dataFieldList.value.findIndex(item => item.id !== fieldData.value.id &&
2016
+ item.fieldName === fieldData.value.fieldName) >= 0) {
2017
+ ElMessage.error('字段名称[' + fieldData.value.fieldName + ']已存在!');
2018
+ return;
2019
+ }
2020
+
2021
+ if (fieldData.value.isNew === true) {
2022
+ fieldData.value.isNew = false;
2023
+ const data = fieldData.value;
2024
+ const index = dataFieldList.value.findIndex(item => item.ordinal >= 9900);
2025
+ if (index > 0) {
2026
+ dataFieldList.value.splice(index, 0, data);
2027
+ } else {
2028
+ dataFieldList.value.push(data);
2029
+ }
2030
+ } else {
2031
+ const data = fieldData.value;
2032
+ const index = dataFieldList.value
2033
+ .findIndex(item => data.id ? item.id === data.id : item.fieldFlag === data.fieldFlag);
2034
+ dataFieldList.value[index] = data;
2035
+ }
2036
+
2037
+ if (fieldData.value.fieldType === '联动' && fieldData.value.relevanceType === '人员树') {
2038
+ deriveDept(fieldData.value);
2039
+ }
2040
+
2041
+ fieldData.value = {};
2042
+ fieldVisible.value = false;
2043
+ }
2044
+ });
2045
+ };
2046
+
2047
+ const addFieldRelevance = () => {
2048
+ if (!fieldData.value.relevanceList) {
2049
+ fieldData.value.relevanceList = [];
2050
+ }
2051
+
2052
+ fieldData.value.relevanceList.push({
2053
+ rowFlag: ++rowFlag.value
2054
+ });
2055
+ };
2056
+
2057
+ const deleteFieldRelevance = (data) => {
2058
+ const index = fieldData.value.relevanceList
2059
+ .findIndex(item => data.id ? item.id === data.id : item.rowFlag === data.rowFlag);
2060
+ fieldData.value.relevanceList.splice(index, 1);
2061
+ };
2062
+
2063
+ const dataFieldIdOptions = ref({});
2064
+ const loadDataFieldIdOptions = async(fieldId, data) => {
2065
+ if (!data.dataModelId) {
2066
+ data.fieldOptions = [];
2067
+ return;
2068
+ }
2069
+
2070
+ const options = [];
2071
+ const res = await api.post('/system/dataField/queryList', { modelId: data.dataModelId });
2072
+ (res && res.data || []).forEach(field => {
2073
+ options.push({ key: field.id, value: field.showName });
2074
+ });
2075
+ dataFieldIdOptions.value[fieldId] = options;
2076
+ };
2077
+
2078
+ const loadDataFieldOptions = async(data) => {
2079
+ if (!data.dataModelId) {
2080
+ data.fieldOptions = [];
2081
+ return;
2082
+ }
2083
+
2084
+ const options = [];
2085
+ const res = await api.post('/system/dataField/queryList', { modelId: data.dataModelId });
2086
+ (res && res.data || []).forEach(field => {
2087
+ options.push({ key: field.id, value: field.showName });
2088
+ });
2089
+ data.fieldOptions = options;
2090
+ };
2091
+
2092
+ const addDataTable = () => {
2093
+ if (!dataModelId.value) {
2094
+ return;
2095
+ }
2096
+
2097
+ tableData.value = { modelId: dataModelId.value };
2098
+ tableVisible.value = true;
2099
+ };
2100
+
2101
+ const editDataTable = (data) => {
2102
+ tableData.value = { id: data.id, modelId: data.modelId };
2103
+ tableVisible.value = true;
2104
+ };
2105
+
2106
+ const copyDataTable = (data) => {
2107
+ ElMessageBox.confirm('请确认是否复制?', '提示', { type: 'info' }).then(() => {
2108
+ loading.showLoading();
2109
+ api.post('/system/dataTable/copy', { id: data.id }).then(res => {
2110
+ ElMessage.success(res.message);
2111
+ loadDataTable(data.modelId);
2112
+ loading.hideLoading();
2113
+ }).catch(() => loading.hideLoading());
2114
+ }).catch(() => {});
2115
+ };
2116
+
2117
+ const previewDataTable = (data) => {
2118
+ clearCache();
2119
+
2120
+ previewVisible.value = true;
2121
+ previewPadding.value = false;
2122
+ previewTitle.value = '表格预览';
2123
+ previewComp.value = markRaw(Table);
2124
+ previewOptions.value = {
2125
+ dataTableId: data.id,
2126
+ dataFieldList: dataFieldList.value,
2127
+ autoHeight: '1'
2128
+ };
2129
+ };
2130
+
2131
+ const previewDataForm = (data) => {
2132
+ clearCache();
2133
+
2134
+ previewVisible.value = true;
2135
+ previewPadding.value = true;
2136
+ previewTitle.value = '表单预览';
2137
+ previewComp.value = markRaw(Form);
2138
+ previewOptions.value = {
2139
+ dataFormId: data.id,
2140
+ fieldList: dataFieldList.value
2141
+ };
2142
+ };
2143
+
2144
+ const deleteDataTable = (data) => {
2145
+ ElMessageBox.confirm('请确认是否删除【' + data.name + '】?', '提示', { type: 'warning' }).then(() => {
2146
+ loading.showLoading();
2147
+ api.post('/system/dataTable/delete', { id: data.id }).then(res => {
2148
+ ElMessage.success(res.message);
2149
+ loadDataTable(data.modelId);
2150
+ loading.hideLoading();
2151
+ }).catch(() => loading.hideLoading());
2152
+ }).catch(() => {});
2153
+ };
2154
+
2155
+ const submitTableForm = () => {
2156
+ tableComp.value.submitData();
2157
+ };
2158
+
2159
+ const afterTableSubmit = () => {
2160
+ tableVisible.value = false;
2161
+ loadDataTable(dataModelId.value);
2162
+ };
2163
+
2164
+ const addDataForm = () => {
2165
+ if (!dataModelId.value) {
2166
+ return;
2167
+ }
2168
+
2169
+ formData.value = { modelId: dataModelId.value };
2170
+ formVisible.value = true;
2171
+ };
2172
+
2173
+ const editDataForm = (data) => {
2174
+ formData.value = { id: data.id, modelId: data.modelId };
2175
+ formVisible.value = true;
2176
+ };
2177
+
2178
+ const copyDataForm = (data) => {
2179
+ ElMessageBox.confirm('请确认是否复制?', '提示', { type: 'info' }).then(() => {
2180
+ loading.showLoading();
2181
+ api.post('/system/dataForm/copy', { id: data.id }).then(res => {
2182
+ ElMessage.success(res.message);
2183
+ loadDataForm(data.modelId);
2184
+ loading.hideLoading();
2185
+ }).catch(() => loading.hideLoading());
2186
+ });
2187
+ };
2188
+
2189
+ const deleteDataForm = (data) => {
2190
+ ElMessageBox.confirm('请确认是否删除【' + data.name + '】?', '提示', { type: 'warning' }).then(() => {
2191
+ loading.showLoading();
2192
+ api.post('/system/dataForm/delete', { id: data.id }).then(res => {
2193
+ ElMessage.success(res.message);
2194
+ loadDataForm(data.modelId);
2195
+ loading.hideLoading();
2196
+ }).catch(() => loading.hideLoading());
2197
+ });
2198
+ };
2199
+
2200
+ const submitFormForm = () => {
2201
+ formComp.value.submitData();
2202
+ };
2203
+
2204
+ const afterFormSubmit = () => {
2205
+ formVisible.value = false;
2206
+ loadDataForm(dataModelId.value);
2207
+ };
2208
+
2209
+ const clickPlusItem = (opType, data) => {
2210
+ if (opType === 'folder') {
2211
+ showFolderDialog('新增', { parentId: data.id, ordinal: 10 });
2212
+ } else if (opType === 'model') {
2213
+ initDataModel({ folderId: data.id });
2214
+ }
2215
+ };
2216
+
2217
+ const showFolderDialog = (tips, data) => {
2218
+ folderTitle.value = tips + '目录';
2219
+ folderVisible.value = true;
2220
+ folderData.value = Object.assign({}, data);
2221
+ folderForm.value && folderForm.value.resetFields();
2222
+ };
2223
+
2224
+ const updateNode = (opType, data) => {
2225
+ if (opType === 'folder') {
2226
+ showFolderDialog('修改', data);
2227
+ } else {
2228
+ initDataModel(data);
2229
+ }
2230
+ };
2231
+
2232
+ const copyNode = async(opType, data) => {
2233
+ if (opType === 'folder' || !data.id) return;
2234
+
2235
+ const res = await api.post('/system/dataField/queryList', { modelId: data.id });
2236
+ const fieldList = [];
2237
+ const fieldIdMap = {};
2238
+ res.data.forEach(field => {
2239
+ if (field.builtin && field.builtin === '1') return;
2240
+
2241
+ fieldIdMap[field.id] = ++fieldFlag.value;
2242
+ field.fieldFlag = fieldIdMap[field.id];
2243
+ delete field.id;
2244
+
2245
+ if (field.relevanceList) {
2246
+ field.relevanceList.forEach(relevance => {
2247
+ relevance.id = '';
2248
+ delete relevance.fieldId;
2249
+ });
2250
+ }
2251
+ fieldList.push(field);
2252
+ });
2253
+
2254
+ fieldList.forEach(field => {
2255
+ if (field.nativeFieldId) {
2256
+ field.nativeFieldId = 'temp_' + fieldIdMap[field.nativeFieldId];
2257
+ }
2258
+ });
2259
+ dataFieldList.value = fieldList || [];
2260
+
2261
+ dataModelShow.value = true;
2262
+ tabName.value = 'field';
2263
+ dataModelId.value = '';
2264
+ dataModelData.value = { folderId: data.folderId || '', type: data.type || '1' };
2265
+ dataModelLoading.value = false;
2266
+ dataFieldLoading.value = false;
2267
+ dataIndexLoading.value = false;
2268
+ dataIndexList.value = [];
2269
+
2270
+ unSortDataField();
2271
+ await nextTick(() => {
2272
+ dataModelForm.value && dataModelForm.value.clearValidate();
2273
+ });
2274
+ };
2275
+
2276
+ const moveNode = (opType, data) => {
2277
+ moveTitle.value = opType === 'folder' ? '移动目录' : '移动数据模型';
2278
+ moveVisible.value = true;
2279
+ moveData.value = {
2280
+ opType: opType,
2281
+ id: data.id,
2282
+ name: data.name,
2283
+ labelName: opType === 'folder' ? '目录' : '数据模型',
2284
+ folderId: opType === 'folder' ? data.parentId : data.folderId
2285
+ };
2286
+ moveForm.value && moveForm.value.resetFields();
2287
+ };
2288
+
2289
+ const deleteNode = (opType, data) => {
2290
+ let url = '/system/dataModel/delete';
2291
+ if (opType === 'folder') {
2292
+ url = '/system/dataFolder/delete';
2293
+ }
2294
+
2295
+ ElMessageBox.confirm('请确认是否删除【' + data.name + '】?', '提示', { type: 'warning' }).then(() => {
2296
+ api.post(url, { id: data.id }).then(res => {
2297
+ ElMessage.success(res.message);
2298
+ dataModelShow.value = false;
2299
+ dataModelData.value = {};
2300
+ treeExpand.value.push(data.parentId || data.folderId || '0');
2301
+ treeKey.value = data.parentId || data.folderId || '0';
2302
+ loadTreeData();
2303
+ });
2304
+ }).catch(() => {
2305
+ });
2306
+ };
2307
+
2308
+ const submitFolderForm = () => {
2309
+ folderForm.value && folderForm.value.validate((valid) => {
2310
+ if (valid) {
2311
+ ElMessageBox.confirm('请确认是否提交?', '提示', { type: 'info' }).then(() => {
2312
+ folderLoading.value = true;
2313
+ api.post('/system/dataFolder/save', folderData.value).then(res => {
2314
+ dataModelShow.value = false;
2315
+ ElMessage.success(res.message);
2316
+ folderVisible.value = false;
2317
+ folderLoading.value = false;
2318
+ treeExpand.value.push(res.data.id || '0');
2319
+ treeKey.value = res.data.id || '0';
2320
+ loadTreeData();
2321
+ }).catch(() => {
2322
+ folderLoading.value = false;
2323
+ });
2324
+ }).catch(() => {
2325
+ });
2326
+ }
2327
+ });
2328
+ };
2329
+
2330
+ const submitMoveForm = () => {
2331
+ moveForm.value && moveForm.value.validate((valid) => {
2332
+ if (valid) {
2333
+ ElMessageBox.confirm('请确认是否提交?', '提示', { type: 'info' }).then(() => {
2334
+ moveLoading.value = true;
2335
+ const data = { id: moveData.value.id };
2336
+ let url;
2337
+ if (moveData.value.opType === 'folder') {
2338
+ data.parentId = moveData.value.folderId;
2339
+ url = '/system/dataFolder/updateParentId';
2340
+ } else {
2341
+ data.folderId = moveData.value.folderId;
2342
+ url = '/system/dataModel/updateFolder'
2343
+ }
2344
+ api.post(url, data).then(res => {
2345
+ ElMessage.success(res.message);
2346
+ moveVisible.value = false;
2347
+ moveLoading.value = false;
2348
+ treeExpand.value.push(res.data.id || '0');
2349
+ treeKey.value = res.data.id || '0';
2350
+ loadTreeData();
2351
+ }).catch(() => {
2352
+ moveLoading.value = false;
2353
+ })
2354
+ }).catch(() => {
2355
+ });
2356
+ }
2357
+ });
2358
+ };
2359
+
2360
+ const handleExport = () => {
2361
+ const nodes = tree.value.getCheckedNodes(false, true);
2362
+ if (!nodes || nodes.length === 0) {
2363
+ ElMessage.error('请先选择数据模型!');
2364
+ return;
2365
+ }
2366
+ const data = { folderIds: [], modelIds: [] };
2367
+ nodes.forEach(node => {
2368
+ if (node.type === 'folder') {
2369
+ data.folderIds.push(node.id);
2370
+ } else if (node.type === 'model') {
2371
+ data.modelIds.push(node.id);
2372
+ }
2373
+ });
2374
+ api.downloadFile('/system/dataModel/exportData', data).then(res => api.saveFileLocal(res));
2375
+ };
2376
+
2377
+ const handleImport = (file) => {
2378
+ api.uploadFile('/system/dataModel/importData', { file: file.file }).then((res) => {
2379
+ ElMessage.success(res.message);
2380
+ loadTreeData();
2381
+ });
2382
+ };
2383
+
2384
+ const downloadTpl = () => {
2385
+ api.downloadFile('/system/dataModel/downloadTpl').then(res => api.saveFileLocal(res));
2386
+ };
2387
+
2388
+ const handleUpload = (file) => {
2389
+ return new Promise((resolve, reject) => {
2390
+ api.uploadFile('/system/dataModel/uploadXls', { file: file.file }).then((res) => {
2391
+ if (res.code === '2') {
2392
+ ElMessage({ type: 'error', dangerouslyUseHTMLString: true, message: res.message.replace(/@@@/g, '<br/>') });
2393
+ reject();
2394
+ } else {
2395
+ ElMessage.success(res.message);
2396
+ loadTreeData();
2397
+ resolve();
2398
+ }
2399
+ }).catch(() => {
2400
+ reject();
2401
+ });
2402
+ })
2403
+ };
2404
+
2405
+ const loadTreeData = () => {
2406
+ treeLoading.value = true;
2407
+ api.post('/system/dataModel/queryTree').then(res => {
2408
+ const node = tree.value.getCurrentNode();
2409
+ if (node !== undefined && node != null) {
2410
+ treeExpand.value = [node.id, node.data.parentId, node.data.folderId, '0'];
2411
+ } else {
2412
+ treeExpand.value = ['0'];
2413
+ }
2414
+ treeData.value = res.data.children;
2415
+ treeLoading.value = false;
2416
+ if (treeKey.value) {
2417
+ nextTick(() => {
2418
+ tree.value.setCurrentKey(treeKey.value);
2419
+ });
2420
+ }
2421
+ }).catch(() => {
2422
+ treeLoading.value = false;
2423
+ });
2424
+ };
2425
+
2426
+ watch(() => filterText.value, val => {
2427
+ tree.value.filter(val);
2428
+ });
2429
+
2430
+ onMounted(() => {
2431
+ loadTreeData();
2432
+ });
2433
+ </script>
2434
+
2435
+ <style lang="scss">
2436
+ @import "@/assets/style/codeless.css";
2437
+ @import "@/assets/style/visual.css";
2438
+ </style>
2439
+
2440
+ <style lang="scss" scoped>
2441
+ .title {
2442
+ display: flex;
2443
+ flex-direction: row;
2444
+ margin-right: 10px;
2445
+ height: 40px;
2446
+ align-items: center;
2447
+
2448
+ .title-content {
2449
+ flex-grow: 1;
2450
+ font-size: 18px;
2451
+ }
2452
+
2453
+ .title-button {
2454
+ display: flex;
2455
+ flex-direction: row;
2456
+ justify-content: center;
2457
+ align-items: center;
2458
+ .button-list {
2459
+ display: flex;
2460
+ flex-direction: row;
2461
+ align-items: center;
2462
+ .button-item {
2463
+ margin: 0 5px 0 5px;
2464
+ }
2465
+ }
2466
+ }
2467
+
2468
+ .title-button .title-button-box {
2469
+ height: 30px;
2470
+ width: 40px;
2471
+ border-radius: 5px;
2472
+ display: flex;
2473
+ flex-direction: row;
2474
+ align-items: center;
2475
+ justify-content: center;
2476
+ border: none;
2477
+ cursor: pointer;
2478
+ }
2479
+
2480
+ .title-button .title-button-box:hover {
2481
+ background: #eaeaea;
2482
+ border: none;
2483
+ }
2484
+
2485
+ .title-button .title-button-box:focus-visible {
2486
+ outline: unset;
2487
+ }
2488
+ }
2489
+
2490
+ .filter-box {
2491
+ margin-right: 10px;
2492
+ }
2493
+
2494
+ .tree :deep(.el-tree-node__content) {
2495
+ height: 40px;
2496
+ }
2497
+
2498
+ .page-aside-grow {
2499
+ width: 100% !important;
2500
+
2501
+ :deep(.el-tree) {
2502
+ display: flex;
2503
+ flex-direction: column;
2504
+ width: 1px !important;
2505
+ }
2506
+
2507
+ :deep(.el-tree-node) {
2508
+ display: flex;
2509
+ flex-direction: column;
2510
+ width: 100% !important;
2511
+ }
2512
+
2513
+ :deep(.el-tree-node__content) {
2514
+ display: flex;
2515
+ flex-grow: 1;
2516
+ }
2517
+ }
2518
+
2519
+ .node-item {
2520
+ display: flex;
2521
+ flex-direction: row;
2522
+ align-items: center;
2523
+ width: 100%;
2524
+
2525
+ .icon {
2526
+ display: flex;
2527
+ align-items: center;
2528
+ }
2529
+
2530
+ .node-label {
2531
+ margin-left: 6px;
2532
+ flex-grow: 1;
2533
+ width: 1px;
2534
+ text-overflow: ellipsis;
2535
+ overflow: hidden;
2536
+ display: flex;
2537
+
2538
+ > span {
2539
+ width: 100%;
2540
+ text-overflow: ellipsis;
2541
+ overflow: hidden;
2542
+ }
2543
+ }
2544
+ .node-button {
2545
+ margin-right: 10px;
2546
+ display: flex;
2547
+ justify-content: center;
2548
+ align-items: center;
2549
+ }
2550
+ .node-button .node-button-item {
2551
+ height: 30px;
2552
+ width: 40px;
2553
+ display: flex;
2554
+ justify-content: center;
2555
+ align-items: center;
2556
+ border-radius: 5px;
2557
+ }
2558
+ .node-button .node-button-item:focus-visible {
2559
+ outline: unset;
2560
+ }
2561
+ }
2562
+ .node-item:hover {
2563
+ .node-button .node-button-item:hover {
2564
+ background: #eaeaea;
2565
+ }
2566
+ }
2567
+ .preview-container {
2568
+ display: flex;
2569
+ flex-direction: column;
2570
+ background-color: #ffffff;
2571
+ flex-grow: 1;
2572
+ overflow: auto !important;
2573
+ }
2574
+ .preview-container.padding10 {
2575
+ padding: 10px;
2576
+ width: calc(100% - 20px);
2577
+ height: calc(100% - 20px);
2578
+ }
2579
+ .preview-container.padding20 {
2580
+ padding: 20px;
2581
+ width: calc(100% - 40px);
2582
+ height: calc(100% - 40px);
2583
+ }
2584
+ </style>