vue2-client 1.17.40 → 1.17.41

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 (337) 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 +112 -112
  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/package.info +1 -1
  62. package/src/assets/img/querySlotDemo.svg +15 -15
  63. package/src/assets/svg/badtwo.svg +1 -1
  64. package/src/assets/svg/goodtwo.svg +1 -1
  65. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  66. package/src/base-client/components/AI/demo.vue +31 -31
  67. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  68. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  69. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  70. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  71. package/src/base-client/components/common/CitySelect/index.js +3 -3
  72. package/src/base-client/components/common/CitySelect/index.md +109 -109
  73. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  74. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  75. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  76. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  77. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  78. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  79. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  80. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  81. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  82. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  83. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  84. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  85. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  86. package/src/base-client/components/common/HIS/demo.vue +61 -61
  87. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  88. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  90. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  91. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  92. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  93. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  101. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  102. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  103. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  104. package/src/base-client/components/common/Recording/index.js +3 -3
  105. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  106. package/src/base-client/components/common/Tree/index.js +2 -2
  107. package/src/base-client/components/common/Upload/index.js +3 -3
  108. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  109. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  110. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +304 -304
  111. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  112. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  113. package/src/base-client/components/common/XAddReport/index.js +3 -3
  114. package/src/base-client/components/common/XAddReport/index.md +56 -56
  115. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  116. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  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/XCalendar/XCalendar.vue +4 -4
  120. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  121. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  122. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  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/XStatusButton.vue +54 -54
  134. package/src/base-client/components/common/XForm/index.md +178 -178
  135. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  136. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  137. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  138. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  139. package/src/base-client/components/common/XFormTable/XFormTable.vue +1093 -1093
  140. package/src/base-client/components/common/XFormTable/demo.vue +113 -113
  141. package/src/base-client/components/common/XFormTable/index.md +92 -92
  142. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  143. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  144. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  145. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  146. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  147. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  148. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  149. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  150. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  151. package/src/base-client/components/common/XPrint/index.vue +97 -97
  152. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  153. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  154. package/src/base-client/components/common/XReport/index.js +3 -3
  155. package/src/base-client/components/common/XReport/print.js +186 -186
  156. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  157. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  158. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  159. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  160. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  161. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  162. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  163. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  164. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  165. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  166. package/src/base-client/components/common/XStepView/index.js +3 -3
  167. package/src/base-client/components/common/XStepView/index.md +31 -31
  168. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  169. package/src/base-client/components/common/XTab/index.js +3 -3
  170. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  171. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  172. package/src/base-client/components/common/XTable/XTableWrapper.vue +706 -706
  173. package/src/base-client/components/common/XTable/index.md +255 -255
  174. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  175. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  176. package/src/base-client/components/common/XTree/index.js +3 -3
  177. package/src/base-client/components/common/XTree/index.md +36 -36
  178. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  179. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  180. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  181. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  182. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  183. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  184. package/src/base-client/components/index.js +51 -51
  185. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  186. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  187. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  188. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  189. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  190. package/src/base-client/plugins/Config.js +19 -19
  191. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  192. package/src/base-client/plugins/Recording.js +258 -258
  193. package/src/base-client/plugins/index.js +23 -23
  194. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  195. package/src/components/Charts/Bar.vue +62 -62
  196. package/src/components/Charts/ChartCard.vue +134 -134
  197. package/src/components/Charts/Liquid.vue +67 -67
  198. package/src/components/Charts/MiniArea.vue +39 -39
  199. package/src/components/Charts/MiniBar.vue +39 -39
  200. package/src/components/Charts/MiniProgress.vue +75 -75
  201. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  202. package/src/components/Charts/Radar.vue +68 -68
  203. package/src/components/Charts/RankList.vue +77 -77
  204. package/src/components/Charts/TagCloud.vue +113 -113
  205. package/src/components/Charts/TransferBar.vue +64 -64
  206. package/src/components/Charts/Trend.vue +82 -82
  207. package/src/components/Charts/chart.less +12 -12
  208. package/src/components/Charts/smooth.area.less +13 -13
  209. package/src/components/CodeMirror/inedx.vue +118 -118
  210. package/src/components/CodeMirror/setting.js +40 -40
  211. package/src/components/FileImageItem/FileItem.vue +320 -320
  212. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  213. package/src/components/NumberInfo/index.js +3 -3
  214. package/src/components/NumberInfo/index.less +54 -54
  215. package/src/components/NumberInfo/index.md +43 -43
  216. package/src/components/STable/index.js +771 -771
  217. package/src/components/card/ChartCard.vue +79 -79
  218. package/src/components/chart/Bar.vue +60 -60
  219. package/src/components/chart/MiniArea.vue +67 -67
  220. package/src/components/chart/MiniBar.vue +59 -59
  221. package/src/components/chart/MiniProgress.vue +57 -57
  222. package/src/components/chart/Radar.vue +80 -80
  223. package/src/components/chart/RankingList.vue +60 -60
  224. package/src/components/chart/Trend.vue +79 -79
  225. package/src/components/chart/index.less +9 -9
  226. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  227. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  228. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  229. package/src/components/checkbox/index.js +9 -9
  230. package/src/components/exception/ExceptionPage.vue +70 -70
  231. package/src/components/g2Charts/constants.js +202 -202
  232. package/src/components/g2Charts/demo.vue +808 -808
  233. package/src/components/g2Charts/designer.vue +228 -228
  234. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  235. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  236. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  237. package/src/components/g2Charts/index.vue +397 -397
  238. package/src/components/index.js +36 -36
  239. package/src/components/input/IInput.vue +66 -66
  240. package/src/components/menu/SideMenu.vue +75 -75
  241. package/src/components/menu/menu.js +273 -273
  242. package/src/components/setting/Setting.vue +234 -234
  243. package/src/components/tool/AStepItem.vue +60 -60
  244. package/src/config/CreateQueryConfig.js +325 -325
  245. package/src/config/default/antd.config.js +89 -89
  246. package/src/config/default/setting.config.js +55 -55
  247. package/src/font-style/font.css +60 -60
  248. package/src/layouts/CommonLayout.vue +56 -56
  249. package/src/layouts/PageLayout.vue +151 -151
  250. package/src/layouts/SinglePageView.vue +136 -136
  251. package/src/layouts/header/AdminHeader.vue +132 -132
  252. package/src/layouts/header/HeaderNotice.vue +177 -177
  253. package/src/layouts/header/InstitutionDetail.vue +181 -181
  254. package/src/layouts/tabs/TabsHead.vue +189 -189
  255. package/src/lib.js +1 -1
  256. package/src/mock/extend/index.js +84 -84
  257. package/src/mock/goods/index.js +108 -108
  258. package/src/pages/DefaultExample/index.vue +77 -77
  259. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  260. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  261. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  262. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  263. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  264. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  265. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  266. package/src/pages/DynamicStatistics/index.vue +282 -282
  267. package/src/pages/Example/childIndex.vue +15 -15
  268. package/src/pages/Example/index.vue +30 -30
  269. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  270. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  271. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  272. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  273. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  274. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  275. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  276. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  277. package/src/pages/Recording/index.vue +77 -77
  278. package/src/pages/ServiceReview/index.vue +284 -284
  279. package/src/pages/SubExample/index.vue +26 -26
  280. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  281. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  282. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  283. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +98 -97
  284. package/src/pages/XReportView/index.vue +64 -64
  285. package/src/pages/XTreeOneProExample/index.vue +67 -67
  286. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  287. package/src/pages/login/Login.vue +379 -379
  288. package/src/pages/login/LoginV3.vue +389 -389
  289. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  290. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  291. package/src/pages/report/ReportTable.js +124 -124
  292. package/src/pages/resourceManage/orgListManage.vue +98 -98
  293. package/src/pages/system/dictionary/index.vue +44 -44
  294. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  295. package/src/pages/system/monitor/operLog/index.vue +37 -37
  296. package/src/pages/system/settings/modifyPassword.vue +117 -117
  297. package/src/pages/system/ticket/index.vue +480 -480
  298. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  299. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  300. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  301. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  302. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  303. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  304. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  305. package/src/plugins/EventLogPlugin.js +33 -33
  306. package/src/plugins/FindParentsData.js +17 -17
  307. package/src/router/async/router.map.js +133 -133
  308. package/src/services/DataModel.js +30 -30
  309. package/src/services/LodopFuncs.js +137 -137
  310. package/src/services/api/TicketDetailsViewApi.js +46 -46
  311. package/src/services/api/cas.js +79 -79
  312. package/src/services/api/entity.js +18 -18
  313. package/src/services/api/index.js +17 -17
  314. package/src/store/modules/account.js +121 -121
  315. package/src/store/modules/index.js +5 -5
  316. package/src/store/modules/lowCode.js +33 -33
  317. package/src/store/modules/setting.js +119 -119
  318. package/src/theme/default/style.less +58 -58
  319. package/src/theme/global.less +311 -311
  320. package/src/utils/authority-utils.js +85 -85
  321. package/src/utils/errorCode.js +6 -6
  322. package/src/utils/formatter.js +74 -74
  323. package/src/utils/htmlToPDF.js +108 -108
  324. package/src/utils/htmlToPDFApi.js +5 -5
  325. package/src/utils/login.js +188 -188
  326. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  327. package/src/utils/lowcode/lowcodeLog.js +29 -29
  328. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  329. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  330. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  331. package/src/utils/map-utils.js +47 -47
  332. package/src/utils/reg.js +95 -95
  333. package/src/utils/runEvalFunction.js +14 -14
  334. package/src/utils/theme-color-replacer-extend.js +92 -92
  335. package/src/utils/util.js +329 -329
  336. package/src/utils/waterMark.js +31 -31
  337. 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
+ }