cloud-web-corejs 1.1.0-dev.6 → 1.1.0-dev.61

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 (499) hide show
  1. package/README.md +38 -0
  2. package/bin/core-resources.js +16 -0
  3. package/bin/create-child-app.js +34 -0
  4. package/docs/child-app/README.md +95 -0
  5. package/docs/child-app/activiti-resources.md +63 -0
  6. package/docs/child-app/generate-prompt.md +55 -0
  7. package/docs/child-app/luckysheet-resources.md +80 -0
  8. package/docs/child-app/public-resources-plan.md +288 -0
  9. package/docs/child-app/resources-implementation.md +101 -0
  10. package/docs/child-app/tinymce-resources.md +88 -0
  11. package/docs/child-app/validation.md +34 -0
  12. package/docs/qiankun/346/216/245/345/205/245/345/215/217/350/256/256.md +298 -0
  13. package/docs/qiankun/350/257/246/346/203/205/346/211/277/350/275/275/345/255/220/345/272/224/347/224/250/345/257/271/346/216/245/346/270/205/345/215/225.md +111 -0
  14. package/package.json +29 -4
  15. package/resource-tools/index.js +126 -0
  16. package/src/app-bootstrap.js +531 -0
  17. package/src/app-bootstrap.sync.js +502 -0
  18. package/src/boot-assets.legacy.js +13 -0
  19. package/src/boot-assets.next.js +7 -0
  20. package/src/components/Qrcode/fileParse.vue +11 -0
  21. package/src/components/Tinymce/dynamicLoadScript.js +51 -59
  22. package/src/components/Tinymce/index.vue +382 -336
  23. package/src/components/Tinymce/mce-chrome.scss +150 -0
  24. package/src/components/VabUpload/image-viewer.vue +18 -10
  25. package/src/components/VabUpload/index.js +11 -4
  26. package/src/components/VabUpload/index.vue +1 -1
  27. package/src/components/VabUpload/mixins/fileLibraryDialog.js +2 -0
  28. package/src/components/VabUpload/mixins.js +72 -40
  29. package/src/components/VabUpload/partUploadConfig.js +95 -0
  30. package/src/components/VabUpload/privateProfileDialogMixins.js +2 -0
  31. package/src/components/VabUpload/style.scss +282 -0
  32. package/src/components/VabUpload/view.vue +19 -18
  33. package/src/components/baseArea/index.vue +2 -2
  34. package/src/components/baseInputExport/mixins.js +1 -6
  35. package/src/components/bizTab/BizTabListPage.vue +66 -33
  36. package/src/components/bizTab/README.md +3 -1
  37. package/src/components/bizTab/bizBillDetailMixin.js +2 -0
  38. package/src/components/code-editor/ace-chrome.scss +17 -0
  39. package/src/components/code-editor/index.vue +361 -340
  40. package/src/components/errorMsg/index.vue +142 -13
  41. package/src/components/errorMsg/mixins.js +53 -0
  42. package/src/components/excelExport/conditionExportConfig.js +112 -0
  43. package/src/components/excelExport/exportColumnMemory.js +118 -0
  44. package/src/components/excelExport/exportFieldDialog.vue +50 -38
  45. package/src/components/excelExport/exportType.js +8 -0
  46. package/src/components/excelExport/index.js +30 -13
  47. package/src/components/excelExport/index.vue +7 -1
  48. package/src/components/excelExport/mixins.js +782 -293
  49. package/src/components/excelImport/index.vue +156 -156
  50. package/src/components/excelImport/mixins.js +888 -834
  51. package/src/components/fileLibrary/mixins/indexMixins.js +2 -0
  52. package/src/components/fileLibrary/style.scss +579 -0
  53. package/src/components/formDialog/index.vue +11 -8
  54. package/src/components/hiprint/style.scss +188 -0
  55. package/src/components/hiprint/view/json-view.vue +4 -4
  56. package/src/components/jdPrint/mixins.js +2 -0
  57. package/src/components/jsonImport/index.vue +1 -1
  58. package/src/components/jsonImport/mixins.js +6 -10
  59. package/src/components/langImport/index.vue +1 -1
  60. package/src/components/langImport/mixins.js +6 -10
  61. package/src/components/luckysheet/loadResources.js +64 -0
  62. package/src/components/luckysheet/view.vue +239 -210
  63. package/src/components/mobile/buttonGroup/index.vue +1 -1
  64. package/src/components/mobile/wf/addTaskUserdialog.vue +100 -80
  65. package/src/components/mobile/wf/content.vue +1734 -1662
  66. package/src/components/mobile/wf/deleteTaskUserDialog.vue +73 -54
  67. package/src/components/mobile/wf/selectUserDialog.vue +118 -0
  68. package/src/components/mobile/wf/setCandidateDialog.vue +69 -48
  69. package/src/components/mobile/wf/urgingDialog.vue +75 -52
  70. package/src/components/mobile/wf/wfModifyDialog.vue +4 -0
  71. package/src/components/obsUpload/index.js +4 -1
  72. package/src/components/obsUpload/index.vue +1 -1
  73. package/src/components/obsUpload/mixins.js +45 -15
  74. package/src/components/onlineTalk/index.vue +4 -4
  75. package/src/components/onlineTalk/mixins.js +21 -7
  76. package/src/components/table/index.js +96 -81
  77. package/src/components/table/plugins/cell-area/index.js +10 -3
  78. package/src/components/table/style.scss +1399 -0
  79. package/src/components/table/vxeFilter/mixin.js +28 -18
  80. package/src/components/wf/content.vue +3 -2
  81. package/src/components/wf/content2.vue +1 -1
  82. package/src/components/wf/style.scss +265 -0
  83. package/src/components/wf/wf.js +7 -0
  84. package/src/components/wf/wfActionItems.js +3 -0
  85. package/src/components/wf/wfStartDialog.vue +1 -0
  86. package/src/components/wf/wfTransferEnabled.js +54 -0
  87. package/src/components/wf/wfUtil.js +47 -29
  88. package/src/components/wf/wfVisibility.js +6 -0
  89. package/src/components/xform/docs/2026-07 table/344/270/216excelExport/344/277/256/345/244/215/345/217/212/345/257/274/345/207/272/344/274/230/345/214/226.md" +64 -57
  90. package/src/components/xform/docs/2026-08 xform H5 P0 /345/256/236/347/216/260/350/247/204/346/240/274.md" +1 -1
  91. package/src/components/xform/docs/2026-08 xform /347/247/273/345/212/250/347/253/257/345/270/203/345/261/200/345/257/271/351/275/220 bill_setting /346/226/271/346/241/210.md" +1 -1
  92. package/src/components/xform/docs/2026-09 /345/212/250/346/200/201/345/255/227/346/256/265/350/247/204/345/210/231/344/270/216/346/265/201/347/250/213/346/216/247/345/210/266/346/211/247/350/241/214/351/241/272/345/272/217/350/220/275/345/234/260/346/226/271/346/241/210.md" +409 -0
  93. package/src/components/xform/docs/2026-09 /346/235/241/344/273/266/345/257/274/345/207/272/345/244/247/346/225/260/346/215/256/351/207/217/345/264/251/346/272/203/346/216/222/346/237/245.md" +389 -0
  94. package/src/components/xform/docs/2026-09 /346/265/217/350/247/210/345/231/250/345/264/251/346/272/203/346/262/273/347/220/206P0/344/273/243/347/240/201/350/257/204/345/256/241.md" +255 -0
  95. package/src/components/xform/docs/2026-09 /346/265/217/350/247/210/345/231/250/345/264/251/346/272/203/346/262/273/347/220/206P0/346/265/213/350/257/225/351/252/214/350/257/201/345/256/236/346/226/275/346/226/207/346/241/243.md" +595 -0
  96. package/src/components/xform/docs/2026-09 /347/274/226/350/276/221/350/241/250/350/241/214/345/206/205/344/277/235/345/255/230/346/240/241/351/252/214/350/214/203/345/233/264/344/270/216/345/210/227/345/277/205/345/241/253/350/247/243/346/236/220/344/277/256/345/244/215.md" +233 -0
  97. package/src/components/xform/docs/2026-09 /350/241/250/345/215/225/345/257/274/345/205/245/351/200/232/351/201/223/346/242/263/347/220/206/344/270/216/350/220/275/345/234/260/346/226/271/346/241/210.md" +745 -0
  98. package/src/components/xform/docs//346/265/217/350/247/210/345/231/250/345/264/251/346/272/203/346/262/273/347/220/206/344/270/216/344/277/256/345/244/215/350/220/275/345/234/260/346/226/271/346/241/210.md +324 -0
  99. package/src/components/xform/form-designer/designer.js +2133 -2100
  100. package/src/components/xform/form-designer/form-widget/container-widget/data-table-mixin.js +7 -0
  101. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +4 -2
  102. package/src/components/xform/form-designer/form-widget/container-widget/detail-h5-widget.vue +243 -227
  103. package/src/components/xform/form-designer/form-widget/container-widget/h5-card-pane-widget.vue +228 -207
  104. package/src/components/xform/form-designer/form-widget/container-widget/h5-card-widget.vue +165 -136
  105. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +30 -4
  106. package/src/components/xform/form-designer/form-widget/dialog/importDialog.vue +190 -185
  107. package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +2657 -1774
  108. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +27 -4
  109. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +1 -1
  110. package/src/components/xform/form-designer/form-widget/field-widget/a-text-widget.vue +1 -1
  111. package/src/components/xform/form-designer/form-widget/field-widget/area-select-widget.vue +1 -1
  112. package/src/components/xform/form-designer/form-widget/field-widget/autocomplete-widget.vue +1 -1
  113. package/src/components/xform/form-designer/form-widget/field-widget/baseAttachment-widget.vue +1 -1
  114. package/src/components/xform/form-designer/form-widget/field-widget/button-widget.vue +1 -1
  115. package/src/components/xform/form-designer/form-widget/field-widget/cascader-widget.vue +1 -1
  116. package/src/components/xform/form-designer/form-widget/field-widget/census-widget.vue +1 -1
  117. package/src/components/xform/form-designer/form-widget/field-widget/checkbox-widget.vue +1 -1
  118. package/src/components/xform/form-designer/form-widget/field-widget/color-widget.vue +1 -1
  119. package/src/components/xform/form-designer/form-widget/field-widget/copy_button-widget.vue +1 -1
  120. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +1 -1
  121. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +1 -1
  122. package/src/components/xform/form-designer/form-widget/field-widget/descriptions-widget.vue +1 -1
  123. package/src/components/xform/form-designer/form-widget/field-widget/divider-widget.vue +1 -1
  124. package/src/components/xform/form-designer/form-widget/field-widget/download-button-widget.vue +1 -1
  125. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-item-widget.vue +1 -1
  126. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-widget.vue +35 -4
  127. package/src/components/xform/form-designer/form-widget/field-widget/echart-bar-widget.vue +1 -1
  128. package/src/components/xform/form-designer/form-widget/field-widget/echart-category-widget.vue +1 -1
  129. package/src/components/xform/form-designer/form-widget/field-widget/echart-pie-widget.vue +1 -1
  130. package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +64 -10
  131. package/src/components/xform/form-designer/form-widget/field-widget/file-upload-widget.vue +1 -1
  132. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +14 -4
  133. package/src/components/xform/form-designer/form-widget/field-widget/html-text-widget.vue +1 -1
  134. package/src/components/xform/form-designer/form-widget/field-widget/import-button-widget.vue +19 -6
  135. package/src/components/xform/form-designer/form-widget/field-widget/import2-button-widget.vue +1 -1
  136. package/src/components/xform/form-designer/form-widget/field-widget/index.js +10 -1
  137. package/src/components/xform/form-designer/form-widget/field-widget/input-batch-widget.vue +1 -1
  138. package/src/components/xform/form-designer/form-widget/field-widget/input-widget.vue +29 -3
  139. package/src/components/xform/form-designer/form-widget/field-widget/multiSearch-widget.vue +1 -1
  140. package/src/components/xform/form-designer/form-widget/field-widget/news-list-widget.vue +1 -1
  141. package/src/components/xform/form-designer/form-widget/field-widget/number-widget.vue +1 -1
  142. package/src/components/xform/form-designer/form-widget/field-widget/oplog-widget.vue +1 -1
  143. package/src/components/xform/form-designer/form-widget/field-widget/picture-upload-widget.vue +1 -1
  144. package/src/components/xform/form-designer/form-widget/field-widget/print-button-widget.vue +1 -1
  145. package/src/components/xform/form-designer/form-widget/field-widget/print-detail-button-widget.vue +1 -1
  146. package/src/components/xform/form-designer/form-widget/field-widget/project-tag-widget.vue +1 -1
  147. package/src/components/xform/form-designer/form-widget/field-widget/radio-widget.vue +1 -1
  148. package/src/components/xform/form-designer/form-widget/field-widget/rate-widget.vue +1 -1
  149. package/src/components/xform/form-designer/form-widget/field-widget/rich-editor-widget.vue +1 -1
  150. package/src/components/xform/form-designer/form-widget/field-widget/row-col-select-widget.vue +64 -0
  151. package/src/components/xform/form-designer/form-widget/field-widget/save_submit_wf_button-widget.vue +1 -1
  152. package/src/components/xform/form-designer/form-widget/field-widget/script-input-widget.vue +1 -1
  153. package/src/components/xform/form-designer/form-widget/field-widget/search_button-widget.vue +1 -1
  154. package/src/components/xform/form-designer/form-widget/field-widget/select-export-button-widget.vue +1 -1
  155. package/src/components/xform/form-designer/form-widget/field-widget/select-export-item-button-widget.vue +6 -2
  156. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +1 -1
  157. package/src/components/xform/form-designer/form-widget/field-widget/singerSearch-widget.vue +1 -1
  158. package/src/components/xform/form-designer/form-widget/field-widget/singleUpload-widget.vue +145 -145
  159. package/src/components/xform/form-designer/form-widget/field-widget/slider-widget.vue +1 -1
  160. package/src/components/xform/form-designer/form-widget/field-widget/static-content-wrapper.vue +1 -1
  161. package/src/components/xform/form-designer/form-widget/field-widget/static-text-widget.vue +1 -1
  162. package/src/components/xform/form-designer/form-widget/field-widget/status-widget.vue +1 -1
  163. package/src/components/xform/form-designer/form-widget/field-widget/switch-widget.vue +1 -1
  164. package/src/components/xform/form-designer/form-widget/field-widget/table-export-button-widget.vue +3 -2
  165. package/src/components/xform/form-designer/form-widget/field-widget/tempStorage-widget.vue +1 -1
  166. package/src/components/xform/form-designer/form-widget/field-widget/text-widget.vue +1 -1
  167. package/src/components/xform/form-designer/form-widget/field-widget/textarea-widget.vue +1 -1
  168. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +1 -1
  169. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +1 -1
  170. package/src/components/xform/form-designer/form-widget/field-widget/title-head-widget.vue +1 -1
  171. package/src/components/xform/form-designer/form-widget/field-widget/vabSearch-widget.vue +1 -1
  172. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +3 -3
  173. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload2-widget.vue +25 -1
  174. package/src/components/xform/form-designer/form-widget/field-widget/vue-page-widget.vue +1 -1
  175. package/src/components/xform/form-designer/indexMixin.js +27 -0
  176. package/src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue +687 -602
  177. package/src/components/xform/form-designer/setting-panel/form-setting.vue +269 -36
  178. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +335 -12
  179. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +23 -7
  180. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-temp-edito.vue +13 -1
  181. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +846 -860
  182. package/src/components/xform/form-designer/setting-panel/property-editor/container-tab/tab-lazyRender-editor.vue +27 -0
  183. package/src/components/xform/form-designer/setting-panel/property-editor/event-handler/onTabChange-editor.vue +28 -0
  184. package/src/components/xform/form-designer/setting-panel/property-editor/event-handler/onTabClick-editor.vue +28 -0
  185. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import-button-editor.vue +62 -1
  186. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +142 -2
  187. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/empty-number-input.vue +51 -0
  188. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-item-button-editor.vue +27 -2
  189. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/table-export-button-editor.vue +33 -3
  190. package/src/components/xform/form-designer/setting-panel/property-editor/project-tag-editor.vue +2 -4
  191. package/src/components/xform/form-designer/setting-panel/property-editor/suffixIconClickable-editor.vue +23 -0
  192. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +18 -4
  193. package/src/components/xform/form-designer/toolbar-panel/index.vue +884 -874
  194. package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +13 -0
  195. package/src/components/xform/form-designer/widget-panel/index.vue +11 -7
  196. package/src/components/xform/form-designer/widget-panel/indexMixin.js +15 -2
  197. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +152 -9
  198. package/src/components/xform/form-render/container-item/containerItemMixin.js +93 -8
  199. package/src/components/xform/form-render/container-item/data-table-item.vue +352 -347
  200. package/src/components/xform/form-render/container-item/data-table-mixin.js +7261 -5985
  201. package/src/components/xform/form-render/container-item/detail-h5-item.vue +48 -19
  202. package/src/components/xform/form-render/container-item/detail-item.vue +350 -446
  203. package/src/components/xform/form-render/container-item/dynamicFieldMixin.js +55 -1
  204. package/src/components/xform/form-render/container-item/list-h5-item.vue +261 -178
  205. package/src/components/xform/form-render/container-item/panel-item.vue +1 -1
  206. package/src/components/xform/form-render/container-item/tab-item.vue +177 -129
  207. package/src/components/xform/form-render/fieldControlEngine.js +218 -0
  208. package/src/components/xform/form-render/fieldControlMixin.js +536 -0
  209. package/src/components/xform/form-render/index.vue +164 -153
  210. package/src/components/xform/form-render/indexMixin.js +5443 -5311
  211. package/src/components/xform/form-render/pageDialogScope.js +54 -0
  212. package/src/components/xform/icon-picker/index.vue +1 -1
  213. package/src/components/xform/lang/en-US.js +8 -0
  214. package/src/components/xform/lang/zh-CN.js +9 -0
  215. package/src/components/xform/mixins/businessLock.js +59 -0
  216. package/src/components/xform/mixins/defaultHandle.js +713 -707
  217. package/src/components/xform/mixins/scriptHttp.js +42 -21
  218. package/src/components/xform/mixins/wfStart.js +105 -0
  219. package/src/components/xform/mixins/wfVisibility.js +33 -0
  220. package/src/components/xform/styles/census.scss +288 -0
  221. package/src/components/xform/styles/containers.scss +215 -0
  222. package/src/components/xform/styles/designer.scss +904 -0
  223. package/src/components/xform/styles/detail-temp.scss +71 -0
  224. package/src/components/xform/styles/h5-designer.scss +191 -0
  225. package/src/components/xform/styles/h5-runtime.scss +520 -0
  226. package/src/components/xform/styles/h5.scss +836 -516
  227. package/src/components/xform/styles/skins.scss +398 -0
  228. package/src/components/xform/styles/table-layout.scss +91 -0
  229. package/src/components/xform/styles/titles.scss +255 -0
  230. package/src/components/xform/utils/dynamicSchemaUtil.js +385 -361
  231. package/src/components/xform/utils/fixedQueryUtil.js +29 -4
  232. package/src/components/xform/utils/serviceNameCache.js +69 -0
  233. package/src/components/xform/utils/tableColumnHelper.js +46 -4
  234. package/src/components/xform/utils/util.js +1776 -1708
  235. package/src/core-resources/css/h5.scss +548 -0
  236. package/src/core-resources/css/iconfont.css +1447 -0
  237. package/src/core-resources/font/iconfont.ttf +0 -0
  238. package/src/core-resources/font/iconfont.woff +0 -0
  239. package/src/core-resources/font/iconfont.woff2 +0 -0
  240. package/src/core-resources/images/default-header.png +0 -0
  241. package/src/core-resources/images/ico-default_wenjian.svg +1 -0
  242. package/src/core-resources/images/ico-excel.svg +1 -0
  243. package/src/core-resources/images/ico-ftl.svg +7 -0
  244. package/src/core-resources/images/ico-html.svg +1 -0
  245. package/src/core-resources/images/ico-java.svg +1 -0
  246. package/src/core-resources/images/ico-music.svg +1 -0
  247. package/src/core-resources/images/ico-pdf.svg +1 -0
  248. package/src/core-resources/images/ico-photo.svg +1 -0
  249. package/src/core-resources/images/ico-ppt.svg +1 -0
  250. package/src/core-resources/images/ico-psd.svg +1 -0
  251. package/src/core-resources/images/ico-service.png +0 -0
  252. package/src/core-resources/images/ico-txt.svg +1 -0
  253. package/src/core-resources/images/ico-video.svg +1 -0
  254. package/src/core-resources/images/ico-vue.svg +8 -0
  255. package/src/core-resources/images/ico-wenjianjia.svg +1 -0
  256. package/src/core-resources/images/ico-wrod.svg +1 -0
  257. package/src/core-resources/images/ico-xml.svg +1 -0
  258. package/src/core-resources/images/ico-yasuobao.svg +1 -0
  259. package/src/core-resources/images/icon-error.png +0 -0
  260. package/src/core-resources/images/icon-tips.png +0 -0
  261. package/src/core-resources/images/nodata.png +0 -0
  262. package/src/core-resources/images/nodata2.png +0 -0
  263. package/src/directive/append-to-body/index.js +48 -0
  264. package/src/directive/el-dialog-center/index.js +3 -2
  265. package/src/directive/el-drag-dialog/drag.js +33 -4
  266. package/src/icons/index.js +9 -0
  267. package/src/icons/svg/404.svg +1 -0
  268. package/src/icons/svg/alert.svg +1 -0
  269. package/src/icons/svg/bug.svg +1 -0
  270. package/src/icons/svg/button.svg +1 -0
  271. package/src/icons/svg/card.svg +1 -0
  272. package/src/icons/svg/cascader-field.svg +1 -0
  273. package/src/icons/svg/census.svg +1 -0
  274. package/src/icons/svg/chart.svg +1 -0
  275. package/src/icons/svg/checkbox-field.svg +1 -0
  276. package/src/icons/svg/clipboard.svg +1 -0
  277. package/src/icons/svg/color-field.svg +1 -0
  278. package/src/icons/svg/component.svg +1 -0
  279. package/src/icons/svg/custom-component.svg +1 -0
  280. package/src/icons/svg/dashboard.svg +1 -0
  281. package/src/icons/svg/data-table.svg +1 -0
  282. package/src/icons/svg/date-field.svg +1 -0
  283. package/src/icons/svg/date-range-field.svg +1 -0
  284. package/src/icons/svg/descriptions.svg +1 -0
  285. package/src/icons/svg/divider.svg +1 -0
  286. package/src/icons/svg/document.svg +1 -0
  287. package/src/icons/svg/documentation.svg +1 -0
  288. package/src/icons/svg/drag.svg +1 -0
  289. package/src/icons/svg/echart-category.svg +1 -0
  290. package/src/icons/svg/echart-pie.svg +1 -0
  291. package/src/icons/svg/echart.svg +1 -0
  292. package/src/icons/svg/edit.svg +1 -0
  293. package/src/icons/svg/education.svg +1 -0
  294. package/src/icons/svg/email.svg +1 -0
  295. package/src/icons/svg/example.svg +1 -0
  296. package/src/icons/svg/excel.svg +1 -0
  297. package/src/icons/svg/exit-fullscreen.svg +1 -0
  298. package/src/icons/svg/eye-open.svg +1 -0
  299. package/src/icons/svg/eye.svg +1 -0
  300. package/src/icons/svg/file-upload-field.svg +1 -0
  301. package/src/icons/svg/form.svg +1 -0
  302. package/src/icons/svg/fullscreen.svg +1 -0
  303. package/src/icons/svg/github.svg +1 -0
  304. package/src/icons/svg/grid.svg +1 -0
  305. package/src/icons/svg/guide.svg +1 -0
  306. package/src/icons/svg/html-text.svg +1 -0
  307. package/src/icons/svg/ico-more.svg +1 -0
  308. package/src/icons/svg/ico-wenjianjia.svg +1 -0
  309. package/src/icons/svg/icon.svg +1 -0
  310. package/src/icons/svg/input-batch.svg +1 -0
  311. package/src/icons/svg/international.svg +1 -0
  312. package/src/icons/svg/language.svg +1 -0
  313. package/src/icons/svg/link.svg +1 -0
  314. package/src/icons/svg/list-export.svg +1 -0
  315. package/src/icons/svg/list.svg +1 -0
  316. package/src/icons/svg/lock.svg +1 -0
  317. package/src/icons/svg/message.svg +1 -0
  318. package/src/icons/svg/money.svg +1 -0
  319. package/src/icons/svg/nested.svg +1 -0
  320. package/src/icons/svg/news-list.svg +1 -0
  321. package/src/icons/svg/node-tree.svg +1 -0
  322. package/src/icons/svg/number-field.svg +1 -0
  323. package/src/icons/svg/password.svg +1 -0
  324. package/src/icons/svg/pdf.svg +1 -0
  325. package/src/icons/svg/people.svg +1 -0
  326. package/src/icons/svg/peoples.svg +1 -0
  327. package/src/icons/svg/picture-upload-field.svg +1 -0
  328. package/src/icons/svg/qq.svg +1 -0
  329. package/src/icons/svg/query.svg +1 -0
  330. package/src/icons/svg/radio-field.svg +1 -0
  331. package/src/icons/svg/rate-field.svg +1 -0
  332. package/src/icons/svg/redo.svg +1 -0
  333. package/src/icons/svg/rich-editor-field.svg +1 -0
  334. package/src/icons/svg/search.svg +1 -0
  335. package/src/icons/svg/searchbox.svg +1 -0
  336. package/src/icons/svg/section.svg +1 -0
  337. package/src/icons/svg/select-field.svg +1 -0
  338. package/src/icons/svg/shopping.svg +1 -0
  339. package/src/icons/svg/size.svg +1 -0
  340. package/src/icons/svg/skill.svg +1 -0
  341. package/src/icons/svg/slider-field.svg +1 -0
  342. package/src/icons/svg/slot-component.svg +1 -0
  343. package/src/icons/svg/slot-field.svg +1 -0
  344. package/src/icons/svg/star.svg +1 -0
  345. package/src/icons/svg/static-text.svg +1 -0
  346. package/src/icons/svg/status.svg +1 -0
  347. package/src/icons/svg/sub-form.svg +1 -0
  348. package/src/icons/svg/switch-field.svg +1 -0
  349. package/src/icons/svg/tab.svg +1 -0
  350. package/src/icons/svg/table.svg +1 -0
  351. package/src/icons/svg/text-field.svg +1 -0
  352. package/src/icons/svg/text.svg +1 -0
  353. package/src/icons/svg/textarea-field.svg +1 -0
  354. package/src/icons/svg/theme.svg +1 -0
  355. package/src/icons/svg/time-field.svg +1 -0
  356. package/src/icons/svg/time-range-field.svg +1 -0
  357. package/src/icons/svg/tips-text.svg +1 -0
  358. package/src/icons/svg/title-head.svg +1 -0
  359. package/src/icons/svg/tree-pane.svg +1 -0
  360. package/src/icons/svg/tree-table.svg +1 -0
  361. package/src/icons/svg/tree.svg +1 -0
  362. package/src/icons/svg/undo.svg +1 -0
  363. package/src/icons/svg/uploadbox.svg +1 -0
  364. package/src/icons/svg/user.svg +1 -0
  365. package/src/icons/svg/vf-box.svg +1 -0
  366. package/src/icons/svg/vf-dialog.svg +1 -0
  367. package/src/icons/svg/vf-drawer.svg +1 -0
  368. package/src/icons/svg/vue-sfc.svg +1 -0
  369. package/src/icons/svg/wechat.svg +1 -0
  370. package/src/icons/svg/zip.svg +1 -0
  371. package/src/index.js +2 -510
  372. package/src/index.next.js +5 -0
  373. package/src/index.sync.js +5 -0
  374. package/src/layout/components/Sidebar/default.vue +1656 -1655
  375. package/src/layout/components/TagsView/index.vue +330 -323
  376. package/src/layout/components/TagsView/style.scss +92 -0
  377. package/src/layout/components/watermark/index.vue +1 -1
  378. package/src/layout/defaultLayout.vue +2 -2
  379. package/src/router/index.js +43 -48
  380. package/src/router/modules/customer.js +12 -0
  381. package/src/store/modules/settings.js +1 -1
  382. package/src/store/modules/tagsView.js +241 -217
  383. package/src/store/modules/user.js +16 -12
  384. package/src/styles/btn.scss +315 -0
  385. package/src/styles/dialog.scss +1710 -0
  386. package/src/styles/element-ui.scss +1076 -0
  387. package/src/styles/element-variables.scss +31 -0
  388. package/src/styles/global.scss +115 -0
  389. package/src/styles/index.scss +245 -0
  390. package/src/styles/layout-skins.scss +840 -0
  391. package/src/styles/legacy-base.scss +19 -0
  392. package/src/styles/menu-icons.scss +75 -0
  393. package/src/styles/mixin.scss +80 -0
  394. package/src/styles/nprogress.scss +14 -0
  395. package/src/styles/page-shell.scss +723 -0
  396. package/src/styles/sidebar.scss +296 -0
  397. package/src/styles/split-handle.scss +52 -0
  398. package/src/styles/theme-variables.scss +7 -0
  399. package/src/styles/transition.scss +48 -0
  400. package/src/styles/utilities.scss +253 -0
  401. package/src/styles/variables.scss +72 -0
  402. package/src/utils/baseDictsCache.js +197 -0
  403. package/src/utils/chunkLoadError.js +24 -0
  404. package/src/utils/featureResources.js +57 -0
  405. package/src/utils/importLimit.js +72 -0
  406. package/src/utils/pdfUtil.js +6 -1
  407. package/src/utils/request.js +149 -9
  408. package/src/utils/resolveViewComponent.js +45 -90
  409. package/src/utils/runtimeRecovery.js +105 -0
  410. package/src/utils/swiperLoader.js +20 -0
  411. package/src/utils/vab.js +1334 -1283
  412. package/src/utils/xlsxLoader.js +29 -0
  413. package/src/views/bd/setting/formVersion/compareContMixin.scss +1 -1
  414. package/src/views/bd/setting/form_template/edit.vue +378 -356
  415. package/src/views/bd/setting/form_template/formDesignerDialog.vue +6 -0
  416. package/src/views/bd/setting/form_template/formTemplateType.js +43 -0
  417. package/src/views/bd/setting/form_template/list.vue +304 -303
  418. package/src/views/bd/setting/form_template/mixins/edit.js +344 -280
  419. package/src/views/bd/setting/form_template/mixins/list.js +749 -721
  420. package/src/views/bd/setting/form_template/mixins/list2.js +412 -411
  421. package/src/views/bd/setting/form_template/mixins/wf_list.js +431 -430
  422. package/src/views/mobile/user/area/dialog.vue +1 -1
  423. package/src/views/mobile/user/user/dialog.vue +1 -1
  424. package/src/views/user/bill_setting/mixins/wf.js +8 -0
  425. package/src/views/user/bill_setting/render.vue +1 -1
  426. package/src/views/user/commMenu/index.vue +3 -1
  427. package/src/views/user/commMenu/style.scss +123 -0
  428. package/src/views/user/common_attribute/edit.vue +2 -0
  429. package/src/views/user/common_attribute/itemEdit.vue +2 -0
  430. package/src/views/user/file_view_ins/list.vue +970 -970
  431. package/src/views/user/form/form_template/list.vue +527 -506
  432. package/src/views/user/form/vform/designer.vue +823 -821
  433. package/src/views/user/form/view/list.vue +24 -1
  434. package/src/views/user/home/default.vue +1124 -1117
  435. package/src/views/user/home/default2.vue +12 -8
  436. package/src/views/user/home/index.vue +102 -102
  437. package/src/views/user/home/wjl/content.vue +1581 -1569
  438. package/src/views/user/intf_permission/edit.vue +230 -0
  439. package/src/views/user/intf_permission/list.vue +196 -0
  440. package/src/views/user/menuFallback/index.vue +23 -0
  441. package/src/views/user/notify_message/dialog.vue +139 -139
  442. package/src/views/user/outLink/form_view.vue +202 -202
  443. package/src/views/user/outLink/index.vue +110 -110
  444. package/src/views/user/role/edit.vue +4 -0
  445. package/src/views/user/role/role-box.scss +83 -0
  446. package/src/views/user/role/voc_edit.vue +4 -0
  447. package/src/views/user/user/list.vue +28 -6
  448. package/src/views/user/wf/iframe/index.vue +51 -51
  449. package/src/views/user/wf/iframe/index2.vue +64 -64
  450. package/src/views/user/wf/wf_diy_attribute/edit.vue +1 -1
  451. package/src/views/user/wf/wf_manage/list2.vue +871 -871
  452. package/src/views/user/wf/wf_manage/wfContentDialog.vue +177 -126
  453. package/src/views/user/wf/wf_obj_config/activiti_wf.vue +134 -133
  454. package/src/views/user/wf/wf_obj_config/importItemDialog.vue +1 -1
  455. package/src/views/user/wf/wf_obj_config/list.vue +747 -746
  456. package/src/views/user/wf/wf_obj_config/list_form.vue +374 -373
  457. package/templates/child-app/.env +3 -0
  458. package/templates/child-app/README.md +49 -0
  459. package/templates/child-app/app.config.js +6 -0
  460. package/templates/child-app/babel.config.js +1 -0
  461. package/templates/child-app/core-resources.config.js +15 -0
  462. package/templates/child-app/gitignore +7 -0
  463. package/templates/child-app/package.json +34 -0
  464. package/templates/child-app/public/index.html +12 -0
  465. package/templates/child-app/src/assets/401_images/401.gif +0 -0
  466. package/templates/child-app/src/assets/404_images/404.png +0 -0
  467. package/templates/child-app/src/assets/404_images/404_cloud.png +0 -0
  468. package/templates/child-app/src/assets/logo.png +0 -0
  469. package/templates/child-app/src/corejsConfig.js +2 -0
  470. package/templates/child-app/src/icons/index.js +2 -0
  471. package/templates/child-app/src/icons/svg/child-demo.svg +1 -0
  472. package/templates/child-app/src/layout/index.vue +4 -0
  473. package/templates/child-app/src/main.js +5 -0
  474. package/templates/child-app/src/prefixConfig.js +13 -0
  475. package/templates/child-app/src/resources/css/login.scss +29 -0
  476. package/templates/child-app/src/resources/images/bg-login5.jpg +0 -0
  477. package/templates/child-app/src/resources/images/home-img.png +0 -0
  478. package/templates/child-app/src/router/modules/customer.js +3 -0
  479. package/templates/child-app/src/settings.js +25 -0
  480. package/templates/child-app/src/styles/app.scss +2 -0
  481. package/templates/child-app/src/views/demo/detail.vue +19 -0
  482. package/templates/child-app/src/views/demo/list.vue +38 -0
  483. package/templates/child-app/src/views/user/login/index.vue +18 -0
  484. package/templates/child-app/vue.config.js +107 -0
  485. package/src/components/xform/form-render/container-item/dynamicFieldEngine.js +0 -285
  486. package/src/components/xform/form-render/formDynamicFieldMixin.js +0 -131
  487. package/src/views/demo/bizTab/bill/billConfig.js +0 -41
  488. package/src/views/demo/bizTab/bill/detail.vue +0 -436
  489. package/src/views/demo/bizTab/bill/list.vue +0 -288
  490. package/src/views/demo/bizTab/bill/productDialog.vue +0 -176
  491. package/src/views/demo/bizTab/simple/billApi.js +0 -123
  492. package/src/views/demo/bizTab/simple/detail.vue +0 -407
  493. package/src/views/demo/bizTab/simple/list.vue +0 -217
  494. package/src/views/demo/bizTab/standalone/index.vue +0 -121
  495. package/src/views/demo/bizTab/wf/billConfig.js +0 -44
  496. package/src/views/demo/bizTab/wf/detail.vue +0 -661
  497. package/src/views/demo/bizTab/wf/list.vue +0 -242
  498. package/src/views/user/outLink/cc_form_view.vue +0 -188
  499. /package/src/{resources → core-resources}/js/base/common.js +0 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * 基础字典(/user/common_attribute/listItems)的进程内缓存。
3
+ *
4
+ * 动机是同一个观察:打开一次详情页,光字典就会打出去 5~7 条 listItems —— 一部分来自
5
+ * 页面自己的 mounted,一部分来自表单里每个挂了 commonAttributeCode 的字段各发各的。
6
+ * 这批请求和详情取数挤在同一个 tick 里,是详情页请求突发量的主要来源。
7
+ *
8
+ * 于是这里做两件事:
9
+ * 1. **并发去重** —— 同一 key 在飞的请求只发一条,后来者挂到同一个 promise 上;
10
+ * 2. **结果复用** —— 字典内容按天计都未必变一次,TTL 内重复进出页面不再发请求。
11
+ *
12
+ * 几条刻意的约束:
13
+ * - **只缓存成功响应**。失败(断网、DNS 解析失败、网关 502)一律不写缓存,否则一次
14
+ * 网络抖动会把「空字典」粘住整个 TTL —— 那比多发几个请求糟得多。
15
+ * - **每次取用都复制一份再交出去**。调用方普遍把 dicts 直接挂到 Vue data 上,会被
16
+ * 响应式系统 observe;共享同一份数组会让 A 页面的改动漏到 B 页面。
17
+ * - **key 必须带公司维度**。listItems 是带 forCompany: true 发的,而切换公司走的是
18
+ * store 的 changeCompanyInfo,不刷新页面,不带公司维度就会命中上一家公司的字典。
19
+ * - **失效要能打断在途请求的回写**。字典维护页保存后会调 invalidateBaseDicts,此时
20
+ * 可能有一条更早发出的请求还没回来;用 generation 计数把它的回写作废,
21
+ * 否则刚失效的缓存会被旧数据重新填上。
22
+ */
23
+
24
+ export const DEFAULT_BASE_DICTS_TTL = 5 * 60 * 1000;
25
+
26
+ /** key -> { code, res, expireAt } */
27
+ const cache = new Map();
28
+ /** key -> { code, promise } */
29
+ const inflight = new Map();
30
+ /** 每次失效 +1;在途请求回写前比对,对不上就丢弃结果。 */
31
+ let generation = 0;
32
+
33
+ function isPlainEmptyObject(value) {
34
+ if (value === null || typeof value !== "object") return false;
35
+ if (Array.isArray(value)) return false;
36
+ return Object.keys(value).length === 0;
37
+ }
38
+
39
+ /**
40
+ * 键顺序无关的序列化。option.data 多半是 handleCustomEvent 的返回值展开出来的,
41
+ * 同样的参数不保证同样的键顺序,直接 JSON.stringify 会漏掉本该命中的缓存。
42
+ */
43
+ function stableStringify(value) {
44
+ if (value === null || typeof value !== "object") {
45
+ const text = JSON.stringify(value);
46
+ return text === undefined ? "" : text;
47
+ }
48
+ if (Array.isArray(value)) {
49
+ return `[${value.map(stableStringify).join(",")}]`;
50
+ }
51
+ return `{${Object.keys(value)
52
+ .sort()
53
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
54
+ .join(",")}}`;
55
+ }
56
+
57
+ /**
58
+ * @param {String} scope 公司维度,通常是 store.getters.companyCode
59
+ * @param {String} code 字典编码
60
+ * @param {Object} [data] 额外请求参数;不传和传 {} 发出去的请求一样,归一到同一个 key
61
+ */
62
+ export function buildBaseDictsKey(scope, code, data) {
63
+ let extra = "";
64
+ if (data !== undefined && data !== null && !isPlainEmptyObject(data)) {
65
+ extra = stableStringify(data);
66
+ }
67
+ const dictCode = code === undefined || code === null ? "" : code;
68
+ return `${scope || ""}::${dictCode}::${extra}`;
69
+ }
70
+
71
+ function cloneResponse(res) {
72
+ if (!res || typeof res !== "object") return res;
73
+ const cloned = { ...res };
74
+ if (Array.isArray(res.objx)) {
75
+ cloned.objx = res.objx.map((item) =>
76
+ item && typeof item === "object" ? { ...item } : item
77
+ );
78
+ }
79
+ return cloned;
80
+ }
81
+
82
+ function isSuccessResponse(res) {
83
+ return !!res && res.type === "success";
84
+ }
85
+
86
+ /** 把响应拆成调用方要的 { dicts, dictMap }。 */
87
+ export function toBaseDicts(res) {
88
+ const dicts = res && Array.isArray(res.objx) ? res.objx : [];
89
+ const dictMap = {};
90
+ for (const item of dicts) {
91
+ if (item && item.sn !== undefined && item.sn !== null) {
92
+ dictMap[item.sn] = item.value;
93
+ }
94
+ }
95
+ return { dicts, dictMap };
96
+ }
97
+
98
+ /**
99
+ * 取字典:先查缓存,再查在途,都没有才调 request()。
100
+ *
101
+ * @param {Object} option
102
+ * @param {String} option.key buildBaseDictsKey 的结果
103
+ * @param {String} [option.code] 字典编码,只用于按 code 失效
104
+ * @param {Function} option.request 真正发请求的函数,返回 Promise<res>
105
+ * @param {Number} [option.ttl] 毫秒;<= 0 表示只去重不缓存
106
+ * @param {Boolean} [option.force] 跳过缓存与在途,强制重取
107
+ * @returns {Promise} 解析为后端响应 res(结构与直接发请求一致)
108
+ */
109
+ export function loadBaseDicts(option) {
110
+ const { key, code, request, force = false } = option || {};
111
+ const hasTtl = typeof option.ttl === "number";
112
+ const ttl = hasTtl ? option.ttl : DEFAULT_BASE_DICTS_TTL;
113
+
114
+ if (typeof request !== "function") {
115
+ return Promise.reject(new TypeError("loadBaseDicts 缺少 request 函数"));
116
+ }
117
+ // 没有 key(比如没传 code)就退化成一次普通请求,不走缓存。
118
+ if (!key) {
119
+ try {
120
+ return Promise.resolve(request());
121
+ } catch (error) {
122
+ return Promise.reject(error);
123
+ }
124
+ }
125
+
126
+ if (!force) {
127
+ const hit = cache.get(key);
128
+ if (hit) {
129
+ if (hit.expireAt > Date.now()) {
130
+ return Promise.resolve(cloneResponse(hit.res));
131
+ }
132
+ cache.delete(key);
133
+ }
134
+ const pending = inflight.get(key);
135
+ if (pending) return pending.promise.then(cloneResponse);
136
+ }
137
+
138
+ const startedAt = generation;
139
+ // 同步调 request(),别用 Promise.resolve().then(request) —— 那会把请求整体推迟
140
+ // 一个微任务,白白错过本可以和同批请求一起排队的时机。try/catch 只是接住
141
+ // request 自己同步抛出的情况。
142
+ let started;
143
+ try {
144
+ started = Promise.resolve(request());
145
+ } catch (error) {
146
+ return Promise.reject(error);
147
+ }
148
+
149
+ const task = started
150
+ .then((res) => {
151
+ if (ttl > 0 && isSuccessResponse(res) && generation === startedAt) {
152
+ cache.set(key, {
153
+ code,
154
+ res: cloneResponse(res),
155
+ expireAt: Date.now() + ttl,
156
+ });
157
+ }
158
+ return res;
159
+ })
160
+ .finally(() => {
161
+ const current = inflight.get(key);
162
+ if (current && current.promise === task) inflight.delete(key);
163
+ });
164
+
165
+ inflight.set(key, { code, promise: task });
166
+ return task;
167
+ }
168
+
169
+ /**
170
+ * 失效缓存。不传 code(或传空)则整体清空。
171
+ * @param {String|String[]} [code]
172
+ */
173
+ export function invalidateBaseDicts(code) {
174
+ generation += 1;
175
+ if (code === undefined || code === null || code === "") {
176
+ cache.clear();
177
+ inflight.clear();
178
+ return;
179
+ }
180
+ const codes = Array.isArray(code) ? code : [code];
181
+ for (const [key, entry] of cache) {
182
+ if (codes.includes(entry.code)) cache.delete(key);
183
+ }
184
+ for (const [key, entry] of inflight) {
185
+ if (codes.includes(entry.code)) inflight.delete(key);
186
+ }
187
+ }
188
+
189
+ /** 清空全部。登出、切租户等场景直接调它。 */
190
+ export function clearBaseDictsCache() {
191
+ invalidateBaseDicts();
192
+ }
193
+
194
+ /** 仅供测试与排查使用。 */
195
+ export function getBaseDictsCacheStats() {
196
+ return { cached: cache.size, inflight: inflight.size };
197
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Webpack async chunk load error helpers.
3
+ *
4
+ * Keep this module dependency-free so dialogs and route loaders can share the
5
+ * same detection without pulling UI code into a chunk.
6
+ */
7
+ export function isChunkLoadError(error) {
8
+ const name = (error && error.name) || "";
9
+ const message = (error && error.message) || String(error || "");
10
+ return (
11
+ name === "ChunkLoadError"
12
+ || /Loading (CSS )?chunk .* failed/i.test(message)
13
+ || /ChunkLoadError/i.test(message)
14
+ || /Failed to fetch dynamically imported module/i.test(message)
15
+ || /页面资源加载失败/i.test(message)
16
+ );
17
+ }
18
+
19
+ export function getChunkLoadErrorMessage(error, resourceName = "页面资源") {
20
+ if (isChunkLoadError(error)) {
21
+ return `${resourceName}加载失败,可能系统已发布新版本,请刷新页面后重试`;
22
+ }
23
+ return `${resourceName}加载失败,请稍后重试`;
24
+ }
@@ -0,0 +1,57 @@
1
+ /* global __CORE_RESOURCES__ */
2
+ // Keep unmanaged legacy applications working. Managed starters fail explicitly
3
+ // when a feature/mode was not declared, instead of issuing hidden 404 requests.
4
+ export function codeEditorResourcePath(mode) {
5
+ const config = typeof __CORE_RESOURCES__ === "undefined" ? null : __CORE_RESOURCES__;
6
+ const feature = config && config.features.codeEditor;
7
+ if (config && !feature) throw new Error("CodeEditor 未启用资源,请配置 codeEditor 并运行 npm run resources:prepare");
8
+ if (feature && feature.modes !== "*" && !feature.modes.includes(mode)) {
9
+ throw new Error(`CodeEditor 资源未包含模式 ${mode},请使用 full 配置并重新构建`);
10
+ }
11
+ return resolveResourceBase((feature && feature.basePath) || "base/ace/src-min-noconflict/");
12
+ }
13
+
14
+ export function richTextResourcePath(locale) {
15
+ const config = typeof __CORE_RESOURCES__ === "undefined" ? null : __CORE_RESOURCES__;
16
+ const feature = config && config.features.richText;
17
+ if (config && !feature) throw new Error("TinyMCE 未启用资源,请配置 richText 并运行 npm run resources:prepare");
18
+ if (feature && !feature.locales.includes(locale)) throw new Error(`TinyMCE 资源未包含语言 ${locale}`);
19
+ return resolveResourceBase((feature && feature.basePath) || "base/tinymce/");
20
+ }
21
+
22
+ export function spreadsheetResourcePath() {
23
+ const config = typeof __CORE_RESOURCES__ === "undefined" ? null : __CORE_RESOURCES__;
24
+ const feature = config && config.features.spreadsheet;
25
+ if (config && !feature) throw new Error("Luckysheet 未启用资源,请配置 spreadsheet 并运行 npm run resources:prepare");
26
+ return resolveResourceBase((feature && feature.basePath) || "luckysheet/");
27
+ }
28
+
29
+ export function workflowDesignerResourcePath() {
30
+ const config = typeof __CORE_RESOURCES__ === "undefined" ? null : __CORE_RESOURCES__;
31
+ const feature = config && config.features.workflowDesigner;
32
+ if (config && !feature) throw new Error("Activiti 未启用资源,请配置 workflowDesigner 并运行 npm run resources:prepare");
33
+ const base = resolveResourceBase((feature && feature.basePath) || "activiti-explorer/");
34
+ if (window.__POWERED_BY_QIANKUN__) {
35
+ throw new Error("Activiti 5.17 依赖真实父窗口回调,只支持主应用或非 qiankun 的同源页面");
36
+ }
37
+ return base;
38
+ }
39
+
40
+ export function workflowDesignerUrl({ wfType, serviceId, modelId, baseApi }) {
41
+ const resourceBase = workflowDesignerResourcePath();
42
+ window.sysParamForWf = {
43
+ webPrefix: new URL("../", resourceBase).href.replace(/\/$/, ""),
44
+ baseApi,
45
+ };
46
+ const url = new URL("modeler.html", resourceBase);
47
+ url.searchParams.set("wfType", wfType);
48
+ url.searchParams.set("serviceId", serviceId);
49
+ url.searchParams.set("modelId", modelId);
50
+ return url.href;
51
+ }
52
+
53
+ function resolveResourceBase(relative) {
54
+ const base = window.__POWERED_BY_QIANKUN__ && window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
55
+ ? window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ : (window.WEB_PREFIX || "") + "/";
56
+ return new URL(relative, new URL(base, window.location.href)).href;
57
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 导入文件闸门。
3
+ *
4
+ * 导入侧是整文件 readAsBinaryString 读进内存 → XLSX.read(占用通常是文件体积的
5
+ * 5~20 倍)→ 再逐格建行数组,全程同步且没有任何让步。此前没有大小与行数校验,
6
+ * 几十 MB 的 xlsx 会直接把标签页撑爆,且崩在 FileReader / XLSX 内部,用户看到的
7
+ * 同样是"页面崩溃"而不是一句提示。
8
+ *
9
+ * 阈值都可以由导入配置覆盖(maxFileSize / maxRowNum,也支持写在 importOption 上),
10
+ * 传 0 表示不限制。
11
+ */
12
+
13
+ /** 导入文件大小上限(字节)。 */
14
+ export const DEFAULT_IMPORT_FILE_SIZE = 20 * 1024 * 1024;
15
+
16
+ /** 导入数据行数上限(不含模板前 3 行表头)。 */
17
+ export const DEFAULT_IMPORT_ROW_NUM = 20000;
18
+
19
+ const readOption = (option, key) => {
20
+ if (option && option[key] !== undefined) return option[key];
21
+ if (option && option.importOption && option.importOption[key] !== undefined) {
22
+ return option.importOption[key];
23
+ }
24
+ return undefined;
25
+ };
26
+
27
+ const resolveLimit = (value, defaultValue) => {
28
+ let num = Number(value);
29
+ if (!isFinite(num) || num < 0) return defaultValue;
30
+ return num;
31
+ };
32
+
33
+ /** @param {Object} option 导入配置。@returns {Number} 文件大小上限,0 表示不限制。 */
34
+ export function getImportFileSizeLimit(option) {
35
+ return resolveLimit(readOption(option, "maxFileSize"), DEFAULT_IMPORT_FILE_SIZE);
36
+ }
37
+
38
+ /** @param {Object} option 导入配置。@returns {Number} 行数上限,0 表示不限制。 */
39
+ export function getImportRowLimit(option) {
40
+ return resolveLimit(readOption(option, "maxRowNum"), DEFAULT_IMPORT_ROW_NUM);
41
+ }
42
+
43
+ /** @param {File} file 待导入文件。@param {Object} option 导入配置。@returns {Boolean} */
44
+ export function isImportFileOversize(file, option) {
45
+ let limit = getImportFileSizeLimit(option);
46
+ return limit > 0 && !!file && file.size > limit;
47
+ }
48
+
49
+ /** @param {Number} rowNum 数据行数。@param {Object} option 导入配置。@returns {Boolean} */
50
+ export function isImportRowsOverLimit(rowNum, option) {
51
+ let limit = getImportRowLimit(option);
52
+ return limit > 0 && rowNum > limit;
53
+ }
54
+
55
+ /** @param {Number} bytes 字节数。@returns {Number} 保留一位小数的 MB 数。 */
56
+ export function toFileSizeMb(bytes) {
57
+ return Math.round(((bytes || 0) / 1024 / 1024) * 10) / 10;
58
+ }
59
+
60
+ /**
61
+ * 取单元格文本:w(格式化文本)缺失时回退 v(原始值)。
62
+ * 模板里手工粘贴或公式生成的数值格常常只有 v,直接 w.trim() 会 TypeError,
63
+ * 而调用点外层的 catch 会把它吞成"点了导入没反应"。
64
+ * @param {Object} cell xlsx 单元格。
65
+ * @returns {String|undefined}
66
+ */
67
+ export function getImportCellText(cell) {
68
+ if (cell === undefined || cell === null) return undefined;
69
+ let text = cell.w !== undefined && cell.w !== null ? cell.w : cell.v;
70
+ if (text === undefined || text === null) return undefined;
71
+ return String(text).trim();
72
+ }
@@ -11,6 +11,8 @@ const PAGE_MARGIN = 10;
11
11
  //超过之后 toDataURL 直接返回空白图——长详情页很容易撞上,这里按内容尺寸回退 scale。
12
12
  const MAX_CANVAS_SIDE = 16384;
13
13
  const MAX_CANVAS_AREA = 268435456;
14
+ //回退倍率的下限。再往下字就糊到认不出了,与其导出一份看不清的 PDF,不如让它明确失败
15
+ const MIN_SCALE = 0.2;
14
16
 
15
17
  const JPEG_QUALITY = 0.92;
16
18
 
@@ -103,7 +105,10 @@ function pickScale(width, height, expected) {
103
105
  MAX_CANVAS_SIDE / height,
104
106
  Math.sqrt(MAX_CANVAS_AREA / (width * height))
105
107
  );
106
- return Math.max(scale, 1);
108
+ //下限不能取 1:内容高度超过 16384 CSS px 的长页面(整页导出的常态)算出来的上限本就 <1,
109
+ //抬回 1 等于把上面这段保护整个作废——canvas 照样越界,toDataURL 返回空白图,
110
+ //正是 MAX_CANVAS_SIDE 想拦的那个失败。html2canvas 支持 scale < 1,糊一点也要出得来。
111
+ return Math.max(scale, MIN_SCALE);
107
112
  }
108
113
 
109
114
  //Safari(WebKit) 的 getComputedStyle 会把颜色序列化成 color(srgb …) / color(display-p3 …),
@@ -9,6 +9,7 @@ import PopupManager from "element-ui/src/utils/popup/popup-manager.js";
9
9
  import settingConfig from "@/settings.js";
10
10
  import { encode } from "js-base64";
11
11
  import { encrypt } from "@base/utils/aes";
12
+ import { handleRequestNetworkError } from "@base/utils/runtimeRecovery";
12
13
 
13
14
  let configUtil = {
14
15
  baseUrl: process.env.VUE_APP_BASE_API,
@@ -56,8 +57,13 @@ service.interceptors.request.use(
56
57
  config.filterConfig
57
58
  );
58
59
  }
59
- if (
60
- (config.headers["Content-Type"] === "application/x-www-form-urlencoded" ||
60
+ if (settingConfig.requestAesEnabled === true) {
61
+ config.data = {
62
+ _aeenboda: encrypt(JSON.stringify(config.data === undefined ? {} : config.data)),
63
+ };
64
+ config.headers["Content-Type"] = "application/json;charset=UTF-8";
65
+ } else if (
66
+ (config.headers["Content-Type"] === "application/x-www-form-urlencoded" ||
61
67
  config.headers["Content-Type"] ===
62
68
  "application/x-www-form-urlencoded;charset=UTF-8") &&
63
69
  typeof config.data !== "string" &&
@@ -92,6 +98,15 @@ service.interceptors.request.use(
92
98
  background: "unset",
93
99
  });
94
100
  }
101
+
102
+ // 被取消的请求走不到响应/错误拦截器里的 removeModel —— Cancel 对象不带 config,
103
+ // 那边无从知道该清理哪一个请求。不收口的话上面这两样会永久留在页面上(一个关不掉
104
+ // 的转圈遮罩)。挂到令牌自己的 promise 上,取消时精确清理本次请求创建的那份。
105
+ if (config.cancelToken && (config.ajaxOverlay || config.loadingInstance)) {
106
+ config.cancelToken.promise.then(function () {
107
+ removeModel(config);
108
+ });
109
+ }
95
110
  return config;
96
111
  },
97
112
  (error) => {
@@ -115,6 +130,103 @@ function removeModel(config) {
115
130
  }
116
131
  }
117
132
 
133
+ function getSafeRequestUrl(config) {
134
+ if (!config || !config.url) return t1("未知");
135
+ const rawUrl = String(config.url).split("?")[0].split("#")[0];
136
+ const baseUrl = config.baseURL || "";
137
+ if (/^https?:\/\//i.test(rawUrl)) return rawUrl;
138
+ return `${baseUrl || ""}${rawUrl}` || t1("未知");
139
+ }
140
+
141
+ function t1(path, values) {
142
+ const translate = Vue.prototype.$t1;
143
+ return typeof translate === "function" ? translate(path, values) : path;
144
+ }
145
+
146
+ function isAxiosNetworkError(error) {
147
+ if (!error || error.response) return false;
148
+ const message = (error.message || "").toString();
149
+ if (error.code === "ECONNABORTED" || /timeout/i.test(message)) return false;
150
+ return error.code === "ERR_NETWORK" || /network error/i.test(message);
151
+ }
152
+
153
+ function isGateway502(error) {
154
+ return !!(error && error.response && error.response.status === 502);
155
+ }
156
+
157
+ function shouldSwallowNetworkError(config, error) {
158
+ return !!(
159
+ config &&
160
+ config.ignoreNetworkError === true &&
161
+ isAxiosNetworkError(error)
162
+ );
163
+ }
164
+
165
+ function shouldSwallow502(config, error) {
166
+ return !!(config && config.ignore502 === true && isGateway502(error));
167
+ }
168
+
169
+ function getRequestErrorMessage(error) {
170
+ const config = (error && error.config) || {};
171
+ const response = error && error.response;
172
+ const status = response && response.status;
173
+ const method = String(config.method || "GET").toUpperCase();
174
+ const requestUrl = getSafeRequestUrl(config);
175
+ const originalMessage = (error && error.message) || "未知错误";
176
+ let summary = t1("请求失败,请稍后重试。");
177
+
178
+ if (error && (error.code === "ECONNABORTED" || /timeout/i.test(originalMessage))) {
179
+ summary = t1("请求超时,请检查网络或稍后重试。");
180
+ } else if (!response) {
181
+ summary = t1("无法连接服务器,请检查网络、VPN/代理及服务状态后重试。");
182
+ } else if ([501, 502, 503, 504].includes(status)) {
183
+ summary = t1("网关或后端服务异常,请稍后重试或联系管理员。");
184
+ } else if (status >= 500) {
185
+ summary = t1("服务器暂时不可用,请稍后重试或联系管理员。");
186
+ } else if (status === 404) {
187
+ summary = t1("请求的服务地址不存在,请联系管理员检查接口配置。");
188
+ } else if (status === 403) {
189
+ summary = t1("服务器拒绝了本次请求,请检查访问权限。");
190
+ } else if (status === 401) {
191
+ summary = t1("登录状态已失效或无效,请重新登录。");
192
+ } else if (status >= 400) {
193
+ summary = t1("服务器未能处理本次请求,请检查输入后重试。");
194
+ }
195
+
196
+ const details = [
197
+ summary,
198
+ t1("请求:{method} {url}", { method, url: requestUrl }),
199
+ t1("状态码:{status}", {
200
+ status: status || t1("未收到服务器响应(浏览器未提供 HTTP 状态码)"),
201
+ }),
202
+ ];
203
+ if (error && error.code) {
204
+ details.push(t1("错误码:{code}", { code: error.code }));
205
+ }
206
+ details.push(
207
+ t1("原始错误:{message}", { message: originalMessage }),
208
+ t1("发生时间:{time}", { time: new Date().toLocaleString() })
209
+ );
210
+
211
+ if (!response) {
212
+ details.push(t1("可能原因:"));
213
+ details.push(t1("ERR_CONNECTION_RESET:连接被服务端、网关或安全设备重置;"));
214
+ details.push(t1("CORS:浏览器跨域配置异常;"));
215
+ details.push(t1("ERR_CERT_*:HTTPS 证书异常;"));
216
+ details.push(t1("请求长期 Pending:接口阻塞或连接未释放。"));
217
+ details.push(t1("实际 HTTP 状态码请在浏览器 Network 面板或网关日志中确认。"));
218
+ } else if ([501, 502, 503, 504].includes(status)) {
219
+ details.push(t1("501/502/503/504:网关或后端服务异常。"));
220
+ }
221
+
222
+ return {
223
+ summary,
224
+ details: details.join("\n"),
225
+ // 有 HTTP 状态码时直接挂到弹窗标题 Error(502),不用点开「详情」
226
+ errorLabel: status ? String(status) : !response ? originalMessage : "",
227
+ };
228
+ }
229
+
118
230
  async function handleNickName(option) {
119
231
  let { vueTarget, res, callback, config } = option;
120
232
  if (res.type !== "success" || !res.objx) {
@@ -383,7 +495,31 @@ service.interceptors.response.use(
383
495
  }
384
496
  },
385
497
  (error) => {
498
+ // 主动取消(axios.CancelToken)不是错误,必须最先短路返回。
499
+ // axios 0.18 取消时 reject 的是 Cancel 对象,它**不带 config**,会一路落到下面
500
+ // 那个 else 分支无条件弹 ErroreBox —— 而 ErroreBox 是弹窗不是 toast,取消 N 个
501
+ // 在途请求就会连弹 N 个错误框。config.errorMsg 那条逃生口在 if (config) 里面,
502
+ // Cancel 走不到,所以只能在这里拦。调用方按需自行 catch。
503
+ if (axios.isCancel(error)) {
504
+ return Promise.reject(error);
505
+ }
386
506
  let config = error.config;
507
+ // ignoreNetworkError 只吞 Network Error;ignore502 只吞 502。两者互不影响。
508
+ const swallowError =
509
+ shouldSwallowNetworkError(config, error) || shouldSwallow502(config, error);
510
+ // modalStrictly 的语义是「业务失败后由后续流程接管遮罩」,只对响应拦截器里
511
+ // res.type !== 'success' 那条分支成立。传输层错误(断网、DNS 解析失败、连接被
512
+ // 重置)没有任何后续流程会接手,再跳过 removeModel,遮罩就永远留在页面上。
513
+ //
514
+ // $baseLoading({ target: document.body }) 拿到的是 element 的 fullscreen 单例
515
+ // (见 utils/pdfUtil.js 里的说明),平时靠「同一批里随便哪个请求收尾」顺手关掉,
516
+ // 所以只有整批请求全军覆没时才暴露出来 —— 正好就是详情页 mounted 一口气发
517
+ // 8+ 个 isLoading + modalStrictly 请求、网络一抖就整页白屏且滚动被锁死的场景。
518
+ // 下面两处一律 removeModel:正常情况下本来也会被别的请求关掉,行为不变。
519
+ if (handleRequestNetworkError()) {
520
+ removeModel(config);
521
+ return swallowError ? Promise.resolve() : Promise.reject(error);
522
+ }
387
523
  if (
388
524
  error.response &&
389
525
  error.response.data &&
@@ -394,23 +530,27 @@ service.interceptors.response.use(
394
530
  } else {
395
531
  if (config) {
396
532
  config.error && config.error(error);
397
- if (config.modalStrictly !== true) {
398
- removeModel(config);
399
- }
400
- if (config.errorMsg !== false) {
533
+ removeModel(config);
534
+ if (config.errorMsg !== false && !swallowError) {
535
+ const requestError = getRequestErrorMessage(error);
401
536
  ErroreBox.msg({
402
- content: error.message,
537
+ content: requestError.summary,
538
+ _errorMsg: requestError.details,
539
+ errorLabel: requestError.errorLabel,
403
540
  type: "error",
404
541
  });
405
542
  }
406
543
  } else {
544
+ const requestError = getRequestErrorMessage(error);
407
545
  ErroreBox.msg({
408
- content: error.message,
546
+ content: requestError.summary,
547
+ _errorMsg: requestError.details,
548
+ errorLabel: requestError.errorLabel,
409
549
  type: "error",
410
550
  });
411
551
  }
412
552
  }
413
- return Promise.reject(error);
553
+ return swallowError ? Promise.resolve() : Promise.reject(error);
414
554
  }
415
555
  );
416
556