vue2-client 1.13.10 → 1.13.12

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 (388) hide show
  1. package/.cursorrules +19 -19
  2. package/.env.gaslink +19 -19
  3. package/.env.his +19 -19
  4. package/.env.iot +19 -19
  5. package/.env.liuli +19 -19
  6. package/.env.revenue +19 -19
  7. package/.env.scada +19 -19
  8. package/.eslintrc.js +90 -90
  9. package/CHANGELOG.md +824 -824
  10. package/Components.md +60 -60
  11. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  12. package/docs/LowCode/lowcode.md +155 -155
  13. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  14. package/docs/index.md +30 -30
  15. package/index.js +31 -31
  16. package/jest-transform-stub.js +8 -8
  17. package/jest.setup.js +7 -7
  18. package/jsconfig.json +19 -19
  19. package/package.json +1 -1
  20. package/public/his/editor/editor.html +51 -51
  21. package/public/his/editor/mock/bind_data.html +779 -779
  22. package/public/his/editor/mock/data_table.html +40 -40
  23. package/public/his/editor/mock/sign.html +75 -75
  24. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  25. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  26. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  27. package/public/his/editor/vender/date97/calendar.js +4 -4
  28. package/public/his/editor/vender/date97/lang/en.js +13 -13
  29. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  30. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  31. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  32. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  33. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  34. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  35. package/public/his/editor/vender/diff.js +1627 -1627
  36. package/public/his/editor/vender/editor.js +1 -1
  37. package/public/his/editor/vender/fabric.js +31187 -31187
  38. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  39. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  40. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  41. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  42. package/public/his/editor/vender/mui/mui.min.css +4 -4
  43. package/public/his/editor/vender/mui/mui.min.js +5 -5
  44. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  45. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  46. package/public/his/editor/vender/qrcode.js +7 -7
  47. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  48. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  49. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  50. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  51. package/public/his/editor/vender/validator.js +5094 -5094
  52. package/public/his/editor/vender/weui/weui.css +5659 -5659
  53. package/public/his/editor/vender/weui/weui.min.css +4 -4
  54. package/public/his/editor/vender/weui/weui.min.js +11 -11
  55. package/public/index.html +27 -27
  56. package/src/ReportView.js +19 -19
  57. package/src/assets/img/querySlotDemo.svg +15 -15
  58. package/src/assets/svg/badtwo.svg +1 -1
  59. package/src/assets/svg/goodtwo.svg +1 -1
  60. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  61. package/src/base-client/components/AI/demo.vue +31 -31
  62. package/src/base-client/components/common/AMisRender/index.js +3 -3
  63. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  64. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  65. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  66. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  67. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  68. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  69. package/src/base-client/components/common/CitySelect/index.js +3 -3
  70. package/src/base-client/components/common/CitySelect/index.md +109 -109
  71. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  72. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  73. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  74. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  75. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  76. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  77. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  78. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  79. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  80. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  81. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  82. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  83. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  84. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  85. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  86. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  87. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  88. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  91. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  99. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  100. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  101. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  102. package/src/base-client/components/common/Recording/index.js +3 -3
  103. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  104. package/src/base-client/components/common/Tree/index.js +2 -2
  105. package/src/base-client/components/common/Upload/index.js +3 -3
  106. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  107. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1156 -1156
  108. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  109. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  110. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  111. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  112. package/src/base-client/components/common/XAddReport/index.js +3 -3
  113. package/src/base-client/components/common/XAddReport/index.md +56 -56
  114. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  115. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  116. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  117. package/src/base-client/components/common/XButtons/index.js +3 -3
  118. package/src/base-client/components/common/XButtons/index.md +61 -61
  119. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  120. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  121. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  122. package/src/base-client/components/common/XCollapse/XCollapseDemo.vue +15 -0
  123. package/src/base-client/components/common/XDataCard/index.js +3 -3
  124. package/src/base-client/components/common/XDataCard/index.md +1 -1
  125. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  126. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  127. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  128. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  129. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  130. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  131. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  132. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  133. package/src/base-client/components/common/XForm/XForm.vue +404 -404
  134. package/src/base-client/components/common/XForm/XFormItem.vue +1310 -1310
  135. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  136. package/src/base-client/components/common/XForm/XTreeSelect.vue +270 -270
  137. package/src/base-client/components/common/XForm/index.md +178 -178
  138. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  139. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  140. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  141. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  142. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  143. package/src/base-client/components/common/XFormTable/demo.vue +76 -76
  144. package/src/base-client/components/common/XFormTable/index.md +92 -92
  145. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +167 -167
  146. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  147. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  148. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  149. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  150. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  151. package/src/base-client/components/common/XPrint/PrintBill.vue +302 -302
  152. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  153. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  154. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  155. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  156. package/src/base-client/components/common/XPrint/index.vue +97 -97
  157. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  158. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  159. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  160. package/src/base-client/components/common/XReport/index.js +3 -3
  161. package/src/base-client/components/common/XReport/index.md +44 -44
  162. package/src/base-client/components/common/XReport/print.js +186 -186
  163. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  164. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
  165. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +712 -712
  166. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  167. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  168. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  169. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  170. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  171. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  172. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  173. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  174. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  175. package/src/base-client/components/common/XStepView/index.js +3 -3
  176. package/src/base-client/components/common/XStepView/index.md +31 -31
  177. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  178. package/src/base-client/components/common/XTab/index.js +3 -3
  179. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  180. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  181. package/src/base-client/components/common/XTable/XTable.vue +1361 -1361
  182. package/src/base-client/components/common/XTable/XTableWrapper.vue +257 -257
  183. package/src/base-client/components/common/XTable/index.md +255 -255
  184. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  185. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  186. package/src/base-client/components/common/XTree/index.js +3 -3
  187. package/src/base-client/components/common/XTree/index.md +36 -36
  188. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  189. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  190. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  191. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  192. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +38 -5
  193. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +3 -0
  194. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  195. package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
  196. package/src/base-client/components/his/XTitle/XTitle.vue +39 -39
  197. package/src/base-client/components/index.js +51 -51
  198. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  199. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  200. package/src/base-client/components/layout/XPageView/index.js +3 -3
  201. package/src/base-client/components/layout/XPageView/index.md +38 -38
  202. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  203. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  204. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  205. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  206. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  207. package/src/base-client/plugins/AppData.js +126 -126
  208. package/src/base-client/plugins/Config.js +19 -19
  209. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  210. package/src/base-client/plugins/Recording.js +258 -258
  211. package/src/base-client/plugins/index.js +23 -23
  212. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  213. package/src/components/Charts/Bar.vue +62 -62
  214. package/src/components/Charts/ChartCard.vue +134 -134
  215. package/src/components/Charts/Liquid.vue +67 -67
  216. package/src/components/Charts/MiniArea.vue +39 -39
  217. package/src/components/Charts/MiniBar.vue +39 -39
  218. package/src/components/Charts/MiniProgress.vue +75 -75
  219. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  220. package/src/components/Charts/Radar.vue +68 -68
  221. package/src/components/Charts/RankList.vue +77 -77
  222. package/src/components/Charts/TagCloud.vue +113 -113
  223. package/src/components/Charts/TransferBar.vue +64 -64
  224. package/src/components/Charts/Trend.vue +82 -82
  225. package/src/components/Charts/chart.less +12 -12
  226. package/src/components/Charts/smooth.area.less +13 -13
  227. package/src/components/CodeMirror/inedx.vue +118 -118
  228. package/src/components/CodeMirror/setting.js +40 -40
  229. package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
  230. package/src/components/HeightScanner/index.vue +571 -571
  231. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  232. package/src/components/NumberInfo/index.js +3 -3
  233. package/src/components/NumberInfo/index.less +54 -54
  234. package/src/components/NumberInfo/index.md +43 -43
  235. package/src/components/STable/index.js +437 -437
  236. package/src/components/card/ChartCard.vue +79 -79
  237. package/src/components/chart/Bar.vue +60 -60
  238. package/src/components/chart/MiniArea.vue +67 -67
  239. package/src/components/chart/MiniBar.vue +59 -59
  240. package/src/components/chart/MiniProgress.vue +57 -57
  241. package/src/components/chart/Radar.vue +80 -80
  242. package/src/components/chart/RankingList.vue +60 -60
  243. package/src/components/chart/Trend.vue +79 -79
  244. package/src/components/chart/index.less +9 -9
  245. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  246. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  247. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  248. package/src/components/checkbox/index.js +9 -9
  249. package/src/components/exception/ExceptionPage.vue +70 -70
  250. package/src/components/g2Charts/constants.js +202 -202
  251. package/src/components/g2Charts/demo.vue +808 -808
  252. package/src/components/g2Charts/designer.vue +228 -228
  253. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  254. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  255. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  256. package/src/components/g2Charts/index.vue +397 -397
  257. package/src/components/index.js +36 -36
  258. package/src/components/input/IInput.vue +66 -66
  259. package/src/components/menu/SideMenu.vue +75 -75
  260. package/src/components/menu/menu.js +273 -273
  261. package/src/components/setting/Setting.vue +234 -234
  262. package/src/components/tool/AStepItem.vue +60 -60
  263. package/src/config/CreateQueryConfig.js +325 -325
  264. package/src/config/default/antd.config.js +89 -89
  265. package/src/config/default/setting.config.js +55 -55
  266. package/src/font-style/font.css +4 -4
  267. package/src/layouts/CommonLayout.vue +56 -56
  268. package/src/layouts/PageLayout.vue +151 -151
  269. package/src/layouts/SinglePageView.vue +136 -136
  270. package/src/layouts/header/AdminHeader.vue +132 -132
  271. package/src/layouts/header/HeaderNotice.vue +177 -177
  272. package/src/layouts/header/InstitutionDetail.vue +181 -181
  273. package/src/layouts/tabs/TabsHead.vue +189 -189
  274. package/src/layouts/tabs/TabsView.vue +389 -389
  275. package/src/lib.js +1 -1
  276. package/src/main.js +34 -34
  277. package/src/mixins/formValidationMixin.js +46 -46
  278. package/src/mock/extend/index.js +84 -84
  279. package/src/mock/goods/index.js +108 -108
  280. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  281. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  282. package/src/pages/DefaultExample/index.vue +77 -77
  283. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  284. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  285. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  286. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  287. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  288. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  289. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  290. package/src/pages/DynamicStatistics/index.vue +282 -282
  291. package/src/pages/Example/childIndex.vue +15 -15
  292. package/src/pages/Example/index.vue +30 -30
  293. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  294. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  295. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  296. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  297. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  298. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  299. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  300. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  301. package/src/pages/Recording/index.vue +77 -77
  302. package/src/pages/ReportGrid/index.vue +76 -76
  303. package/src/pages/ServiceReview/index.vue +284 -284
  304. package/src/pages/SubExample/index.vue +26 -26
  305. package/src/pages/WorkflowDetail/WorkflowDetail.vue +235 -235
  306. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  307. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  308. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  309. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  310. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  311. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  312. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  313. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  314. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  315. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  316. package/src/pages/XPageViewExample/index.vue +38 -38
  317. package/src/pages/XReportView/index.vue +64 -64
  318. package/src/pages/XTreeOneProExample/index.vue +67 -67
  319. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  320. package/src/pages/login/Login.vue +378 -378
  321. package/src/pages/login/LoginV3.vue +389 -389
  322. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  323. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  324. package/src/pages/report/ReportTable.js +124 -124
  325. package/src/pages/resourceManage/orgListManage.vue +98 -98
  326. package/src/pages/system/dictionary/index.vue +44 -44
  327. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  328. package/src/pages/system/monitor/operLog/index.vue +37 -37
  329. package/src/pages/system/settings/modifyPassword.vue +117 -117
  330. package/src/pages/system/ticket/index.vue +480 -480
  331. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  332. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  333. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +76 -76
  334. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +74 -74
  335. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  336. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  337. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +74 -74
  338. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  339. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +74 -74
  340. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  341. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +86 -86
  342. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +73 -73
  343. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  344. package/src/plugins/EventLogPlugin.js +33 -33
  345. package/src/plugins/FindParentsData.js +17 -17
  346. package/src/router/async/config.async.js +35 -35
  347. package/src/router/async/router.map.js +126 -119
  348. package/src/router/index.js +27 -27
  349. package/src/router.js +19 -19
  350. package/src/services/DataModel.js +30 -30
  351. package/src/services/LodopFuncs.js +137 -137
  352. package/src/services/api/TicketDetailsViewApi.js +46 -46
  353. package/src/services/api/cas.js +79 -79
  354. package/src/services/api/common.js +346 -346
  355. package/src/services/api/entity.js +18 -18
  356. package/src/services/api/index.js +17 -17
  357. package/src/services/api/restTools.js +145 -145
  358. package/src/services/api/workFlow.js +63 -63
  359. package/src/services/apiService.js +16 -16
  360. package/src/store/modules/account.js +115 -115
  361. package/src/store/modules/index.js +5 -5
  362. package/src/store/modules/lowCode.js +33 -33
  363. package/src/store/modules/setting.js +119 -119
  364. package/src/theme/default/style.less +58 -58
  365. package/src/theme/global.less +159 -159
  366. package/src/utils/authority-utils.js +85 -85
  367. package/src/utils/errorCode.js +6 -6
  368. package/src/utils/formatter.js +74 -74
  369. package/src/utils/htmlToPDF.js +108 -108
  370. package/src/utils/htmlToPDFApi.js +5 -5
  371. package/src/utils/login.js +188 -188
  372. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  373. package/src/utils/lowcode/lowcodeLog.js +29 -29
  374. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  375. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  376. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  377. package/src/utils/map-utils.js +47 -47
  378. package/src/utils/reg.js +95 -95
  379. package/src/utils/runEvalFunction.js +14 -14
  380. package/src/utils/theme-color-replacer-extend.js +92 -92
  381. package/src/utils/util.js +329 -329
  382. package/src/utils/waterMark.js +31 -31
  383. package/test/Amis.spec.js +164 -164
  384. package/test/Tree.spec.js +168 -168
  385. package/test/myDialog.spec.js +47 -47
  386. package/test/util.test.js +53 -53
  387. package/test/v3Api.test.js +1984 -1984
  388. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,712 +1,712 @@
1
- <template>
2
- <a-row id="has_row" type="flex" :gutter="gutter" :style="isWidget ? {margin: '0px'} : {'margin-bottom': '.5rem'}">
3
- <template v-for="(cell, cellIndex) in columns">
4
- <a-col
5
- name="trGroup"
6
- v-if="Array.isArray(cell) || !cell.dontShowRow"
7
- :key="cellIndex"
8
- :ref="`trGroup_${ cell.slotRef || cellIndex}`"
9
- @hook:mounted="(h)=>applyAllStyles(cell,cellIndex)"
10
- :span="calculateColSpan(cell)">
11
- <div id="report_widget" v-if="isWidget">
12
- <!-- 插槽渲染 -->
13
- <template v-if="Array.isArray(cell)">
14
- <!-- 处理 cell 是数组的情况 -->
15
- <div v-for="(item, index) in cell" :key="index">
16
- <x-report-tr-group
17
- :env="env"
18
- :key="index"
19
- :columns="recalculateItem(item)"
20
- :config-data="configData"
21
- :config="config"
22
- :display="true">
23
- </x-report-tr-group>
24
- </div>
25
- </template>
26
- <template v-else-if="cell.type === 'slot'">
27
- <template
28
- v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse','x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio','x-calendar', 'x-time-select' ,'x-checkbox', 'x-title', 'x-select'].includes(cell.slotType)">
29
- <component
30
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
31
- :key="cellIndex"
32
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
33
- :serviceName="cell.serviceName"
34
- :serverName="cell.serviceName"
35
- v-on="getEventHandlers(cell)"
36
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
37
- :queryParamsName="cell.slotConfig"
38
- :configName="cell.slotConfig"
39
- :countVisible="false"
40
- :env="env"
41
- />
42
- </template>
43
- </template>
44
- </div>
45
- <a-card v-else class="flexItem" :bordered="false">
46
- <!-- 插槽渲染 -->
47
- <template v-if="Array.isArray(cell)">
48
- <!-- 处理 cell 是数组的情况 -->
49
- <div v-for="(item, index) in cell" :key="index">
50
- <x-report-tr-group
51
- :server-name="serverName"
52
- :env="env"
53
- :key="index"
54
- :columns="recalculateItem(item)"
55
- :config-data="configData"
56
- :config="config"
57
- :display="true">
58
- </x-report-tr-group>
59
- </div>
60
- </template>
61
- <template v-else-if="cell.type === 'slot'">
62
- <template
63
- v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse', 'x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio','x-calendar', 'x-time-select','x-checkbox', 'x-title', 'x-select'].includes(cell.slotType)">
64
- <component
65
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
66
- :key="cellIndex"
67
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
68
- :serviceName="cell.serviceName"
69
- :serverName="cell.serviceName"
70
- v-on="getEventHandlers(cell)"
71
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
72
- :queryParamsName="cell.slotConfig"
73
- :configName="cell.slotConfig"
74
- @listClick="listClick"
75
- :countVisible="false"
76
- :env="env"
77
- />
78
- </template>
79
- </template>
80
- </a-card>
81
- </a-col>
82
- </template>
83
- </a-row>
84
- </template>
85
-
86
- <script>
87
- import Upload from '@vue2-client/base-client/components/common/Upload'
88
- import { getRealKeyData } from '@vue2-client/utils/util'
89
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
90
- import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
91
- import { getMicroData, getWindow, isMicroAppEnv, microDispatch } from '@vue2-client/utils/microAppUtils'
92
-
93
- export default {
94
- name: 'XReportTrGroup',
95
- components: {
96
- Upload,
97
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
98
- XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
99
- XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
100
- XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
101
- XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
102
- XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
103
- XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
104
- XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
105
- XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
106
- XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
107
- XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
108
- XCardSet: () => import('@vue2-client/base-client/components/common/XCardSet/XCardSet.vue'),
109
- XCollapse: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
110
- XHDescriptions: () => import('@vue2-client/base-client/components/his/XHDescriptions/XHDescriptions.vue'),
111
- XSidebar: () => import('@vue2-client/base-client/components/his/XSidebar/XSidebar.vue'),
112
- XList: () => import('@vue2-client/base-client/components/his/XList/XList.vue'),
113
- XInput: () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
114
- XTimeLine: () => import('@vue2-client/base-client/components/common/XTimeline/XTimeline.vue'),
115
- XRadio: () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
116
- XCalendar: () => import('@vue2-client/base-client/components/common/XCalendar/XCalendar.vue'),
117
- XTimeSelect: () => import('@vue2-client/base-client/components/his/XTimeSelect/XTimeSelect.vue'),
118
- XCheckbox: () => import('@vue2-client/base-client/components/his/XCheckbox/XCheckbox.vue'),
119
- XTitle: () => import('@vue2-client/base-client/components/his/XTitle/XTitle.vue'),
120
- XSelect: () => import('@vue2-client/base-client/components/his/XSelect/XSelect.vue')
121
- },
122
- props: {
123
- // 每一行的配置
124
- columns: {
125
- type: Array,
126
- required: true
127
- },
128
- showImgInCell: {
129
- type: Boolean,
130
- default: false
131
- },
132
- config: {
133
- type: Object,
134
- default: function () {
135
- return {}
136
- }
137
- },
138
- // 命名空间
139
- serverName: {
140
- type: String,
141
- default: 'af-system'
142
- },
143
- // 环境
144
- env: {
145
- type: String,
146
- default: 'prod'
147
- },
148
- // 原始配置
149
- configData: {
150
- type: Object,
151
- required: true
152
- },
153
- // 是否为展示行
154
- display: {
155
- type: Boolean,
156
- default: false
157
- },
158
- },
159
- computed: {
160
- allSlotSum () {
161
- // 计算总共有多少个Slot
162
- let sum = 0
163
- this.columns.forEach((item) => {
164
- console.log('item', item)
165
- if (Array.isArray(item)) {
166
- item.forEach((cell) => {
167
- if (cell.type === 'slot') {
168
- sum++
169
- }
170
- })
171
- } else if (item.type && item.type === 'slot') {
172
- sum++
173
- }
174
- })
175
- console.log(`=总共有 ${sum} 个插槽栅格`)
176
- return sum
177
- }
178
- },
179
- data () {
180
- return {
181
- gutter: [8, { xs: 8, sm: 16, md: 24, lg: 32 }], // 设置水槽大小
182
- maxColSpan: 12,
183
- uploadParams: {
184
- type: 'image',
185
- accept: ['*'],
186
- resUploadStock: 1,
187
- pathKey: 'cs'
188
- },
189
- mixinData: {},
190
- flexItemBodyState: {},
191
- // 已经渲染得插槽得数量
192
- slotRendered: 0,
193
- // tableConfig: {}
194
- }
195
- },
196
- watch: {
197
- columns: {
198
- deep: true,
199
- immediate: true,
200
- handler (newVal) {
201
- console.log('columns变化:', JSON.parse(JSON.stringify(newVal)))
202
- // 使用nextTick确保DOM更新
203
- this.$nextTick(() => {
204
- this.$forceUpdate()
205
- })
206
- }
207
- }
208
- },
209
- inject: ['openDialog', 'emitEvent', 'registerComponent', 'setColSpanByName', 'setGlobalData', 'getGlobalData', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
210
- methods: {
211
- getWindow,
212
- isMicroAppEnv,
213
- microDispatch,
214
- getMicroData,
215
- getRealKeyData,
216
- listClick (data) {
217
- this.$emit('listClick', data)
218
- },
219
- calculateColSpan (cell) {
220
- return Array.isArray(cell)
221
- ? cell[0][0]?.colSpan * 2
222
- : (cell?.colSpan ?? cell?.def?.colSpan ?? 1) * 2
223
- },
224
- applyAllStyles (cell, cellIndex) {
225
- // 应用组件样式
226
- const component = this.$refs[`trGroup_${ cell.slotRef || cellIndex}`][0]
227
- // 确保组件已经完全挂载
228
- this.$nextTick(() => {
229
- this.applyComponentStyles(component, cell, cellIndex)
230
- })
231
- },
232
- onComponentMounted (h, cell, cellIndex) {
233
- this.slotRendered += 1
234
- if (this.slotRendered >= this.allSlotSum) {
235
- this.$emit('slotRendered')
236
- }
237
- if (this.getMixinData && this.getMixinData()) {
238
- this.mixinData = this.getMixinData()
239
- }
240
- if (cell.slotRef) {
241
- this.registerComponent(cell.slotRef, this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0])
242
- }
243
- // 传递给祖先组件
244
- console.log(`插槽组件已经初始化 slotType ${cell.slotType},ref= dynamicComponent_${cell.slotRef || cellIndex} , serviceName = ${cell.serviceName}`)
245
- const shouldInit = cell.shouldInit == null ? true : cell.shouldInit
246
- if (shouldInit) {
247
- if (cell.slotType === 'x-add-native-form') {
248
- // 简易表单需要主动调用初始化方法
249
- getConfigByName(cell.slotConfig, cell.serviceName, async (res) => {
250
- // 如果配置了 表单初始化logic
251
- // 调用 logic 获取参数
252
- let param = { ...this.mixinData }
253
- let selectedId
254
- if (res.paramLogicName) {
255
- if (!!this.getSelectedId) {
256
- selectedId = this.getSelectedId()
257
- if (typeof selectedId !== 'object') {
258
- selectedId = { selectedId: selectedId }
259
- }
260
- }
261
- param = Object.assign(param, await runLogic(res.paramLogicName, selectedId, cell.serviceName))
262
- }
263
- console.info('给表单赋值', res)
264
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
265
- serviceName: cell.serviceName,
266
- configName: cell.slotConfig,
267
- formItems: res.formJson,
268
- showSubmitBtn: !this.isInAModal,
269
- businessType: param.businessType || '新增',
270
- layout: res.xAddFormLayout,
271
- primaryKey: res.primaryKey,
272
- ...res,
273
- fixedAddForm: param,
274
- modifyModelData: {
275
- files: param.files,
276
- images: param.images
277
- }
278
- })
279
- }, this.env === 'dev')
280
- } else if (cell.slotType === 'x-form-group') {
281
- // 简易表单需要主动调用初始化方法
282
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
283
- // 如果配置了 表单初始化logic
284
- // 调用 logic 获取参数
285
- const param = { ...this.mixinData }
286
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
287
- ...res,
288
- serviceName: cell.serviceName,
289
- showSubmitBtn: !this.isInAModal,
290
- businessType: param.businessType || '新增',
291
- modifyModelData: param,
292
- showLeftTab: true,
293
- })
294
- }, this.env === 'dev')
295
- } else if (cell.slotType === 'x-buttons') {
296
- // 按钮组需要主动调用初始化方法
297
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
298
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
299
- ...res,
300
- serviceName: cell.serviceName,
301
- })
302
- }, this.env === 'dev')
303
- } else if (cell.slotType === 'x-label-select') {
304
- // 按钮组需要主动调用初始化方法
305
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
306
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
307
- ...res,
308
- serviceName: cell.serviceName,
309
- })
310
- }, this.env === 'dev')
311
- }
312
- }
313
- if (cell.slotType === 'x-report') {
314
- const param = { ...this.mixinData }
315
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init(param)
316
- }
317
- if (cell.slotType === 'x-conversation') {
318
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
319
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
320
- serviceName: cell.serviceName,
321
- ...res,
322
- })
323
- }, this.env === 'dev')
324
- }
325
- if (cell.slotType === 'x-check-list') {
326
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
327
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
328
- serviceName: cell.serviceName,
329
- ...res,
330
- })
331
- }, this.env === 'dev')
332
- }
333
- },
334
- recalculateItem (item) {
335
- const totalColSpan = item.reduce((sum, cell) => {
336
- // 保留手动设置的colSpan
337
- return sum + (cell._isManualColSpan ? 0 : (cell.colSpan || 1))
338
- }, 0)
339
- return item.map(cell => {
340
- // 跳过已手动设置的单元格
341
- if (cell._isManualColSpan) return cell
342
- const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12)
343
- return {
344
- ...cell,
345
- colSpan: newColSpan,
346
- // 标记自动计算的单元格
347
- _isAutoCalculated: true
348
- }
349
- })
350
- },
351
-
352
- getEventHandlers (cell) {
353
- const handlers = {}
354
- if (!cell?.events || cell?.events?.length === 0) {
355
- return handlers
356
- }
357
- cell.events.forEach(event => {
358
- handlers[event.type] = async (...args) => {
359
- console.info('Event handled:', event.type, args)
360
- let func = event.customFunction
361
- if (func && func.startsWith('function')) {
362
- func = func.replace('function', 'async function')
363
- }
364
- const result = await executeStrFunctionByContext(this, func, args)
365
- if (result instanceof Promise) {
366
- result.then((res) => {
367
- if (!res) return
368
- let messageType = 'success'
369
- // 如果传递了组件名字 自动调用刷新
370
- if (res?.name) {
371
- const waitRefreshRef = this.getComponentByName(res.name)
372
- if (waitRefreshRef) {
373
- waitRefreshRef.refresh()
374
- } else {
375
- console.warn(`未找到组件${res.name}无法刷新`)
376
- }
377
- }
378
- // 如果传递消息类型 自动调用消息
379
- if (res?.messageType) {
380
- messageType = res.messageType
381
- }
382
- // 如果传递了提示信息自动调用提示
383
- if (res?.message) {
384
- this.$message[messageType](res?.message)
385
- }
386
- })
387
- }
388
- }
389
- })
390
- return handlers
391
- },
392
- getComponentName (queryParamsName, serviceName, componentName) {
393
- return componentName
394
- },
395
- // 判断单元格样式
396
- determineCellStyle (cell, color = '#000', borderWidth = '1px') {
397
- // 如果声明了borderColor
398
- if (this.config.style.borderColor) {
399
- color = this.config.style.borderColor
400
- }
401
- let result = {}
402
- // 如果表格也声明了样式,用表格样式将样式覆盖
403
- if (cell.style) {
404
- if (cell.noBorder) {
405
- result = { ...cell.style }
406
- } else {
407
- if (this.noTopBorder) {
408
- result = { ...cell.style }
409
- } else {
410
- result = { ...cell.style }
411
- }
412
- }
413
- return result
414
- }
415
- return result
416
- },
417
- // 把用户定义的组件,传递到整个杉格中,方便调用
418
- passComponentNamesToAncestor (refs) {
419
- console.log('组件的keys', Object.entries(refs), refs)
420
- // 遍历所有 refs
421
- Object.entries(refs).forEach(([refKey, refValue]) => {
422
- // 检查 ref 是否以 dynamicComponent_ 开头
423
- if (refKey.startsWith('dynamicComponent_')) {
424
- console.log('组件名存在')
425
- const componentRef = refValue[0]
426
- if (componentRef) {
427
- // 去掉前缀并获取组件名字
428
- const index = refKey.replace('dynamicComponent_', '') // 去掉前缀
429
- console.log('注册组件', index)
430
- // 传递给祖先组件
431
- this.registerComponent(index, componentRef)
432
- }
433
- }
434
- })
435
- },
436
- // 获取组件样式配置
437
- async getComponentStyleConfig (componentType) {
438
- try {
439
- // 从配置中获取样式定义
440
- const styleConfig = this.$appdata.getStylesByKey(componentType)
441
- return styleConfig || {}
442
- } catch (error) {
443
- console.error('获取组件样式配置失败:', error)
444
- return {}
445
- }
446
- },
447
-
448
- // 解析组件样式配置
449
- async parseComponentStyles (cell) {
450
- if (!cell.class) return { rootStyles: {}, childStyles: {} }
451
-
452
- const styleConfig = await this.getComponentStyleConfig(cell.slotType)
453
- if (!styleConfig) return { rootStyles: {}, childStyles: {} }
454
-
455
- const rootStyles = {}
456
- const childStyles = new Map()
457
-
458
- // 处理每个class配置
459
- cell.class.split(' ').forEach(className => {
460
- const classConfig = styleConfig[className]
461
- if (!classConfig) return
462
-
463
- // 处理根节点样式
464
- Object.entries(classConfig).forEach(([key, value]) => {
465
- if (!key.startsWith('*') && typeof key !== 'object') {
466
- rootStyles[key] = value
467
- }
468
- })
469
-
470
- // 处理子节点样式
471
- this.parseNestedStyles(classConfig, childStyles)
472
- })
473
-
474
- console.warn('样式配置', rootStyles, childStyles)
475
- return {
476
- rootStyles,
477
- childStyles
478
- }
479
- },
480
-
481
- // 递归解析嵌套的样式配置
482
- parseNestedStyles (config, styleMap, parentKey = '') {
483
- Object.entries(config).forEach(([key, value]) => {
484
- if (!key.startsWith('*')) return
485
-
486
- const className = key.replace('*', '.')
487
-
488
- // 如果值是对象,检查是否包含样式和子节点
489
- if (typeof value === 'object') {
490
- const { style = {}, children = {} } = this.separateStyleAndChildren(value)
491
-
492
- // 创建或获取当前节点的样式配置
493
- if (!styleMap.has(className)) {
494
- styleMap.set(className, {
495
- styles: {},
496
- children: new Map()
497
- })
498
- }
499
-
500
- const nodeData = styleMap.get(className)
501
-
502
- // 合并样式
503
- Object.assign(nodeData.styles, style)
504
-
505
- // 递归处理子节点
506
- this.parseNestedStyles(children, nodeData.children, className)
507
- }
508
- })
509
- },
510
-
511
- // 分离样式属性和子节点配置
512
- separateStyleAndChildren (obj) {
513
- const style = {}
514
- const children = {}
515
-
516
- Object.entries(obj).forEach(([key, value]) => {
517
- if (key.startsWith('*')) {
518
- // 子节点配置
519
- children[key] = value
520
- } else {
521
- // 样式属性
522
- style[key] = value
523
- }
524
- })
525
-
526
- return { style, children }
527
- },
528
-
529
- // 应用组件样式
530
- async applyComponentStyles (component, cell, cellIndex) {
531
- if (!component || !component.$el) return
532
-
533
- const { rootStyles, childStyles } = await this.parseComponentStyles(cell)
534
-
535
- // 应用根节点样式
536
- if (Object.keys(rootStyles).length > 0) {
537
- Object.entries(rootStyles).forEach(([property, value]) => {
538
- component.$el.style.setProperty(property, value, 'important')
539
- })
540
- }
541
-
542
- // 如果没有子节点样式,直接返回
543
- if (childStyles.size === 0) return
544
-
545
- let retryCount = 0
546
- const maxRetries = 5
547
- const retryInterval = 100 // 100ms
548
-
549
- const applyStyles = () => {
550
- this.applyChildStylesOptimized(component.$el, childStyles)
551
- }
552
-
553
- // 首次应用样式
554
- applyStyles()
555
-
556
- // 创建重试机制
557
- const retryApplyStyles = () => {
558
- if (retryCount >= maxRetries) return
559
-
560
- setTimeout(() => {
561
- applyStyles()
562
- retryCount++
563
- retryApplyStyles()
564
- }, retryInterval)
565
- }
566
-
567
- // 开始重试
568
- retryApplyStyles()
569
-
570
- // 创建 MutationObserver 用于动态内容
571
- const observer = new MutationObserver((mutations) => {
572
- // 检查是否有新增节点
573
- const hasNewNodes = mutations.some(mutation =>
574
- mutation.type === 'childList' && mutation.addedNodes.length > 0
575
- )
576
-
577
- if (hasNewNodes) {
578
- applyStyles()
579
- }
580
- })
581
-
582
- // 配置 observer
583
- observer.observe(component.$el, {
584
- childList: true,
585
- subtree: true,
586
- attributes: false
587
- })
588
-
589
- // 3秒后停止观察
590
- // setTimeout(() => {
591
- // observer.disconnect()
592
- // }, 3000)
593
-
594
- // 组件销毁时清理
595
- this.$once('hook:beforeDestroy', () => {
596
- observer.disconnect()
597
- })
598
- },
599
-
600
- // 优化后的子节点样式应用方法
601
- applyChildStylesOptimized (rootElement, styleMap, parentSelector = '') {
602
- if (!rootElement) return
603
-
604
- // 处理样式映射
605
- for (const [selector, data] of styleMap.entries()) {
606
- const currentSelector = parentSelector ? `${parentSelector} ${selector}` : selector
607
-
608
- try {
609
- // 查找匹配的元素
610
- const elements = Array.from(rootElement.querySelectorAll(currentSelector))
611
-
612
- if (!elements.length) continue
613
-
614
- // 应用当前层级样式
615
- if (data.styles) {
616
- elements.forEach(element => {
617
- if (!element) return
618
-
619
- // 应用每个样式属性
620
- Object.entries(data.styles).forEach(([property, value]) => {
621
- try {
622
- element.style.setProperty(property, value, 'important')
623
- } catch (err) {
624
- console.warn(`设置样式失败: ${property}=${value}`, err)
625
- }
626
- })
627
- })
628
- }
629
-
630
- // 处理子层级
631
- if (data.children && data.children.size > 0) {
632
- elements.forEach(element => {
633
- if (element) {
634
- this.applyChildStylesOptimized(element, data.children, currentSelector)
635
- }
636
- })
637
- }
638
- } catch (err) {
639
- console.warn(`处理选择器失败: ${currentSelector}`, err)
640
- continue
641
- }
642
- }
643
- },
644
- },
645
- beforeMount () {
646
- if (this.useOssForImg) {
647
- this.uploadParams.resUploadMode = 'oss'
648
- }
649
- },
650
- mounted () {
651
- },
652
- }
653
-
654
- </script>
655
-
656
- <style scoped lang="less">
657
- .inputsDiv {
658
- display: flex;
659
- justify-content: space-between;
660
-
661
- .inputsDivItem {
662
- display: flex;
663
- align-items: center;
664
- padding: 0 4px;
665
- white-space: nowrap;
666
-
667
- .inputsDivItemLabel {
668
- padding: 0 4px;
669
- }
670
- }
671
- }
672
-
673
- .tdNoBorder {
674
- border-left: 1px solid #000;
675
- border-right: 1px solid #000;
676
- padding: 8px;
677
- }
678
-
679
- .tdWithBorder {
680
- border: 1px solid #000;
681
- padding: 8px;
682
- }
683
-
684
- .tdWithNoTopBorder {
685
- border-top-style: none;
686
- border-left: 1px solid #000;
687
- border-right: 1px solid #000;
688
- border-bottom: 1px solid #000;
689
- padding: 8px;
690
- }
691
-
692
- .grid-content {
693
- border-radius: 4px;
694
- min-height: 36px;
695
- text-align: center;
696
- color: #fff;
697
- background-color: #606266;
698
- }
699
-
700
- .bg-purple {
701
- background: #9254de;
702
- }
703
-
704
- .bg-purple-light {
705
- background: #b37feb;
706
- }
707
-
708
- .flexItem {
709
- border-radius: 8px;
710
- height: 100%;
711
- }
712
- </style>
1
+ <template>
2
+ <a-row id="has_row" type="flex" :gutter="gutter" :style="isWidget ? {margin: '0px'} : {'margin-bottom': '.5rem'}">
3
+ <template v-for="(cell, cellIndex) in columns">
4
+ <a-col
5
+ name="trGroup"
6
+ v-if="Array.isArray(cell) || !cell.dontShowRow"
7
+ :key="cellIndex"
8
+ :ref="`trGroup_${ cell.slotRef || cellIndex}`"
9
+ @hook:mounted="(h)=>applyAllStyles(cell,cellIndex)"
10
+ :span="calculateColSpan(cell)">
11
+ <div id="report_widget" v-if="isWidget">
12
+ <!-- 插槽渲染 -->
13
+ <template v-if="Array.isArray(cell)">
14
+ <!-- 处理 cell 是数组的情况 -->
15
+ <div v-for="(item, index) in cell" :key="index">
16
+ <x-report-tr-group
17
+ :env="env"
18
+ :key="index"
19
+ :columns="recalculateItem(item)"
20
+ :config-data="configData"
21
+ :config="config"
22
+ :display="true">
23
+ </x-report-tr-group>
24
+ </div>
25
+ </template>
26
+ <template v-else-if="cell.type === 'slot'">
27
+ <template
28
+ v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse','x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio','x-calendar', 'x-time-select' ,'x-checkbox', 'x-title', 'x-select'].includes(cell.slotType)">
29
+ <component
30
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
31
+ :key="cellIndex"
32
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
33
+ :serviceName="cell.serviceName"
34
+ :serverName="cell.serviceName"
35
+ v-on="getEventHandlers(cell)"
36
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
37
+ :queryParamsName="cell.slotConfig"
38
+ :configName="cell.slotConfig"
39
+ :countVisible="false"
40
+ :env="env"
41
+ />
42
+ </template>
43
+ </template>
44
+ </div>
45
+ <a-card v-else class="flexItem" :bordered="false">
46
+ <!-- 插槽渲染 -->
47
+ <template v-if="Array.isArray(cell)">
48
+ <!-- 处理 cell 是数组的情况 -->
49
+ <div v-for="(item, index) in cell" :key="index">
50
+ <x-report-tr-group
51
+ :server-name="serverName"
52
+ :env="env"
53
+ :key="index"
54
+ :columns="recalculateItem(item)"
55
+ :config-data="configData"
56
+ :config="config"
57
+ :display="true">
58
+ </x-report-tr-group>
59
+ </div>
60
+ </template>
61
+ <template v-else-if="cell.type === 'slot'">
62
+ <template
63
+ v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse', 'x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio','x-calendar', 'x-time-select','x-checkbox', 'x-title', 'x-select'].includes(cell.slotType)">
64
+ <component
65
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
66
+ :key="cellIndex"
67
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
68
+ :serviceName="cell.serviceName"
69
+ :serverName="cell.serviceName"
70
+ v-on="getEventHandlers(cell)"
71
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
72
+ :queryParamsName="cell.slotConfig"
73
+ :configName="cell.slotConfig"
74
+ @listClick="listClick"
75
+ :countVisible="false"
76
+ :env="env"
77
+ />
78
+ </template>
79
+ </template>
80
+ </a-card>
81
+ </a-col>
82
+ </template>
83
+ </a-row>
84
+ </template>
85
+
86
+ <script>
87
+ import Upload from '@vue2-client/base-client/components/common/Upload'
88
+ import { getRealKeyData } from '@vue2-client/utils/util'
89
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
90
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
91
+ import { getMicroData, getWindow, isMicroAppEnv, microDispatch } from '@vue2-client/utils/microAppUtils'
92
+
93
+ export default {
94
+ name: 'XReportTrGroup',
95
+ components: {
96
+ Upload,
97
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
98
+ XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
99
+ XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
100
+ XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
101
+ XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
102
+ XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
103
+ XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
104
+ XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
105
+ XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
106
+ XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
107
+ XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
108
+ XCardSet: () => import('@vue2-client/base-client/components/common/XCardSet/XCardSet.vue'),
109
+ XCollapse: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
110
+ XHDescriptions: () => import('@vue2-client/base-client/components/his/XHDescriptions/XHDescriptions.vue'),
111
+ XSidebar: () => import('@vue2-client/base-client/components/his/XSidebar/XSidebar.vue'),
112
+ XList: () => import('@vue2-client/base-client/components/his/XList/XList.vue'),
113
+ XInput: () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
114
+ XTimeLine: () => import('@vue2-client/base-client/components/common/XTimeline/XTimeline.vue'),
115
+ XRadio: () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
116
+ XCalendar: () => import('@vue2-client/base-client/components/common/XCalendar/XCalendar.vue'),
117
+ XTimeSelect: () => import('@vue2-client/base-client/components/his/XTimeSelect/XTimeSelect.vue'),
118
+ XCheckbox: () => import('@vue2-client/base-client/components/his/XCheckbox/XCheckbox.vue'),
119
+ XTitle: () => import('@vue2-client/base-client/components/his/XTitle/XTitle.vue'),
120
+ XSelect: () => import('@vue2-client/base-client/components/his/XSelect/XSelect.vue')
121
+ },
122
+ props: {
123
+ // 每一行的配置
124
+ columns: {
125
+ type: Array,
126
+ required: true
127
+ },
128
+ showImgInCell: {
129
+ type: Boolean,
130
+ default: false
131
+ },
132
+ config: {
133
+ type: Object,
134
+ default: function () {
135
+ return {}
136
+ }
137
+ },
138
+ // 命名空间
139
+ serverName: {
140
+ type: String,
141
+ default: 'af-system'
142
+ },
143
+ // 环境
144
+ env: {
145
+ type: String,
146
+ default: 'prod'
147
+ },
148
+ // 原始配置
149
+ configData: {
150
+ type: Object,
151
+ required: true
152
+ },
153
+ // 是否为展示行
154
+ display: {
155
+ type: Boolean,
156
+ default: false
157
+ },
158
+ },
159
+ computed: {
160
+ allSlotSum () {
161
+ // 计算总共有多少个Slot
162
+ let sum = 0
163
+ this.columns.forEach((item) => {
164
+ console.log('item', item)
165
+ if (Array.isArray(item)) {
166
+ item.forEach((cell) => {
167
+ if (cell.type === 'slot') {
168
+ sum++
169
+ }
170
+ })
171
+ } else if (item.type && item.type === 'slot') {
172
+ sum++
173
+ }
174
+ })
175
+ console.log(`=总共有 ${sum} 个插槽栅格`)
176
+ return sum
177
+ }
178
+ },
179
+ data () {
180
+ return {
181
+ gutter: [8, { xs: 8, sm: 16, md: 24, lg: 32 }], // 设置水槽大小
182
+ maxColSpan: 12,
183
+ uploadParams: {
184
+ type: 'image',
185
+ accept: ['*'],
186
+ resUploadStock: 1,
187
+ pathKey: 'cs'
188
+ },
189
+ mixinData: {},
190
+ flexItemBodyState: {},
191
+ // 已经渲染得插槽得数量
192
+ slotRendered: 0,
193
+ // tableConfig: {}
194
+ }
195
+ },
196
+ watch: {
197
+ columns: {
198
+ deep: true,
199
+ immediate: true,
200
+ handler (newVal) {
201
+ console.log('columns变化:', JSON.parse(JSON.stringify(newVal)))
202
+ // 使用nextTick确保DOM更新
203
+ this.$nextTick(() => {
204
+ this.$forceUpdate()
205
+ })
206
+ }
207
+ }
208
+ },
209
+ inject: ['openDialog', 'emitEvent', 'registerComponent', 'setColSpanByName', 'setGlobalData', 'getGlobalData', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
210
+ methods: {
211
+ getWindow,
212
+ isMicroAppEnv,
213
+ microDispatch,
214
+ getMicroData,
215
+ getRealKeyData,
216
+ listClick (data) {
217
+ this.$emit('listClick', data)
218
+ },
219
+ calculateColSpan (cell) {
220
+ return Array.isArray(cell)
221
+ ? cell[0][0]?.colSpan * 2
222
+ : (cell?.colSpan ?? cell?.def?.colSpan ?? 1) * 2
223
+ },
224
+ applyAllStyles (cell, cellIndex) {
225
+ // 应用组件样式
226
+ const component = this.$refs[`trGroup_${ cell.slotRef || cellIndex}`][0]
227
+ // 确保组件已经完全挂载
228
+ this.$nextTick(() => {
229
+ this.applyComponentStyles(component, cell, cellIndex)
230
+ })
231
+ },
232
+ onComponentMounted (h, cell, cellIndex) {
233
+ this.slotRendered += 1
234
+ if (this.slotRendered >= this.allSlotSum) {
235
+ this.$emit('slotRendered')
236
+ }
237
+ if (this.getMixinData && this.getMixinData()) {
238
+ this.mixinData = this.getMixinData()
239
+ }
240
+ if (cell.slotRef) {
241
+ this.registerComponent(cell.slotRef, this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0])
242
+ }
243
+ // 传递给祖先组件
244
+ console.log(`插槽组件已经初始化 slotType ${cell.slotType},ref= dynamicComponent_${cell.slotRef || cellIndex} , serviceName = ${cell.serviceName}`)
245
+ const shouldInit = cell.shouldInit == null ? true : cell.shouldInit
246
+ if (shouldInit) {
247
+ if (cell.slotType === 'x-add-native-form') {
248
+ // 简易表单需要主动调用初始化方法
249
+ getConfigByName(cell.slotConfig, cell.serviceName, async (res) => {
250
+ // 如果配置了 表单初始化logic
251
+ // 调用 logic 获取参数
252
+ let param = { ...this.mixinData }
253
+ let selectedId
254
+ if (res.paramLogicName) {
255
+ if (!!this.getSelectedId) {
256
+ selectedId = this.getSelectedId()
257
+ if (typeof selectedId !== 'object') {
258
+ selectedId = { selectedId: selectedId }
259
+ }
260
+ }
261
+ param = Object.assign(param, await runLogic(res.paramLogicName, selectedId, cell.serviceName))
262
+ }
263
+ console.info('给表单赋值', res)
264
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
265
+ serviceName: cell.serviceName,
266
+ configName: cell.slotConfig,
267
+ formItems: res.formJson,
268
+ showSubmitBtn: !this.isInAModal,
269
+ businessType: param.businessType || '新增',
270
+ layout: res.xAddFormLayout,
271
+ primaryKey: res.primaryKey,
272
+ ...res,
273
+ fixedAddForm: param,
274
+ modifyModelData: {
275
+ files: param.files,
276
+ images: param.images
277
+ }
278
+ })
279
+ }, this.env === 'dev')
280
+ } else if (cell.slotType === 'x-form-group') {
281
+ // 简易表单需要主动调用初始化方法
282
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
283
+ // 如果配置了 表单初始化logic
284
+ // 调用 logic 获取参数
285
+ const param = { ...this.mixinData }
286
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
287
+ ...res,
288
+ serviceName: cell.serviceName,
289
+ showSubmitBtn: !this.isInAModal,
290
+ businessType: param.businessType || '新增',
291
+ modifyModelData: param,
292
+ showLeftTab: true,
293
+ })
294
+ }, this.env === 'dev')
295
+ } else if (cell.slotType === 'x-buttons') {
296
+ // 按钮组需要主动调用初始化方法
297
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
298
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
299
+ ...res,
300
+ serviceName: cell.serviceName,
301
+ })
302
+ }, this.env === 'dev')
303
+ } else if (cell.slotType === 'x-label-select') {
304
+ // 按钮组需要主动调用初始化方法
305
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
306
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
307
+ ...res,
308
+ serviceName: cell.serviceName,
309
+ })
310
+ }, this.env === 'dev')
311
+ }
312
+ }
313
+ if (cell.slotType === 'x-report') {
314
+ const param = { ...this.mixinData }
315
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init(param)
316
+ }
317
+ if (cell.slotType === 'x-conversation') {
318
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
319
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
320
+ serviceName: cell.serviceName,
321
+ ...res,
322
+ })
323
+ }, this.env === 'dev')
324
+ }
325
+ if (cell.slotType === 'x-check-list') {
326
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
327
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
328
+ serviceName: cell.serviceName,
329
+ ...res,
330
+ })
331
+ }, this.env === 'dev')
332
+ }
333
+ },
334
+ recalculateItem (item) {
335
+ const totalColSpan = item.reduce((sum, cell) => {
336
+ // 保留手动设置的colSpan
337
+ return sum + (cell._isManualColSpan ? 0 : (cell.colSpan || 1))
338
+ }, 0)
339
+ return item.map(cell => {
340
+ // 跳过已手动设置的单元格
341
+ if (cell._isManualColSpan) return cell
342
+ const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12)
343
+ return {
344
+ ...cell,
345
+ colSpan: newColSpan,
346
+ // 标记自动计算的单元格
347
+ _isAutoCalculated: true
348
+ }
349
+ })
350
+ },
351
+
352
+ getEventHandlers (cell) {
353
+ const handlers = {}
354
+ if (!cell?.events || cell?.events?.length === 0) {
355
+ return handlers
356
+ }
357
+ cell.events.forEach(event => {
358
+ handlers[event.type] = async (...args) => {
359
+ console.info('Event handled:', event.type, args)
360
+ let func = event.customFunction
361
+ if (func && func.startsWith('function')) {
362
+ func = func.replace('function', 'async function')
363
+ }
364
+ const result = await executeStrFunctionByContext(this, func, args)
365
+ if (result instanceof Promise) {
366
+ result.then((res) => {
367
+ if (!res) return
368
+ let messageType = 'success'
369
+ // 如果传递了组件名字 自动调用刷新
370
+ if (res?.name) {
371
+ const waitRefreshRef = this.getComponentByName(res.name)
372
+ if (waitRefreshRef) {
373
+ waitRefreshRef.refresh()
374
+ } else {
375
+ console.warn(`未找到组件${res.name}无法刷新`)
376
+ }
377
+ }
378
+ // 如果传递消息类型 自动调用消息
379
+ if (res?.messageType) {
380
+ messageType = res.messageType
381
+ }
382
+ // 如果传递了提示信息自动调用提示
383
+ if (res?.message) {
384
+ this.$message[messageType](res?.message)
385
+ }
386
+ })
387
+ }
388
+ }
389
+ })
390
+ return handlers
391
+ },
392
+ getComponentName (queryParamsName, serviceName, componentName) {
393
+ return componentName
394
+ },
395
+ // 判断单元格样式
396
+ determineCellStyle (cell, color = '#000', borderWidth = '1px') {
397
+ // 如果声明了borderColor
398
+ if (this.config.style.borderColor) {
399
+ color = this.config.style.borderColor
400
+ }
401
+ let result = {}
402
+ // 如果表格也声明了样式,用表格样式将样式覆盖
403
+ if (cell.style) {
404
+ if (cell.noBorder) {
405
+ result = { ...cell.style }
406
+ } else {
407
+ if (this.noTopBorder) {
408
+ result = { ...cell.style }
409
+ } else {
410
+ result = { ...cell.style }
411
+ }
412
+ }
413
+ return result
414
+ }
415
+ return result
416
+ },
417
+ // 把用户定义的组件,传递到整个杉格中,方便调用
418
+ passComponentNamesToAncestor (refs) {
419
+ console.log('组件的keys', Object.entries(refs), refs)
420
+ // 遍历所有 refs
421
+ Object.entries(refs).forEach(([refKey, refValue]) => {
422
+ // 检查 ref 是否以 dynamicComponent_ 开头
423
+ if (refKey.startsWith('dynamicComponent_')) {
424
+ console.log('组件名存在')
425
+ const componentRef = refValue[0]
426
+ if (componentRef) {
427
+ // 去掉前缀并获取组件名字
428
+ const index = refKey.replace('dynamicComponent_', '') // 去掉前缀
429
+ console.log('注册组件', index)
430
+ // 传递给祖先组件
431
+ this.registerComponent(index, componentRef)
432
+ }
433
+ }
434
+ })
435
+ },
436
+ // 获取组件样式配置
437
+ async getComponentStyleConfig (componentType) {
438
+ try {
439
+ // 从配置中获取样式定义
440
+ const styleConfig = this.$appdata.getStylesByKey(componentType)
441
+ return styleConfig || {}
442
+ } catch (error) {
443
+ console.error('获取组件样式配置失败:', error)
444
+ return {}
445
+ }
446
+ },
447
+
448
+ // 解析组件样式配置
449
+ async parseComponentStyles (cell) {
450
+ if (!cell.class) return { rootStyles: {}, childStyles: {} }
451
+
452
+ const styleConfig = await this.getComponentStyleConfig(cell.slotType)
453
+ if (!styleConfig) return { rootStyles: {}, childStyles: {} }
454
+
455
+ const rootStyles = {}
456
+ const childStyles = new Map()
457
+
458
+ // 处理每个class配置
459
+ cell.class.split(' ').forEach(className => {
460
+ const classConfig = styleConfig[className]
461
+ if (!classConfig) return
462
+
463
+ // 处理根节点样式
464
+ Object.entries(classConfig).forEach(([key, value]) => {
465
+ if (!key.startsWith('*') && typeof key !== 'object') {
466
+ rootStyles[key] = value
467
+ }
468
+ })
469
+
470
+ // 处理子节点样式
471
+ this.parseNestedStyles(classConfig, childStyles)
472
+ })
473
+
474
+ console.warn('样式配置', rootStyles, childStyles)
475
+ return {
476
+ rootStyles,
477
+ childStyles
478
+ }
479
+ },
480
+
481
+ // 递归解析嵌套的样式配置
482
+ parseNestedStyles (config, styleMap, parentKey = '') {
483
+ Object.entries(config).forEach(([key, value]) => {
484
+ if (!key.startsWith('*')) return
485
+
486
+ const className = key.replace('*', '.')
487
+
488
+ // 如果值是对象,检查是否包含样式和子节点
489
+ if (typeof value === 'object') {
490
+ const { style = {}, children = {} } = this.separateStyleAndChildren(value)
491
+
492
+ // 创建或获取当前节点的样式配置
493
+ if (!styleMap.has(className)) {
494
+ styleMap.set(className, {
495
+ styles: {},
496
+ children: new Map()
497
+ })
498
+ }
499
+
500
+ const nodeData = styleMap.get(className)
501
+
502
+ // 合并样式
503
+ Object.assign(nodeData.styles, style)
504
+
505
+ // 递归处理子节点
506
+ this.parseNestedStyles(children, nodeData.children, className)
507
+ }
508
+ })
509
+ },
510
+
511
+ // 分离样式属性和子节点配置
512
+ separateStyleAndChildren (obj) {
513
+ const style = {}
514
+ const children = {}
515
+
516
+ Object.entries(obj).forEach(([key, value]) => {
517
+ if (key.startsWith('*')) {
518
+ // 子节点配置
519
+ children[key] = value
520
+ } else {
521
+ // 样式属性
522
+ style[key] = value
523
+ }
524
+ })
525
+
526
+ return { style, children }
527
+ },
528
+
529
+ // 应用组件样式
530
+ async applyComponentStyles (component, cell, cellIndex) {
531
+ if (!component || !component.$el) return
532
+
533
+ const { rootStyles, childStyles } = await this.parseComponentStyles(cell)
534
+
535
+ // 应用根节点样式
536
+ if (Object.keys(rootStyles).length > 0) {
537
+ Object.entries(rootStyles).forEach(([property, value]) => {
538
+ component.$el.style.setProperty(property, value, 'important')
539
+ })
540
+ }
541
+
542
+ // 如果没有子节点样式,直接返回
543
+ if (childStyles.size === 0) return
544
+
545
+ let retryCount = 0
546
+ const maxRetries = 5
547
+ const retryInterval = 100 // 100ms
548
+
549
+ const applyStyles = () => {
550
+ this.applyChildStylesOptimized(component.$el, childStyles)
551
+ }
552
+
553
+ // 首次应用样式
554
+ applyStyles()
555
+
556
+ // 创建重试机制
557
+ const retryApplyStyles = () => {
558
+ if (retryCount >= maxRetries) return
559
+
560
+ setTimeout(() => {
561
+ applyStyles()
562
+ retryCount++
563
+ retryApplyStyles()
564
+ }, retryInterval)
565
+ }
566
+
567
+ // 开始重试
568
+ retryApplyStyles()
569
+
570
+ // 创建 MutationObserver 用于动态内容
571
+ const observer = new MutationObserver((mutations) => {
572
+ // 检查是否有新增节点
573
+ const hasNewNodes = mutations.some(mutation =>
574
+ mutation.type === 'childList' && mutation.addedNodes.length > 0
575
+ )
576
+
577
+ if (hasNewNodes) {
578
+ applyStyles()
579
+ }
580
+ })
581
+
582
+ // 配置 observer
583
+ observer.observe(component.$el, {
584
+ childList: true,
585
+ subtree: true,
586
+ attributes: false
587
+ })
588
+
589
+ // 3秒后停止观察
590
+ // setTimeout(() => {
591
+ // observer.disconnect()
592
+ // }, 3000)
593
+
594
+ // 组件销毁时清理
595
+ this.$once('hook:beforeDestroy', () => {
596
+ observer.disconnect()
597
+ })
598
+ },
599
+
600
+ // 优化后的子节点样式应用方法
601
+ applyChildStylesOptimized (rootElement, styleMap, parentSelector = '') {
602
+ if (!rootElement) return
603
+
604
+ // 处理样式映射
605
+ for (const [selector, data] of styleMap.entries()) {
606
+ const currentSelector = parentSelector ? `${parentSelector} ${selector}` : selector
607
+
608
+ try {
609
+ // 查找匹配的元素
610
+ const elements = Array.from(rootElement.querySelectorAll(currentSelector))
611
+
612
+ if (!elements.length) continue
613
+
614
+ // 应用当前层级样式
615
+ if (data.styles) {
616
+ elements.forEach(element => {
617
+ if (!element) return
618
+
619
+ // 应用每个样式属性
620
+ Object.entries(data.styles).forEach(([property, value]) => {
621
+ try {
622
+ element.style.setProperty(property, value, 'important')
623
+ } catch (err) {
624
+ console.warn(`设置样式失败: ${property}=${value}`, err)
625
+ }
626
+ })
627
+ })
628
+ }
629
+
630
+ // 处理子层级
631
+ if (data.children && data.children.size > 0) {
632
+ elements.forEach(element => {
633
+ if (element) {
634
+ this.applyChildStylesOptimized(element, data.children, currentSelector)
635
+ }
636
+ })
637
+ }
638
+ } catch (err) {
639
+ console.warn(`处理选择器失败: ${currentSelector}`, err)
640
+ continue
641
+ }
642
+ }
643
+ },
644
+ },
645
+ beforeMount () {
646
+ if (this.useOssForImg) {
647
+ this.uploadParams.resUploadMode = 'oss'
648
+ }
649
+ },
650
+ mounted () {
651
+ },
652
+ }
653
+
654
+ </script>
655
+
656
+ <style scoped lang="less">
657
+ .inputsDiv {
658
+ display: flex;
659
+ justify-content: space-between;
660
+
661
+ .inputsDivItem {
662
+ display: flex;
663
+ align-items: center;
664
+ padding: 0 4px;
665
+ white-space: nowrap;
666
+
667
+ .inputsDivItemLabel {
668
+ padding: 0 4px;
669
+ }
670
+ }
671
+ }
672
+
673
+ .tdNoBorder {
674
+ border-left: 1px solid #000;
675
+ border-right: 1px solid #000;
676
+ padding: 8px;
677
+ }
678
+
679
+ .tdWithBorder {
680
+ border: 1px solid #000;
681
+ padding: 8px;
682
+ }
683
+
684
+ .tdWithNoTopBorder {
685
+ border-top-style: none;
686
+ border-left: 1px solid #000;
687
+ border-right: 1px solid #000;
688
+ border-bottom: 1px solid #000;
689
+ padding: 8px;
690
+ }
691
+
692
+ .grid-content {
693
+ border-radius: 4px;
694
+ min-height: 36px;
695
+ text-align: center;
696
+ color: #fff;
697
+ background-color: #606266;
698
+ }
699
+
700
+ .bg-purple {
701
+ background: #9254de;
702
+ }
703
+
704
+ .bg-purple-light {
705
+ background: #b37feb;
706
+ }
707
+
708
+ .flexItem {
709
+ border-radius: 8px;
710
+ height: 100%;
711
+ }
712
+ </style>