vue2-client 1.17.39 → 1.17.40

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 (353) 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/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/female.svg +1 -1
  65. package/src/assets/svg/goodtwo.svg +1 -1
  66. package/src/assets/svg/male.svg +1 -1
  67. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  68. package/src/base-client/components/AI/demo.vue +31 -31
  69. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  70. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  71. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  72. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  73. package/src/base-client/components/common/CitySelect/index.js +3 -3
  74. package/src/base-client/components/common/CitySelect/index.md +109 -109
  75. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  76. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  77. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  78. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  79. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  80. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  81. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  82. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  83. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  84. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  85. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  86. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  87. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  88. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +491 -491
  89. package/src/base-client/components/common/HIS/HFormGroup/index.js +3 -3
  90. package/src/base-client/components/common/HIS/HTab/HTab.vue +443 -443
  91. package/src/base-client/components/common/HIS/demo.vue +61 -61
  92. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  93. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  94. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  95. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  96. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  97. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  98. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  102. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  103. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  104. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  105. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  106. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  107. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  108. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  109. package/src/base-client/components/common/Recording/index.js +3 -3
  110. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  111. package/src/base-client/components/common/Tree/index.js +2 -2
  112. package/src/base-client/components/common/Upload/index.js +3 -3
  113. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  114. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  115. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +304 -304
  116. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  117. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  118. package/src/base-client/components/common/XAddReport/index.js +3 -3
  119. package/src/base-client/components/common/XAddReport/index.md +56 -56
  120. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  121. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  122. package/src/base-client/components/common/XButtons/index.js +3 -3
  123. package/src/base-client/components/common/XButtons/index.md +61 -61
  124. package/src/base-client/components/common/XCalendar/XCalendar.vue +4 -4
  125. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  126. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  127. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  128. package/src/base-client/components/common/XCollapse/XCollapse.vue +830 -830
  129. package/src/base-client/components/common/XDataCard/index.js +3 -3
  130. package/src/base-client/components/common/XDataCard/index.md +1 -1
  131. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  132. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  133. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  134. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  135. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  136. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  137. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  138. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  139. package/src/base-client/components/common/XForm/XFormItem.vue +12 -4
  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 -1092
  147. package/src/base-client/components/common/XFormTable/demo.vue +113 -89
  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/XReportJsonRender.vue +381 -381
  161. package/src/base-client/components/common/XReport/index.js +3 -3
  162. package/src/base-client/components/common/XReport/print.js +186 -186
  163. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  164. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  165. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  166. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  167. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  168. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  169. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  170. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  171. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  172. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  173. package/src/base-client/components/common/XStepView/index.js +3 -3
  174. package/src/base-client/components/common/XStepView/index.md +31 -31
  175. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  176. package/src/base-client/components/common/XTab/index.js +3 -3
  177. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  178. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  179. package/src/base-client/components/common/XTable/XTable.vue +46 -0
  180. package/src/base-client/components/common/XTable/XTableWrapper.vue +706 -669
  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/XTimeline/XTimeline.vue +477 -477
  184. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  185. package/src/base-client/components/common/XTree/index.js +3 -3
  186. package/src/base-client/components/common/XTree/index.md +36 -36
  187. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  188. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  189. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  190. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  191. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  192. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +705 -705
  193. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  194. package/src/base-client/components/his/XList/XList.vue +938 -938
  195. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +354 -354
  196. package/src/base-client/components/his/XTitle/XTitle.vue +314 -314
  197. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +341 -341
  198. package/src/base-client/components/his/threeTestOrders/editor.vue +113 -113
  199. package/src/base-client/components/index.js +51 -51
  200. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  201. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  202. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  203. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  204. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  205. package/src/base-client/plugins/Config.js +19 -19
  206. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  207. package/src/base-client/plugins/Recording.js +258 -258
  208. package/src/base-client/plugins/index.js +23 -23
  209. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  210. package/src/components/Charts/Bar.vue +62 -62
  211. package/src/components/Charts/ChartCard.vue +134 -134
  212. package/src/components/Charts/Liquid.vue +67 -67
  213. package/src/components/Charts/MiniArea.vue +39 -39
  214. package/src/components/Charts/MiniBar.vue +39 -39
  215. package/src/components/Charts/MiniProgress.vue +75 -75
  216. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  217. package/src/components/Charts/Radar.vue +68 -68
  218. package/src/components/Charts/RankList.vue +77 -77
  219. package/src/components/Charts/TagCloud.vue +113 -113
  220. package/src/components/Charts/TransferBar.vue +64 -64
  221. package/src/components/Charts/Trend.vue +82 -82
  222. package/src/components/Charts/chart.less +12 -12
  223. package/src/components/Charts/smooth.area.less +13 -13
  224. package/src/components/CodeMirror/inedx.vue +118 -118
  225. package/src/components/CodeMirror/setting.js +40 -40
  226. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  227. package/src/components/NumberInfo/index.js +3 -3
  228. package/src/components/NumberInfo/index.less +54 -54
  229. package/src/components/NumberInfo/index.md +43 -43
  230. package/src/components/STable/index.js +771 -771
  231. package/src/components/card/ChartCard.vue +79 -79
  232. package/src/components/chart/Bar.vue +60 -60
  233. package/src/components/chart/MiniArea.vue +67 -67
  234. package/src/components/chart/MiniBar.vue +59 -59
  235. package/src/components/chart/MiniProgress.vue +57 -57
  236. package/src/components/chart/Radar.vue +80 -80
  237. package/src/components/chart/RankingList.vue +60 -60
  238. package/src/components/chart/Trend.vue +79 -79
  239. package/src/components/chart/index.less +9 -9
  240. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  241. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  242. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  243. package/src/components/checkbox/index.js +9 -9
  244. package/src/components/exception/ExceptionPage.vue +70 -70
  245. package/src/components/g2Charts/constants.js +202 -202
  246. package/src/components/g2Charts/demo.vue +808 -808
  247. package/src/components/g2Charts/designer.vue +228 -228
  248. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  249. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  250. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  251. package/src/components/g2Charts/index.vue +397 -397
  252. package/src/components/index.js +36 -36
  253. package/src/components/input/IInput.vue +66 -66
  254. package/src/components/menu/SideMenu.vue +75 -75
  255. package/src/components/menu/menu.js +273 -273
  256. package/src/components/setting/Setting.vue +234 -234
  257. package/src/components/tool/AStepItem.vue +60 -60
  258. package/src/config/CreateQueryConfig.js +325 -325
  259. package/src/config/default/antd.config.js +89 -89
  260. package/src/config/default/setting.config.js +55 -55
  261. package/src/font-style/font.css +60 -60
  262. package/src/layouts/CommonLayout.vue +56 -56
  263. package/src/layouts/PageLayout.vue +151 -151
  264. package/src/layouts/SinglePageView.vue +136 -136
  265. package/src/layouts/header/AdminHeader.vue +132 -132
  266. package/src/layouts/header/HeaderNotice.vue +177 -177
  267. package/src/layouts/header/InstitutionDetail.vue +181 -181
  268. package/src/layouts/tabs/TabsHead.vue +189 -189
  269. package/src/lib.js +1 -1
  270. package/src/mock/extend/index.js +84 -84
  271. package/src/mock/goods/index.js +108 -108
  272. package/src/pages/DefaultExample/index.vue +77 -77
  273. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  274. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  275. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  276. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  277. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  278. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  279. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  280. package/src/pages/DynamicStatistics/index.vue +282 -282
  281. package/src/pages/Example/childIndex.vue +15 -15
  282. package/src/pages/Example/index.vue +30 -30
  283. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  284. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  285. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  286. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  287. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  288. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  289. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  290. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  291. package/src/pages/Recording/index.vue +77 -77
  292. package/src/pages/ServiceReview/index.vue +284 -284
  293. package/src/pages/SubExample/index.vue +26 -26
  294. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  295. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  296. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  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/ExceptionRecordQuery/index.vue +45 -45
  314. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  315. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  316. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  317. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  318. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  319. package/src/plugins/EventLogPlugin.js +33 -33
  320. package/src/plugins/FindParentsData.js +17 -17
  321. package/src/router/async/router.map.js +133 -133
  322. package/src/services/DataModel.js +30 -30
  323. package/src/services/LodopFuncs.js +137 -137
  324. package/src/services/api/TicketDetailsViewApi.js +46 -46
  325. package/src/services/api/cas.js +79 -79
  326. package/src/services/api/entity.js +18 -18
  327. package/src/services/api/index.js +17 -17
  328. package/src/store/modules/account.js +121 -121
  329. package/src/store/modules/index.js +5 -5
  330. package/src/store/modules/lowCode.js +33 -33
  331. package/src/store/modules/setting.js +119 -119
  332. package/src/theme/default/style.less +58 -58
  333. package/src/theme/global.less +311 -311
  334. package/src/utils/authority-utils.js +85 -85
  335. package/src/utils/errorCode.js +6 -6
  336. package/src/utils/formatter.js +74 -74
  337. package/src/utils/htmlToPDF.js +108 -108
  338. package/src/utils/htmlToPDFApi.js +5 -5
  339. package/src/utils/login.js +188 -188
  340. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  341. package/src/utils/lowcode/lowcodeLog.js +29 -29
  342. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  343. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  344. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  345. package/src/utils/map-utils.js +47 -47
  346. package/src/utils/reg.js +95 -95
  347. package/src/utils/runEvalFunction.js +14 -14
  348. package/src/utils/theme-color-replacer-extend.js +92 -92
  349. package/src/utils/util.js +329 -329
  350. package/src/utils/waterMark.js +31 -31
  351. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  352. package/src-base-client/components/common/HIS/HForm/HForm.vue +0 -347
  353. package/src-base-client/components/common/XCollapse/XCollapse.vue +0 -0
@@ -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
+ }