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

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 (498) 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/defaultLayout.vue +2 -2
  378. package/src/router/index.js +43 -48
  379. package/src/router/modules/customer.js +12 -0
  380. package/src/store/modules/settings.js +1 -1
  381. package/src/store/modules/tagsView.js +241 -217
  382. package/src/store/modules/user.js +16 -12
  383. package/src/styles/btn.scss +315 -0
  384. package/src/styles/dialog.scss +1710 -0
  385. package/src/styles/element-ui.scss +1076 -0
  386. package/src/styles/element-variables.scss +31 -0
  387. package/src/styles/global.scss +115 -0
  388. package/src/styles/index.scss +245 -0
  389. package/src/styles/layout-skins.scss +840 -0
  390. package/src/styles/legacy-base.scss +19 -0
  391. package/src/styles/menu-icons.scss +75 -0
  392. package/src/styles/mixin.scss +80 -0
  393. package/src/styles/nprogress.scss +14 -0
  394. package/src/styles/page-shell.scss +723 -0
  395. package/src/styles/sidebar.scss +296 -0
  396. package/src/styles/split-handle.scss +52 -0
  397. package/src/styles/theme-variables.scss +7 -0
  398. package/src/styles/transition.scss +48 -0
  399. package/src/styles/utilities.scss +253 -0
  400. package/src/styles/variables.scss +72 -0
  401. package/src/utils/baseDictsCache.js +197 -0
  402. package/src/utils/chunkLoadError.js +24 -0
  403. package/src/utils/featureResources.js +57 -0
  404. package/src/utils/importLimit.js +72 -0
  405. package/src/utils/pdfUtil.js +6 -1
  406. package/src/utils/request.js +142 -7
  407. package/src/utils/resolveViewComponent.js +45 -90
  408. package/src/utils/runtimeRecovery.js +105 -0
  409. package/src/utils/swiperLoader.js +20 -0
  410. package/src/utils/vab.js +1334 -1283
  411. package/src/utils/xlsxLoader.js +29 -0
  412. package/src/views/bd/setting/formVersion/compareContMixin.scss +1 -1
  413. package/src/views/bd/setting/form_template/edit.vue +378 -356
  414. package/src/views/bd/setting/form_template/formDesignerDialog.vue +6 -0
  415. package/src/views/bd/setting/form_template/formTemplateType.js +43 -0
  416. package/src/views/bd/setting/form_template/list.vue +304 -303
  417. package/src/views/bd/setting/form_template/mixins/edit.js +344 -280
  418. package/src/views/bd/setting/form_template/mixins/list.js +749 -721
  419. package/src/views/bd/setting/form_template/mixins/list2.js +412 -411
  420. package/src/views/bd/setting/form_template/mixins/wf_list.js +431 -430
  421. package/src/views/mobile/user/area/dialog.vue +1 -1
  422. package/src/views/mobile/user/user/dialog.vue +1 -1
  423. package/src/views/user/bill_setting/mixins/wf.js +8 -0
  424. package/src/views/user/bill_setting/render.vue +1 -1
  425. package/src/views/user/commMenu/index.vue +3 -1
  426. package/src/views/user/commMenu/style.scss +123 -0
  427. package/src/views/user/common_attribute/edit.vue +2 -0
  428. package/src/views/user/common_attribute/itemEdit.vue +2 -0
  429. package/src/views/user/file_view_ins/list.vue +970 -970
  430. package/src/views/user/form/form_template/list.vue +527 -506
  431. package/src/views/user/form/vform/designer.vue +823 -821
  432. package/src/views/user/form/view/list.vue +24 -1
  433. package/src/views/user/home/default.vue +1124 -1117
  434. package/src/views/user/home/default2.vue +12 -8
  435. package/src/views/user/home/index.vue +102 -102
  436. package/src/views/user/home/wjl/content.vue +1581 -1569
  437. package/src/views/user/intf_permission/edit.vue +230 -0
  438. package/src/views/user/intf_permission/list.vue +196 -0
  439. package/src/views/user/menuFallback/index.vue +23 -0
  440. package/src/views/user/notify_message/dialog.vue +139 -139
  441. package/src/views/user/outLink/form_view.vue +202 -202
  442. package/src/views/user/outLink/index.vue +110 -110
  443. package/src/views/user/role/edit.vue +4 -0
  444. package/src/views/user/role/role-box.scss +83 -0
  445. package/src/views/user/role/voc_edit.vue +4 -0
  446. package/src/views/user/user/list.vue +28 -6
  447. package/src/views/user/wf/iframe/index.vue +51 -51
  448. package/src/views/user/wf/iframe/index2.vue +64 -64
  449. package/src/views/user/wf/wf_diy_attribute/edit.vue +1 -1
  450. package/src/views/user/wf/wf_manage/list2.vue +871 -871
  451. package/src/views/user/wf/wf_manage/wfContentDialog.vue +177 -126
  452. package/src/views/user/wf/wf_obj_config/activiti_wf.vue +134 -133
  453. package/src/views/user/wf/wf_obj_config/importItemDialog.vue +1 -1
  454. package/src/views/user/wf/wf_obj_config/list.vue +747 -746
  455. package/src/views/user/wf/wf_obj_config/list_form.vue +374 -373
  456. package/templates/child-app/.env +3 -0
  457. package/templates/child-app/README.md +49 -0
  458. package/templates/child-app/app.config.js +6 -0
  459. package/templates/child-app/babel.config.js +1 -0
  460. package/templates/child-app/core-resources.config.js +15 -0
  461. package/templates/child-app/gitignore +7 -0
  462. package/templates/child-app/package.json +34 -0
  463. package/templates/child-app/public/index.html +12 -0
  464. package/templates/child-app/src/assets/401_images/401.gif +0 -0
  465. package/templates/child-app/src/assets/404_images/404.png +0 -0
  466. package/templates/child-app/src/assets/404_images/404_cloud.png +0 -0
  467. package/templates/child-app/src/assets/logo.png +0 -0
  468. package/templates/child-app/src/corejsConfig.js +2 -0
  469. package/templates/child-app/src/icons/index.js +2 -0
  470. package/templates/child-app/src/icons/svg/child-demo.svg +1 -0
  471. package/templates/child-app/src/layout/index.vue +4 -0
  472. package/templates/child-app/src/main.js +5 -0
  473. package/templates/child-app/src/prefixConfig.js +13 -0
  474. package/templates/child-app/src/resources/css/login.scss +29 -0
  475. package/templates/child-app/src/resources/images/bg-login5.jpg +0 -0
  476. package/templates/child-app/src/resources/images/home-img.png +0 -0
  477. package/templates/child-app/src/router/modules/customer.js +3 -0
  478. package/templates/child-app/src/settings.js +24 -0
  479. package/templates/child-app/src/styles/app.scss +2 -0
  480. package/templates/child-app/src/views/demo/detail.vue +19 -0
  481. package/templates/child-app/src/views/demo/list.vue +38 -0
  482. package/templates/child-app/src/views/user/login/index.vue +18 -0
  483. package/templates/child-app/vue.config.js +107 -0
  484. package/src/components/xform/form-render/container-item/dynamicFieldEngine.js +0 -285
  485. package/src/components/xform/form-render/formDynamicFieldMixin.js +0 -131
  486. package/src/views/demo/bizTab/bill/billConfig.js +0 -41
  487. package/src/views/demo/bizTab/bill/detail.vue +0 -436
  488. package/src/views/demo/bizTab/bill/list.vue +0 -288
  489. package/src/views/demo/bizTab/bill/productDialog.vue +0 -176
  490. package/src/views/demo/bizTab/simple/billApi.js +0 -123
  491. package/src/views/demo/bizTab/simple/detail.vue +0 -407
  492. package/src/views/demo/bizTab/simple/list.vue +0 -217
  493. package/src/views/demo/bizTab/standalone/index.vue +0 -121
  494. package/src/views/demo/bizTab/wf/billConfig.js +0 -44
  495. package/src/views/demo/bizTab/wf/detail.vue +0 -661
  496. package/src/views/demo/bizTab/wf/list.vue +0 -242
  497. package/src/views/user/outLink/cc_form_view.vue +0 -188
  498. /package/src/{resources → core-resources}/js/base/common.js +0 -0
@@ -0,0 +1,324 @@
1
+ # 浏览器崩溃治理与修复落地方案
2
+
3
+ ## 1. 文档信息
4
+
5
+ - 编制日期:2026-09-20
6
+ - 当前实施仓库(测试源仓):`D:\develop\code\company\2024\dev\sf-cloud-web-com-dev@publish_dev`
7
+ - 正式源仓:`D:\develop\code\company\2024\dev\sf-cloud-web-com@publish`
8
+ - 发布删减版:`E:\develop\code\comapny\2026\sf-cloud-web-vue-tw\@wjlfw\_zs`
9
+ - 当前状态:P0 数据表格、自动保存队列和 Blob URL 释放已在测试源仓实施;KeepAlive 治理待确认后实施;正式源仓尚未同步。
10
+
11
+ ## 2. 问题结论
12
+
13
+ 浏览器崩溃不是单一原因造成,主要风险是页面长期运行后,多个运行时对象叠加并持续占用内存:
14
+
15
+ 1. 数据表格多次查询后,旧行 schema、组件引用或异步响应未及时失效。
16
+ 2. 用户连续点击查询时,并发请求乱序返回,旧数据可能覆盖新数据并重复创建行级对象。
17
+ 3. 编辑表自动保存请求重复进入队列,慢接口情况下形成任务积压。
18
+ 4. 下载、导入结果、打印和上传预览创建的 Blob URL 未释放。
19
+ 5. KeepAlive 长期保留多个重型页面,导致表格、表单、图表、事件和定时器一直存活。
20
+ 6. 超大查询、导入、导出或图片预览在短时间内形成内存峰值。
21
+
22
+ 删减页面只能减少初始路由和静态资源,能够降低基础占用,但不能解决运行期间的引用残留、并发请求、任务队列、Blob URL 和 KeepAlive 实例累积。因此删减版只能缓解,不能作为浏览器崩溃的根本修复手段。
23
+
24
+ ## 3. 数据表格对象关系
25
+
26
+ ### 3.1 fieldSchemaMap
27
+
28
+ `fieldSchemaMap` 保存每一行独立的字段 schema。schema 是字段组件的配置和运行时状态描述,不是 Vue 组件实例。
29
+
30
+ ```js
31
+ fieldSchemaMap = {
32
+ row_001: {
33
+ input_product_name: productNameSchema,
34
+ input_amount: amountSchema,
35
+ },
36
+ row_002: {
37
+ input_product_name: productNameSchema2,
38
+ input_amount: amountSchema2,
39
+ },
40
+ };
41
+ ```
42
+
43
+ ### 3.2 refList
44
+
45
+ `refList` 保存已经挂载的 Vue 字段组件实例,推荐键格式为:
46
+
47
+ ```js
48
+ refList = {
49
+ input_product_name_row_001: productNameComponent,
50
+ input_amount_row_001: amountComponent,
51
+ };
52
+ ```
53
+
54
+ 行键使用 `_X_ROW_KEY`。schema 与 ref 使用相同行键建立对应关系,但二者不能合并:
55
+
56
+ - `fieldSchemaMap[rowKey][fieldName]`:字段配置和状态。
57
+ - `refList[fieldName + "_" + rowKey]`:已经挂载的组件实例。
58
+
59
+ 虚拟滚动时,单元格组件可能销毁后重新创建,因此单个单元格销毁时只注销 ref,不能立即删除整行 schema。只有在行被真正删除、查询整体替换数据或整张表销毁时,才清理对应 schema。
60
+
61
+ ## 4. 已实施的 P0 修复
62
+
63
+ 核心文件:`src/components/xform/form-render/container-item/data-table-mixin.js`
64
+
65
+ ### 4.1 查询为空时清理 schema
66
+
67
+ 查询或赋值结果为空时立即执行:
68
+
69
+ ```js
70
+ if (rowLength === 0) {
71
+ this.fieldSchemaMap = {};
72
+ return;
73
+ }
74
+ ```
75
+
76
+ 修复原先 `rowLength > 0` 才重建、空结果继续保留上一批 schema 的问题。
77
+
78
+ VXE 在查询 Promise 完成前仍可能短暂渲染旧行,并把刚清空的 schema 懒建回来。因此查询换批后还会在组件更新及下一宏任务中,按当前有效行键再次清理旧行 schema 和 ref,覆盖空结果及换页的卸载时间窗。ref 清理只遍历实际存在的引用一次;schema 采用一次性压缩替换,避免“旧行数 × 组件列数”组合扫描和逐条响应式删除造成查询后卡顿。
79
+
80
+ ### 4.2 查询并发控制
81
+
82
+ - 普通查询开始前取消上一次普通查询。
83
+ - 每次查询生成递增序号。
84
+ - 只有当前序号的响应可以写入表格。
85
+ - 组件销毁后到达的响应不再处理。
86
+ - 导出查询独立运行,不被普通查询取消。
87
+
88
+ 这样可以防止连续点击查询时旧响应覆盖新响应,以及同一批数据被重复初始化。
89
+
90
+ ### 4.3 旧行 ref 清理
91
+
92
+ 查询整体替换数据后:
93
+
94
+ 1. 记录查询前的 `_X_ROW_KEY`。
95
+ 2. 对比查询后的有效行键。
96
+ 3. 在组件更新完成后,精确删除旧行对应的 `fieldName_rowKey` 引用。
97
+ 4. 正常组件生命周期仍负责常规注销,该逻辑只作为异常残留兜底。
98
+
99
+ ### 4.4 删除行时释放运行时状态
100
+
101
+ 普通表、编辑表和树表删除行时统一释放:
102
+
103
+ - `fieldSchemaMap[rowKey]`;
104
+ - 该行自动保存定时器;
105
+ - 该行尚未执行的自动保存任务。
106
+
107
+ 行组件销毁时继续由字段组件注销自身 ref。
108
+
109
+ ### 4.5 表格销毁清理
110
+
111
+ 表格 `beforeDestroy` 中执行:
112
+
113
+ - 标记表格已经销毁;
114
+ - 取消当前查询;
115
+ - 使自动保存任务代次失效;
116
+ - 清除自动保存定时器和等待项;
117
+ - 清空 `fieldSchemaMap`;
118
+ - 清空行键数据;
119
+ - 注销表格引用。
120
+
121
+ ### 4.6 自动保存队列
122
+
123
+ 自动保存采用串行队列,规则如下:
124
+
125
+ - 同一行短时间连续修改合并为一次任务。
126
+ - 保存请求执行期间再次修改,前一次完成后补存最新版本。
127
+ - 粘贴、失焦和 change 触发统一进入同一个串行 worker,不再存在两套自动保存并发竞争。
128
+ - 不允许同一行无限并发保存。
129
+ - 最多保留 20 个待保存行,超过后提示用户稍后编辑。
130
+ - 行删除、表格销毁后,相关待执行任务失效。
131
+ - 自动保存的写入请求和保存后回查共用 CancelToken;行删除或表格销毁时会取消当前自动保存。手动保存仍按原交互执行,不纳入自动保存 worker。
132
+ - worker 每次只持有当前行,等待行保存在可清空的 map/order 中;销毁时不会留下整条 Promise 回调链引用组件和行对象。
133
+
134
+ ### 4.7 Blob URL 释放
135
+
136
+ 以下场景已补充 `URL.revokeObjectURL`:
137
+
138
+ - 文件库下载;
139
+ - 私有文件下载;
140
+ - 表单导入结果下载;
141
+ - 打印预览;
142
+ - 二维码文件解析;
143
+ - 聊天附件;
144
+ - 普通上传、OBS 上传及 VabUpload2 上传预览;
145
+ - 表单字段附件预览。
146
+
147
+ 下载完成后释放;打印预览延迟 60 秒释放;上传预览在文件删除、值替换、组件销毁时释放。异步请求在组件销毁后才返回时,立即释放刚创建的 URL。
148
+
149
+ ## 5. KeepAlive 治理方案
150
+
151
+ ### 5.1 当前问题
152
+
153
+ 项目使用自定义 `BaseKeepAlive`,内部已经支持 `max`,但 `AppMain.vue` 未传入该参数,实际缓存实例没有上限。
154
+
155
+ KeepAlive 页面切换时只触发 `deactivated`,不会触发 `beforeDestroy`。因此数据表格、行 schema、表单数据、图表、定时器、事件监听和请求可能一直保留。
156
+
157
+ ### 5.2 不允许只增加 max
158
+
159
+ 直接设置 `max=8` 会按最久未访问顺序销毁页面。如果最老页面是未保存的编辑表单,用户数据会静默丢失。
160
+
161
+ 因此 `max` 必须和未保存状态保护一起实施。
162
+
163
+ ### 5.3 推荐策略
164
+
165
+ | 项目 | 推荐值或规则 |
166
+ | --- | --- |
167
+ | 普通页面最大实际缓存实例 | 8 |
168
+ | outLink 最大实例 | 3 |
169
+ | 当前页面 | 不淘汰 |
170
+ | 未保存表单 | 不自动淘汰 |
171
+ | 正在上传、导入或自动保存 | 不自动淘汰 |
172
+ | 大报表、文件预览 | 默认不缓存 |
173
+ | 全部实例均受保护 | 临时允许超过上限并记录告警 |
174
+
175
+ ### 5.4 dirty 状态管理
176
+
177
+ 在 `tagsView` 中按 `viewKey` 保存页面状态:
178
+
179
+ ```js
180
+ dirtyViews = {
181
+ "/form/edit?id=001": true,
182
+ };
183
+ ```
184
+
185
+ 提供以下动作:
186
+
187
+ - `markViewDirty(view)`:字段第一次修改时调用。
188
+ - `markViewSaved(view)`:保存成功后调用。
189
+ - `clearViewDirty(view)`:确认放弃修改并关闭时调用。
190
+
191
+ 不建议深度监听整个大表单。应复用字段 change、表格编辑、附件修改等已有事件,在第一次变化时标记 dirty。
192
+
193
+ ### 5.5 安全 LRU
194
+
195
+ 修改 `src/utils/keepAlive.js`,淘汰候选必须满足:
196
+
197
+ ```text
198
+ 不是当前页面
199
+ 且不在 protectedKeys
200
+ 且不是正在执行关键任务的页面
201
+ ```
202
+
203
+ 从符合条件的页面中选择最久未访问的实例销毁。如果没有候选,则本次不淘汰。
204
+
205
+ 页签数量与实际实例数量分离:页签仍可保留;被淘汰页面再次点击时重新创建。
206
+
207
+ ### 5.6 关闭页签保护
208
+
209
+ 以下操作都必须检查 dirty 状态:
210
+
211
+ - 关闭当前;
212
+ - 关闭其他;
213
+ - 关闭全部;
214
+ - 退出登录;
215
+ - 路由跳转到不再保留当前表单的流程。
216
+
217
+ 显式关闭时可以弹出“内容尚未保存,是否放弃修改”。自动 LRU 淘汰不能弹异步确认,只能跳过受保护页面。
218
+
219
+ ### 5.7 activated/deactivated 规范
220
+
221
+ 重型缓存页面在 `deactivated` 时应暂停:
222
+
223
+ - 轮询和刷新定时器;
224
+ - 只服务于当前页面的查询;
225
+ - window/document 事件;
226
+ - 图表动画、视频;
227
+ - 临时弹层和非必要后台计算。
228
+
229
+ 在 `activated` 时恢复必要监听,并根据路由参数或数据时间决定是否刷新。
230
+
231
+ `deactivated` 时不能清空表单数据、行 schema 和未保存编辑状态;这些对象只能在真正关闭或淘汰触发的 `beforeDestroy` 中清理。
232
+
233
+ ### 5.8 outLink 和微应用
234
+
235
+ `outLink` 使用 `v-for + v-show` 保存实例,不受 `BaseKeepAlive max` 控制,需要单独实现最多 3 个实例的 LRU。
236
+
237
+ qiankun 微应用也不受主应用 KeepAlive 直接控制,需要通过微应用的停用、卸载和资源清理接口治理。
238
+
239
+ ## 6. 建议的数据量限制
240
+
241
+ 以下参数尚未实施,需要业务确认:
242
+
243
+ | 场景 | 推荐初始限制 |
244
+ | --- | --- |
245
+ | 普通列表默认每页 | 200 行 |
246
+ | 普通查询单次硬上限 | 1000 行 |
247
+ | 前端导入文件 | 10 MB |
248
+ | 前端同步解析行数 | 10000 行 |
249
+ | 更大导入 | 后端异步任务 |
250
+ | 大数据导出 | 后端或分页导出 |
251
+
252
+ 限制值应允许按具体业务配置,但必须保留系统级硬上限,避免脚本或配置错误造成单次内存峰值。
253
+
254
+ ## 7. 测试方案
255
+
256
+ ### 7.1 数据表格稳定性
257
+
258
+ 1. 同一列表连续点击查询 100 次。
259
+ 2. 交替查询有数据和空结果。
260
+ 3. 快速切换查询条件,模拟前一个请求比后一个请求更晚返回。
261
+ 4. 重复新增、删除普通行、编辑行和树表行。
262
+ 5. 检查 `fieldSchemaMap` 键数量是否和当前有效行一致。
263
+ 6. 检查 `refList` 是否不存在已经删除或查询替换掉的行键。
264
+
265
+ ### 7.2 自动保存
266
+
267
+ 1. 同一行连续编辑多个字段。
268
+ 2. 保存接口延迟情况下继续编辑同一行。
269
+ 3. 粘贴后立即失焦或继续修改同一行,确认始终只有一个保存请求在执行,且最终版本会补存。
270
+ 4. 同时编辑 20 行以上,确认系统不会无限创建请求。
271
+ 5. 保存过程中删除该行,确认当前请求被取消且不再回写。
272
+ 6. 保存过程中关闭表格页签,确认当前请求被取消且等待队列释放。
273
+
274
+ ### 7.3 Blob URL
275
+
276
+ 反复执行上传预览、删除、替换、下载、导入结果下载和打印预览,使用浏览器 Memory 面板确认 Blob 数量能够回落。
277
+
278
+ ### 7.4 KeepAlive
279
+
280
+ 实施后需要验证:
281
+
282
+ 1. 连续打开 20 个普通页面,实际缓存实例不超过 8。
283
+ 2. 页签仍保留,被淘汰页面可以重新创建。
284
+ 3. 未保存表单不会被自动淘汰。
285
+ 4. 关闭未保存页签会提示。
286
+ 5. “关闭其他”和“关闭全部”不会跳过保护逻辑。
287
+ 6. outLink 实例不超过 3。
288
+ 7. 页面切走后轮询、定时器和事件监听停止。
289
+
290
+ ### 7.5 浏览器长稳测试
291
+
292
+ 建议进行不少于 2 小时的综合操作:查询、切菜单、编辑、上传、下载和导入循环执行。记录:
293
+
294
+ - Chrome 任务管理器内存;
295
+ - DevTools Performance Monitor 的 JS heap、DOM nodes、event listeners;
296
+ - Memory Heap Snapshot 中组件实例、Blob、闭包和 detached DOM 数量;
297
+ - 是否存在内存只上升、不回落的趋势。
298
+
299
+ ## 8. 发布步骤
300
+
301
+ 1. 在测试源仓完成 P0 构建和专项测试。
302
+ 2. 实施并验证 KeepAlive 治理。
303
+ 3. 完成长稳测试和业务回归。
304
+ 4. 将确认后的修改同步到正式源仓。
305
+ 5. 使用正式源仓最新代码执行 JKS 发布流程。
306
+ 6. 将构建产物发布到删减版环境。
307
+ 7. 观察生产环境浏览器内存和崩溃反馈,保留快速回退版本。
308
+
309
+ 不建议直接从测试工作副本整体覆盖正式源仓,应按确认后的文件或提交同步,避免夹带测试源仓中已有的无关修改。
310
+
311
+ ## 9. 当前验证结果
312
+
313
+ - 修改文件 JavaScript 静态解析通过。
314
+ - 测试源仓生产构建通过。
315
+ - 最新构建 Hash:`a1b3d085c11a9f2d`。
316
+ - 全仓 `createObjectURL` 文件扫描均已存在对应释放路径。
317
+ - 正式源仓和发布删减版尚未修改。
318
+
319
+ ## 10. 待确认事项
320
+
321
+ 1. KeepAlive 是否按“普通页面 8 个、outLink 3 个、dirty 页面保护”的推荐方案实施。
322
+ 2. 普通查询是否采用“默认 200 行、单次最多 1000 行”。
323
+ 3. 导入是否采用“10 MB、10000 行”的默认限制。
324
+ 4. 测试环境专项和长稳测试通过后,是否同步到正式源仓。