vue2-client 1.17.40 → 1.17.42

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 (352) hide show
  1. package/.claude/settings.local.json +20 -20
  2. package/.cursorrules +19 -19
  3. package/.env.apply +19 -19
  4. package/.env.gaslink +19 -19
  5. package/.env.his +19 -19
  6. package/.env.liuli +20 -20
  7. package/.env.scada +19 -19
  8. package/.eslintrc.js +90 -90
  9. package/.serena/memories/code_style_conventions.md +217 -217
  10. package/.serena/memories/project_overview.md +54 -54
  11. package/.serena/memories/project_structure.md +329 -329
  12. package/.serena/memories/suggested_commands.md +127 -127
  13. package/.serena/memories/task_completion_checklist.md +183 -183
  14. package/.serena/memories/tech_stack.md +94 -94
  15. package/CHANGELOG.md +830 -830
  16. package/CLAUDE.md +97 -97
  17. package/Components.md +60 -60
  18. package/docs/LowCode/lowcode.md +155 -155
  19. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  20. package/docs/index.md +30 -30
  21. package/index.js +31 -31
  22. package/jest-transform-stub.js +8 -8
  23. package/jest.setup.js +7 -7
  24. package/jsconfig.json +19 -19
  25. package/package.json +1 -1
  26. package/public/his/editor/editor.html +51 -51
  27. package/public/his/editor/mock/bind_data.html +779 -779
  28. package/public/his/editor/mock/data_table.html +40 -40
  29. package/public/his/editor/mock/sign.html +75 -75
  30. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  31. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  32. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  33. package/public/his/editor/vender/date97/calendar.js +4 -4
  34. package/public/his/editor/vender/date97/lang/en.js +13 -13
  35. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  36. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  37. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  38. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  39. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  40. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  41. package/public/his/editor/vender/diff.js +1627 -1627
  42. package/public/his/editor/vender/editor.js +1 -1
  43. package/public/his/editor/vender/fabric.js +31187 -31187
  44. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  45. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  46. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  47. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  48. package/public/his/editor/vender/mui/mui.min.css +4 -4
  49. package/public/his/editor/vender/mui/mui.min.js +5 -5
  50. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  51. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  52. package/public/his/editor/vender/qrcode.js +7 -7
  53. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  54. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  55. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  56. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  57. package/public/his/editor/vender/validator.js +5094 -5094
  58. package/public/his/editor/vender/weui/weui.css +5659 -5659
  59. package/public/his/editor/vender/weui/weui.min.css +4 -4
  60. package/public/his/editor/vender/weui/weui.min.js +11 -11
  61. package/src/assets/img/paymentMethod/icon1.png +0 -0
  62. package/src/assets/img/paymentMethod/icon2.png +0 -0
  63. package/src/assets/img/paymentMethod/icon3.png +0 -0
  64. package/src/assets/img/paymentMethod/icon4.png +0 -0
  65. package/src/assets/img/paymentMethod/icon5.png +0 -0
  66. package/src/assets/img/paymentMethod/icon6.png +0 -0
  67. package/src/assets/img/paymentMethod/package.info +1 -1
  68. package/src/assets/img/querySlotDemo.svg +15 -15
  69. package/src/assets/svg/badtwo.svg +1 -1
  70. package/src/assets/svg/goodtwo.svg +1 -1
  71. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  72. package/src/base-client/components/AI/demo.vue +31 -31
  73. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  74. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  75. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  76. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  77. package/src/base-client/components/common/CitySelect/index.js +3 -3
  78. package/src/base-client/components/common/CitySelect/index.md +109 -109
  79. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  80. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  81. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  82. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  83. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  84. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  85. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  86. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  87. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  88. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  89. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  90. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  91. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  92. package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +3 -1
  93. package/src/base-client/components/common/HIS/demo.vue +61 -61
  94. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  95. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  96. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  97. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  98. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  99. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  100. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  102. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  103. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  104. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  105. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  106. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  107. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  108. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  109. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  110. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  111. package/src/base-client/components/common/Recording/index.js +3 -3
  112. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  113. package/src/base-client/components/common/Tree/index.js +2 -2
  114. package/src/base-client/components/common/Upload/index.js +3 -3
  115. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  116. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  117. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +304 -304
  118. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  119. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  120. package/src/base-client/components/common/XAddReport/index.js +3 -3
  121. package/src/base-client/components/common/XAddReport/index.md +56 -56
  122. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  123. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  124. package/src/base-client/components/common/XButtons/index.js +3 -3
  125. package/src/base-client/components/common/XButtons/index.md +61 -61
  126. package/src/base-client/components/common/XCalendar/XCalendar.vue +4 -4
  127. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  128. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  129. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  130. package/src/base-client/components/common/XDataCard/index.js +3 -3
  131. package/src/base-client/components/common/XDataCard/index.md +1 -1
  132. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  133. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  134. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  135. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  136. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  137. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  138. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  139. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  140. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  141. package/src/base-client/components/common/XForm/index.md +178 -178
  142. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  143. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  144. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  145. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  146. package/src/base-client/components/common/XFormTable/XFormTable.vue +1093 -1093
  147. package/src/base-client/components/common/XFormTable/demo.vue +113 -113
  148. package/src/base-client/components/common/XFormTable/index.md +92 -92
  149. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  150. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  151. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  152. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  153. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  154. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  155. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  156. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  157. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  158. package/src/base-client/components/common/XPrint/index.vue +97 -97
  159. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  160. package/src/base-client/components/common/XReport/XReportHospitalizationDemo.vue +45 -0
  161. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  162. package/src/base-client/components/common/XReport/index.js +3 -3
  163. package/src/base-client/components/common/XReport/print.js +186 -186
  164. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  165. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  166. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  167. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  168. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  169. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  170. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  171. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  172. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  173. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  174. package/src/base-client/components/common/XStepView/index.js +3 -3
  175. package/src/base-client/components/common/XStepView/index.md +31 -31
  176. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  177. package/src/base-client/components/common/XTab/index.js +3 -3
  178. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  179. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  180. package/src/base-client/components/common/XTable/XTableWrapper.vue +706 -706
  181. package/src/base-client/components/common/XTable/index.md +255 -255
  182. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  183. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  184. package/src/base-client/components/common/XTree/index.js +3 -3
  185. package/src/base-client/components/common/XTree/index.md +36 -36
  186. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  187. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  188. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  189. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  190. package/src/base-client/components/his/HChart/HChart.vue +493 -0
  191. package/src/base-client/components/his/HChart/demo.vue +88 -0
  192. package/src/base-client/components/his/HChart/index.md +798 -0
  193. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  194. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  195. package/src/base-client/components/his/XIcon/XIcon.vue +73 -73
  196. package/src/base-client/components/his/XIcon/index.js +3 -3
  197. package/src/base-client/components/his/XIcon/index.md +177 -177
  198. package/src/base-client/components/index.js +51 -51
  199. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  200. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  201. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  202. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  203. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  204. package/src/base-client/plugins/Config.js +19 -19
  205. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  206. package/src/base-client/plugins/Recording.js +258 -258
  207. package/src/base-client/plugins/index.js +23 -23
  208. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  209. package/src/components/Charts/Bar.vue +62 -62
  210. package/src/components/Charts/ChartCard.vue +134 -134
  211. package/src/components/Charts/Liquid.vue +67 -67
  212. package/src/components/Charts/MiniArea.vue +39 -39
  213. package/src/components/Charts/MiniBar.vue +39 -39
  214. package/src/components/Charts/MiniProgress.vue +75 -75
  215. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  216. package/src/components/Charts/Radar.vue +68 -68
  217. package/src/components/Charts/RankList.vue +77 -77
  218. package/src/components/Charts/TagCloud.vue +113 -113
  219. package/src/components/Charts/TransferBar.vue +64 -64
  220. package/src/components/Charts/Trend.vue +82 -82
  221. package/src/components/Charts/chart.less +12 -12
  222. package/src/components/Charts/smooth.area.less +13 -13
  223. package/src/components/CodeMirror/inedx.vue +118 -118
  224. package/src/components/CodeMirror/setting.js +40 -40
  225. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  226. package/src/components/NumberInfo/index.js +3 -3
  227. package/src/components/NumberInfo/index.less +54 -54
  228. package/src/components/NumberInfo/index.md +43 -43
  229. package/src/components/STable/index.js +771 -771
  230. package/src/components/card/ChartCard.vue +79 -79
  231. package/src/components/chart/Bar.vue +60 -60
  232. package/src/components/chart/MiniArea.vue +67 -67
  233. package/src/components/chart/MiniBar.vue +59 -59
  234. package/src/components/chart/MiniProgress.vue +57 -57
  235. package/src/components/chart/Radar.vue +80 -80
  236. package/src/components/chart/RankingList.vue +60 -60
  237. package/src/components/chart/Trend.vue +79 -79
  238. package/src/components/chart/index.less +9 -9
  239. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  240. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  241. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  242. package/src/components/checkbox/index.js +9 -9
  243. package/src/components/exception/ExceptionPage.vue +70 -70
  244. package/src/components/g2Charts/constants.js +202 -202
  245. package/src/components/g2Charts/demo.vue +808 -808
  246. package/src/components/g2Charts/designer.vue +228 -228
  247. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  248. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  249. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  250. package/src/components/g2Charts/index.vue +397 -397
  251. package/src/components/index.js +36 -36
  252. package/src/components/input/IInput.vue +66 -66
  253. package/src/components/menu/SideMenu.vue +75 -75
  254. package/src/components/menu/menu.js +273 -273
  255. package/src/components/setting/Setting.vue +234 -234
  256. package/src/components/tool/AStepItem.vue +60 -60
  257. package/src/config/CreateQueryConfig.js +325 -325
  258. package/src/config/default/antd.config.js +89 -89
  259. package/src/config/default/setting.config.js +55 -55
  260. package/src/font-style/font.css +60 -60
  261. package/src/layouts/CommonLayout.vue +56 -56
  262. package/src/layouts/PageLayout.vue +151 -151
  263. package/src/layouts/SinglePageView.vue +136 -136
  264. package/src/layouts/header/AdminHeader.vue +132 -132
  265. package/src/layouts/header/HeaderNotice.vue +177 -177
  266. package/src/layouts/header/InstitutionDetail.vue +181 -181
  267. package/src/layouts/tabs/TabsHead.vue +189 -189
  268. package/src/lib.js +1 -1
  269. package/src/mock/extend/index.js +84 -84
  270. package/src/mock/goods/index.js +108 -108
  271. package/src/pages/DefaultExample/index.vue +77 -77
  272. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  273. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  274. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  275. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  276. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  277. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  278. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  279. package/src/pages/DynamicStatistics/index.vue +282 -282
  280. package/src/pages/Example/childIndex.vue +15 -15
  281. package/src/pages/Example/index.vue +30 -30
  282. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  283. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  284. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  285. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  286. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  287. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  288. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  289. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  290. package/src/pages/Recording/index.vue +77 -77
  291. package/src/pages/ServiceReview/index.vue +284 -284
  292. package/src/pages/SubExample/index.vue +26 -26
  293. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  294. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  295. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  296. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +3 -2
  297. package/src/pages/XReportView/index.vue +64 -64
  298. package/src/pages/XTreeOneProExample/index.vue +67 -67
  299. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  300. package/src/pages/login/Login.vue +379 -379
  301. package/src/pages/login/LoginV3.vue +389 -389
  302. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  303. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  304. package/src/pages/report/ReportTable.js +124 -124
  305. package/src/pages/resourceManage/orgListManage.vue +98 -98
  306. package/src/pages/system/dictionary/index.vue +44 -44
  307. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  308. package/src/pages/system/monitor/operLog/index.vue +37 -37
  309. package/src/pages/system/settings/modifyPassword.vue +117 -117
  310. package/src/pages/system/ticket/index.vue +480 -480
  311. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  312. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  313. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  314. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  315. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  316. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  317. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  318. package/src/plugins/EventLogPlugin.js +33 -33
  319. package/src/plugins/FindParentsData.js +17 -17
  320. package/src/router/async/router.map.js +134 -133
  321. package/src/services/DataModel.js +30 -30
  322. package/src/services/LodopFuncs.js +137 -137
  323. package/src/services/api/TicketDetailsViewApi.js +46 -46
  324. package/src/services/api/cas.js +79 -79
  325. package/src/services/api/entity.js +18 -18
  326. package/src/services/api/index.js +17 -17
  327. package/src/store/modules/account.js +121 -121
  328. package/src/store/modules/index.js +5 -5
  329. package/src/store/modules/lowCode.js +33 -33
  330. package/src/store/modules/setting.js +119 -119
  331. package/src/theme/default/style.less +58 -58
  332. package/src/theme/global.less +311 -311
  333. package/src/utils/authority-utils.js +85 -85
  334. package/src/utils/errorCode.js +6 -6
  335. package/src/utils/formatter.js +74 -74
  336. package/src/utils/htmlToPDF.js +108 -108
  337. package/src/utils/htmlToPDFApi.js +5 -5
  338. package/src/utils/login.js +188 -188
  339. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  340. package/src/utils/lowcode/lowcodeLog.js +29 -29
  341. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  342. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  343. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  344. package/src/utils/map-utils.js +47 -47
  345. package/src/utils/reg.js +95 -95
  346. package/src/utils/runEvalFunction.js +14 -14
  347. package/src/utils/theme-color-replacer-extend.js +92 -92
  348. package/src/utils/util.js +329 -329
  349. package/src/utils/waterMark.js +31 -31
  350. package/src-base-client/components/his/XCharge/README.md +0 -0
  351. package/src-base-client/components/his/XCharge/XCharge.vue +0 -0
  352. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,771 +1,771 @@
1
- import T from 'ant-design-vue/es/table/Table'
2
- import get from 'lodash.get'
3
- import { mapState } from 'vuex'
4
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
5
-
6
- export default {
7
- data () {
8
- return {
9
- clickedRowKey: null,
10
- hoveredRowKey: null, // 跟踪鼠标悬浮的行
11
- needTotalList: [],
12
-
13
- selectedRows: [],
14
- selectedRowKeys: [],
15
-
16
- localLoading: false,
17
- localDataSource: [],
18
- localPagination: Object.assign({}, this.pagination),
19
-
20
- sortField: undefined,
21
- sortOrder: undefined,
22
- pageNum: 1,
23
- pageSize: 10
24
- }
25
- },
26
- props: Object.assign({}, T.props, {
27
- rowKey: {
28
- type: [String, Function],
29
- default: 'key'
30
- },
31
- data: {
32
- type: Function,
33
- required: true
34
- },
35
- setScrollYHeight: {
36
- type: Function,
37
- required: true
38
- },
39
- showSizeChanger: {
40
- type: Boolean,
41
- default: true
42
- },
43
- showSummary: {
44
- type: Boolean,
45
- default: false
46
- },
47
- selectRowMode: {
48
- type: String,
49
- default: 'default'
50
- },
51
- size: {
52
- type: String,
53
- default: 'default'
54
- },
55
- /**
56
- * alert: {
57
- * show: true,
58
- * clear: Function
59
- * }
60
- */
61
- alert: {
62
- type: [Object, Boolean],
63
- default: null
64
- },
65
- rowSelection: {
66
- type: Object,
67
- default: null
68
- },
69
- /** @Deprecated */
70
- showAlertInfo: {
71
- type: Boolean,
72
- default: false
73
- },
74
- showPagination: {
75
- type: [String, Boolean],
76
- default: 'auto'
77
- },
78
- // 是否隐藏翻页,如果隐藏,彻底不显示翻译
79
- hidePagination: {
80
- type: Boolean,
81
- default: false
82
- },
83
- // 是否显示表头已选择部分
84
- showSelected: {
85
- type: Boolean,
86
- default: true
87
- },
88
- /**
89
- * enable page URI mode
90
- *
91
- * e.g:
92
- * /users/1
93
- * /users/2
94
- * /users/3?queryParam=test
95
- * ...
96
- */
97
- pageURI: {
98
- type: Boolean,
99
- default: false
100
- },
101
- // 最大分页大小,如果设置则使用该值作为分页大小并隐藏分页组件
102
- pageMaxSize: {
103
- type: Number,
104
- default: null
105
- },
106
- // 是否使用自定义分页样式
107
- customPagination: {
108
- type: Boolean,
109
- default: false
110
- },
111
- // 行样式函数,用于控制每行的样式类型
112
- rowStyleFunction: {
113
- type: [Function, String],
114
- default: null
115
- }
116
- }),
117
- computed: {
118
- ...mapState('setting', ['theme']), // 添加 theme 到计算属性
119
-
120
- // 计算点击行的背景色,使用 10% 透明度
121
- clickedRowColor () {
122
- const themeColor = this.$store.state.setting.theme.color
123
- return this.hexToRgba(themeColor || '#1890ff', 0.1)
124
- }
125
- },
126
- watch: {
127
- 'localPagination.current' (val) {
128
- this.pageURI && this.$router.push({
129
- ...this.$route,
130
- name: this.$route.name,
131
- params: Object.assign({}, this.$route.params, {
132
- pageNo: val
133
- })
134
- })
135
- // change pagination, reset total data
136
- this.needTotalList = this.initTotalList(this.columns)
137
- if (this.selectRowMode === 'default') {
138
- this.selectedRowKeys = []
139
- this.selectedRows = []
140
- }
141
- },
142
- pageNum (val) {
143
- Object.assign(this.localPagination, {
144
- current: val
145
- })
146
- },
147
- pageSize (val) {
148
- Object.assign(this.localPagination, {
149
- pageSize: val
150
- })
151
- },
152
- showSizeChanger (val) {
153
- Object.assign(this.localPagination, {
154
- showSizeChanger: val
155
- })
156
- },
157
- pageMaxSize: {
158
- handler (val) {
159
- if (val) {
160
- this.pageSize = val
161
- // 更新 localPagination
162
- if (this.localPagination) {
163
- Object.assign(this.localPagination, {
164
- pageSize: val
165
- })
166
- }
167
- }
168
- },
169
- immediate: true
170
- }
171
- },
172
- created () {
173
- const { pageNo } = this.$route.params
174
- const localPageNum = this.pageURI && (pageNo && parseInt(pageNo)) || this.pageNum
175
-
176
- if (this.pageMaxSize) {
177
- this.pageSize = this.pageMaxSize
178
- }
179
-
180
- this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, {
181
- current: localPageNum,
182
- pageSize: this.pageSize,
183
- showSizeChanger: this.showSizeChanger
184
- }) || false
185
- this.needTotalList = this.initTotalList(this.columns)
186
- // this.loadData()
187
- },
188
- methods: {
189
- /**
190
- * 表格重新加载方法
191
- * 如果参数为 true, 则强制刷新到第一页
192
- * @param Boolean bool
193
- */
194
- refresh (bool = false) {
195
- bool && (this.localPagination = Object.assign({}, {
196
- current: 1, pageSize: this.pageSize
197
- }))
198
- this.loadData()
199
- },
200
- /**
201
- * 加载数据方法
202
- * @param {Object} pagination 分页选项器
203
- * @param {Object} filters 过滤条件
204
- * @param {Object} sorter 排序条件
205
- */
206
- loadData (pagination, filters, sorter) {
207
- this.localLoading = true
208
- // 暂存排序方式,避免 refresh 之后排序失效
209
- if (sorter && sorter.field) {
210
- this.sortField = sorter.field
211
- }
212
- if (sorter && sorter.order) {
213
- this.sortOrder = sorter.order
214
- }
215
-
216
- // 确定 pageSize
217
- let finalPageSize = this.pageSize
218
- if (this.showPagination === false) {
219
- // 当 showPagination 为 false 时,优先使用传入的 pageSize
220
- finalPageSize = pagination?.pageSize || this.pageSize
221
- } else if (pagination && pagination.pageSize) {
222
- finalPageSize = pagination.pageSize
223
- } else if (this.localPagination && this.localPagination.pageSize) {
224
- finalPageSize = this.localPagination.pageSize
225
- }
226
-
227
- const parameter = Object.assign({
228
- querySummary: !pagination && this.showSummary, // 分页查询的情况不重新获取汇总数据
229
- pageNo: (pagination && pagination.current) ||
230
- this.showPagination && this.localPagination.current || this.pageNum,
231
- pageSize: finalPageSize
232
- },
233
- (this.sortField && { sortField: this.sortField }) || {},
234
- (this.sortOrder && { sortOrder: this.sortOrder }) || {},
235
- { ...filters }
236
- )
237
-
238
- // 在加载新数据前,将当前数据传递给父组件
239
- if (this.localDataSource && this.localDataSource.length > 0) {
240
- // 变化前的数据: oldData, 分页信息: pagination, 过滤条件: filters, 排序信息: sorter
241
- this.$emit('beforeDataChange', {
242
- oldData: this.localDataSource,
243
- pagination: this.localPagination,
244
- filters: filters,
245
- sorter: sorter
246
- })
247
- }
248
-
249
- const result = this.data(parameter)
250
- // 对接自己的通用数据接口需要修改下方代码中的 r.pageNo, r.totalCount, r.data
251
- // eslint-disable-next-line
252
- if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') {
253
- result.then(r => {
254
- this.localPagination = this.showPagination && Object.assign({}, this.localPagination, {
255
- current: r.pageNo, // 返回结果中的当前分页数
256
- total: r.totalCount, // 返回结果中的总记录数
257
- showSizeChanger: this.showSizeChanger,
258
- pageSize: finalPageSize
259
- }) || false
260
- // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页
261
- if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) {
262
- this.localPagination.current--
263
- this.loadData()
264
- return
265
- }
266
-
267
- // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = 'auto' 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小
268
- // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能
269
- try {
270
- if ((['auto'].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) {
271
- this.localPagination.hideOnSinglePage = true
272
- }
273
- } catch (e) {
274
- this.localPagination = false
275
- }
276
- this.localDataSource = r.data // 返回结果中的数组数据
277
- this.localLoading = false
278
- // 清除选中行状态(翻页或重新查询时)
279
- this.clickedRowKey = null
280
- this.setScrollYHeight({ type: 'default' })
281
- }, () => {
282
- this.localLoading = false
283
- this.setScrollYHeight({ type: 'default' })
284
- })
285
- }
286
- },
287
- setLocalDataSource (data) {
288
- this.localDataSource = data
289
- },
290
- initTotalList (columns) {
291
- const totalList = []
292
- columns && columns instanceof Array && columns.forEach(column => {
293
- if (column.needTotal) {
294
- totalList.push({
295
- ...column,
296
- total: 0
297
- })
298
- }
299
- })
300
- return totalList
301
- },
302
- /**
303
- * 用于更新已选中的列表数据 total 统计
304
- * @param selectedRowKeys
305
- * @param selectedRows
306
- */
307
- updateSelect (selectedRowKeys, selectedRows) {
308
- this.selectedRows = selectedRows
309
- this.selectedRowKeys = selectedRowKeys
310
- const list = this.needTotalList
311
- this.needTotalList = list.map(item => {
312
- return {
313
- ...item,
314
- total: selectedRows.reduce((sum, val) => {
315
- const total = sum + parseInt(get(val, item.dataIndex))
316
- return isNaN(total) ? 0 : total
317
- }, 0)
318
- }
319
- })
320
- },
321
- /**
322
- * 清空 table 已选中项
323
- */
324
- clearSelected () {
325
- if (this.rowSelection) {
326
- this.rowSelection.onChange([], [])
327
- this.updateSelect([], [])
328
- }
329
- },
330
- /**
331
- * 处理交给 table 使用者去处理 clear 事件时,内部选中统计同时调用
332
- * @param callback
333
- * @returns {*}
334
- */
335
- renderClear (callback) {
336
- if (this.selectedRowKeys.length <= 0) return null
337
- return (
338
- <a style="margin-left: 24px" onClick={() => {
339
- callback()
340
- this.clearSelected()
341
- }}>清空</a>
342
- )
343
- },
344
- renderAlert () {
345
- // 绘制统计列数据
346
- const needTotalItems = this.needTotalList.map((item) => {
347
- return (<span style="margin-right: 12px">
348
- {item.title}总计 <a
349
- style="font-weight: 600">{!item.customRender ? item.total : item.customRender(item.total)}</a>
350
- </span>)
351
- })
352
-
353
- // 绘制 清空 按钮
354
- const clearItem = (typeof this.alert.clear === 'boolean' && this.alert.clear) ? (
355
- this.renderClear(this.clearSelected)
356
- ) : (typeof this.alert.clear === 'function') ? (
357
- this.renderClear(this.alert.clear)
358
- ) : null
359
-
360
- // 绘制 alert 组件
361
- return (
362
- <a-alert showIcon={true} style={{ marginBottom: '8px', fontSize: '14px' }}>
363
- <template slot="message">
364
- <span style="margin-right: 12px;">已选择: <a style="font-weight: 600">{this.selectedRows.length}</a></span>
365
- {needTotalItems}
366
- {clearItem}
367
- </template>
368
- </a-alert>
369
- )
370
- },
371
- onExpand (expanded, record) {
372
- this.$emit('expand', expanded, record)
373
- },
374
- handleRowClick (record, index) {
375
- const isRowKeySequence = this.rowKey === '序号'
376
- const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
377
-
378
- // 如果点击的是已选中的行,则取消选中;否则选中该行
379
- if (this.clickedRowKey === currentRowKey) {
380
- this.clickedRowKey = null
381
- this.$emit('rowClick', null) // 传递 null 表示取消选中
382
- } else {
383
- this.clickedRowKey = currentRowKey
384
- this.$emit('rowClick', record)
385
- }
386
- },
387
- handleRowMouseEnter (record, index) {
388
- if (this.rowKey === '序号') {
389
- this.hoveredRowKey = index
390
- } else {
391
- this.hoveredRowKey = record[this.rowKey]
392
- }
393
- this.$emit('rowMouseEnter', record, index)
394
- },
395
- handleRowMouseLeave (record, index) {
396
- this.hoveredRowKey = null
397
- this.$emit('rowMouseLeave', record, index)
398
- },
399
- hexToRgba (hex, alpha = 1) {
400
- try {
401
- const r = parseInt(hex.slice(1, 3), 16)
402
- const g = parseInt(hex.slice(3, 5), 16)
403
- const b = parseInt(hex.slice(5, 7), 16)
404
- return `rgba(${r}, ${g}, ${b}, ${alpha})`
405
- } catch (e) {
406
- return '#e6f7ff'
407
- }
408
- },
409
- // 获取行样式类型
410
- getRowStyleType (record, index) {
411
- if (this.rowStyleFunction) {
412
- try {
413
- // 如果是函数对象,直接执行
414
- if (typeof this.rowStyleFunction === 'function') {
415
- return this.rowStyleFunction(record, index)
416
- }
417
- // 如果是字符串函数,使用executeStrFunctionByContext执行
418
- if (typeof this.rowStyleFunction === 'string') {
419
- return executeStrFunctionByContext(this, this.rowStyleFunction, [record, index])
420
- }
421
- } catch (e) {
422
- console.warn('Row style function error:', e)
423
- return 'info'
424
- }
425
- }
426
- return 'info'
427
- },
428
- // 根据行样式类型和是否激活获取背景色
429
- // isActive: 是否处于 hover 或 selected 状态
430
- getRowBgColor (styleType, isActive = false) {
431
- const colorMap = {
432
- success: {
433
- normal: 'rgba(82, 196, 26, 0.2)',
434
- active: 'rgba(82, 196, 26, 0.2)'
435
- },
436
- warning: {
437
- normal: 'rgba(250, 173, 20, 0.1)',
438
- active: 'rgba(250, 173, 20, 0.2)'
439
- },
440
- error: {
441
- normal: 'rgba(245, 34, 47, 0.1)',
442
- active: 'rgba(245, 34, 47, 0.2)'
443
- },
444
- danger: {
445
- normal: 'rgba(245, 34, 47, 0.1)',
446
- active: 'rgba(245, 34, 47, 0.2)'
447
- },
448
- magic: {
449
- normal: 'rgba(114, 46, 209, 0.1)',
450
- active: 'rgba(114, 46, 209, 0.2)'
451
- },
452
- warn: {
453
- normal: 'rgba(250, 173, 20, 0.1)',
454
- active: 'rgba(250, 173, 20, 0.2)'
455
- },
456
- info: {
457
- normal: '',
458
- active: 'rgba(24, 144, 255, 0.2)'
459
- }
460
- }
461
-
462
- const colors = colorMap[styleType] || colorMap.info
463
- return isActive ? colors.active : colors.normal
464
- },
465
- // 获取行样式颜色(根据当前行的 hover 和 selected 状态)
466
- getRowStyleClass (record, index) {
467
- const isRowKeySequence = this.rowKey === '序号'
468
- const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
469
-
470
- // 判断是否是选中行或悬浮行
471
- const isActive = this.clickedRowKey === currentRowKey || this.hoveredRowKey === currentRowKey
472
-
473
- // 获取行样式类型
474
- const styleType = this.getRowStyleType(record, index)
475
-
476
- // 返回对应颜色
477
- return this.getRowBgColor(styleType, isActive)
478
- },
479
- },
480
-
481
- render () {
482
- const props = {}
483
- const localKeys = Object.keys(this.$data)
484
- const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert
485
-
486
- Object.keys(T.props).forEach(k => {
487
- const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}`
488
- if (localKeys.includes(localKey)) {
489
- props[k] = this[localKey]
490
- return props[k]
491
- }
492
- if (k === 'rowSelection') {
493
- if (showAlert && this.rowSelection) {
494
- // 如果需要使用alert,则重新绑定 rowSelection 事件
495
- props[k] = {
496
- ...this.rowSelection,
497
- selectedRows: this.selectedRows,
498
- selectedRowKeys: this.selectedRowKeys,
499
- onChange: (selectedRowKeys, selectedRows) => {
500
- this.updateSelect(selectedRowKeys, selectedRows)
501
- typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows)
502
- }
503
- }
504
- return props[k]
505
- } else if (!this.rowSelection) {
506
- // 如果没打算开启 rowSelection 则清空默认的选择项
507
- props[k] = null
508
- return props[k]
509
- }
510
- }
511
- this[k] && (props[k] = this[k])
512
- return props[k]
513
- })
514
- // 取消原有的分页组件 产品设计分页组件和汇总在一行 重新分页逻辑
515
- props.pagination = false
516
-
517
- // 使用 rowClassName 实现响应式行样式
518
- props.rowClassName = (record, index) => {
519
- const isRowKeySequence = this.rowKey === '序号'
520
- const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
521
-
522
- const classes = []
523
-
524
- // 判断是否是选中行(点击状态)
525
- if (this.clickedRowKey === currentRowKey) {
526
- classes.push('row-clicked')
527
- }
528
-
529
- // 添加行样式类型(用于不同的颜色主题)
530
- const styleType = this.getRowStyleType(record, index)
531
- classes.push(`row-style-${styleType}`)
532
-
533
- return classes.join(' ')
534
- }
535
-
536
- // 在 props 中添加自定义行事件
537
- props.customRow = (record, index) => {
538
- return {
539
- on: {
540
- click: () => this.handleRowClick(record, index),
541
- mouseenter: () => this.handleRowMouseEnter(record, index),
542
- mouseleave: () => this.handleRowMouseLeave(record, index)
543
- }
544
- }
545
- }
546
- // 自定义底部汇总插槽组件
547
- const pagination = (
548
- !!this.showPagination && <a-row type={'flex'} justify={'start'} style={{ marginTop: '8px' }}>
549
- <a-col flex="1" style={{
550
- alignItems: 'center',
551
- display: 'flex',
552
- justifyContent: 'start',
553
- boxSizing: 'border-box',
554
- paddingRight: '2rem'
555
- }}>
556
- {this.$slots.fixedfooter}
557
- </a-col>
558
- <a-col flex="0 0">
559
- {this.customPagination ? (
560
- <div class="custom-pagination-container">
561
- {/* 首页按钮 */}
562
- <div
563
- class={['custom-pagination-btn', { disabled: this.localPagination.current === 1 }]}
564
- onClick={() => {
565
- if (this.localPagination.current > 1) {
566
- this.pageSize = this.localPagination.pageSize
567
- this.pageNum = 1
568
- this.loadData({
569
- current: 1,
570
- pageSize: this.localPagination.pageSize
571
- })
572
- }
573
- }}
574
- >
575
- <span class="custom-pagination-icon icon-rotate-right">⌅</span>
576
- </div>
577
-
578
- {/* 上一页按钮 */}
579
- <div
580
- class={['custom-pagination-btn', { disabled: this.localPagination.current === 1 }]}
581
- onClick={() => {
582
- if (this.localPagination.current > 1) {
583
- this.pageSize = this.localPagination.pageSize
584
- this.pageNum = this.localPagination.current - 1
585
- this.loadData({
586
- current: this.localPagination.current - 1,
587
- pageSize: this.localPagination.pageSize
588
- })
589
- }
590
- }}
591
- >
592
- &lt;
593
- </div>
594
-
595
- {/* 当前页按钮 */}
596
- <div class="custom-pagination-btn active">
597
- {this.localPagination.current}
598
- </div>
599
-
600
- {/* 下一页按钮 */}
601
- <div
602
- class={['custom-pagination-btn', { disabled: this.localPagination.current === ((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) || !((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) }]}
603
- onClick={() => {
604
- const totalPages = (this.localPagination && this.localPagination.pageSize)
605
- ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
606
- : 0
607
- if (totalPages > 0 && this.localPagination.current < totalPages) {
608
- this.pageSize = this.localPagination.pageSize
609
- this.pageNum = this.localPagination.current + 1
610
- this.loadData({
611
- current: this.localPagination.current + 1,
612
- pageSize: this.localPagination.pageSize
613
- })
614
- }
615
- }}
616
- >
617
- &gt;
618
- </div>
619
-
620
- {/* 末页按钮 */}
621
- <div
622
- class={['custom-pagination-btn', { disabled: this.localPagination.current === ((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) || !((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) }]}
623
- onClick={() => {
624
- const totalPages = (this.localPagination && this.localPagination.pageSize)
625
- ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
626
- : 0
627
- if (totalPages > 0 && this.localPagination.current < totalPages) {
628
- this.pageSize = this.localPagination.pageSize
629
- this.pageNum = totalPages
630
- this.loadData({
631
- current: totalPages,
632
- pageSize: this.localPagination.pageSize
633
- })
634
- }
635
- }}
636
- >
637
- <span class="custom-pagination-icon icon-rotate-left">⌅</span>
638
- </div>
639
-
640
- {/* 分页信息 */}
641
- <div class="custom-pagination-info">
642
- 共{(this.localPagination && this.localPagination.pageSize)
643
- ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
644
- : 0}页, {(this.localPagination && typeof this.localPagination.total !== 'undefined') ? this.localPagination.total : 0}条
645
- </div>
646
- </div>
647
- ) : (
648
- <a-pagination
649
- total={this.localPagination.total}
650
- onChange={(page, pageSize) => {
651
- this.pageSize = pageSize
652
- this.pageNum = page
653
- this.loadData({
654
- current: page,
655
- pageSize: pageSize
656
- })
657
- }
658
- }
659
- onShowSizeChange={(page, pageSize) => {
660
- this.pageSize = pageSize
661
- this.pageNum = page
662
- this.loadData({
663
- current: page,
664
- pageSize: pageSize
665
- })
666
- }
667
- }
668
- show-total={(total, range) => range[0] === range[1] ? `${range[0]} | 共 ${total} 项` : `${range[0]}-${range[1]} | 共 ${total} 项`}
669
- default-current={this.localPagination.current}
670
- showSizeChanger={this.localPagination.showSizeChanger}/>
671
- )}
672
- </a-col>
673
- </a-row>
674
- )
675
- const table = (
676
- <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData}
677
- onExpand={(expanded, record) => this.onExpand(expanded, record)}>
678
- {Object.keys(this.$slots).map(name => (<template slot={name}>{this.$slots[name]}</template>))}
679
- </a-table>
680
- )
681
- return (
682
- <div class="table-wrapper">
683
- {showAlert && this.showSelected && this.selectRowMode === 'default' ? this.renderAlert() : null}
684
- {table}
685
- {!this.hidePagination ? pagination : null}
686
- </div>
687
- )
688
- }
689
- }
690
-
691
- // 添加自定义分页样式
692
- const customPaginationStyles = `
693
- <style>
694
- .custom-pagination-container {
695
- display: flex;
696
- align-items: center;
697
- gap: 8px;
698
- }
699
-
700
- .custom-pagination-btn {
701
- width: 32px;
702
- height: 32px;
703
- border: 1px solid #d9d9d9;
704
- border-radius: 6px;
705
- background: #fafafa;
706
- color: #5D5C5C;
707
- font-size: 14px;
708
- font-weight: 500;
709
- display: flex;
710
- align-items: center;
711
- justify-content: center;
712
- cursor: pointer;
713
- transition: all 0.3s;
714
- user-select: none;
715
- }
716
-
717
- .custom-pagination-btn:hover {
718
- border-color: #0057FE;
719
- color: #0057FE;
720
- }
721
-
722
- .custom-pagination-btn.active {
723
- background: #0057FE;
724
- border-color: #0057FE;
725
- color: #fff;
726
- }
727
-
728
- .custom-pagination-btn.disabled {
729
- background: #f5f5f5;
730
- border-color: #d9d9d9;
731
- color: #bfbfbf;
732
- cursor: not-allowed;
733
- }
734
-
735
- .custom-pagination-btn.disabled:hover {
736
- border-color: #d9d9d9;
737
- color: #bfbfbf;
738
- }
739
-
740
- .custom-pagination-info {
741
- margin-left: 16px;
742
- color: #666;
743
- font-size: 14px;
744
- white-space: nowrap;
745
- }
746
-
747
- /* 自定义图标与旋转方向 */
748
- .custom-pagination-icon {
749
- display: inline-block;
750
- line-height: 1;
751
- transform-origin: center;
752
- }
753
- .icon-rotate-left {
754
- transform: rotate(90deg);
755
- }
756
- .icon-rotate-right {
757
- transform: rotate(-90deg);
758
- }
759
- </style>
760
- `
761
-
762
- // 将样式注入到页面
763
- if (typeof document !== 'undefined') {
764
- const styleId = 'custom-pagination-styles'
765
- if (!document.getElementById(styleId)) {
766
- const styleElement = document.createElement('style')
767
- styleElement.id = styleId
768
- styleElement.textContent = customPaginationStyles.replace('<style>', '').replace('</style>', '')
769
- document.head.appendChild(styleElement)
770
- }
771
- }
1
+ import T from 'ant-design-vue/es/table/Table'
2
+ import get from 'lodash.get'
3
+ import { mapState } from 'vuex'
4
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
5
+
6
+ export default {
7
+ data () {
8
+ return {
9
+ clickedRowKey: null,
10
+ hoveredRowKey: null, // 跟踪鼠标悬浮的行
11
+ needTotalList: [],
12
+
13
+ selectedRows: [],
14
+ selectedRowKeys: [],
15
+
16
+ localLoading: false,
17
+ localDataSource: [],
18
+ localPagination: Object.assign({}, this.pagination),
19
+
20
+ sortField: undefined,
21
+ sortOrder: undefined,
22
+ pageNum: 1,
23
+ pageSize: 10
24
+ }
25
+ },
26
+ props: Object.assign({}, T.props, {
27
+ rowKey: {
28
+ type: [String, Function],
29
+ default: 'key'
30
+ },
31
+ data: {
32
+ type: Function,
33
+ required: true
34
+ },
35
+ setScrollYHeight: {
36
+ type: Function,
37
+ required: true
38
+ },
39
+ showSizeChanger: {
40
+ type: Boolean,
41
+ default: true
42
+ },
43
+ showSummary: {
44
+ type: Boolean,
45
+ default: false
46
+ },
47
+ selectRowMode: {
48
+ type: String,
49
+ default: 'default'
50
+ },
51
+ size: {
52
+ type: String,
53
+ default: 'default'
54
+ },
55
+ /**
56
+ * alert: {
57
+ * show: true,
58
+ * clear: Function
59
+ * }
60
+ */
61
+ alert: {
62
+ type: [Object, Boolean],
63
+ default: null
64
+ },
65
+ rowSelection: {
66
+ type: Object,
67
+ default: null
68
+ },
69
+ /** @Deprecated */
70
+ showAlertInfo: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ showPagination: {
75
+ type: [String, Boolean],
76
+ default: 'auto'
77
+ },
78
+ // 是否隐藏翻页,如果隐藏,彻底不显示翻译
79
+ hidePagination: {
80
+ type: Boolean,
81
+ default: false
82
+ },
83
+ // 是否显示表头已选择部分
84
+ showSelected: {
85
+ type: Boolean,
86
+ default: true
87
+ },
88
+ /**
89
+ * enable page URI mode
90
+ *
91
+ * e.g:
92
+ * /users/1
93
+ * /users/2
94
+ * /users/3?queryParam=test
95
+ * ...
96
+ */
97
+ pageURI: {
98
+ type: Boolean,
99
+ default: false
100
+ },
101
+ // 最大分页大小,如果设置则使用该值作为分页大小并隐藏分页组件
102
+ pageMaxSize: {
103
+ type: Number,
104
+ default: null
105
+ },
106
+ // 是否使用自定义分页样式
107
+ customPagination: {
108
+ type: Boolean,
109
+ default: false
110
+ },
111
+ // 行样式函数,用于控制每行的样式类型
112
+ rowStyleFunction: {
113
+ type: [Function, String],
114
+ default: null
115
+ }
116
+ }),
117
+ computed: {
118
+ ...mapState('setting', ['theme']), // 添加 theme 到计算属性
119
+
120
+ // 计算点击行的背景色,使用 10% 透明度
121
+ clickedRowColor () {
122
+ const themeColor = this.$store.state.setting.theme.color
123
+ return this.hexToRgba(themeColor || '#1890ff', 0.1)
124
+ }
125
+ },
126
+ watch: {
127
+ 'localPagination.current' (val) {
128
+ this.pageURI && this.$router.push({
129
+ ...this.$route,
130
+ name: this.$route.name,
131
+ params: Object.assign({}, this.$route.params, {
132
+ pageNo: val
133
+ })
134
+ })
135
+ // change pagination, reset total data
136
+ this.needTotalList = this.initTotalList(this.columns)
137
+ if (this.selectRowMode === 'default') {
138
+ this.selectedRowKeys = []
139
+ this.selectedRows = []
140
+ }
141
+ },
142
+ pageNum (val) {
143
+ Object.assign(this.localPagination, {
144
+ current: val
145
+ })
146
+ },
147
+ pageSize (val) {
148
+ Object.assign(this.localPagination, {
149
+ pageSize: val
150
+ })
151
+ },
152
+ showSizeChanger (val) {
153
+ Object.assign(this.localPagination, {
154
+ showSizeChanger: val
155
+ })
156
+ },
157
+ pageMaxSize: {
158
+ handler (val) {
159
+ if (val) {
160
+ this.pageSize = val
161
+ // 更新 localPagination
162
+ if (this.localPagination) {
163
+ Object.assign(this.localPagination, {
164
+ pageSize: val
165
+ })
166
+ }
167
+ }
168
+ },
169
+ immediate: true
170
+ }
171
+ },
172
+ created () {
173
+ const { pageNo } = this.$route.params
174
+ const localPageNum = this.pageURI && (pageNo && parseInt(pageNo)) || this.pageNum
175
+
176
+ if (this.pageMaxSize) {
177
+ this.pageSize = this.pageMaxSize
178
+ }
179
+
180
+ this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, {
181
+ current: localPageNum,
182
+ pageSize: this.pageSize,
183
+ showSizeChanger: this.showSizeChanger
184
+ }) || false
185
+ this.needTotalList = this.initTotalList(this.columns)
186
+ // this.loadData()
187
+ },
188
+ methods: {
189
+ /**
190
+ * 表格重新加载方法
191
+ * 如果参数为 true, 则强制刷新到第一页
192
+ * @param Boolean bool
193
+ */
194
+ refresh (bool = false) {
195
+ bool && (this.localPagination = Object.assign({}, {
196
+ current: 1, pageSize: this.pageSize
197
+ }))
198
+ this.loadData()
199
+ },
200
+ /**
201
+ * 加载数据方法
202
+ * @param {Object} pagination 分页选项器
203
+ * @param {Object} filters 过滤条件
204
+ * @param {Object} sorter 排序条件
205
+ */
206
+ loadData (pagination, filters, sorter) {
207
+ this.localLoading = true
208
+ // 暂存排序方式,避免 refresh 之后排序失效
209
+ if (sorter && sorter.field) {
210
+ this.sortField = sorter.field
211
+ }
212
+ if (sorter && sorter.order) {
213
+ this.sortOrder = sorter.order
214
+ }
215
+
216
+ // 确定 pageSize
217
+ let finalPageSize = this.pageSize
218
+ if (this.showPagination === false) {
219
+ // 当 showPagination 为 false 时,优先使用传入的 pageSize
220
+ finalPageSize = pagination?.pageSize || this.pageSize
221
+ } else if (pagination && pagination.pageSize) {
222
+ finalPageSize = pagination.pageSize
223
+ } else if (this.localPagination && this.localPagination.pageSize) {
224
+ finalPageSize = this.localPagination.pageSize
225
+ }
226
+
227
+ const parameter = Object.assign({
228
+ querySummary: !pagination && this.showSummary, // 分页查询的情况不重新获取汇总数据
229
+ pageNo: (pagination && pagination.current) ||
230
+ this.showPagination && this.localPagination.current || this.pageNum,
231
+ pageSize: finalPageSize
232
+ },
233
+ (this.sortField && { sortField: this.sortField }) || {},
234
+ (this.sortOrder && { sortOrder: this.sortOrder }) || {},
235
+ { ...filters }
236
+ )
237
+
238
+ // 在加载新数据前,将当前数据传递给父组件
239
+ if (this.localDataSource && this.localDataSource.length > 0) {
240
+ // 变化前的数据: oldData, 分页信息: pagination, 过滤条件: filters, 排序信息: sorter
241
+ this.$emit('beforeDataChange', {
242
+ oldData: this.localDataSource,
243
+ pagination: this.localPagination,
244
+ filters: filters,
245
+ sorter: sorter
246
+ })
247
+ }
248
+
249
+ const result = this.data(parameter)
250
+ // 对接自己的通用数据接口需要修改下方代码中的 r.pageNo, r.totalCount, r.data
251
+ // eslint-disable-next-line
252
+ if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') {
253
+ result.then(r => {
254
+ this.localPagination = this.showPagination && Object.assign({}, this.localPagination, {
255
+ current: r.pageNo, // 返回结果中的当前分页数
256
+ total: r.totalCount, // 返回结果中的总记录数
257
+ showSizeChanger: this.showSizeChanger,
258
+ pageSize: finalPageSize
259
+ }) || false
260
+ // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页
261
+ if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) {
262
+ this.localPagination.current--
263
+ this.loadData()
264
+ return
265
+ }
266
+
267
+ // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = 'auto' 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小
268
+ // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能
269
+ try {
270
+ if ((['auto'].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) {
271
+ this.localPagination.hideOnSinglePage = true
272
+ }
273
+ } catch (e) {
274
+ this.localPagination = false
275
+ }
276
+ this.localDataSource = r.data // 返回结果中的数组数据
277
+ this.localLoading = false
278
+ // 清除选中行状态(翻页或重新查询时)
279
+ this.clickedRowKey = null
280
+ this.setScrollYHeight({ type: 'default' })
281
+ }, () => {
282
+ this.localLoading = false
283
+ this.setScrollYHeight({ type: 'default' })
284
+ })
285
+ }
286
+ },
287
+ setLocalDataSource (data) {
288
+ this.localDataSource = data
289
+ },
290
+ initTotalList (columns) {
291
+ const totalList = []
292
+ columns && columns instanceof Array && columns.forEach(column => {
293
+ if (column.needTotal) {
294
+ totalList.push({
295
+ ...column,
296
+ total: 0
297
+ })
298
+ }
299
+ })
300
+ return totalList
301
+ },
302
+ /**
303
+ * 用于更新已选中的列表数据 total 统计
304
+ * @param selectedRowKeys
305
+ * @param selectedRows
306
+ */
307
+ updateSelect (selectedRowKeys, selectedRows) {
308
+ this.selectedRows = selectedRows
309
+ this.selectedRowKeys = selectedRowKeys
310
+ const list = this.needTotalList
311
+ this.needTotalList = list.map(item => {
312
+ return {
313
+ ...item,
314
+ total: selectedRows.reduce((sum, val) => {
315
+ const total = sum + parseInt(get(val, item.dataIndex))
316
+ return isNaN(total) ? 0 : total
317
+ }, 0)
318
+ }
319
+ })
320
+ },
321
+ /**
322
+ * 清空 table 已选中项
323
+ */
324
+ clearSelected () {
325
+ if (this.rowSelection) {
326
+ this.rowSelection.onChange([], [])
327
+ this.updateSelect([], [])
328
+ }
329
+ },
330
+ /**
331
+ * 处理交给 table 使用者去处理 clear 事件时,内部选中统计同时调用
332
+ * @param callback
333
+ * @returns {*}
334
+ */
335
+ renderClear (callback) {
336
+ if (this.selectedRowKeys.length <= 0) return null
337
+ return (
338
+ <a style="margin-left: 24px" onClick={() => {
339
+ callback()
340
+ this.clearSelected()
341
+ }}>清空</a>
342
+ )
343
+ },
344
+ renderAlert () {
345
+ // 绘制统计列数据
346
+ const needTotalItems = this.needTotalList.map((item) => {
347
+ return (<span style="margin-right: 12px">
348
+ {item.title}总计 <a
349
+ style="font-weight: 600">{!item.customRender ? item.total : item.customRender(item.total)}</a>
350
+ </span>)
351
+ })
352
+
353
+ // 绘制 清空 按钮
354
+ const clearItem = (typeof this.alert.clear === 'boolean' && this.alert.clear) ? (
355
+ this.renderClear(this.clearSelected)
356
+ ) : (typeof this.alert.clear === 'function') ? (
357
+ this.renderClear(this.alert.clear)
358
+ ) : null
359
+
360
+ // 绘制 alert 组件
361
+ return (
362
+ <a-alert showIcon={true} style={{ marginBottom: '8px', fontSize: '14px' }}>
363
+ <template slot="message">
364
+ <span style="margin-right: 12px;">已选择: <a style="font-weight: 600">{this.selectedRows.length}</a></span>
365
+ {needTotalItems}
366
+ {clearItem}
367
+ </template>
368
+ </a-alert>
369
+ )
370
+ },
371
+ onExpand (expanded, record) {
372
+ this.$emit('expand', expanded, record)
373
+ },
374
+ handleRowClick (record, index) {
375
+ const isRowKeySequence = this.rowKey === '序号'
376
+ const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
377
+
378
+ // 如果点击的是已选中的行,则取消选中;否则选中该行
379
+ if (this.clickedRowKey === currentRowKey) {
380
+ this.clickedRowKey = null
381
+ this.$emit('rowClick', null) // 传递 null 表示取消选中
382
+ } else {
383
+ this.clickedRowKey = currentRowKey
384
+ this.$emit('rowClick', record)
385
+ }
386
+ },
387
+ handleRowMouseEnter (record, index) {
388
+ if (this.rowKey === '序号') {
389
+ this.hoveredRowKey = index
390
+ } else {
391
+ this.hoveredRowKey = record[this.rowKey]
392
+ }
393
+ this.$emit('rowMouseEnter', record, index)
394
+ },
395
+ handleRowMouseLeave (record, index) {
396
+ this.hoveredRowKey = null
397
+ this.$emit('rowMouseLeave', record, index)
398
+ },
399
+ hexToRgba (hex, alpha = 1) {
400
+ try {
401
+ const r = parseInt(hex.slice(1, 3), 16)
402
+ const g = parseInt(hex.slice(3, 5), 16)
403
+ const b = parseInt(hex.slice(5, 7), 16)
404
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`
405
+ } catch (e) {
406
+ return '#e6f7ff'
407
+ }
408
+ },
409
+ // 获取行样式类型
410
+ getRowStyleType (record, index) {
411
+ if (this.rowStyleFunction) {
412
+ try {
413
+ // 如果是函数对象,直接执行
414
+ if (typeof this.rowStyleFunction === 'function') {
415
+ return this.rowStyleFunction(record, index)
416
+ }
417
+ // 如果是字符串函数,使用executeStrFunctionByContext执行
418
+ if (typeof this.rowStyleFunction === 'string') {
419
+ return executeStrFunctionByContext(this, this.rowStyleFunction, [record, index])
420
+ }
421
+ } catch (e) {
422
+ console.warn('Row style function error:', e)
423
+ return 'info'
424
+ }
425
+ }
426
+ return 'info'
427
+ },
428
+ // 根据行样式类型和是否激活获取背景色
429
+ // isActive: 是否处于 hover 或 selected 状态
430
+ getRowBgColor (styleType, isActive = false) {
431
+ const colorMap = {
432
+ success: {
433
+ normal: 'rgba(82, 196, 26, 0.2)',
434
+ active: 'rgba(82, 196, 26, 0.2)'
435
+ },
436
+ warning: {
437
+ normal: 'rgba(250, 173, 20, 0.1)',
438
+ active: 'rgba(250, 173, 20, 0.2)'
439
+ },
440
+ error: {
441
+ normal: 'rgba(245, 34, 47, 0.1)',
442
+ active: 'rgba(245, 34, 47, 0.2)'
443
+ },
444
+ danger: {
445
+ normal: 'rgba(245, 34, 47, 0.1)',
446
+ active: 'rgba(245, 34, 47, 0.2)'
447
+ },
448
+ magic: {
449
+ normal: 'rgba(114, 46, 209, 0.1)',
450
+ active: 'rgba(114, 46, 209, 0.2)'
451
+ },
452
+ warn: {
453
+ normal: 'rgba(250, 173, 20, 0.1)',
454
+ active: 'rgba(250, 173, 20, 0.2)'
455
+ },
456
+ info: {
457
+ normal: '',
458
+ active: 'rgba(24, 144, 255, 0.2)'
459
+ }
460
+ }
461
+
462
+ const colors = colorMap[styleType] || colorMap.info
463
+ return isActive ? colors.active : colors.normal
464
+ },
465
+ // 获取行样式颜色(根据当前行的 hover 和 selected 状态)
466
+ getRowStyleClass (record, index) {
467
+ const isRowKeySequence = this.rowKey === '序号'
468
+ const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
469
+
470
+ // 判断是否是选中行或悬浮行
471
+ const isActive = this.clickedRowKey === currentRowKey || this.hoveredRowKey === currentRowKey
472
+
473
+ // 获取行样式类型
474
+ const styleType = this.getRowStyleType(record, index)
475
+
476
+ // 返回对应颜色
477
+ return this.getRowBgColor(styleType, isActive)
478
+ },
479
+ },
480
+
481
+ render () {
482
+ const props = {}
483
+ const localKeys = Object.keys(this.$data)
484
+ const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert
485
+
486
+ Object.keys(T.props).forEach(k => {
487
+ const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}`
488
+ if (localKeys.includes(localKey)) {
489
+ props[k] = this[localKey]
490
+ return props[k]
491
+ }
492
+ if (k === 'rowSelection') {
493
+ if (showAlert && this.rowSelection) {
494
+ // 如果需要使用alert,则重新绑定 rowSelection 事件
495
+ props[k] = {
496
+ ...this.rowSelection,
497
+ selectedRows: this.selectedRows,
498
+ selectedRowKeys: this.selectedRowKeys,
499
+ onChange: (selectedRowKeys, selectedRows) => {
500
+ this.updateSelect(selectedRowKeys, selectedRows)
501
+ typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows)
502
+ }
503
+ }
504
+ return props[k]
505
+ } else if (!this.rowSelection) {
506
+ // 如果没打算开启 rowSelection 则清空默认的选择项
507
+ props[k] = null
508
+ return props[k]
509
+ }
510
+ }
511
+ this[k] && (props[k] = this[k])
512
+ return props[k]
513
+ })
514
+ // 取消原有的分页组件 产品设计分页组件和汇总在一行 重新分页逻辑
515
+ props.pagination = false
516
+
517
+ // 使用 rowClassName 实现响应式行样式
518
+ props.rowClassName = (record, index) => {
519
+ const isRowKeySequence = this.rowKey === '序号'
520
+ const currentRowKey = isRowKeySequence ? index : record[this.rowKey]
521
+
522
+ const classes = []
523
+
524
+ // 判断是否是选中行(点击状态)
525
+ if (this.clickedRowKey === currentRowKey) {
526
+ classes.push('row-clicked')
527
+ }
528
+
529
+ // 添加行样式类型(用于不同的颜色主题)
530
+ const styleType = this.getRowStyleType(record, index)
531
+ classes.push(`row-style-${styleType}`)
532
+
533
+ return classes.join(' ')
534
+ }
535
+
536
+ // 在 props 中添加自定义行事件
537
+ props.customRow = (record, index) => {
538
+ return {
539
+ on: {
540
+ click: () => this.handleRowClick(record, index),
541
+ mouseenter: () => this.handleRowMouseEnter(record, index),
542
+ mouseleave: () => this.handleRowMouseLeave(record, index)
543
+ }
544
+ }
545
+ }
546
+ // 自定义底部汇总插槽组件
547
+ const pagination = (
548
+ !!this.showPagination && <a-row type={'flex'} justify={'start'} style={{ marginTop: '8px' }}>
549
+ <a-col flex="1" style={{
550
+ alignItems: 'center',
551
+ display: 'flex',
552
+ justifyContent: 'start',
553
+ boxSizing: 'border-box',
554
+ paddingRight: '2rem'
555
+ }}>
556
+ {this.$slots.fixedfooter}
557
+ </a-col>
558
+ <a-col flex="0 0">
559
+ {this.customPagination ? (
560
+ <div class="custom-pagination-container">
561
+ {/* 首页按钮 */}
562
+ <div
563
+ class={['custom-pagination-btn', { disabled: this.localPagination.current === 1 }]}
564
+ onClick={() => {
565
+ if (this.localPagination.current > 1) {
566
+ this.pageSize = this.localPagination.pageSize
567
+ this.pageNum = 1
568
+ this.loadData({
569
+ current: 1,
570
+ pageSize: this.localPagination.pageSize
571
+ })
572
+ }
573
+ }}
574
+ >
575
+ <span class="custom-pagination-icon icon-rotate-right">⌅</span>
576
+ </div>
577
+
578
+ {/* 上一页按钮 */}
579
+ <div
580
+ class={['custom-pagination-btn', { disabled: this.localPagination.current === 1 }]}
581
+ onClick={() => {
582
+ if (this.localPagination.current > 1) {
583
+ this.pageSize = this.localPagination.pageSize
584
+ this.pageNum = this.localPagination.current - 1
585
+ this.loadData({
586
+ current: this.localPagination.current - 1,
587
+ pageSize: this.localPagination.pageSize
588
+ })
589
+ }
590
+ }}
591
+ >
592
+ &lt;
593
+ </div>
594
+
595
+ {/* 当前页按钮 */}
596
+ <div class="custom-pagination-btn active">
597
+ {this.localPagination.current}
598
+ </div>
599
+
600
+ {/* 下一页按钮 */}
601
+ <div
602
+ class={['custom-pagination-btn', { disabled: this.localPagination.current === ((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) || !((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) }]}
603
+ onClick={() => {
604
+ const totalPages = (this.localPagination && this.localPagination.pageSize)
605
+ ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
606
+ : 0
607
+ if (totalPages > 0 && this.localPagination.current < totalPages) {
608
+ this.pageSize = this.localPagination.pageSize
609
+ this.pageNum = this.localPagination.current + 1
610
+ this.loadData({
611
+ current: this.localPagination.current + 1,
612
+ pageSize: this.localPagination.pageSize
613
+ })
614
+ }
615
+ }}
616
+ >
617
+ &gt;
618
+ </div>
619
+
620
+ {/* 末页按钮 */}
621
+ <div
622
+ class={['custom-pagination-btn', { disabled: this.localPagination.current === ((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) || !((this.localPagination && this.localPagination.pageSize) ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1))) : 0) }]}
623
+ onClick={() => {
624
+ const totalPages = (this.localPagination && this.localPagination.pageSize)
625
+ ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
626
+ : 0
627
+ if (totalPages > 0 && this.localPagination.current < totalPages) {
628
+ this.pageSize = this.localPagination.pageSize
629
+ this.pageNum = totalPages
630
+ this.loadData({
631
+ current: totalPages,
632
+ pageSize: this.localPagination.pageSize
633
+ })
634
+ }
635
+ }}
636
+ >
637
+ <span class="custom-pagination-icon icon-rotate-left">⌅</span>
638
+ </div>
639
+
640
+ {/* 分页信息 */}
641
+ <div class="custom-pagination-info">
642
+ 共{(this.localPagination && this.localPagination.pageSize)
643
+ ? Math.ceil(((this.localPagination.total || 0) / (this.localPagination.pageSize || 1)))
644
+ : 0}页, {(this.localPagination && typeof this.localPagination.total !== 'undefined') ? this.localPagination.total : 0}条
645
+ </div>
646
+ </div>
647
+ ) : (
648
+ <a-pagination
649
+ total={this.localPagination.total}
650
+ onChange={(page, pageSize) => {
651
+ this.pageSize = pageSize
652
+ this.pageNum = page
653
+ this.loadData({
654
+ current: page,
655
+ pageSize: pageSize
656
+ })
657
+ }
658
+ }
659
+ onShowSizeChange={(page, pageSize) => {
660
+ this.pageSize = pageSize
661
+ this.pageNum = page
662
+ this.loadData({
663
+ current: page,
664
+ pageSize: pageSize
665
+ })
666
+ }
667
+ }
668
+ show-total={(total, range) => range[0] === range[1] ? `${range[0]} | 共 ${total} 项` : `${range[0]}-${range[1]} | 共 ${total} 项`}
669
+ default-current={this.localPagination.current}
670
+ showSizeChanger={this.localPagination.showSizeChanger}/>
671
+ )}
672
+ </a-col>
673
+ </a-row>
674
+ )
675
+ const table = (
676
+ <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData}
677
+ onExpand={(expanded, record) => this.onExpand(expanded, record)}>
678
+ {Object.keys(this.$slots).map(name => (<template slot={name}>{this.$slots[name]}</template>))}
679
+ </a-table>
680
+ )
681
+ return (
682
+ <div class="table-wrapper">
683
+ {showAlert && this.showSelected && this.selectRowMode === 'default' ? this.renderAlert() : null}
684
+ {table}
685
+ {!this.hidePagination ? pagination : null}
686
+ </div>
687
+ )
688
+ }
689
+ }
690
+
691
+ // 添加自定义分页样式
692
+ const customPaginationStyles = `
693
+ <style>
694
+ .custom-pagination-container {
695
+ display: flex;
696
+ align-items: center;
697
+ gap: 8px;
698
+ }
699
+
700
+ .custom-pagination-btn {
701
+ width: 32px;
702
+ height: 32px;
703
+ border: 1px solid #d9d9d9;
704
+ border-radius: 6px;
705
+ background: #fafafa;
706
+ color: #5D5C5C;
707
+ font-size: 14px;
708
+ font-weight: 500;
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ cursor: pointer;
713
+ transition: all 0.3s;
714
+ user-select: none;
715
+ }
716
+
717
+ .custom-pagination-btn:hover {
718
+ border-color: #0057FE;
719
+ color: #0057FE;
720
+ }
721
+
722
+ .custom-pagination-btn.active {
723
+ background: #0057FE;
724
+ border-color: #0057FE;
725
+ color: #fff;
726
+ }
727
+
728
+ .custom-pagination-btn.disabled {
729
+ background: #f5f5f5;
730
+ border-color: #d9d9d9;
731
+ color: #bfbfbf;
732
+ cursor: not-allowed;
733
+ }
734
+
735
+ .custom-pagination-btn.disabled:hover {
736
+ border-color: #d9d9d9;
737
+ color: #bfbfbf;
738
+ }
739
+
740
+ .custom-pagination-info {
741
+ margin-left: 16px;
742
+ color: #666;
743
+ font-size: 14px;
744
+ white-space: nowrap;
745
+ }
746
+
747
+ /* 自定义图标与旋转方向 */
748
+ .custom-pagination-icon {
749
+ display: inline-block;
750
+ line-height: 1;
751
+ transform-origin: center;
752
+ }
753
+ .icon-rotate-left {
754
+ transform: rotate(90deg);
755
+ }
756
+ .icon-rotate-right {
757
+ transform: rotate(-90deg);
758
+ }
759
+ </style>
760
+ `
761
+
762
+ // 将样式注入到页面
763
+ if (typeof document !== 'undefined') {
764
+ const styleId = 'custom-pagination-styles'
765
+ if (!document.getElementById(styleId)) {
766
+ const styleElement = document.createElement('style')
767
+ styleElement.id = styleId
768
+ styleElement.textContent = customPaginationStyles.replace('<style>', '').replace('</style>', '')
769
+ document.head.appendChild(styleElement)
770
+ }
771
+ }