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,576 +1,576 @@
1
- <template>
2
- <div>
3
- <div class="chat-container" v-if="loading">
4
- <!-- 对话展示区域 -->
5
- <div class="chat-content" ref="chatContent">
6
- <div
7
- v-for="(message, index) in messages"
8
- :key="index"
9
- :class="['chat-message', message.type]"
10
- >
11
- <span class="chat-avatar">{{ message.type === 'user' ? '👤' : '🤖' }}</span>
12
- <div class="chat-text-wrapper">
13
- <div
14
- class="chat-text markdown-body"
15
- v-if="message.text"
16
- v-html="renderMarkdown(message.text)"
17
- ></div>
18
- <div class="chat-text" v-else-if="message.state === 'loading'">
19
- <a-spin :spinning="true"/>
20
- </div>
21
- <a-button
22
- v-if="message.sourceInfo"
23
- type="link"
24
- class="source-info-btn"
25
- @click="showSourceInfo(message.sourceInfo)"
26
- >
27
- 查看源信息
28
- </a-button>
29
- </div>
30
- </div>
31
- </div>
32
-
33
- <!-- 输入框和发送按钮 -->
34
- <div class="chat-input-wrapper">
35
- <div class="chat-input">
36
- <a-input
37
- v-model="inputMessage"
38
- placeholder="Type your message..."
39
- @pressEnter="sendMessage"
40
- />
41
- <a-button type="primary" @click="sendMessage">发送</a-button>
42
- </div>
43
- </div>
44
- </div>
45
- <a-spin :spinning="!loading"/>
46
-
47
- <!-- 源信息弹窗 -->
48
- <a-modal
49
- v-model="sourceInfoVisible"
50
- title="源信息"
51
- :footer="null"
52
- width="600px"
53
- >
54
- <div class="source-info-content markdown-body" v-html="renderMarkdown(currentSourceInfo)"></div>
55
- </a-modal>
56
- </div>
57
- </template>
58
-
59
- <script>
60
- import { runLogic } from '@vue2-client/services/api/common'
61
- import { postByServiceName, startEventStreamPOST } from '@vue2-client/services/api/restTools'
62
- import moment from 'moment/moment'
63
- import { marked } from 'marked'
64
-
65
- export default {
66
- inject: {
67
- getSelectedId: {
68
- default: () => () => {
69
- console.warn('getSelectedId is not provided.')
70
- return null
71
- },
72
- },
73
- setGlobalData: {
74
- default: () => () => {
75
- console.warn('setGlobalData is not provided.')
76
- return null
77
- },
78
- },
79
- getGlobalData: {
80
- default: () => () => {
81
- console.warn('getGlobalData is not provided.')
82
- return null
83
- },
84
- },
85
- getSelectedData: {
86
- default: () => () => {
87
- console.warn('getSelectedData is not provided.')
88
- return null
89
- },
90
- },
91
- getMixinData: {
92
- default: () => () => {
93
- console.warn('getMixinData is not provided.')
94
- return {}
95
- },
96
- },
97
- getOutEnv: {
98
- default: () => () => {
99
- console.warn('getOutEnv is not provided.')
100
- return {}
101
- },
102
- },
103
- currUser: {
104
- default: () => () => {
105
- console.warn('currUser is not provided.')
106
- return {}
107
- },
108
- }
109
- },
110
- name: 'XConversation',
111
- props: {
112
- prompt: {
113
- type: String,
114
- default: undefined
115
- }
116
- },
117
- data () {
118
- return {
119
- serviceName: undefined,
120
- // 组件加载状态
121
- loading: false,
122
- // 配置内容
123
- renderConfig: {
124
- // 请求logic 名称
125
- logicName: '',
126
- // 请求api 地址
127
- api: '',
128
- // 请求流式api 地址
129
- streamApi: '',
130
- // 聊天室id 当type为AI 时必传
131
- chatId: '',
132
- // ai 模型 当type为AI 时必传
133
- aiModel: '',
134
- type: ''
135
- },
136
- // 用户输入的内容
137
- inputMessage: '',
138
- additionalInfo: {},
139
- stopConnection: undefined,
140
- messages: [ // 消息列表
141
- { type: 'bot', text: '你好! 今天有什么能帮到您的?' },
142
- ],
143
- sourceInfoVisible: false,
144
- currentSourceInfo: '',
145
- }
146
- },
147
- methods: {
148
- renderMarkdown (text) {
149
- if (!text) return ''
150
-
151
- // 预处理文本,处理特殊字符
152
- const processedText = text
153
-
154
- try {
155
- // 配置 marked 选项
156
- marked.setOptions({
157
- breaks: true, // 支持换行符
158
- gfm: true, // 启用 GitHub 风格的 Markdown
159
- headerIds: false, // 禁用标题 ID
160
- mangle: false, // 禁用标题 ID 混淆
161
- sanitize: false // 允许 HTML 标签
162
- })
163
- const rendered = marked(processedText)
164
- this.scrollToBottom()
165
- return rendered
166
- } catch (error) {
167
- console.error('Markdown 渲染错误:', error)
168
- return processedText
169
- }
170
- },
171
- setAddtionalInfo (params) {
172
- this.additionalInfo = params
173
- },
174
- init (params) {
175
- this.renderConfig = params
176
- this.loading = true
177
- this.serviceName = params.serviceName || process.env.VUE_APP_SERVICE_NAME
178
- },
179
- scrollToBottom () {
180
- this.$nextTick(() => {
181
- const chatContent = this.$refs.chatContent
182
- if (chatContent) {
183
- chatContent.scrollTop = chatContent.scrollHeight
184
- }
185
- })
186
- },
187
- async sendMessage () {
188
- if (this.renderConfig.type === 'AI') {
189
- // 验证 chatId 和 aiModel
190
- if (!this.renderConfig.chatId || !this.renderConfig.aiModel) {
191
- this.$message.error('chatId 和 aiModel 不能为空,请检查调用逻辑')
192
- return
193
- }
194
- }
195
- if (!this.inputMessage.trim()) return
196
-
197
- // 添加用户消息
198
- this.messages.push({ type: 'user', text: this.inputMessage })
199
- this.scrollToBottom()
200
-
201
- // 清空输入框
202
- const userMessage = this.inputMessage
203
- this.inputMessage = ''
204
-
205
- // 通过logic获取消息
206
- if (this.renderConfig.logicName) {
207
- const response = await runLogic(this.renderConfig.logicName, {
208
- question: userMessage,
209
- additionalInfo: this.additionalInfo
210
- }, this.serviceName)
211
-
212
- // 遍历并保存 additionalInfo
213
- console.log(response)
214
- if (response.additionalInfo) {
215
- Object.entries(response.additionalInfo).forEach(([key, value]) => {
216
- // 如果值是字符串类型,尝试转换为数字
217
- if (typeof value === 'string' && !isNaN(value)) {
218
- const numberValue = Number(value)
219
- // 检查转换后的值是否是有限数字
220
- if (isFinite(numberValue)) {
221
- this.additionalInfo[key] = numberValue
222
- } else {
223
- this.additionalInfo[key] = value
224
- }
225
- } else {
226
- this.additionalInfo[key] = value
227
- }
228
- })
229
- }
230
- console.log(this.additionalInfo)
231
- if (typeof response.value === 'string') {
232
- try {
233
- response.value = JSON.parse(response.value)
234
- } catch (e) {
235
- console.error('JSON解析失败:', e)
236
- }
237
- }
238
- console.log(response.value)
239
- this.messages.push({
240
- type: 'bot',
241
- text: response.value,
242
- sourceInfo: response.sourceInfo || ''
243
- })
244
- } else if (this.renderConfig.api) {
245
- // 通过api获取消息
246
- this.messages.push({ type: 'bot', state: 'loading', sourceInfo: '' })
247
- this.messages[this.messages.length - 1].text = await postByServiceName(this.renderConfig.api, {
248
- userMessage,
249
- additionalInfo: this.additionalInfo,
250
- model: this.renderConfig.aiModel,
251
- chatId: this.renderConfig.chatId || moment().format('YYYYMMDDHHmmss'),
252
- prompt: this.prompt
253
- }, this.serviceName)
254
- this.$forceUpdate()
255
- } else if (this.renderConfig.streamApi) {
256
- // 通过流式api 获取消息
257
- this.messages.push({ type: 'bot', state: 'loading', sourceInfo: '' })
258
-
259
- // 如果存在之前的连接,先关闭它
260
- if (this.stopConnection) {
261
- this.stopConnection()
262
- }
263
-
264
- let currentMessage = ''
265
- this.stopConnection = startEventStreamPOST(
266
- this.renderConfig.streamApi,
267
- {
268
- userMessage,
269
- model: this.renderConfig.aiModel,
270
- chatId: this.renderConfig.chatId || moment().format('YYYYMMDDHHmmss'),
271
- prompt: this.prompt,
272
- additionalInfo: this.additionalInfo
273
- },
274
- {},
275
- (data, type) => {
276
- // 处理 additionalInfo 事件
277
- if (type === 'additionalInfo') {
278
- console.log('收到 additionalInfo:', data)
279
- if (data) {
280
- // 更新 additionalInfo
281
- this.additionalInfo = {
282
- ...this.additionalInfo,
283
- ...data
284
- }
285
- // 触发全局数据更新
286
- this.setGlobalData?.(this.additionalInfo)
287
- }
288
- return
289
- }
290
-
291
- if (type === 'sourceInfo') {
292
- console.log('收到 sourceInfo:', data)
293
- if (data) {
294
- // 更新 sourceInfo
295
- this.messages[this.messages.length - 1].sourceInfo = data.replace(/<br\s*\/?>/gi, '\n')
296
- }
297
- return
298
- }
299
- // 处理普通消息
300
- if (this.messages[this.messages.length - 1].state === 'loading') {
301
- this.messages[this.messages.length - 1].state = undefined
302
- }
303
- currentMessage += data
304
- this.messages[this.messages.length - 1].text = currentMessage.replace(/<br\s*\/?>/gi, '\n')
305
- this.renderMarkdown(this.messages[this.messages.length - 1].text)
306
- this.$forceUpdate()
307
- },
308
- (error) => {
309
- console.error('流式请求错误:', error)
310
- this.messages[this.messages.length - 1].state = undefined
311
- this.messages[this.messages.length - 1].text = '抱歉,消息发送失败,请重试。'
312
- this.$forceUpdate()
313
- }
314
- )
315
- }
316
- },
317
- setHistoryMessages (messages) {
318
- console.log(messages)
319
- // 清空现有消息
320
- this.messages = []
321
- // 添加历史消息
322
- messages.forEach(msg => {
323
- this.messages.push({
324
- type: msg.role === 'user' ? 'user' : 'bot',
325
- text: msg.content
326
- })
327
- })
328
- this.scrollToBottom()
329
- },
330
- showSourceInfo (sourceInfo) {
331
- this.currentSourceInfo = typeof sourceInfo === 'string'
332
- ? sourceInfo
333
- : JSON.stringify(sourceInfo, null, 2)
334
- this.sourceInfoVisible = true
335
- },
336
- },
337
- mounted () {
338
- this.setAddtionalInfo(this.getMixinData())
339
- },
340
- beforeDestroy () {
341
- if (this.stopConnection) {
342
- this.stopConnection()
343
- }
344
- },
345
- watch: {
346
- messages: {
347
- handler () {
348
- this.scrollToBottom()
349
- },
350
- deep: true
351
- },
352
- 'messages.$[].text': {
353
- handler () {
354
- this.scrollToBottom()
355
- },
356
- deep: true
357
- }
358
- }
359
- }
360
- </script>
361
-
362
- <style scoped>
363
- .chat-container {
364
- display: flex;
365
- flex-direction: column;
366
- height: 600px; /* 设置最小高度 */
367
- border: 1px solid #d9d9d9;
368
- border-radius: 4px;
369
- overflow: hidden;
370
- position: relative;
371
- }
372
-
373
- .chat-content {
374
- flex: 1;
375
- padding: 16px;
376
- overflow-y: auto;
377
- background: #f5f5f5;
378
- padding-bottom: 60px; /* 为底部输入框留出空间 */
379
- }
380
-
381
- .chat-message {
382
- display: flex;
383
- align-items: flex-start;
384
- margin-bottom: 10px;
385
- }
386
-
387
- .chat-message.user {
388
- justify-content: flex-end;
389
- }
390
-
391
- .chat-message.bot {
392
- justify-content: flex-start;
393
- }
394
-
395
- .chat-avatar {
396
- margin: 0 8px;
397
- }
398
-
399
- .chat-text-wrapper {
400
- display: flex;
401
- flex-direction: column;
402
- max-width: 70%;
403
- }
404
-
405
- .chat-text {
406
- padding: 8px 12px;
407
- border-radius: 4px;
408
- background-color: #fff;
409
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
410
- }
411
-
412
- .chat-message.user .chat-text {
413
- background-color: #e6f7ff;
414
- }
415
-
416
- .chat-input-wrapper {
417
- position: absolute;
418
- bottom: 0;
419
- left: 0;
420
- right: 0;
421
- background: #fff;
422
- border-top: 1px solid #d9d9d9;
423
- padding: 8px;
424
- }
425
-
426
- .chat-input {
427
- display: flex;
428
- gap: 10px;
429
- }
430
-
431
- .chat-input a-input {
432
- flex: 1;
433
- }
434
-
435
- code {
436
- background-color: #f5f5f5;
437
- border-radius: 4px;
438
- padding: 2px 4px;
439
- font-size: 90%;
440
- }
441
-
442
- /* 添加 Markdown 样式 */
443
- .markdown-body {
444
- font-size: 14px;
445
- line-height: 1.6;
446
- }
447
-
448
- .markdown-body h1,
449
- .markdown-body h2,
450
- .markdown-body h3,
451
- .markdown-body h4,
452
- .markdown-body h5,
453
- .markdown-body h6 {
454
- margin-top: 16px;
455
- margin-bottom: 8px;
456
- font-weight: 600;
457
- }
458
-
459
- .markdown-body pre {
460
- background-color: #f6f8fa;
461
- border-radius: 6px;
462
- padding: 16px;
463
- overflow: auto;
464
- }
465
-
466
- .markdown-body code {
467
- background-color: #f6f8fa;
468
- border-radius: 3px;
469
- padding: 0.2em 0.4em;
470
- font-size: 85%;
471
- }
472
-
473
- .markdown-body p {
474
- margin-bottom: 16px;
475
- }
476
-
477
- .markdown-body ul,
478
- .markdown-body ol {
479
- padding-left: 2em;
480
- margin-bottom: 16px;
481
- }
482
-
483
- /* 按钮样式 */
484
- .markdown-body :deep(button) {
485
- display: inline-block;
486
- padding: 4px 15px;
487
- font-size: 14px;
488
- font-weight: 400;
489
- line-height: 1.5715;
490
- text-align: center;
491
- white-space: nowrap;
492
- background: #fff;
493
- border: 1px solid #d9d9d9;
494
- border-radius: 2px;
495
- cursor: pointer;
496
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
497
- user-select: none;
498
- touch-action: manipulation;
499
- margin: 4px 8px 4px 0;
500
- }
501
-
502
- .markdown-body :deep(button:hover) {
503
- color: #40a9ff;
504
- border-color: #40a9ff;
505
- background: #fff;
506
- }
507
-
508
- .markdown-body :deep(button:active) {
509
- color: #096dd9;
510
- border-color: #096dd9;
511
- background: #fff;
512
- }
513
-
514
- /* Markdown 按钮样式 */
515
- .markdown-button {
516
- display: inline-block;
517
- padding: 4px 15px;
518
- font-size: 14px;
519
- font-weight: 400;
520
- line-height: 1.5715;
521
- text-align: center;
522
- white-space: nowrap;
523
- background: #fff;
524
- border: 1px solid #d9d9d9;
525
- border-radius: 2px;
526
- cursor: pointer;
527
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
528
- user-select: none;
529
- touch-action: manipulation;
530
- margin: 4px 8px 4px 0;
531
- }
532
-
533
- .markdown-button:hover {
534
- color: #40a9ff;
535
- border-color: #40a9ff;
536
- background: #fff;
537
- }
538
-
539
- .markdown-button:active {
540
- color: #096dd9;
541
- border-color: #096dd9;
542
- background: #fff;
543
- }
544
-
545
- .source-info-btn {
546
- font-size: 12px;
547
- padding: 0;
548
- margin-top: 4px;
549
- align-self: flex-start;
550
- }
551
-
552
- .source-info-content {
553
- background-color: #f5f5f5;
554
- padding: 16px;
555
- border-radius: 4px;
556
- max-height: 400px;
557
- overflow-y: auto;
558
- white-space: pre-wrap;
559
- word-break: break-all;
560
- }
561
-
562
- .source-info-content :deep(pre) {
563
- background-color: #f6f8fa;
564
- border-radius: 6px;
565
- padding: 16px;
566
- overflow: auto;
567
- margin: 0;
568
- }
569
-
570
- .source-info-content :deep(code) {
571
- background-color: #f6f8fa;
572
- border-radius: 3px;
573
- padding: 0.2em 0.4em;
574
- font-size: 85%;
575
- }
576
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="chat-container" v-if="loading">
4
+ <!-- 对话展示区域 -->
5
+ <div class="chat-content" ref="chatContent">
6
+ <div
7
+ v-for="(message, index) in messages"
8
+ :key="index"
9
+ :class="['chat-message', message.type]"
10
+ >
11
+ <span class="chat-avatar">{{ message.type === 'user' ? '👤' : '🤖' }}</span>
12
+ <div class="chat-text-wrapper">
13
+ <div
14
+ class="chat-text markdown-body"
15
+ v-if="message.text"
16
+ v-html="renderMarkdown(message.text)"
17
+ ></div>
18
+ <div class="chat-text" v-else-if="message.state === 'loading'">
19
+ <a-spin :spinning="true"/>
20
+ </div>
21
+ <a-button
22
+ v-if="message.sourceInfo"
23
+ type="link"
24
+ class="source-info-btn"
25
+ @click="showSourceInfo(message.sourceInfo)"
26
+ >
27
+ 查看源信息
28
+ </a-button>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- 输入框和发送按钮 -->
34
+ <div class="chat-input-wrapper">
35
+ <div class="chat-input">
36
+ <a-input
37
+ v-model="inputMessage"
38
+ placeholder="Type your message..."
39
+ @pressEnter="sendMessage"
40
+ />
41
+ <a-button type="primary" @click="sendMessage">发送</a-button>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <a-spin :spinning="!loading"/>
46
+
47
+ <!-- 源信息弹窗 -->
48
+ <a-modal
49
+ v-model="sourceInfoVisible"
50
+ title="源信息"
51
+ :footer="null"
52
+ width="600px"
53
+ >
54
+ <div class="source-info-content markdown-body" v-html="renderMarkdown(currentSourceInfo)"></div>
55
+ </a-modal>
56
+ </div>
57
+ </template>
58
+
59
+ <script>
60
+ import { runLogic } from '@vue2-client/services/api/common'
61
+ import { postByServiceName, startEventStreamPOST } from '@vue2-client/services/api/restTools'
62
+ import moment from 'moment/moment'
63
+ import { marked } from 'marked'
64
+
65
+ export default {
66
+ inject: {
67
+ getSelectedId: {
68
+ default: () => () => {
69
+ console.warn('getSelectedId is not provided.')
70
+ return null
71
+ },
72
+ },
73
+ setGlobalData: {
74
+ default: () => () => {
75
+ console.warn('setGlobalData is not provided.')
76
+ return null
77
+ },
78
+ },
79
+ getGlobalData: {
80
+ default: () => () => {
81
+ console.warn('getGlobalData is not provided.')
82
+ return null
83
+ },
84
+ },
85
+ getSelectedData: {
86
+ default: () => () => {
87
+ console.warn('getSelectedData is not provided.')
88
+ return null
89
+ },
90
+ },
91
+ getMixinData: {
92
+ default: () => () => {
93
+ console.warn('getMixinData is not provided.')
94
+ return {}
95
+ },
96
+ },
97
+ getOutEnv: {
98
+ default: () => () => {
99
+ console.warn('getOutEnv is not provided.')
100
+ return {}
101
+ },
102
+ },
103
+ currUser: {
104
+ default: () => () => {
105
+ console.warn('currUser is not provided.')
106
+ return {}
107
+ },
108
+ }
109
+ },
110
+ name: 'XConversation',
111
+ props: {
112
+ prompt: {
113
+ type: String,
114
+ default: undefined
115
+ }
116
+ },
117
+ data () {
118
+ return {
119
+ serviceName: undefined,
120
+ // 组件加载状态
121
+ loading: false,
122
+ // 配置内容
123
+ renderConfig: {
124
+ // 请求logic 名称
125
+ logicName: '',
126
+ // 请求api 地址
127
+ api: '',
128
+ // 请求流式api 地址
129
+ streamApi: '',
130
+ // 聊天室id 当type为AI 时必传
131
+ chatId: '',
132
+ // ai 模型 当type为AI 时必传
133
+ aiModel: '',
134
+ type: ''
135
+ },
136
+ // 用户输入的内容
137
+ inputMessage: '',
138
+ additionalInfo: {},
139
+ stopConnection: undefined,
140
+ messages: [ // 消息列表
141
+ { type: 'bot', text: '你好! 今天有什么能帮到您的?' },
142
+ ],
143
+ sourceInfoVisible: false,
144
+ currentSourceInfo: '',
145
+ }
146
+ },
147
+ methods: {
148
+ renderMarkdown (text) {
149
+ if (!text) return ''
150
+
151
+ // 预处理文本,处理特殊字符
152
+ const processedText = text
153
+
154
+ try {
155
+ // 配置 marked 选项
156
+ marked.setOptions({
157
+ breaks: true, // 支持换行符
158
+ gfm: true, // 启用 GitHub 风格的 Markdown
159
+ headerIds: false, // 禁用标题 ID
160
+ mangle: false, // 禁用标题 ID 混淆
161
+ sanitize: false // 允许 HTML 标签
162
+ })
163
+ const rendered = marked(processedText)
164
+ this.scrollToBottom()
165
+ return rendered
166
+ } catch (error) {
167
+ console.error('Markdown 渲染错误:', error)
168
+ return processedText
169
+ }
170
+ },
171
+ setAddtionalInfo (params) {
172
+ this.additionalInfo = params
173
+ },
174
+ init (params) {
175
+ this.renderConfig = params
176
+ this.loading = true
177
+ this.serviceName = params.serviceName || process.env.VUE_APP_SERVICE_NAME
178
+ },
179
+ scrollToBottom () {
180
+ this.$nextTick(() => {
181
+ const chatContent = this.$refs.chatContent
182
+ if (chatContent) {
183
+ chatContent.scrollTop = chatContent.scrollHeight
184
+ }
185
+ })
186
+ },
187
+ async sendMessage () {
188
+ if (this.renderConfig.type === 'AI') {
189
+ // 验证 chatId 和 aiModel
190
+ if (!this.renderConfig.chatId || !this.renderConfig.aiModel) {
191
+ this.$message.error('chatId 和 aiModel 不能为空,请检查调用逻辑')
192
+ return
193
+ }
194
+ }
195
+ if (!this.inputMessage.trim()) return
196
+
197
+ // 添加用户消息
198
+ this.messages.push({ type: 'user', text: this.inputMessage })
199
+ this.scrollToBottom()
200
+
201
+ // 清空输入框
202
+ const userMessage = this.inputMessage
203
+ this.inputMessage = ''
204
+
205
+ // 通过logic获取消息
206
+ if (this.renderConfig.logicName) {
207
+ const response = await runLogic(this.renderConfig.logicName, {
208
+ question: userMessage,
209
+ additionalInfo: this.additionalInfo
210
+ }, this.serviceName)
211
+
212
+ // 遍历并保存 additionalInfo
213
+ console.log(response)
214
+ if (response.additionalInfo) {
215
+ Object.entries(response.additionalInfo).forEach(([key, value]) => {
216
+ // 如果值是字符串类型,尝试转换为数字
217
+ if (typeof value === 'string' && !isNaN(value)) {
218
+ const numberValue = Number(value)
219
+ // 检查转换后的值是否是有限数字
220
+ if (isFinite(numberValue)) {
221
+ this.additionalInfo[key] = numberValue
222
+ } else {
223
+ this.additionalInfo[key] = value
224
+ }
225
+ } else {
226
+ this.additionalInfo[key] = value
227
+ }
228
+ })
229
+ }
230
+ console.log(this.additionalInfo)
231
+ if (typeof response.value === 'string') {
232
+ try {
233
+ response.value = JSON.parse(response.value)
234
+ } catch (e) {
235
+ console.error('JSON解析失败:', e)
236
+ }
237
+ }
238
+ console.log(response.value)
239
+ this.messages.push({
240
+ type: 'bot',
241
+ text: response.value,
242
+ sourceInfo: response.sourceInfo || ''
243
+ })
244
+ } else if (this.renderConfig.api) {
245
+ // 通过api获取消息
246
+ this.messages.push({ type: 'bot', state: 'loading', sourceInfo: '' })
247
+ this.messages[this.messages.length - 1].text = await postByServiceName(this.renderConfig.api, {
248
+ userMessage,
249
+ additionalInfo: this.additionalInfo,
250
+ model: this.renderConfig.aiModel,
251
+ chatId: this.renderConfig.chatId || moment().format('YYYYMMDDHHmmss'),
252
+ prompt: this.prompt
253
+ }, this.serviceName)
254
+ this.$forceUpdate()
255
+ } else if (this.renderConfig.streamApi) {
256
+ // 通过流式api 获取消息
257
+ this.messages.push({ type: 'bot', state: 'loading', sourceInfo: '' })
258
+
259
+ // 如果存在之前的连接,先关闭它
260
+ if (this.stopConnection) {
261
+ this.stopConnection()
262
+ }
263
+
264
+ let currentMessage = ''
265
+ this.stopConnection = startEventStreamPOST(
266
+ this.renderConfig.streamApi,
267
+ {
268
+ userMessage,
269
+ model: this.renderConfig.aiModel,
270
+ chatId: this.renderConfig.chatId || moment().format('YYYYMMDDHHmmss'),
271
+ prompt: this.prompt,
272
+ additionalInfo: this.additionalInfo
273
+ },
274
+ {},
275
+ (data, type) => {
276
+ // 处理 additionalInfo 事件
277
+ if (type === 'additionalInfo') {
278
+ console.log('收到 additionalInfo:', data)
279
+ if (data) {
280
+ // 更新 additionalInfo
281
+ this.additionalInfo = {
282
+ ...this.additionalInfo,
283
+ ...data
284
+ }
285
+ // 触发全局数据更新
286
+ this.setGlobalData?.(this.additionalInfo)
287
+ }
288
+ return
289
+ }
290
+
291
+ if (type === 'sourceInfo') {
292
+ console.log('收到 sourceInfo:', data)
293
+ if (data) {
294
+ // 更新 sourceInfo
295
+ this.messages[this.messages.length - 1].sourceInfo = data.replace(/<br\s*\/?>/gi, '\n')
296
+ }
297
+ return
298
+ }
299
+ // 处理普通消息
300
+ if (this.messages[this.messages.length - 1].state === 'loading') {
301
+ this.messages[this.messages.length - 1].state = undefined
302
+ }
303
+ currentMessage += data
304
+ this.messages[this.messages.length - 1].text = currentMessage.replace(/<br\s*\/?>/gi, '\n')
305
+ this.renderMarkdown(this.messages[this.messages.length - 1].text)
306
+ this.$forceUpdate()
307
+ },
308
+ (error) => {
309
+ console.error('流式请求错误:', error)
310
+ this.messages[this.messages.length - 1].state = undefined
311
+ this.messages[this.messages.length - 1].text = '抱歉,消息发送失败,请重试。'
312
+ this.$forceUpdate()
313
+ }
314
+ )
315
+ }
316
+ },
317
+ setHistoryMessages (messages) {
318
+ console.log(messages)
319
+ // 清空现有消息
320
+ this.messages = []
321
+ // 添加历史消息
322
+ messages.forEach(msg => {
323
+ this.messages.push({
324
+ type: msg.role === 'user' ? 'user' : 'bot',
325
+ text: msg.content
326
+ })
327
+ })
328
+ this.scrollToBottom()
329
+ },
330
+ showSourceInfo (sourceInfo) {
331
+ this.currentSourceInfo = typeof sourceInfo === 'string'
332
+ ? sourceInfo
333
+ : JSON.stringify(sourceInfo, null, 2)
334
+ this.sourceInfoVisible = true
335
+ },
336
+ },
337
+ mounted () {
338
+ this.setAddtionalInfo(this.getMixinData())
339
+ },
340
+ beforeDestroy () {
341
+ if (this.stopConnection) {
342
+ this.stopConnection()
343
+ }
344
+ },
345
+ watch: {
346
+ messages: {
347
+ handler () {
348
+ this.scrollToBottom()
349
+ },
350
+ deep: true
351
+ },
352
+ 'messages.$[].text': {
353
+ handler () {
354
+ this.scrollToBottom()
355
+ },
356
+ deep: true
357
+ }
358
+ }
359
+ }
360
+ </script>
361
+
362
+ <style scoped>
363
+ .chat-container {
364
+ display: flex;
365
+ flex-direction: column;
366
+ height: 600px; /* 设置最小高度 */
367
+ border: 1px solid #d9d9d9;
368
+ border-radius: 4px;
369
+ overflow: hidden;
370
+ position: relative;
371
+ }
372
+
373
+ .chat-content {
374
+ flex: 1;
375
+ padding: 16px;
376
+ overflow-y: auto;
377
+ background: #f5f5f5;
378
+ padding-bottom: 60px; /* 为底部输入框留出空间 */
379
+ }
380
+
381
+ .chat-message {
382
+ display: flex;
383
+ align-items: flex-start;
384
+ margin-bottom: 10px;
385
+ }
386
+
387
+ .chat-message.user {
388
+ justify-content: flex-end;
389
+ }
390
+
391
+ .chat-message.bot {
392
+ justify-content: flex-start;
393
+ }
394
+
395
+ .chat-avatar {
396
+ margin: 0 8px;
397
+ }
398
+
399
+ .chat-text-wrapper {
400
+ display: flex;
401
+ flex-direction: column;
402
+ max-width: 70%;
403
+ }
404
+
405
+ .chat-text {
406
+ padding: 8px 12px;
407
+ border-radius: 4px;
408
+ background-color: #fff;
409
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
410
+ }
411
+
412
+ .chat-message.user .chat-text {
413
+ background-color: #e6f7ff;
414
+ }
415
+
416
+ .chat-input-wrapper {
417
+ position: absolute;
418
+ bottom: 0;
419
+ left: 0;
420
+ right: 0;
421
+ background: #fff;
422
+ border-top: 1px solid #d9d9d9;
423
+ padding: 8px;
424
+ }
425
+
426
+ .chat-input {
427
+ display: flex;
428
+ gap: 10px;
429
+ }
430
+
431
+ .chat-input a-input {
432
+ flex: 1;
433
+ }
434
+
435
+ code {
436
+ background-color: #f5f5f5;
437
+ border-radius: 4px;
438
+ padding: 2px 4px;
439
+ font-size: 90%;
440
+ }
441
+
442
+ /* 添加 Markdown 样式 */
443
+ .markdown-body {
444
+ font-size: 14px;
445
+ line-height: 1.6;
446
+ }
447
+
448
+ .markdown-body h1,
449
+ .markdown-body h2,
450
+ .markdown-body h3,
451
+ .markdown-body h4,
452
+ .markdown-body h5,
453
+ .markdown-body h6 {
454
+ margin-top: 16px;
455
+ margin-bottom: 8px;
456
+ font-weight: 600;
457
+ }
458
+
459
+ .markdown-body pre {
460
+ background-color: #f6f8fa;
461
+ border-radius: 6px;
462
+ padding: 16px;
463
+ overflow: auto;
464
+ }
465
+
466
+ .markdown-body code {
467
+ background-color: #f6f8fa;
468
+ border-radius: 3px;
469
+ padding: 0.2em 0.4em;
470
+ font-size: 85%;
471
+ }
472
+
473
+ .markdown-body p {
474
+ margin-bottom: 16px;
475
+ }
476
+
477
+ .markdown-body ul,
478
+ .markdown-body ol {
479
+ padding-left: 2em;
480
+ margin-bottom: 16px;
481
+ }
482
+
483
+ /* 按钮样式 */
484
+ .markdown-body :deep(button) {
485
+ display: inline-block;
486
+ padding: 4px 15px;
487
+ font-size: 14px;
488
+ font-weight: 400;
489
+ line-height: 1.5715;
490
+ text-align: center;
491
+ white-space: nowrap;
492
+ background: #fff;
493
+ border: 1px solid #d9d9d9;
494
+ border-radius: 2px;
495
+ cursor: pointer;
496
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
497
+ user-select: none;
498
+ touch-action: manipulation;
499
+ margin: 4px 8px 4px 0;
500
+ }
501
+
502
+ .markdown-body :deep(button:hover) {
503
+ color: #40a9ff;
504
+ border-color: #40a9ff;
505
+ background: #fff;
506
+ }
507
+
508
+ .markdown-body :deep(button:active) {
509
+ color: #096dd9;
510
+ border-color: #096dd9;
511
+ background: #fff;
512
+ }
513
+
514
+ /* Markdown 按钮样式 */
515
+ .markdown-button {
516
+ display: inline-block;
517
+ padding: 4px 15px;
518
+ font-size: 14px;
519
+ font-weight: 400;
520
+ line-height: 1.5715;
521
+ text-align: center;
522
+ white-space: nowrap;
523
+ background: #fff;
524
+ border: 1px solid #d9d9d9;
525
+ border-radius: 2px;
526
+ cursor: pointer;
527
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
528
+ user-select: none;
529
+ touch-action: manipulation;
530
+ margin: 4px 8px 4px 0;
531
+ }
532
+
533
+ .markdown-button:hover {
534
+ color: #40a9ff;
535
+ border-color: #40a9ff;
536
+ background: #fff;
537
+ }
538
+
539
+ .markdown-button:active {
540
+ color: #096dd9;
541
+ border-color: #096dd9;
542
+ background: #fff;
543
+ }
544
+
545
+ .source-info-btn {
546
+ font-size: 12px;
547
+ padding: 0;
548
+ margin-top: 4px;
549
+ align-self: flex-start;
550
+ }
551
+
552
+ .source-info-content {
553
+ background-color: #f5f5f5;
554
+ padding: 16px;
555
+ border-radius: 4px;
556
+ max-height: 400px;
557
+ overflow-y: auto;
558
+ white-space: pre-wrap;
559
+ word-break: break-all;
560
+ }
561
+
562
+ .source-info-content :deep(pre) {
563
+ background-color: #f6f8fa;
564
+ border-radius: 6px;
565
+ padding: 16px;
566
+ overflow: auto;
567
+ margin: 0;
568
+ }
569
+
570
+ .source-info-content :deep(code) {
571
+ background-color: #f6f8fa;
572
+ border-radius: 3px;
573
+ padding: 0.2em 0.4em;
574
+ font-size: 85%;
575
+ }
576
+ </style>