vue2-client 1.15.84 → 1.15.86

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 (377) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.editorconfig +9 -9
  3. package/.env +20 -20
  4. package/.env.development +1 -1
  5. package/.env.iot +19 -19
  6. package/.env.message +19 -19
  7. package/.env.revenue +19 -19
  8. package/.env.runtime +19 -19
  9. package/.eslintrc.json +5 -5
  10. package/CLAUDE.md +89 -89
  11. package/README.md +65 -65
  12. package/babel.config.js +21 -21
  13. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +46 -46
  14. package/docs/notice.md +22 -22
  15. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +179 -179
  16. package/jest.config.js +22 -22
  17. package/package.json +111 -111
  18. package/src/App.vue +196 -196
  19. package/src/ReportView.js +13 -13
  20. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +532 -532
  21. package/src/base-client/components/common/AddressSearchCombobox/index.js +3 -3
  22. package/src/base-client/components/common/AmapMarker/index.js +3 -3
  23. package/src/base-client/components/common/CitySelect/CitySelect.vue +376 -376
  24. package/src/base-client/components/common/CitySelect/demo.vue +43 -43
  25. package/src/base-client/components/common/ColorPickerCombobox/ColorPickerCombobox.vue +99 -99
  26. package/src/base-client/components/common/ColorPickerCombobox/demo.vue +34 -34
  27. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +146 -146
  28. package/src/base-client/components/common/JSONToTree/index.js +3 -3
  29. package/src/base-client/components/common/Upload/Upload.vue +323 -323
  30. package/src/base-client/components/common/XAddForm/index.js +3 -3
  31. package/src/base-client/components/common/XAddForm/index.md +61 -61
  32. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1169 -1169
  33. package/src/base-client/components/common/XAddNativeForm/demo.vue +54 -40
  34. package/src/base-client/components/common/XAddNativeForm/index.js +3 -3
  35. package/src/base-client/components/common/XAddReport/XAddReport.vue +212 -212
  36. package/src/base-client/components/common/XBadge/index.js +3 -3
  37. package/src/base-client/components/common/XBadge/index.md +39 -39
  38. package/src/base-client/components/common/XButtons/XButtons.vue +284 -284
  39. package/src/base-client/components/common/XCalendar/XCalendar.vue +369 -369
  40. package/src/base-client/components/common/XCalendar/index.md +284 -284
  41. package/src/base-client/components/common/XCard/index.js +3 -3
  42. package/src/base-client/components/common/XCard/index.md +43 -43
  43. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -300
  44. package/src/base-client/components/common/XCollapse/XCollapse.vue +354 -354
  45. package/src/base-client/components/common/XConversation/XConversation.vue +576 -576
  46. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  47. package/src/base-client/components/common/XDataCard/XDataCard.vue +629 -629
  48. package/src/base-client/components/common/XDatePicker/index.vue +276 -276
  49. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +174 -174
  50. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -314
  51. package/src/base-client/components/common/XDescriptions/demo.vue +51 -51
  52. package/src/base-client/components/common/XForm/XForm.vue +420 -420
  53. package/src/base-client/components/common/XForm/XFormItem.vue +1474 -1390
  54. package/src/base-client/components/common/XForm/XTreeSelect.vue +276 -276
  55. package/src/base-client/components/common/XForm/demo.vue +105 -105
  56. package/src/base-client/components/common/XForm/index.js +3 -3
  57. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  58. package/src/base-client/components/common/XFormCol/index.js +3 -3
  59. package/src/base-client/components/common/XFormCol/index.md +35 -35
  60. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +301 -301
  61. package/src/base-client/components/common/XFormGroup/demo.vue +41 -41
  62. package/src/base-client/components/common/XFormTable/XFormTable.vue +938 -938
  63. package/src/base-client/components/common/XFormTable/demo.vue +87 -87
  64. package/src/base-client/components/common/XFormTable/index.js +3 -3
  65. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +174 -174
  66. package/src/base-client/components/common/XImportExcel/index.js +3 -3
  67. package/src/base-client/components/common/XImportExcel/index.md +38 -38
  68. package/src/base-client/components/common/XInput/XInput.vue +128 -128
  69. package/src/base-client/components/common/XInput/index.js +3 -3
  70. package/src/base-client/components/common/XInput/index.md +97 -97
  71. package/src/base-client/components/common/XIntervalPicker/XIntervalPicker.vue +121 -121
  72. package/src/base-client/components/common/XLicensePlate/index.js +3 -3
  73. package/src/base-client/components/common/XLicensePlate/index.md +38 -38
  74. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  75. package/src/base-client/components/common/XPrint/PrintBill.vue +308 -308
  76. package/src/base-client/components/common/XRate/demo.vue +102 -102
  77. package/src/base-client/components/common/XRate/index.vue +149 -149
  78. package/src/base-client/components/common/XReport/XReport.vue +963 -963
  79. package/src/base-client/components/common/XReport/XReportDemo.vue +70 -70
  80. package/src/base-client/components/common/XReport/XReportTrGroup.vue +1005 -1005
  81. package/src/base-client/components/common/XReport/index.md +103 -103
  82. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  83. package/src/base-client/components/common/XReportGrid/XReport.vue +1075 -1075
  84. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
  85. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +620 -620
  86. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +723 -723
  87. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  88. package/src/base-client/components/common/XTab/XTab.vue +299 -299
  89. package/src/base-client/components/common/XTable/ExportExcel.vue +283 -283
  90. package/src/base-client/components/common/XTable/XTable.vue +1599 -1599
  91. package/src/base-client/components/common/XTable/XTableWrapper.vue +597 -597
  92. package/src/base-client/components/common/XTable/index.js +3 -3
  93. package/src/base-client/components/common/XTimeline/XTimeline.vue +358 -358
  94. package/src/base-client/components/common/XTimeline/index.md +191 -191
  95. package/src/base-client/components/common/XTree/XTreePro.vue +452 -452
  96. package/src/base-client/components/common/XTreeOne/index.js +3 -3
  97. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  98. package/src/base-client/components/his/XCharge/XCharge.vue +238 -238
  99. package/src/base-client/components/his/XCheckbox/XCheckbox.vue +105 -105
  100. package/src/base-client/components/his/XCheckbox/index.md +253 -253
  101. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +430 -430
  102. package/src/base-client/components/his/XHDescriptions/index.md +217 -217
  103. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +629 -629
  104. package/src/base-client/components/his/XHisEditor/diagnosisAutocomplete.js +263 -263
  105. package/src/base-client/components/his/XList/XList.vue +495 -495
  106. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.json +3 -3
  107. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.vue +106 -106
  108. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireDemo.vue +51 -51
  109. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireItem.vue +269 -269
  110. package/src/base-client/components/his/XRadio/XRadio.vue +125 -125
  111. package/src/base-client/components/his/XRadio/index.md +234 -234
  112. package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
  113. package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +234 -234
  114. package/src/base-client/components/his/XShiftSchedule/dome.vue +29 -29
  115. package/src/base-client/components/his/XSidebar/XSidebar.vue +240 -240
  116. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  117. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +162 -162
  118. package/src/base-client/components/his/XTimeSelect/XTimeSelectDemo.vue +23 -23
  119. package/src/base-client/components/his/XTitle/README.md +113 -113
  120. package/src/base-client/components/his/XTitle/XTitle.vue +123 -123
  121. package/src/base-client/components/his/XTreeRows/TreeNode.vue +107 -107
  122. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +307 -307
  123. package/src/base-client/components/his/threeTestOrders/dome.vue +68 -68
  124. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  125. package/src/base-client/components/his/threeTestOrders/textBox.vue +457 -457
  126. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +475 -475
  127. package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
  128. package/src/base-client/components/layout/XPageView/XErrorView.vue +22 -22
  129. package/src/base-client/components/layout/XPageView/XPageRowTemplate.vue +37 -37
  130. package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
  131. package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
  132. package/src/base-client/components/layout/XPageView/XTab/index.js +3 -3
  133. package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
  134. package/src/base-client/components/layout/XPageView/index.js +2 -2
  135. package/src/base-client/components/layout/XPageView/index.md +96 -96
  136. package/src/base-client/components/system/DictionaryDetailsView/index.js +3 -3
  137. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  138. package/src/base-client/components/system/LogDetailsView/LogDetailsView.vue +376 -376
  139. package/src/base-client/components/system/LogDetailsView/index.js +3 -3
  140. package/src/base-client/components/system/LogDetailsView/index.md +41 -41
  141. package/src/base-client/components/system/QueryParamsDetailsView/index.js +3 -3
  142. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +807 -807
  143. package/src/base-client/components/ticket/TicketDetailsView/index.js +3 -3
  144. package/src/base-client/components/ticket/TicketDetailsView/index.md +29 -29
  145. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +260 -260
  146. package/src/base-client/components/ticket/TicketDetailsView/part/index.js +3 -3
  147. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
  148. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.js +3 -3
  149. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.md +29 -29
  150. package/src/base-client/plugins/AppData.js +126 -126
  151. package/src/base-client/plugins/PagedList.js +177 -177
  152. package/src/base-client/plugins/__tests__/selectValueTypeHelper.test.js +154 -0
  153. package/src/base-client/plugins/authority-plugin.js +167 -167
  154. package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
  155. package/src/base-client/plugins/i18n-extend.js +32 -32
  156. package/src/base-client/plugins/moment.js +8 -8
  157. package/src/base-client/plugins/selectValueTypeHelper.js +281 -0
  158. package/src/bootstrap.js +51 -51
  159. package/src/components/Ellipsis/Ellipsis.vue +65 -65
  160. package/src/components/Ellipsis/index.js +3 -3
  161. package/src/components/Ellipsis/index.md +38 -38
  162. package/src/components/FileImageItem/FileItem.vue +320 -320
  163. package/src/components/FileImageItem/FileItemGroup.vue +197 -197
  164. package/src/components/FileImageItem/ImageItem.vue +107 -107
  165. package/src/components/FileImageItem/index.js +4 -4
  166. package/src/components/FilePreview/FilePreview.vue +181 -181
  167. package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
  168. package/src/components/FilePreview/index.js +3 -3
  169. package/src/components/HeightScanner/index.vue +615 -615
  170. package/src/components/STable/README.md +341 -341
  171. package/src/components/STable/index.js +558 -558
  172. package/src/components/TableSetting/TableSetting.vue +143 -143
  173. package/src/components/TableSetting/index.js +3 -3
  174. package/src/components/Trend/Trend.vue +41 -41
  175. package/src/components/Trend/index.js +3 -3
  176. package/src/components/Trend/index.less +41 -41
  177. package/src/components/Trend/index.md +45 -45
  178. package/src/components/_util/util.js +46 -46
  179. package/src/components/cache/AKeepAlive.js +179 -179
  180. package/src/components/exception/typeConfig.js +19 -19
  181. package/src/components/form/FormRow.vue +52 -52
  182. package/src/components/index.less +5 -5
  183. package/src/components/menu/Contextmenu.vue +84 -84
  184. package/src/components/menu/index.less +38 -38
  185. package/src/components/page/header/PageHeader.vue +64 -64
  186. package/src/components/page/header/index.less +40 -40
  187. package/src/components/result/Result.vue +77 -77
  188. package/src/components/setting/SettingItem.vue +26 -26
  189. package/src/components/setting/i18n.js +117 -117
  190. package/src/components/table/StandardTable.vue +141 -141
  191. package/src/components/table/advance/ActionColumns.vue +158 -158
  192. package/src/components/table/advance/ActionSize.vue +45 -45
  193. package/src/components/table/advance/AdvanceTable.vue +275 -275
  194. package/src/components/table/advance/SearchArea.vue +355 -355
  195. package/src/components/table/advance/index.js +2 -2
  196. package/src/components/table/api/ApiTable.vue +50 -50
  197. package/src/components/task/TaskGroup.vue +80 -80
  198. package/src/components/task/TaskItem.vue +26 -26
  199. package/src/components/tool/AvatarList.vue +68 -68
  200. package/src/components/tool/DetailList.vue +157 -157
  201. package/src/components/tool/Drawer.vue +142 -142
  202. package/src/components/tool/FooterToolBar.vue +30 -30
  203. package/src/components/tool/HeadInfo.vue +35 -35
  204. package/src/components/tool/TagSelect.vue +83 -83
  205. package/src/components/tool/TagSelectOption.vue +33 -33
  206. package/src/components/transition/PageToggleTransition.vue +97 -97
  207. package/src/config/default/admin.config.js +18 -18
  208. package/src/config/default/animate.config.js +21 -21
  209. package/src/config/default/index.js +6 -6
  210. package/src/config/index.js +3 -3
  211. package/src/config/replacer/index.js +10 -10
  212. package/src/config/replacer/resolve.config.js +67 -67
  213. package/src/expression/ExpressionRunner.js +26 -26
  214. package/src/expression/TestExpression.js +509 -509
  215. package/src/expression/core/Delegate.js +115 -115
  216. package/src/expression/core/Expression.js +1358 -1358
  217. package/src/expression/core/Program.js +932 -932
  218. package/src/expression/core/Token.js +27 -27
  219. package/src/expression/enums/ExpressionType.js +81 -81
  220. package/src/expression/enums/TokenType.js +11 -11
  221. package/src/expression/exception/BreakWayException.js +2 -2
  222. package/src/expression/exception/ContinueWayException.js +2 -2
  223. package/src/expression/exception/ExpressionException.js +28 -28
  224. package/src/expression/exception/ReturnWayException.js +14 -14
  225. package/src/expression/exception/ServiceException.js +22 -22
  226. package/src/expression/instances/LogicConsole.js +44 -44
  227. package/src/expression/ts/ExpressionRunner.ts +28 -28
  228. package/src/expression/ts/TestExpression.ts +509 -509
  229. package/src/expression/ts/core/Delegate.ts +114 -114
  230. package/src/expression/ts/core/Expression.ts +1309 -1309
  231. package/src/expression/ts/core/Program.ts +950 -950
  232. package/src/expression/ts/core/Token.ts +29 -29
  233. package/src/expression/ts/enums/ExpressionType.ts +81 -81
  234. package/src/expression/ts/enums/TokenType.ts +13 -13
  235. package/src/expression/ts/exception/BreakWayException.ts +2 -2
  236. package/src/expression/ts/exception/ContinueWayException.ts +2 -2
  237. package/src/expression/ts/exception/ExpressionException.ts +28 -28
  238. package/src/expression/ts/exception/ReturnWayException.ts +14 -14
  239. package/src/expression/ts/exception/ServiceException.ts +22 -22
  240. package/src/expression/ts/instances/JSONArray.ts +48 -48
  241. package/src/expression/ts/instances/JSONObject.ts +109 -109
  242. package/src/expression/ts/instances/LogicConsole.ts +32 -32
  243. package/src/layouts/AdminLayout.vue +176 -176
  244. package/src/layouts/BlankView.vue +79 -79
  245. package/src/layouts/ComponentLayoutOne.vue +47 -47
  246. package/src/layouts/GridView.vue +43 -43
  247. package/src/layouts/PageView.vue +55 -55
  248. package/src/layouts/footer/PageFooter.vue +49 -49
  249. package/src/layouts/header/HeaderAvatar.vue +64 -64
  250. package/src/layouts/header/HeaderSearch.vue +67 -67
  251. package/src/layouts/header/index.less +92 -92
  252. package/src/layouts/tabs/TabsView.vue +383 -383
  253. package/src/layouts/tabs/i18n.js +25 -25
  254. package/src/layouts/tabs/index.js +2 -2
  255. package/src/logic/LogicRunner.js +62 -62
  256. package/src/logic/TestLogic.js +13 -13
  257. package/src/logic/plugins/common/DateTools.js +35 -35
  258. package/src/logic/plugins/common/VueTools.js +30 -30
  259. package/src/logic/plugins/index.js +7 -7
  260. package/src/logic/ts/LogicRunner.ts +67 -67
  261. package/src/logic/ts/TestLogic.ts +13 -13
  262. package/src/main.js +33 -33
  263. package/src/mixins/formValidationMixin.js +46 -46
  264. package/src/mock/common/activityData.js +32 -32
  265. package/src/mock/common/index.js +89 -89
  266. package/src/mock/common/reportData.js +20 -20
  267. package/src/mock/common/tableData.js +118 -118
  268. package/src/mock/index.js +12 -12
  269. package/src/mock/project/index.js +17 -17
  270. package/src/mock/user/current.js +13 -13
  271. package/src/mock/user/login.js +39 -39
  272. package/src/mock/user/routes.js +61 -61
  273. package/src/mock/workplace/index.js +15 -15
  274. package/src/pages/LogicCallExample/index.vue +46 -46
  275. package/src/pages/ReportGrid/index.vue +76 -76
  276. package/src/pages/ReportView.vue +50 -50
  277. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -47
  278. package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +204 -204
  279. package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -203
  280. package/src/pages/WorkflowDetail/WorkflowDetail.vue +391 -391
  281. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  282. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +415 -415
  283. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1766 -1765
  284. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +975 -975
  285. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +109 -109
  286. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +929 -929
  287. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +222 -222
  288. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +243 -243
  289. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +188 -188
  290. package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +109 -109
  291. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -97
  292. package/src/pages/XPageViewExample/index.vue +149 -149
  293. package/src/pages/addressSelect/addressDemo.vue +24 -24
  294. package/src/pages/addressSelect/index.vue +270 -270
  295. package/src/pages/dashboard/workplace/i18n.js +40 -40
  296. package/src/pages/dashboard/workplace/index.js +2 -2
  297. package/src/pages/dashboard/workplace/index.less +59 -59
  298. package/src/pages/exception/403.vue +21 -21
  299. package/src/pages/exception/404.vue +24 -24
  300. package/src/pages/exception/500.vue +21 -21
  301. package/src/pages/login/index.js +2 -2
  302. package/src/pages/report/ReportTableHome.vue +28 -28
  303. package/src/pages/resourceManage/depListManage.vue +23 -23
  304. package/src/pages/resourceManage/funListManage.vue +23 -23
  305. package/src/pages/resourceManage/index.js +15 -15
  306. package/src/pages/resourceManage/resourceManageMain.vue +57 -57
  307. package/src/pages/resourceManage/roleListManage.vue +23 -23
  308. package/src/pages/resourceManage/staffListManage.vue +23 -23
  309. package/src/pages/system/file/Info.vue +56 -56
  310. package/src/pages/system/file/index.vue +317 -317
  311. package/src/pages/system/settings/index.vue +126 -126
  312. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +77 -77
  313. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +75 -75
  314. package/src/pages/userInfoDetailManage/InsuranceDetailQuery/index.vue +64 -64
  315. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +75 -75
  316. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +75 -75
  317. package/src/pages/userInfoDetailManage/PriceAdjustments/index.vue +64 -64
  318. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +94 -94
  319. package/src/pages/userInfoDetailManage/UserException/index.vue +64 -64
  320. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +87 -87
  321. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +74 -74
  322. package/src/pages/userInfoDetailManage/index.vue +290 -290
  323. package/src/pages/userInfoDetailManage/uploadFilesHistory/ImagePreview.vue +101 -101
  324. package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +129 -129
  325. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +144 -144
  326. package/src/plugins/HiPrintPlugin.js +164 -164
  327. package/src/router/async/router.map.js +126 -126
  328. package/src/router/guards.js +262 -262
  329. package/src/router/i18n.js +57 -57
  330. package/src/router.js +17 -17
  331. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  332. package/src/services/api/LogDetailsViewApi.js +10 -10
  333. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  334. package/src/services/api/logininfor/index.js +6 -6
  335. package/src/services/api/manage.js +8 -8
  336. package/src/services/api/restTools.js +215 -215
  337. package/src/services/api/workFlow.js +57 -57
  338. package/src/services/apiService.js +16 -16
  339. package/src/services/dataSource.js +12 -12
  340. package/src/services/index.js +7 -7
  341. package/src/services/user.js +92 -92
  342. package/src/services/v3Api.js +116 -116
  343. package/src/store/index.js +5 -5
  344. package/src/store/mutation-types.js +4 -4
  345. package/src/theme/antd/ant-menu.less +2 -2
  346. package/src/theme/antd/ant-message.less +3 -3
  347. package/src/theme/antd/ant-table.less +22 -22
  348. package/src/theme/antd/ant-time-picker.less +3 -3
  349. package/src/theme/antd/index.less +3 -3
  350. package/src/theme/default/color.less +43 -43
  351. package/src/theme/default/index.less +3 -3
  352. package/src/theme/default/nprogress.less +76 -76
  353. package/src/theme/global.less +279 -279
  354. package/src/theme/index.less +5 -5
  355. package/src/theme/reportTable.less +58 -58
  356. package/src/theme/theme.less +1 -1
  357. package/src/utils/EncryptUtil.js +162 -162
  358. package/src/utils/Objects.js +25 -25
  359. package/src/utils/axios-interceptors.js +100 -100
  360. package/src/utils/colors.js +107 -107
  361. package/src/utils/common.js +10 -10
  362. package/src/utils/excel/Blob.js +180 -180
  363. package/src/utils/excel/Export2Excel.js +141 -141
  364. package/src/utils/filter.js +21 -21
  365. package/src/utils/i18n.js +80 -80
  366. package/src/utils/indexedDB.js +549 -549
  367. package/src/utils/microAppUtils.js +49 -49
  368. package/src/utils/request.js +395 -395
  369. package/src/utils/routerUtil.js +553 -553
  370. package/src/utils/themeUtil.js +100 -100
  371. package/test/Tree.spec.js +168 -168
  372. package/test/myDialog.spec.js +47 -47
  373. package/test/request.test.js +17 -17
  374. package/test/util.test.js +53 -53
  375. package/test/v3Api.test.js +1984 -1984
  376. package/tests/unit/ReportTable.spec.js +16 -16
  377. package/vue.config.js +222 -222
@@ -1,629 +1,629 @@
1
- <template>
2
- <div>
3
- <div v-if="render" class="XCard">
4
- <template v-for="(card, itemIndex) in data">
5
- <a-card
6
- :key="'card' + itemIndex"
7
- class="data-card"
8
- :class="{ 'card-clicked': card.isClicked }"
9
- >
10
- <div
11
- v-if="config && card[config.ribbon]"
12
- class="ribbon"
13
- :style="{ backgroundColor: getRibbonColor(card[config.ribbonColor]) }">
14
- {{ card[config.ribbon] }}
15
- </div>
16
- <!-- 自定义标题 -->
17
- <template #title>
18
- <div class="custom-title" @click="cardClick(card, 'cardclick', itemIndex)">
19
- <a-tooltip placement="top">
20
- <template #title>{{ card[config.id] }}</template>
21
- <div class="title-id" v-if="card[config.id]">{{ card[config.id] }}</div>
22
- </a-tooltip>
23
- <div class="title-basic">
24
- <div class="title-main">
25
- <span class="title-name">{{ card[config.title] }}</span>
26
- <span class="title-info">{{ card[config.title2] }}</span>
27
- <span class="title-title3">{{ card[config.title3] }}</span>
28
- </div>
29
- <div class="additional-info" v-if="card[config.subtitle2] || card[config.subtitle3] || card[config.subtitle4]">
30
- <a-tooltip placement="top" v-if="card[config.subtitle2]">
31
- <template #title>{{ card[config.subtitle2] }}</template>
32
- <span class="subtitle2">{{ card[config.subtitle2] }}</span>
33
- </a-tooltip>
34
- <a-tooltip placement="top" v-if="card[config.subtitle3]">
35
- <template #title>{{ card[config.subtitle3] }}</template>
36
- <span class="subtitle3">{{ card[config.subtitle3] }}</span>
37
- </a-tooltip>
38
- <span class="subtitle4" v-if="card[config.subtitle4]">{{ card[config.subtitle4] }}</span>
39
- </div>
40
- </div>
41
- </div>
42
- </template>
43
- <!-- 主体 -->
44
- <div class="body" v-if="card[config.text] || (config.content && config.content.length > 0)">
45
- <div class="body-text" v-if="card[config.text]">
46
- <a-tooltip :title="card[config.text]">
47
- <span class="text-ellipsis">{{ card[config.text] }}</span>
48
- </a-tooltip>
49
- </div>
50
- <template v-for="(item, bodyIndex) in config.content" v-if="bodyIndex < 6">
51
- <div :key="'body' + bodyIndex" class="body-item">
52
- <span class="body-item-label">{{ item.label }}:</span>
53
- <template v-if="item.type === 'progress'">
54
- <div class="progress">
55
- <div class="progress-bar">
56
- <div class="progress-done" :style="'width:' + card[item.key] * 100 + '%;backgroundColor: ' + determineRatioColor(card[item.key] * 100)"></div>
57
- </div>
58
- </div>
59
- <div class="progress-num">{{ card[item.key] * 100 }}%</div>
60
- </template>
61
- <template v-else-if="item.type === 'custom' && tableColumns">
62
- <!-- 根据 tableColumns 显示自定义内容 -->
63
- <span v-for="column in tableColumns" v-if="column.dataIndex === item.key" :key="column.dataIndex">
64
- <template v-if="column.slotType === 'badge'">
65
- <x-badge
66
- :service-name="serviceName"
67
- :env="env"
68
- :dataCard="true"
69
- :badge-key="column.slotKeyMap"
70
- :value="card[item.key]" />
71
- </template>
72
- <template v-else>
73
- <slot :name="column.slots.customRender">{{ card[item.key] }}</slot>
74
- </template>
75
- </span>
76
- </template>
77
- <template v-else>
78
- <span class="body-item-value">{{ card[item.key] }}</span>
79
- </template>
80
- </div>
81
- <a-divider
82
- v-if="bodyIndex !== config.content.length - 1"
83
- dashed
84
- :key="'body' + bodyIndex + 'after'"
85
- class="body-split" />
86
- </template>
87
- </div>
88
- <!-- 下方按钮 -->
89
- <template #actions>
90
- <a-row align="middle" class="custom-actions" v-if="config && config.footer && config.footer.length > 0">
91
- <template v-for="(item, footerIndex) in config.footer">
92
- <a-col :key="'footer_' + footerIndex" class="footer-item" :span="11" @click="clickFooter(card, item.emit, itemIndex)">
93
- <span>
94
- <a-icon :type="item.icon" class="footer-icon" />
95
- <span>{{ item.label }}</span>
96
- </span>
97
- </a-col>
98
- <a-col
99
- v-if="footerIndex !== config.footer.length - 1"
100
- :span="1"
101
- :key="'footer_' + footerIndex + 'after'"
102
- class="footer-item-split">
103
- |
104
- </a-col>
105
- </template>
106
- </a-row>
107
- </template>
108
- </a-card>
109
- </template>
110
- </div>
111
- <div v-else>
112
- <a-skeleton />
113
- </div>
114
- <div v-if="this.showPagination">
115
- <a-divider />
116
- <a-pagination
117
- v-model="pageNum"
118
- style="float: right"
119
- :total="total"
120
- show-less-items
121
- :page-size="pageSize"
122
- :page-size-options="pageSizeOptions"
123
- show-size-changer
124
- @change="pageNumChange"
125
- :showTotal="paginationShowTotal"
126
- @showSizeChange="pageSizeChange">
127
- </a-pagination>
128
- </div>
129
- </div>
130
- </template>
131
-
132
- <script>
133
- import XBadge from '@vue2-client/base-client/components/common/XBadge'
134
-
135
- export default {
136
- name: 'XDataCard',
137
- components: {
138
- XBadge,
139
- },
140
- props: {
141
- // 卡片数据更新方法
142
- cardData: {
143
- type: Function,
144
- default: undefined
145
- },
146
- // 卡片的配置
147
- cardConfig: {
148
- type: Object,
149
- default: undefined
150
- },
151
- showPagination: {
152
- type: Boolean,
153
- default: false
154
- },
155
- // 临时
156
- testData: {
157
- type: Array,
158
- default: undefined
159
- },
160
- tableColumns: {
161
- type: Array,
162
- default: undefined
163
- },
164
- // 服务名称
165
- serviceName: undefined,
166
- // 当前环境
167
- env: {
168
- type: String,
169
- default: 'prod'
170
- },
171
- // pageSize参数
172
- prePageSize: {
173
- type: Number,
174
- default: undefined
175
- },
176
- // 初始是否加载数据
177
- createdQuery: {
178
- type: Boolean,
179
- default: false
180
- }
181
- },
182
- inject: ['getConfigByName'],
183
- data () {
184
- return {
185
- // 配置
186
- config: {},
187
- // 数据
188
- data: {},
189
- // 当前页码
190
- pageNum: 1,
191
- // 控制渲染
192
- render: true,
193
- // 分页大小
194
- pageSize: 10,
195
- // 分页大小选项
196
- pageSizeOptions: ['4', '6', '8', '10'],
197
- // 数据总数
198
- total: 0,
199
- activeCardIndex: null, // 新增:记录当前激活的卡片索引
200
- // 混入插槽组件的数据
201
- mixinData: {},
202
- }
203
- },
204
- created () {
205
- // 根据参数初始化数据值
206
- if (this.prePageSize) {
207
- this.pageSize = this.prePageSize
208
- }
209
- },
210
- mounted () {
211
- // 配置初始化
212
- if (this.cardConfig) {
213
- this.config = this.cardConfig
214
- } else {
215
- this.config = {
216
- id: '未获取到配置',
217
- title: '未获取到配置',
218
- title2: '未获取到配置',
219
- title3: '未获取到配置',
220
- subtitle2: '未获取到配置',
221
- subtitle3: '未获取到配置',
222
- subtitle4: '未获取到配置',
223
- text: '未获取到配置',
224
- ribbon: '未获取到配置',
225
- ribbonColor: '未获取到配置',
226
- content: [
227
- {
228
- label: '未获取到配置',
229
- key: 'one'
230
- },
231
- {
232
- label: '未获取到配置',
233
- key: 'two'
234
- },
235
- {
236
- label: '未获取到配置',
237
- key: 'three'
238
- },
239
- {
240
- label: '未获取到配置',
241
- key: 'four'
242
- },
243
- {
244
- label: '未获取到配置',
245
- key: 'five'
246
- },
247
- {
248
- label: '未获取到配置',
249
- key: 'six',
250
- type: 'progress'
251
- }
252
- ],
253
- footer: [
254
- {
255
- icon: 'edit',
256
- label: '未获取到配置',
257
- emit: 'planEdit'
258
- },
259
- {
260
- icon: 'user',
261
- label: '未获取到配置',
262
- emit: 'user'
263
- }
264
- ]
265
- }
266
- console.warn(this.config)
267
- }
268
-
269
- // 数据初始化
270
- if (this.cardData) {
271
- // if (this.createdQuery) {
272
- // this.loadData()
273
- // }
274
- } else {
275
- this.data = {
276
- one: '未获取到配置',
277
- two: '未获取到配置',
278
- three: '未获取到配置',
279
- four: '未获取到配置',
280
- five: '未获取到配置',
281
- six: 70,
282
- }
283
- }
284
- // 测试数据初始化
285
- if (this.testData) {
286
- this.data = this.testData
287
- }
288
- },
289
- methods: {
290
- // 根据比例计算出颜色
291
- determineRatioColor (ratio, isNum = false) {
292
- let result
293
- // 如果是数字,并且比例大于79,则将数字显示为黑色
294
- if (isNum && ratio > 79) {
295
- return 'rgb(0,0,0)'
296
- }
297
- if (ratio >= 90) {
298
- result = 'rgb( 1,245, 38 )'
299
- } else if (ratio >= 75) {
300
- result = 'rgb( 139,245, 0)'
301
- } else if (ratio >= 40) {
302
- result = 'rgb(245,163, 0)'
303
- } else if (ratio >= 20) {
304
- result = 'rgb(244, 96, 0)'
305
- } else {
306
- result = 'rgb(255, 0, 0)'
307
- }
308
- return result
309
- },
310
- async cardClick (card, itemIndex) {
311
- try {
312
- // 等待 beforeSwitch 完全执行完成
313
- const result = await this.beforeSwitch(card, 'beforeSwitch', itemIndex)
314
- // 如果返回 undefined 说明没有监听器,或者返回 true 说明检查通过
315
- if (result === undefined || result === true) {
316
- await this.clickFooter(card, 'cardclick', itemIndex)
317
- }
318
- } catch (error) {
319
- }
320
- },
321
- // 点击按钮
322
- async clickFooter (data, eventName, index) {
323
- if (eventName === 'cardclick') {
324
- // 清除所有卡片的点击状态
325
- if (this.data && Array.isArray(this.data)) {
326
- this.data.forEach(item => {
327
- if (item.isClicked) {
328
- this.$set(item, 'isClicked', false)
329
- }
330
- })
331
- }
332
- // 设置当前卡片的点击状态
333
- this.$set(data, 'isClicked', true)
334
- }
335
- this.$emit('cardEmit', data, eventName)
336
- },
337
- async beforeSwitch (data, eventName, index) {
338
- return new Promise((resolve) => {
339
- // 检查是否有其他卡片已经被点击
340
- const hasClickedCard = this.data.some(item => item.isClicked)
341
- // 如果没有任何卡片被点击过,直接通过
342
- if (!hasClickedCard) {
343
- resolve(true)
344
- return
345
- }
346
- // 检查是否有监听器
347
- const hasListeners = this._events?.cardEmit?.length > 0
348
-
349
- // 如果没有监听器,返回 undefined 表示继续执行
350
- if (!hasListeners) {
351
- resolve(undefined)
352
- return
353
- }
354
- // 如果有监听器,执行事件检查
355
- try {
356
- this.$emit('cardEmit', data, eventName)
357
- resolve(true)
358
- } catch (error) {
359
- resolve(false)
360
- }
361
- })
362
- },
363
- // 获取数据
364
- loadData () {
365
- this.render = false
366
- const parameter = Object.assign({
367
- querySummary: false, // 分页查询的情况不重新获取汇总数据
368
- pageNo: this.pageNum,
369
- pageSize: this.pageSize
370
- }
371
- )
372
- this.cardData(parameter).then(res => {
373
- this.data = res.data
374
- this.total = res.totalCount
375
- this.render = true
376
- })
377
- },
378
- // 页码改变
379
- pageNumChange (page, pageSize) {
380
- this.pageNum = page
381
- this.pageSize = pageSize
382
- this.loadData()
383
- },
384
- // 分页大小改变
385
- pageSizeChange (current, pageSize) {
386
- this.pageSize = pageSize
387
- this.loadData()
388
- },
389
- // 刷新
390
- refresh () {
391
- this.loadData()
392
- },
393
- // 分页前展示当前项和总数
394
- paginationShowTotal () {
395
- return `${(this.pageNum - 1) * this.pageSize + 1 } - ${ this.pageNum * this.pageSize } | 共 ${ this.total } 项`
396
- },
397
- getRibbonColor (color) {
398
- switch (color) {
399
- case 'red':
400
- return '#ff4d4f'
401
- case 'blue':
402
- return '#1890ff'
403
- case 'yellow':
404
- return '#fadb14'
405
- default:
406
- return '#ff4d4f' // 默认红色
407
- }
408
- }
409
- }
410
- }
411
- </script>
412
-
413
- <style lang="less" scoped>
414
- .hide-page-numbers /deep/ .ant-pagination-item,
415
- .hide-page-numbers /deep/ .ant-pagination-jump-next {
416
- display: none !important; /* 隐藏数字页码和多页跳转 */
417
- }
418
- .hide-page-numbers /deep/ .ant-pagination-prev,
419
- .hide-page-numbers /deep/ .ant-pagination-next {
420
- display: inline-block !important; /* 保留左右跳转按钮 */
421
- }
422
-
423
- .XCard {
424
- display: flex;
425
- flex-wrap: wrap;
426
- justify-content: flex-start;
427
- overflow-y: auto;
428
- overflow-x: hidden;
429
- max-height: 85vh;
430
- .data-card {
431
- width: 100%;
432
- max-width: 300px;
433
- border: 2px solid rgb(244,244,244);
434
- border-radius: 5px;
435
- margin: 2px;
436
- overflow: hidden;
437
-
438
- ::v-deep .ant-card-body {
439
- padding: 15px !important; // 使用 !important 确保样式覆盖
440
- }
441
-
442
- .header {
443
- width: 100%;
444
- background-color: rgb(244,244,244);
445
- padding: 5px 15px;
446
-
447
- span {
448
- font-weight: bold;
449
- font-size: 1.1em;
450
- }
451
- }
452
-
453
- .body {
454
- .body-text{
455
- width: 500px;
456
- font-weight: bold;
457
- font-size: 1.1em;
458
- .text-ellipsis{
459
- display: inline-block;
460
- max-width: 260px; /* 控制文本的最大宽度 */
461
- white-space: nowrap;
462
- overflow: hidden;
463
- text-overflow: ellipsis;
464
- }
465
- }
466
-
467
- .body-item {
468
- padding: 3px 5px;
469
- }
470
-
471
- .body-split {
472
- margin: 1px 0;
473
- }
474
-
475
- .body-item-label {
476
- color: rgba(117, 117, 117, 0.8);
477
- font-size: 0.95em;
478
- }
479
-
480
- .body-item-value {
481
- color: black;
482
- }
483
-
484
- .progress {
485
- display: inline-block;
486
- width: 60%;
487
- height: 60%;
488
- float: right;
489
- padding-right: 1.5%;
490
- margin-top: 0.5%;
491
-
492
- .progress-bar {
493
- width: 100%;
494
- height: 90%;
495
- display: inline-block;
496
- border-radius: 10%;
497
- background-color: rgba(212,217,218, 0.6);
498
-
499
- .progress-done {
500
- float: left;
501
- display: inline-block;
502
- height: 100%;
503
- border-radius: 10%;
504
- }
505
- }
506
- }
507
- .progress-num {
508
- position: relative;
509
- top: -83%;
510
- left: -3%;
511
- text-align: end;
512
- font-size: 0.9em;
513
- color: black;
514
- }
515
- }
516
-
517
- &.card-clicked {
518
- :deep(.ant-card-head) {
519
- background-color: #e6f7ff;
520
- transition: background-color 0.3s ease;
521
- }
522
- }
523
- }
524
-
525
- .custom-title {
526
- display: flex;
527
- align-items: center;
528
- gap: 12px;
529
-
530
- &:hover {
531
- cursor: pointer;
532
- }
533
-
534
- .title-id {
535
- flex-shrink: 0;
536
- width: 65px;
537
- color: #1890ff;
538
- font-size: 16px;
539
- font-weight: bold;
540
- padding: 4px 8px;
541
- border: 1px solid #1890ff;
542
- border-radius: 4px;
543
- line-height: 1.4;
544
- text-align: center;
545
- white-space: nowrap;
546
- overflow: hidden;
547
- text-overflow: ellipsis;
548
- }
549
-
550
- .title-basic {
551
- display: flex;
552
- flex-direction: column;
553
- flex-grow: 1;
554
-
555
- .subtitle2, .subtitle3 {
556
- display: inline-block;
557
- max-width: 50px; /* 固定宽度 */
558
- white-space: nowrap;
559
- overflow: hidden;
560
- text-overflow: ellipsis;
561
- }
562
-
563
- .title-main {
564
- display: flex;
565
- align-items: center;
566
- gap: 8px;
567
- .title-info {
568
- margin-left: 6px;
569
- color: #808080;
570
- }
571
- .title-title3 {
572
- color: #808080;
573
- }
574
- }
575
-
576
- .additional-info {
577
- display: flex;
578
- gap: 8px;
579
- font-size: 13px;
580
- color: #808080;
581
- .subtitle4 {
582
- color: rgba(0, 0, 255, 0.8);
583
- }
584
- }
585
- }
586
- }
587
-
588
- .ribbon {
589
- position: absolute;
590
- top: 16px;
591
- right: -6px;
592
- background-color: #ff4d4f;
593
- color: white;
594
- padding: 5px 25px;
595
- font-size: 12px;
596
- transform: rotate(45deg) translateX(30%);
597
- transform-origin: top right;
598
- z-index: 1;
599
- }
600
-
601
- .custom-actions {
602
- .footer-icon {
603
- margin-right: 5px;
604
- }
605
-
606
- .footer-item-split {
607
- color: rgba(220, 220, 220, 0.59);
608
- }
609
-
610
- .footer-item {
611
- color: rgba(117, 117, 117, 0.8);
612
- font-size: 1em;
613
- }
614
-
615
- .footer-item:hover {
616
- color: rgb( 24,144,255 );
617
- cursor: pointer;
618
- }
619
- }
620
- }
621
-
622
- .ellipsis {
623
- display: inline-block;
624
- max-width: 60px;
625
- white-space: nowrap;
626
- overflow: hidden;
627
- text-overflow: ellipsis;
628
- }
629
- </style>
1
+ <template>
2
+ <div>
3
+ <div v-if="render" class="XCard">
4
+ <template v-for="(card, itemIndex) in data">
5
+ <a-card
6
+ :key="'card' + itemIndex"
7
+ class="data-card"
8
+ :class="{ 'card-clicked': card.isClicked }"
9
+ >
10
+ <div
11
+ v-if="config && card[config.ribbon]"
12
+ class="ribbon"
13
+ :style="{ backgroundColor: getRibbonColor(card[config.ribbonColor]) }">
14
+ {{ card[config.ribbon] }}
15
+ </div>
16
+ <!-- 自定义标题 -->
17
+ <template #title>
18
+ <div class="custom-title" @click="cardClick(card, 'cardclick', itemIndex)">
19
+ <a-tooltip placement="top">
20
+ <template #title>{{ card[config.id] }}</template>
21
+ <div class="title-id" v-if="card[config.id]">{{ card[config.id] }}</div>
22
+ </a-tooltip>
23
+ <div class="title-basic">
24
+ <div class="title-main">
25
+ <span class="title-name">{{ card[config.title] }}</span>
26
+ <span class="title-info">{{ card[config.title2] }}</span>
27
+ <span class="title-title3">{{ card[config.title3] }}</span>
28
+ </div>
29
+ <div class="additional-info" v-if="card[config.subtitle2] || card[config.subtitle3] || card[config.subtitle4]">
30
+ <a-tooltip placement="top" v-if="card[config.subtitle2]">
31
+ <template #title>{{ card[config.subtitle2] }}</template>
32
+ <span class="subtitle2">{{ card[config.subtitle2] }}</span>
33
+ </a-tooltip>
34
+ <a-tooltip placement="top" v-if="card[config.subtitle3]">
35
+ <template #title>{{ card[config.subtitle3] }}</template>
36
+ <span class="subtitle3">{{ card[config.subtitle3] }}</span>
37
+ </a-tooltip>
38
+ <span class="subtitle4" v-if="card[config.subtitle4]">{{ card[config.subtitle4] }}</span>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </template>
43
+ <!-- 主体 -->
44
+ <div class="body" v-if="card[config.text] || (config.content && config.content.length > 0)">
45
+ <div class="body-text" v-if="card[config.text]">
46
+ <a-tooltip :title="card[config.text]">
47
+ <span class="text-ellipsis">{{ card[config.text] }}</span>
48
+ </a-tooltip>
49
+ </div>
50
+ <template v-for="(item, bodyIndex) in config.content" v-if="bodyIndex < 6">
51
+ <div :key="'body' + bodyIndex" class="body-item">
52
+ <span class="body-item-label">{{ item.label }}:</span>
53
+ <template v-if="item.type === 'progress'">
54
+ <div class="progress">
55
+ <div class="progress-bar">
56
+ <div class="progress-done" :style="'width:' + card[item.key] * 100 + '%;backgroundColor: ' + determineRatioColor(card[item.key] * 100)"></div>
57
+ </div>
58
+ </div>
59
+ <div class="progress-num">{{ card[item.key] * 100 }}%</div>
60
+ </template>
61
+ <template v-else-if="item.type === 'custom' && tableColumns">
62
+ <!-- 根据 tableColumns 显示自定义内容 -->
63
+ <span v-for="column in tableColumns" v-if="column.dataIndex === item.key" :key="column.dataIndex">
64
+ <template v-if="column.slotType === 'badge'">
65
+ <x-badge
66
+ :service-name="serviceName"
67
+ :env="env"
68
+ :dataCard="true"
69
+ :badge-key="column.slotKeyMap"
70
+ :value="card[item.key]" />
71
+ </template>
72
+ <template v-else>
73
+ <slot :name="column.slots.customRender">{{ card[item.key] }}</slot>
74
+ </template>
75
+ </span>
76
+ </template>
77
+ <template v-else>
78
+ <span class="body-item-value">{{ card[item.key] }}</span>
79
+ </template>
80
+ </div>
81
+ <a-divider
82
+ v-if="bodyIndex !== config.content.length - 1"
83
+ dashed
84
+ :key="'body' + bodyIndex + 'after'"
85
+ class="body-split" />
86
+ </template>
87
+ </div>
88
+ <!-- 下方按钮 -->
89
+ <template #actions>
90
+ <a-row align="middle" class="custom-actions" v-if="config && config.footer && config.footer.length > 0">
91
+ <template v-for="(item, footerIndex) in config.footer">
92
+ <a-col :key="'footer_' + footerIndex" class="footer-item" :span="11" @click="clickFooter(card, item.emit, itemIndex)">
93
+ <span>
94
+ <a-icon :type="item.icon" class="footer-icon" />
95
+ <span>{{ item.label }}</span>
96
+ </span>
97
+ </a-col>
98
+ <a-col
99
+ v-if="footerIndex !== config.footer.length - 1"
100
+ :span="1"
101
+ :key="'footer_' + footerIndex + 'after'"
102
+ class="footer-item-split">
103
+ |
104
+ </a-col>
105
+ </template>
106
+ </a-row>
107
+ </template>
108
+ </a-card>
109
+ </template>
110
+ </div>
111
+ <div v-else>
112
+ <a-skeleton />
113
+ </div>
114
+ <div v-if="this.showPagination">
115
+ <a-divider />
116
+ <a-pagination
117
+ v-model="pageNum"
118
+ style="float: right"
119
+ :total="total"
120
+ show-less-items
121
+ :page-size="pageSize"
122
+ :page-size-options="pageSizeOptions"
123
+ show-size-changer
124
+ @change="pageNumChange"
125
+ :showTotal="paginationShowTotal"
126
+ @showSizeChange="pageSizeChange">
127
+ </a-pagination>
128
+ </div>
129
+ </div>
130
+ </template>
131
+
132
+ <script>
133
+ import XBadge from '@vue2-client/base-client/components/common/XBadge'
134
+
135
+ export default {
136
+ name: 'XDataCard',
137
+ components: {
138
+ XBadge,
139
+ },
140
+ props: {
141
+ // 卡片数据更新方法
142
+ cardData: {
143
+ type: Function,
144
+ default: undefined
145
+ },
146
+ // 卡片的配置
147
+ cardConfig: {
148
+ type: Object,
149
+ default: undefined
150
+ },
151
+ showPagination: {
152
+ type: Boolean,
153
+ default: false
154
+ },
155
+ // 临时
156
+ testData: {
157
+ type: Array,
158
+ default: undefined
159
+ },
160
+ tableColumns: {
161
+ type: Array,
162
+ default: undefined
163
+ },
164
+ // 服务名称
165
+ serviceName: undefined,
166
+ // 当前环境
167
+ env: {
168
+ type: String,
169
+ default: 'prod'
170
+ },
171
+ // pageSize参数
172
+ prePageSize: {
173
+ type: Number,
174
+ default: undefined
175
+ },
176
+ // 初始是否加载数据
177
+ createdQuery: {
178
+ type: Boolean,
179
+ default: false
180
+ }
181
+ },
182
+ inject: ['getConfigByName'],
183
+ data () {
184
+ return {
185
+ // 配置
186
+ config: {},
187
+ // 数据
188
+ data: {},
189
+ // 当前页码
190
+ pageNum: 1,
191
+ // 控制渲染
192
+ render: true,
193
+ // 分页大小
194
+ pageSize: 10,
195
+ // 分页大小选项
196
+ pageSizeOptions: ['4', '6', '8', '10'],
197
+ // 数据总数
198
+ total: 0,
199
+ activeCardIndex: null, // 新增:记录当前激活的卡片索引
200
+ // 混入插槽组件的数据
201
+ mixinData: {},
202
+ }
203
+ },
204
+ created () {
205
+ // 根据参数初始化数据值
206
+ if (this.prePageSize) {
207
+ this.pageSize = this.prePageSize
208
+ }
209
+ },
210
+ mounted () {
211
+ // 配置初始化
212
+ if (this.cardConfig) {
213
+ this.config = this.cardConfig
214
+ } else {
215
+ this.config = {
216
+ id: '未获取到配置',
217
+ title: '未获取到配置',
218
+ title2: '未获取到配置',
219
+ title3: '未获取到配置',
220
+ subtitle2: '未获取到配置',
221
+ subtitle3: '未获取到配置',
222
+ subtitle4: '未获取到配置',
223
+ text: '未获取到配置',
224
+ ribbon: '未获取到配置',
225
+ ribbonColor: '未获取到配置',
226
+ content: [
227
+ {
228
+ label: '未获取到配置',
229
+ key: 'one'
230
+ },
231
+ {
232
+ label: '未获取到配置',
233
+ key: 'two'
234
+ },
235
+ {
236
+ label: '未获取到配置',
237
+ key: 'three'
238
+ },
239
+ {
240
+ label: '未获取到配置',
241
+ key: 'four'
242
+ },
243
+ {
244
+ label: '未获取到配置',
245
+ key: 'five'
246
+ },
247
+ {
248
+ label: '未获取到配置',
249
+ key: 'six',
250
+ type: 'progress'
251
+ }
252
+ ],
253
+ footer: [
254
+ {
255
+ icon: 'edit',
256
+ label: '未获取到配置',
257
+ emit: 'planEdit'
258
+ },
259
+ {
260
+ icon: 'user',
261
+ label: '未获取到配置',
262
+ emit: 'user'
263
+ }
264
+ ]
265
+ }
266
+ console.warn(this.config)
267
+ }
268
+
269
+ // 数据初始化
270
+ if (this.cardData) {
271
+ // if (this.createdQuery) {
272
+ // this.loadData()
273
+ // }
274
+ } else {
275
+ this.data = {
276
+ one: '未获取到配置',
277
+ two: '未获取到配置',
278
+ three: '未获取到配置',
279
+ four: '未获取到配置',
280
+ five: '未获取到配置',
281
+ six: 70,
282
+ }
283
+ }
284
+ // 测试数据初始化
285
+ if (this.testData) {
286
+ this.data = this.testData
287
+ }
288
+ },
289
+ methods: {
290
+ // 根据比例计算出颜色
291
+ determineRatioColor (ratio, isNum = false) {
292
+ let result
293
+ // 如果是数字,并且比例大于79,则将数字显示为黑色
294
+ if (isNum && ratio > 79) {
295
+ return 'rgb(0,0,0)'
296
+ }
297
+ if (ratio >= 90) {
298
+ result = 'rgb( 1,245, 38 )'
299
+ } else if (ratio >= 75) {
300
+ result = 'rgb( 139,245, 0)'
301
+ } else if (ratio >= 40) {
302
+ result = 'rgb(245,163, 0)'
303
+ } else if (ratio >= 20) {
304
+ result = 'rgb(244, 96, 0)'
305
+ } else {
306
+ result = 'rgb(255, 0, 0)'
307
+ }
308
+ return result
309
+ },
310
+ async cardClick (card, itemIndex) {
311
+ try {
312
+ // 等待 beforeSwitch 完全执行完成
313
+ const result = await this.beforeSwitch(card, 'beforeSwitch', itemIndex)
314
+ // 如果返回 undefined 说明没有监听器,或者返回 true 说明检查通过
315
+ if (result === undefined || result === true) {
316
+ await this.clickFooter(card, 'cardclick', itemIndex)
317
+ }
318
+ } catch (error) {
319
+ }
320
+ },
321
+ // 点击按钮
322
+ async clickFooter (data, eventName, index) {
323
+ if (eventName === 'cardclick') {
324
+ // 清除所有卡片的点击状态
325
+ if (this.data && Array.isArray(this.data)) {
326
+ this.data.forEach(item => {
327
+ if (item.isClicked) {
328
+ this.$set(item, 'isClicked', false)
329
+ }
330
+ })
331
+ }
332
+ // 设置当前卡片的点击状态
333
+ this.$set(data, 'isClicked', true)
334
+ }
335
+ this.$emit('cardEmit', data, eventName)
336
+ },
337
+ async beforeSwitch (data, eventName, index) {
338
+ return new Promise((resolve) => {
339
+ // 检查是否有其他卡片已经被点击
340
+ const hasClickedCard = this.data.some(item => item.isClicked)
341
+ // 如果没有任何卡片被点击过,直接通过
342
+ if (!hasClickedCard) {
343
+ resolve(true)
344
+ return
345
+ }
346
+ // 检查是否有监听器
347
+ const hasListeners = this._events?.cardEmit?.length > 0
348
+
349
+ // 如果没有监听器,返回 undefined 表示继续执行
350
+ if (!hasListeners) {
351
+ resolve(undefined)
352
+ return
353
+ }
354
+ // 如果有监听器,执行事件检查
355
+ try {
356
+ this.$emit('cardEmit', data, eventName)
357
+ resolve(true)
358
+ } catch (error) {
359
+ resolve(false)
360
+ }
361
+ })
362
+ },
363
+ // 获取数据
364
+ loadData () {
365
+ this.render = false
366
+ const parameter = Object.assign({
367
+ querySummary: false, // 分页查询的情况不重新获取汇总数据
368
+ pageNo: this.pageNum,
369
+ pageSize: this.pageSize
370
+ }
371
+ )
372
+ this.cardData(parameter).then(res => {
373
+ this.data = res.data
374
+ this.total = res.totalCount
375
+ this.render = true
376
+ })
377
+ },
378
+ // 页码改变
379
+ pageNumChange (page, pageSize) {
380
+ this.pageNum = page
381
+ this.pageSize = pageSize
382
+ this.loadData()
383
+ },
384
+ // 分页大小改变
385
+ pageSizeChange (current, pageSize) {
386
+ this.pageSize = pageSize
387
+ this.loadData()
388
+ },
389
+ // 刷新
390
+ refresh () {
391
+ this.loadData()
392
+ },
393
+ // 分页前展示当前项和总数
394
+ paginationShowTotal () {
395
+ return `${(this.pageNum - 1) * this.pageSize + 1 } - ${ this.pageNum * this.pageSize } | 共 ${ this.total } 项`
396
+ },
397
+ getRibbonColor (color) {
398
+ switch (color) {
399
+ case 'red':
400
+ return '#ff4d4f'
401
+ case 'blue':
402
+ return '#1890ff'
403
+ case 'yellow':
404
+ return '#fadb14'
405
+ default:
406
+ return '#ff4d4f' // 默认红色
407
+ }
408
+ }
409
+ }
410
+ }
411
+ </script>
412
+
413
+ <style lang="less" scoped>
414
+ .hide-page-numbers /deep/ .ant-pagination-item,
415
+ .hide-page-numbers /deep/ .ant-pagination-jump-next {
416
+ display: none !important; /* 隐藏数字页码和多页跳转 */
417
+ }
418
+ .hide-page-numbers /deep/ .ant-pagination-prev,
419
+ .hide-page-numbers /deep/ .ant-pagination-next {
420
+ display: inline-block !important; /* 保留左右跳转按钮 */
421
+ }
422
+
423
+ .XCard {
424
+ display: flex;
425
+ flex-wrap: wrap;
426
+ justify-content: flex-start;
427
+ overflow-y: auto;
428
+ overflow-x: hidden;
429
+ max-height: 85vh;
430
+ .data-card {
431
+ width: 100%;
432
+ max-width: 300px;
433
+ border: 2px solid rgb(244,244,244);
434
+ border-radius: 5px;
435
+ margin: 2px;
436
+ overflow: hidden;
437
+
438
+ ::v-deep .ant-card-body {
439
+ padding: 15px !important; // 使用 !important 确保样式覆盖
440
+ }
441
+
442
+ .header {
443
+ width: 100%;
444
+ background-color: rgb(244,244,244);
445
+ padding: 5px 15px;
446
+
447
+ span {
448
+ font-weight: bold;
449
+ font-size: 1.1em;
450
+ }
451
+ }
452
+
453
+ .body {
454
+ .body-text{
455
+ width: 500px;
456
+ font-weight: bold;
457
+ font-size: 1.1em;
458
+ .text-ellipsis{
459
+ display: inline-block;
460
+ max-width: 260px; /* 控制文本的最大宽度 */
461
+ white-space: nowrap;
462
+ overflow: hidden;
463
+ text-overflow: ellipsis;
464
+ }
465
+ }
466
+
467
+ .body-item {
468
+ padding: 3px 5px;
469
+ }
470
+
471
+ .body-split {
472
+ margin: 1px 0;
473
+ }
474
+
475
+ .body-item-label {
476
+ color: rgba(117, 117, 117, 0.8);
477
+ font-size: 0.95em;
478
+ }
479
+
480
+ .body-item-value {
481
+ color: black;
482
+ }
483
+
484
+ .progress {
485
+ display: inline-block;
486
+ width: 60%;
487
+ height: 60%;
488
+ float: right;
489
+ padding-right: 1.5%;
490
+ margin-top: 0.5%;
491
+
492
+ .progress-bar {
493
+ width: 100%;
494
+ height: 90%;
495
+ display: inline-block;
496
+ border-radius: 10%;
497
+ background-color: rgba(212,217,218, 0.6);
498
+
499
+ .progress-done {
500
+ float: left;
501
+ display: inline-block;
502
+ height: 100%;
503
+ border-radius: 10%;
504
+ }
505
+ }
506
+ }
507
+ .progress-num {
508
+ position: relative;
509
+ top: -83%;
510
+ left: -3%;
511
+ text-align: end;
512
+ font-size: 0.9em;
513
+ color: black;
514
+ }
515
+ }
516
+
517
+ &.card-clicked {
518
+ :deep(.ant-card-head) {
519
+ background-color: #e6f7ff;
520
+ transition: background-color 0.3s ease;
521
+ }
522
+ }
523
+ }
524
+
525
+ .custom-title {
526
+ display: flex;
527
+ align-items: center;
528
+ gap: 12px;
529
+
530
+ &:hover {
531
+ cursor: pointer;
532
+ }
533
+
534
+ .title-id {
535
+ flex-shrink: 0;
536
+ width: 65px;
537
+ color: #1890ff;
538
+ font-size: 16px;
539
+ font-weight: bold;
540
+ padding: 4px 8px;
541
+ border: 1px solid #1890ff;
542
+ border-radius: 4px;
543
+ line-height: 1.4;
544
+ text-align: center;
545
+ white-space: nowrap;
546
+ overflow: hidden;
547
+ text-overflow: ellipsis;
548
+ }
549
+
550
+ .title-basic {
551
+ display: flex;
552
+ flex-direction: column;
553
+ flex-grow: 1;
554
+
555
+ .subtitle2, .subtitle3 {
556
+ display: inline-block;
557
+ max-width: 50px; /* 固定宽度 */
558
+ white-space: nowrap;
559
+ overflow: hidden;
560
+ text-overflow: ellipsis;
561
+ }
562
+
563
+ .title-main {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 8px;
567
+ .title-info {
568
+ margin-left: 6px;
569
+ color: #808080;
570
+ }
571
+ .title-title3 {
572
+ color: #808080;
573
+ }
574
+ }
575
+
576
+ .additional-info {
577
+ display: flex;
578
+ gap: 8px;
579
+ font-size: 13px;
580
+ color: #808080;
581
+ .subtitle4 {
582
+ color: rgba(0, 0, 255, 0.8);
583
+ }
584
+ }
585
+ }
586
+ }
587
+
588
+ .ribbon {
589
+ position: absolute;
590
+ top: 16px;
591
+ right: -6px;
592
+ background-color: #ff4d4f;
593
+ color: white;
594
+ padding: 5px 25px;
595
+ font-size: 12px;
596
+ transform: rotate(45deg) translateX(30%);
597
+ transform-origin: top right;
598
+ z-index: 1;
599
+ }
600
+
601
+ .custom-actions {
602
+ .footer-icon {
603
+ margin-right: 5px;
604
+ }
605
+
606
+ .footer-item-split {
607
+ color: rgba(220, 220, 220, 0.59);
608
+ }
609
+
610
+ .footer-item {
611
+ color: rgba(117, 117, 117, 0.8);
612
+ font-size: 1em;
613
+ }
614
+
615
+ .footer-item:hover {
616
+ color: rgb( 24,144,255 );
617
+ cursor: pointer;
618
+ }
619
+ }
620
+ }
621
+
622
+ .ellipsis {
623
+ display: inline-block;
624
+ max-width: 60px;
625
+ white-space: nowrap;
626
+ overflow: hidden;
627
+ text-overflow: ellipsis;
628
+ }
629
+ </style>