vue2-client 1.18.3 → 1.18.5

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 (244) hide show
  1. package/.claude/settings.local.json +20 -20
  2. package/.cursorrules +19 -19
  3. package/.env.apply +19 -19
  4. package/.env.gaslink +19 -19
  5. package/.env.his +19 -19
  6. package/.env.liuli +20 -20
  7. package/.env.scada +19 -19
  8. package/.serena/memories/code_style_conventions.md +217 -217
  9. package/.serena/memories/project_overview.md +54 -54
  10. package/.serena/memories/project_structure.md +329 -329
  11. package/.serena/memories/suggested_commands.md +127 -127
  12. package/.serena/memories/task_completion_checklist.md +183 -183
  13. package/.serena/memories/tech_stack.md +94 -94
  14. package/CHANGELOG.md +830 -830
  15. package/CLAUDE.md +97 -97
  16. package/docs/LowCode/lowcode.md +155 -155
  17. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  18. package/jsconfig.json +19 -19
  19. package/package.json +1 -1
  20. package/public/his/editor/editor.html +51 -51
  21. package/public/his/editor/mock/bind_data.html +779 -779
  22. package/public/his/editor/mock/data_table.html +40 -40
  23. package/public/his/editor/mock/sign.html +75 -75
  24. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  25. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  26. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  27. package/public/his/editor/vender/date97/calendar.js +4 -4
  28. package/public/his/editor/vender/date97/lang/en.js +13 -13
  29. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  30. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  31. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  32. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  33. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  34. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  35. package/public/his/editor/vender/diff.js +1627 -1627
  36. package/public/his/editor/vender/editor.js +1 -1
  37. package/public/his/editor/vender/fabric.js +31187 -31187
  38. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  39. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  40. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  41. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  42. package/public/his/editor/vender/mui/mui.min.css +4 -4
  43. package/public/his/editor/vender/mui/mui.min.js +5 -5
  44. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  45. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  46. package/public/his/editor/vender/qrcode.js +7 -7
  47. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  48. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  49. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  50. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  51. package/public/his/editor/vender/validator.js +5094 -5094
  52. package/public/his/editor/vender/weui/weui.css +5659 -5659
  53. package/public/his/editor/vender/weui/weui.min.css +4 -4
  54. package/public/his/editor/vender/weui/weui.min.js +11 -11
  55. package/src/assets/img/paymentMethod/package.info +1 -1
  56. package/src/assets/svg/badtwo.svg +1 -1
  57. package/src/assets/svg/goodtwo.svg +1 -1
  58. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  59. package/src/base-client/components/AI/demo.vue +31 -31
  60. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  61. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  62. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  63. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  64. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  65. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  66. package/src/base-client/components/common/HIS/demo.vue +61 -61
  67. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  68. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  69. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  70. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  71. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  72. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  73. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  74. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  75. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  76. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  77. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  78. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  79. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  80. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  81. package/src/base-client/components/common/Recording/index.js +3 -3
  82. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  83. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +304 -304
  84. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  85. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  86. package/src/base-client/components/common/XAddReport/index.js +3 -3
  87. package/src/base-client/components/common/XAddReport/index.md +56 -56
  88. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  89. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  90. package/src/base-client/components/common/XButtons/index.js +3 -3
  91. package/src/base-client/components/common/XButtons/index.md +61 -61
  92. package/src/base-client/components/common/XCalendar/XCalendar.vue +4 -4
  93. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  94. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  95. package/src/base-client/components/common/XDataCard/index.js +3 -3
  96. package/src/base-client/components/common/XDataCard/index.md +1 -1
  97. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  98. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  99. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  100. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  101. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  102. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  103. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  104. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  105. package/src/base-client/components/common/XFormTable/XFormTable.vue +1258 -1257
  106. package/src/base-client/components/common/XFormTable/index.md +92 -92
  107. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  108. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  109. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  110. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  111. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  112. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  113. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  114. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  115. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  116. package/src/base-client/components/common/XPrint/index.vue +97 -97
  117. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  118. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  119. package/src/base-client/components/common/XReport/index.js +3 -3
  120. package/src/base-client/components/common/XReport/print.js +186 -186
  121. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  122. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  123. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  124. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  125. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  126. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  127. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  128. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  129. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  130. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  131. package/src/base-client/components/common/XTab/index.js +3 -3
  132. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  133. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  134. package/src/base-client/components/common/XTable/XTableWrapper.vue +1 -1
  135. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  136. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  137. package/src/base-client/components/common/XTree/index.js +3 -3
  138. package/src/base-client/components/common/XTree/index.md +36 -36
  139. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  140. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  141. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  142. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  143. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  144. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  145. package/src/base-client/components/index.js +51 -51
  146. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  147. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  148. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  149. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  150. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  151. package/src/base-client/plugins/Recording.js +258 -258
  152. package/src/base-client/plugins/index.js +23 -23
  153. package/src/components/CodeMirror/inedx.vue +118 -118
  154. package/src/components/CodeMirror/setting.js +40 -40
  155. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  156. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  157. package/src/components/checkbox/index.js +9 -9
  158. package/src/components/exception/ExceptionPage.vue +70 -70
  159. package/src/components/g2Charts/constants.js +202 -202
  160. package/src/components/g2Charts/demo.vue +808 -808
  161. package/src/components/g2Charts/designer.vue +228 -228
  162. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  163. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  164. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  165. package/src/components/g2Charts/index.vue +397 -397
  166. package/src/components/setting/Setting.vue +234 -234
  167. package/src/config/CreateQueryConfig.js +325 -325
  168. package/src/config/default/antd.config.js +89 -89
  169. package/src/config/default/setting.config.js +55 -55
  170. package/src/font-style/font.css +60 -60
  171. package/src/layouts/PageLayout.vue +151 -151
  172. package/src/layouts/SinglePageView.vue +136 -136
  173. package/src/layouts/header/AdminHeader.vue +132 -132
  174. package/src/layouts/header/InstitutionDetail.vue +181 -181
  175. package/src/layouts/tabs/TabsHead.vue +189 -189
  176. package/src/pages/DefaultExample/index.vue +77 -77
  177. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  178. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  179. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  180. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  181. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  182. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  183. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  184. package/src/pages/DynamicStatistics/index.vue +282 -282
  185. package/src/pages/Example/childIndex.vue +15 -15
  186. package/src/pages/Example/index.vue +30 -30
  187. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  188. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  189. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  190. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  191. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  192. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  193. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  194. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  195. package/src/pages/Recording/index.vue +77 -77
  196. package/src/pages/ServiceReview/index.vue +284 -284
  197. package/src/pages/SubExample/index.vue +26 -26
  198. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  199. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  200. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  201. package/src/pages/XReportView/index.vue +64 -64
  202. package/src/pages/XTreeOneProExample/index.vue +67 -67
  203. package/src/pages/login/Login.vue +379 -379
  204. package/src/pages/login/LoginV3.vue +389 -389
  205. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  206. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  207. package/src/pages/report/ReportTable.js +124 -124
  208. package/src/pages/resourceManage/orgListManage.vue +98 -98
  209. package/src/pages/system/settings/modifyPassword.vue +117 -117
  210. package/src/pages/system/ticket/index.vue +480 -480
  211. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  212. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  213. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  214. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  215. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  216. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  217. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  218. package/src/plugins/EventLogPlugin.js +33 -33
  219. package/src/plugins/FindParentsData.js +17 -17
  220. package/src/services/DataModel.js +30 -30
  221. package/src/services/LodopFuncs.js +137 -137
  222. package/src/services/api/TicketDetailsViewApi.js +46 -46
  223. package/src/services/api/entity.js +18 -18
  224. package/src/services/api/index.js +17 -17
  225. package/src/store/modules/account.js +121 -121
  226. package/src/store/modules/index.js +5 -5
  227. package/src/store/modules/lowCode.js +33 -33
  228. package/src/theme/default/style.less +58 -58
  229. package/src/theme/global.less +313 -313
  230. package/src/utils/formatter.js +74 -74
  231. package/src/utils/htmlToPDF.js +108 -108
  232. package/src/utils/htmlToPDFApi.js +5 -5
  233. package/src/utils/login.js +188 -188
  234. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  235. package/src/utils/lowcode/lowcodeLog.js +29 -29
  236. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  237. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  238. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  239. package/src/utils/map-utils.js +47 -47
  240. package/src/utils/reg.js +95 -95
  241. package/src/utils/runEvalFunction.js +14 -14
  242. package/src/utils/theme-color-replacer-extend.js +92 -92
  243. package/src/utils/util.js +329 -329
  244. package/src/utils/waterMark.js +31 -31
@@ -1,591 +1,591 @@
1
- <template>
2
- <a-card
3
- class="question-history"
4
- id="question-history"
5
- size="small"
6
- :bordered="false"
7
- :bodyStyle="{ height:'100%', overflowY: 'auto'}">
8
- <a-tabs v-model="activeKey" :tabBarStyle="{ textAlign: 'center',height:'100%' }" tabPosition="top">
9
- <a-tab-pane key="1" tab="对话历史">
10
- <a-list item-layout="horizontal" :data-source="questions">
11
- <a-list-item
12
- slot="renderItem"
13
- :class="renderItem.sql ? (renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (renderItem.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug')"
14
- slot-scope="renderItem,index"
15
- @click="handleOpenFavorite(renderItem)">
16
- <a-list-item-meta
17
- :title="renderItem.question"
18
- :description="renderItem.date"
19
- />
20
- <a-space>
21
- <a-tooltip title="查看元数据">
22
- <a-icon
23
- v-if="renderItem.data"
24
- type="eye"
25
- @click.stop="openMetaDataModal(renderItem)"/>
26
- </a-tooltip>
27
- <span>&emsp;</span>
28
- <a-tooltip title="删除对话">
29
- <a-icon
30
- type="delete"
31
- theme="filled"
32
- class="delClass"
33
- @click.stop="delQuestion(renderItem,index)"/>
34
- </a-tooltip>
35
- <span>&emsp;</span>
36
- <a-tooltip :title="renderItem.isFavorite ? '取消收藏' : '收藏'" v-if="renderItem.sql">
37
- <a-icon
38
- type="star"
39
- :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
40
- @click.stop="toFavorites(renderItem,index,'lib')"
41
- :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
42
- two-tone-color="#FFD700"/>
43
- </a-tooltip>
44
- <a-tooltip title="重新查询" v-else>
45
- <a-icon
46
- @click.stop="reTrySearch(renderItem, index)"
47
- type="sync"
48
- class="reSearch"
49
- title="重新查询"/>
50
- </a-tooltip>
51
- </a-space>
52
- </a-list-item>
53
- </a-list>
54
- </a-tab-pane>
55
- <a-tab-pane key="2" tab="收藏的对话" force-render>
56
- <a-list item-layout="horizontal" :data-source="favorites">
57
- <a-list-item
58
- slot="renderItem"
59
- slot-scope="renderItem, index"
60
- :class="renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive'"
61
- @click="handleOpenFavorite(renderItem, true)">
62
- <a-list-item-meta
63
- :title="renderItem.question"
64
- :description="renderItem.date"
65
- />
66
- <a-space>
67
- <a-tooltip title="查看元数据">
68
- <a-icon
69
- v-if="renderItem.data"
70
- type="eye"
71
- @click.stop="openMetaDataModal(renderItem)"/>
72
- </a-tooltip>
73
- <span>&emsp;</span>
74
- <a-icon
75
- type="star"
76
- :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
77
- @click.stop="delFavorites(renderItem,index)"
78
- :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
79
- two-tone-color="#FFD700"/>
80
- </a-space>
81
- </a-list-item>
82
- </a-list>
83
- </a-tab-pane>
84
- <a-tab-pane key="3" tab="对话库">
85
- <a-button type="dashed" class="pullQuestion" :loading="pullQuestionLoading" @click="pullQuestion">
86
- 拉取对话
87
- </a-button>
88
- <a-list item-layout="horizontal" :data-source="questionsLib">
89
- <a-list-item
90
- slot="renderItem"
91
- class="questionItem"
92
- :class="[renderItem.sql ? (renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (renderItem.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug'),
93
- index===0 || questionsLib[index].date !== questionsLib[index-1].date ? 'mgtop-20' : '']"
94
- slot-scope="renderItem,index"
95
- @click="handleOnlyOpen(renderItem)">
96
- <a-divider v-if="index===0 || questionsLib[index].date !== questionsLib[index-1].date" class="questionItemDivider">
97
- {{ timeAgo(renderItem.date) }}
98
- </a-divider>
99
- <a-list-item-meta
100
- :description="renderItem.date"
101
- >
102
- <span slot="title">
103
- {{ renderItem.question }}
104
- <br/>
105
- <span class="evaluation" v-if="icons[renderItem.evaluation]">
106
- <a-icon
107
- :type="icons[renderItem.evaluation].icon"
108
- theme="twoTone"
109
- style="font-size: 1rem"
110
- :two-tone-color="icons[renderItem.evaluation].color"/>
111
- 【{{ icons[renderItem.evaluation].text }}】
112
- </span>
113
- <span class="evaluation" v-else>
114
- <a-icon type="message" style="font-size: 1rem" theme="twoTone" two-tone-color="#999"/>
115
- 未评价
116
- </span>
117
- </span>
118
- </a-list-item-meta>
119
- <a-space>
120
- <a-tooltip title="查看元数据">
121
- <a-icon
122
- v-if="renderItem.data"
123
- type="eye"
124
- @click.stop="openMetaDataModal(renderItem)"/>
125
- </a-tooltip>
126
- <span>&emsp;</span>
127
- <a-tooltip :title="renderItem.isFavorite ? '取消收藏' : '收藏'" v-if="renderItem.sql">
128
- <a-icon
129
- type="star"
130
- :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
131
- @click.stop="libToFavorites(renderItem,index)"
132
- :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
133
- two-tone-color="#FFD700"/>
134
- </a-tooltip>
135
- <a-tooltip title="重新查询" v-else>
136
- <a-icon
137
- @click.stop="reTrySearch(renderItem, index)"
138
- type="sync"
139
- class="reSearch"
140
- title="重新查询"/>
141
- </a-tooltip>
142
- </a-space>
143
- </a-list-item>
144
- </a-list>
145
- </a-tab-pane>
146
- </a-tabs>
147
- <a-modal
148
- width="1200px"
149
- title="元数据"
150
- @cancel="handleCancel"
151
- :visible="metaDataModalVisible"
152
- >
153
- <a-descriptions :column="2" bordered>
154
- <a-descriptions-item label="uuid">
155
- {{ item.uuid }}
156
- </a-descriptions-item>
157
- <a-descriptions-item label="问题">
158
- {{ item.question }}
159
- </a-descriptions-item>
160
- <a-descriptions-item label="类型">
161
- {{ item.queryType }}
162
- </a-descriptions-item>
163
- <a-descriptions-item label="filterTable">
164
- {{ item.filterTable }}
165
- </a-descriptions-item>
166
- <a-descriptions-item label="relationTable">
167
- {{ item.relationTable }}
168
- </a-descriptions-item>
169
- <a-descriptions-item label="similarTable">
170
- {{ item.similarTable }}
171
- </a-descriptions-item>
172
- <a-descriptions-item label="prompt">
173
- {{ item.prompt }}
174
- </a-descriptions-item>
175
- <a-descriptions-item label="sql">
176
- {{ item.sql }}
177
- </a-descriptions-item>
178
- <a-descriptions-item label="oldSql">
179
- {{ item.oldSql }}
180
- </a-descriptions-item>
181
- <a-descriptions-item label="查询日期">
182
- {{ item.date }}
183
- </a-descriptions-item>
184
- </a-descriptions>
185
- </a-modal>
186
- </a-card>
187
- </template>
188
-
189
- <script>
190
- import { indexedDB } from '@vue2-client/utils/indexedDB'
191
- import { formatDate } from '@vue2-client/utils/util'
192
- import { post } from '@vue2-client/services/api'
193
-
194
- export default {
195
- props: {
196
- currentuuid: {
197
- type: String,
198
- default: ''
199
- }
200
- },
201
- data () {
202
- return {
203
- activeKey: '1',
204
- actions: [
205
- { type: 'star-o', text: '156' },
206
- { type: 'like-o', text: '156' },
207
- { type: 'message', text: '2' },
208
- ],
209
- questions: [], // 你的问题历史
210
- favorites: [], // 你的收藏问题
211
- questionsLib: [], // 对话库
212
- icons: {
213
- 0: {
214
- icon: 'like',
215
- text: '满意'
216
- },
217
- 1: {
218
- icon: 'dislike',
219
- text: '不满意',
220
- color: '#FF4F53'
221
- },
222
- 2: {
223
- icon: 'dislike',
224
- text: '不满意',
225
- color: '#FF4F53'
226
- }
227
- }, // 对话库
228
- // 元数据窗口
229
- metaDataModalVisible: false,
230
- item: {},
231
- pullQuestionLoading: false
232
- }
233
- },
234
- mounted () {
235
- this.loadData()
236
- },
237
- methods: {
238
- // 根据时间yyyy-mm-dd hh24:mi:ss判断是刚刚?今天?昨天?还是更早?
239
- timeAgo (time) {
240
- const now = new Date()
241
- const date = new Date(time)
242
- const diff = now - date
243
- const day = 24 * 60 * 60 * 1000
244
- if (diff < 60 * 60 * 1000) {
245
- return '刚刚'
246
- } else if (diff < day) {
247
- return '今天'
248
- } else if (diff < day * 2) {
249
- return '昨天'
250
- } else {
251
- return time.substring(0, 10)
252
- }
253
- },
254
- pullQuestion () {
255
- this.pullQuestionLoading = true
256
- post('/api/af-system/logic/openapi/getCommonData', {
257
- type: 'ai-question',
258
- content: ''
259
- }).then(res => {
260
- const _questionsLib = []
261
- res.forEach(item => {
262
- const _item = JSON.parse(item.f_json)
263
- if (_item.data && _item.data.length) {
264
- if (!this.questionsLib.some(_ => _.uuid === _item.uuid)) {
265
- _item.date = formatDate('now')
266
- _questionsLib.push(_item)
267
- indexedDB.add('question-lib-' + _item.uuid, _item)
268
- }
269
- }
270
- })
271
- // _questionsLib 根据问题question文字排序
272
- _questionsLib.sort((a, b) => a.question.localeCompare(b.question))
273
- // 把_questionsLib 放到 questionsLib 上面
274
- this.questionsLib = _questionsLib.concat(this.questionsLib)
275
- this.pullQuestionLoading = false
276
- }).catch(e => {
277
- this.pullQuestionLoading = false
278
- })
279
- },
280
- loadData () {
281
- this.questions = []
282
- this.favorites = []
283
- indexedDB.getAll((data) => {
284
- // 遍历data,将question和favorites分别赋值给questions和favorites
285
- for (const datum of data) {
286
- if (datum.key.includes('question-lib')) {
287
- this.questionsLib.push(datum.data)
288
- } else if (datum.key.includes('favorites')) {
289
- this.favorites.push(datum.data)
290
- } else if (datum.key.includes('question')) {
291
- this.questions.push(datum.data)
292
- }
293
- }
294
- this.questions.sort((a, b) => new Date(b.date) - new Date(a.date))
295
- this.favorites.sort((a, b) => new Date(b.date) - new Date(a.date))
296
- this.questionsLib.sort((a, b) => new Date(b.date) - new Date(a.date))
297
- }
298
- )
299
- },
300
- handleOpenFavorite (item, reSearch) {
301
- this.$emit('handleOpenFavorite', item, reSearch)
302
- },
303
- handleOnlyOpen (item) {
304
- this.$emit('handleOnlyOpen', item)
305
- },
306
- submitEvaluationLib (value, uuid) {
307
- // 根据uuid 在 questionslib里卖弄找到这个对象
308
- const item = this.questionsLib.find(item => item.uuid === uuid)
309
- const key = 'question-lib-' + uuid
310
- // 收藏状态不存储到库里
311
- delete item.isFavorite
312
- const content = Object.assign(item, {
313
- evaluation: value
314
- })
315
- // 使用 content 替换 item
316
- this.questionsLib = this.questionsLib.map(_item => {
317
- if (_item.uuid === uuid) {
318
- _item = content
319
- }
320
- return _item
321
- })
322
- if (content.sql) {
323
- // 处理sql的单引号
324
- content.sql = content.sql.replaceAll(/'/g, "''")
325
- }
326
- if (content.oldSql) {
327
- // 处理sql的单引号
328
- content.oldSql = content.oldSql.replaceAll(/'/g, "''")
329
- }
330
- console.log(content)
331
- // 保存到数据库中
332
- post('/api/af-system/logic/openapi/updateCommonData', {
333
- type: 'ai-question',
334
- content: uuid,
335
- newContent: content
336
- }).then(res => {
337
- this.$message.success('评论成功')
338
- indexedDB.delete(key)
339
- indexedDB.add(key, content)
340
- })
341
- },
342
- reTrySearch (item, index) {
343
- this.delQuestion(item, index)
344
- this.$emit('handleSearch', item.question, null, item.uuid)
345
- },
346
- add (question) {
347
- // 检查 questions 数组中是否已经存在这个问题 替换掉
348
- const index = this.questions.findIndex(item => item.uuid === question.uuid)
349
- const index2 = this.favorites.findIndex(item => item.uuid === question.uuid)
350
- if (index2 !== -1) {
351
- return
352
- }
353
- if (index !== -1) {
354
- if (question.data) {
355
- this.questions.splice(index, 1, Object.assign(question, { date: this.questions[index].date }))
356
- } else {
357
- this.questions.splice(index, 1, question)
358
- }
359
- this.updateQuestion(question)
360
- } else {
361
- this.questions.push(question)
362
- this.handleOpenFavorite(question)
363
- indexedDB.add('question-' + question.uuid, question)
364
- this.loadData()
365
- }
366
- },
367
- updateQuestion (question) {
368
- console.log(question)
369
- const questionKey = 'question-' + question.uuid
370
- indexedDB.delete(questionKey)
371
- indexedDB.add(questionKey, question)
372
- },
373
- openMetaDataModal (item) {
374
- this.item = item
375
- this.metaDataModalVisible = true
376
- },
377
- handleCancel () {
378
- this.metaDataModalVisible = false
379
- },
380
- toFavorites (question, index) {
381
- this.questions[index].isFavorite = !this.questions[index].isFavorite
382
- if (this.questions[index].isFavorite) {
383
- const key = 'favorites-' + question.uuid
384
- question.date = formatDate('now')
385
- question.isFavorite = true
386
- indexedDB.add(key, question)
387
- this.favorites.push(question)
388
- this.$message.success('收藏成功')
389
- } else {
390
- // 根据 uuid 删除 favorites 中的对应项
391
- this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
392
- // 删除收藏的储存
393
- const key = 'favorites-' + question.uuid
394
- indexedDB.delete(key)
395
- }
396
- this.updateQuestion(question)
397
- },
398
- libToFavorites (question, index) {
399
- this.questionsLib[index].isFavorite = !this.questionsLib[index].isFavorite
400
- this.questionsLib = JSON.parse(JSON.stringify(this.questionsLib))
401
- if (this.questionsLib[index].isFavorite) {
402
- const key = 'favorites-' + question.uuid
403
- question.isFavorite = true
404
- // 避免从其他地方收藏了这个 uuid
405
- indexedDB.delete(key)
406
- indexedDB.add(key, question)
407
- this.favorites.push(Object.assign({}, question, { date: formatDate('now') }))
408
- this.$message.success('收藏成功')
409
- } else {
410
- // 根据 uuid 删除 favorites 中的对应项
411
- this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
412
- // 删除收藏的储存
413
- const key = 'favorites-' + question.uuid
414
- indexedDB.delete(key)
415
- }
416
-
417
- const questionKey = 'question-lib-' + question.uuid
418
- indexedDB.delete(questionKey)
419
- indexedDB.add(questionKey, this.questionsLib[index])
420
- },
421
- delQuestion (item, index) {
422
- // 删除对话历史
423
- this.questions.splice(index, 1)
424
- const key = 'question-' + item.uuid
425
- indexedDB.delete(key)
426
- // 删除收藏
427
- const favoritesKey = 'favorites-' + item.uuid
428
- indexedDB.delete(favoritesKey)
429
- },
430
- delFavorites (item, index) {
431
- this.favorites.splice(index, 1)
432
- // 根据uuid寻找 questions 中的对应项
433
- // 重新赋值给 questions
434
- this.questions = this.questions.map(_item => {
435
- if (_item.uuid === item.uuid) {
436
- _item.isFavorite = false
437
- }
438
- return _item
439
- })
440
- const key = 'favorites-' + item.uuid
441
- indexedDB.delete(key)
442
- this.$message.success('取消收藏成功')
443
- // 如果favorites为空,切换到对话历史
444
- if (this.favorites.length === 0) {
445
- this.activeKey = '1'
446
- }
447
- this.updateQuestion(item)
448
- }
449
- ,
450
- }
451
- }
452
- </script>
453
-
454
- <style scoped lang="less">
455
-
456
- #question-history {
457
-
458
- margin-right: 10px;
459
- height: 100%;
460
- border-radius: 8px;
461
-
462
- .question-history-active-bug {
463
- border-left: 4px solid #FF0036;
464
- border-radius: 4px;
465
- padding: 18px 18px 18px 14px;
466
- background-color: rgba(#ff0000, 0.04);
467
- }
468
-
469
- .question-history-active {
470
- border-left: 4px solid #1890FF;
471
- border-radius: 4px;
472
- padding: 18px 18px 18px 14px;
473
- }
474
-
475
- .question-history-inactive-bug {
476
- border-radius: 4px;
477
- padding: 18px;
478
- background-color: rgba(#ff0000, 0.04);
479
- }
480
-
481
- .question-history-inactive {
482
- border-radius: 4px;
483
- padding: 18px;
484
- }
485
-
486
- .ant-list-item-meta /deep/ {
487
- width: 60%;
488
- }
489
-
490
- .ant-list-item-meta-content /deep/ {
491
- width: 98%;
492
- }
493
-
494
- .ant-list-item-meta-title /deep/ {
495
- width: 90%;
496
- white-space: nowrap;
497
- overflow: hidden;
498
- text-overflow: ellipsis;
499
- }
500
-
501
- .ant-card {
502
- height: 100%;
503
- overflow-y: auto;
504
- }
505
-
506
- .startActive {
507
- color: #FFD700;
508
- font-size: 1rem;
509
- }
510
-
511
- .startInactive {
512
- font-size: 1rem;
513
- }
514
-
515
- .delClass {
516
- font-size: 1rem;
517
- color: #777;
518
- }
519
-
520
- .reSearch {
521
- font-size: 1rem;
522
- color: #1890FF;
523
- }
524
-
525
- .reSearch:hover {
526
- animation: rotate 0.5s ease-in-out both;
527
- }
528
-
529
- @keyframes rotate {
530
- 0% {
531
- transform: rotate(0deg);
532
- }
533
- 100% {
534
- transform: rotate(180deg);
535
- }
536
- }
537
-
538
- .startActive, .startInactive, .reSearch {
539
- transition: transform 0.1s;
540
- }
541
-
542
- .startActive:hover, .startInactive:hover {
543
- animation: shake 0.5s ease-in-out both;
544
- }
545
-
546
- @keyframes shake {
547
- 0% {
548
- transform: rotate(0deg);
549
- }
550
- 25% {
551
- transform: rotate(-20deg);
552
- }
553
- 50% {
554
- transform: rotate(0deg);
555
- }
556
- 75% {
557
- transform: rotate(20deg);
558
- }
559
- 100% {
560
- transform: rotate(0deg);
561
- }
562
- }
563
-
564
- .pullQuestion {
565
- width: 100%;
566
- margin-bottom: 10px;
567
- }
568
-
569
- .evaluation {
570
-
571
- }
572
-
573
- .mgtop-20 {
574
- margin-top: 20px;
575
- }
576
-
577
- .questionItemDivider {
578
- position: absolute;
579
- top: -25px
580
- }
581
-
582
- .questionItem {
583
- position: relative;
584
- }
585
- }
586
-
587
- .scroller {
588
- height: 100%;
589
- overflow-y: auto;
590
- }
591
- </style>
1
+ <template>
2
+ <a-card
3
+ class="question-history"
4
+ id="question-history"
5
+ size="small"
6
+ :bordered="false"
7
+ :bodyStyle="{ height:'100%', overflowY: 'auto'}">
8
+ <a-tabs v-model="activeKey" :tabBarStyle="{ textAlign: 'center',height:'100%' }" tabPosition="top">
9
+ <a-tab-pane key="1" tab="对话历史">
10
+ <a-list item-layout="horizontal" :data-source="questions">
11
+ <a-list-item
12
+ slot="renderItem"
13
+ :class="renderItem.sql ? (renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (renderItem.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug')"
14
+ slot-scope="renderItem,index"
15
+ @click="handleOpenFavorite(renderItem)">
16
+ <a-list-item-meta
17
+ :title="renderItem.question"
18
+ :description="renderItem.date"
19
+ />
20
+ <a-space>
21
+ <a-tooltip title="查看元数据">
22
+ <a-icon
23
+ v-if="renderItem.data"
24
+ type="eye"
25
+ @click.stop="openMetaDataModal(renderItem)"/>
26
+ </a-tooltip>
27
+ <span>&emsp;</span>
28
+ <a-tooltip title="删除对话">
29
+ <a-icon
30
+ type="delete"
31
+ theme="filled"
32
+ class="delClass"
33
+ @click.stop="delQuestion(renderItem,index)"/>
34
+ </a-tooltip>
35
+ <span>&emsp;</span>
36
+ <a-tooltip :title="renderItem.isFavorite ? '取消收藏' : '收藏'" v-if="renderItem.sql">
37
+ <a-icon
38
+ type="star"
39
+ :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
40
+ @click.stop="toFavorites(renderItem,index,'lib')"
41
+ :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
42
+ two-tone-color="#FFD700"/>
43
+ </a-tooltip>
44
+ <a-tooltip title="重新查询" v-else>
45
+ <a-icon
46
+ @click.stop="reTrySearch(renderItem, index)"
47
+ type="sync"
48
+ class="reSearch"
49
+ title="重新查询"/>
50
+ </a-tooltip>
51
+ </a-space>
52
+ </a-list-item>
53
+ </a-list>
54
+ </a-tab-pane>
55
+ <a-tab-pane key="2" tab="收藏的对话" force-render>
56
+ <a-list item-layout="horizontal" :data-source="favorites">
57
+ <a-list-item
58
+ slot="renderItem"
59
+ slot-scope="renderItem, index"
60
+ :class="renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive'"
61
+ @click="handleOpenFavorite(renderItem, true)">
62
+ <a-list-item-meta
63
+ :title="renderItem.question"
64
+ :description="renderItem.date"
65
+ />
66
+ <a-space>
67
+ <a-tooltip title="查看元数据">
68
+ <a-icon
69
+ v-if="renderItem.data"
70
+ type="eye"
71
+ @click.stop="openMetaDataModal(renderItem)"/>
72
+ </a-tooltip>
73
+ <span>&emsp;</span>
74
+ <a-icon
75
+ type="star"
76
+ :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
77
+ @click.stop="delFavorites(renderItem,index)"
78
+ :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
79
+ two-tone-color="#FFD700"/>
80
+ </a-space>
81
+ </a-list-item>
82
+ </a-list>
83
+ </a-tab-pane>
84
+ <a-tab-pane key="3" tab="对话库">
85
+ <a-button type="dashed" class="pullQuestion" :loading="pullQuestionLoading" @click="pullQuestion">
86
+ 拉取对话
87
+ </a-button>
88
+ <a-list item-layout="horizontal" :data-source="questionsLib">
89
+ <a-list-item
90
+ slot="renderItem"
91
+ class="questionItem"
92
+ :class="[renderItem.sql ? (renderItem.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (renderItem.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug'),
93
+ index===0 || questionsLib[index].date !== questionsLib[index-1].date ? 'mgtop-20' : '']"
94
+ slot-scope="renderItem,index"
95
+ @click="handleOnlyOpen(renderItem)">
96
+ <a-divider v-if="index===0 || questionsLib[index].date !== questionsLib[index-1].date" class="questionItemDivider">
97
+ {{ timeAgo(renderItem.date) }}
98
+ </a-divider>
99
+ <a-list-item-meta
100
+ :description="renderItem.date"
101
+ >
102
+ <span slot="title">
103
+ {{ renderItem.question }}
104
+ <br/>
105
+ <span class="evaluation" v-if="icons[renderItem.evaluation]">
106
+ <a-icon
107
+ :type="icons[renderItem.evaluation].icon"
108
+ theme="twoTone"
109
+ style="font-size: 1rem"
110
+ :two-tone-color="icons[renderItem.evaluation].color"/>
111
+ 【{{ icons[renderItem.evaluation].text }}】
112
+ </span>
113
+ <span class="evaluation" v-else>
114
+ <a-icon type="message" style="font-size: 1rem" theme="twoTone" two-tone-color="#999"/>
115
+ 未评价
116
+ </span>
117
+ </span>
118
+ </a-list-item-meta>
119
+ <a-space>
120
+ <a-tooltip title="查看元数据">
121
+ <a-icon
122
+ v-if="renderItem.data"
123
+ type="eye"
124
+ @click.stop="openMetaDataModal(renderItem)"/>
125
+ </a-tooltip>
126
+ <span>&emsp;</span>
127
+ <a-tooltip :title="renderItem.isFavorite ? '取消收藏' : '收藏'" v-if="renderItem.sql">
128
+ <a-icon
129
+ type="star"
130
+ :class="renderItem.isFavorite ? 'startActive' : 'startInactive'"
131
+ @click.stop="libToFavorites(renderItem,index)"
132
+ :theme=" renderItem.isFavorite ? 'filled': 'twoTone'"
133
+ two-tone-color="#FFD700"/>
134
+ </a-tooltip>
135
+ <a-tooltip title="重新查询" v-else>
136
+ <a-icon
137
+ @click.stop="reTrySearch(renderItem, index)"
138
+ type="sync"
139
+ class="reSearch"
140
+ title="重新查询"/>
141
+ </a-tooltip>
142
+ </a-space>
143
+ </a-list-item>
144
+ </a-list>
145
+ </a-tab-pane>
146
+ </a-tabs>
147
+ <a-modal
148
+ width="1200px"
149
+ title="元数据"
150
+ @cancel="handleCancel"
151
+ :visible="metaDataModalVisible"
152
+ >
153
+ <a-descriptions :column="2" bordered>
154
+ <a-descriptions-item label="uuid">
155
+ {{ item.uuid }}
156
+ </a-descriptions-item>
157
+ <a-descriptions-item label="问题">
158
+ {{ item.question }}
159
+ </a-descriptions-item>
160
+ <a-descriptions-item label="类型">
161
+ {{ item.queryType }}
162
+ </a-descriptions-item>
163
+ <a-descriptions-item label="filterTable">
164
+ {{ item.filterTable }}
165
+ </a-descriptions-item>
166
+ <a-descriptions-item label="relationTable">
167
+ {{ item.relationTable }}
168
+ </a-descriptions-item>
169
+ <a-descriptions-item label="similarTable">
170
+ {{ item.similarTable }}
171
+ </a-descriptions-item>
172
+ <a-descriptions-item label="prompt">
173
+ {{ item.prompt }}
174
+ </a-descriptions-item>
175
+ <a-descriptions-item label="sql">
176
+ {{ item.sql }}
177
+ </a-descriptions-item>
178
+ <a-descriptions-item label="oldSql">
179
+ {{ item.oldSql }}
180
+ </a-descriptions-item>
181
+ <a-descriptions-item label="查询日期">
182
+ {{ item.date }}
183
+ </a-descriptions-item>
184
+ </a-descriptions>
185
+ </a-modal>
186
+ </a-card>
187
+ </template>
188
+
189
+ <script>
190
+ import { indexedDB } from '@vue2-client/utils/indexedDB'
191
+ import { formatDate } from '@vue2-client/utils/util'
192
+ import { post } from '@vue2-client/services/api'
193
+
194
+ export default {
195
+ props: {
196
+ currentuuid: {
197
+ type: String,
198
+ default: ''
199
+ }
200
+ },
201
+ data () {
202
+ return {
203
+ activeKey: '1',
204
+ actions: [
205
+ { type: 'star-o', text: '156' },
206
+ { type: 'like-o', text: '156' },
207
+ { type: 'message', text: '2' },
208
+ ],
209
+ questions: [], // 你的问题历史
210
+ favorites: [], // 你的收藏问题
211
+ questionsLib: [], // 对话库
212
+ icons: {
213
+ 0: {
214
+ icon: 'like',
215
+ text: '满意'
216
+ },
217
+ 1: {
218
+ icon: 'dislike',
219
+ text: '不满意',
220
+ color: '#FF4F53'
221
+ },
222
+ 2: {
223
+ icon: 'dislike',
224
+ text: '不满意',
225
+ color: '#FF4F53'
226
+ }
227
+ }, // 对话库
228
+ // 元数据窗口
229
+ metaDataModalVisible: false,
230
+ item: {},
231
+ pullQuestionLoading: false
232
+ }
233
+ },
234
+ mounted () {
235
+ this.loadData()
236
+ },
237
+ methods: {
238
+ // 根据时间yyyy-mm-dd hh24:mi:ss判断是刚刚?今天?昨天?还是更早?
239
+ timeAgo (time) {
240
+ const now = new Date()
241
+ const date = new Date(time)
242
+ const diff = now - date
243
+ const day = 24 * 60 * 60 * 1000
244
+ if (diff < 60 * 60 * 1000) {
245
+ return '刚刚'
246
+ } else if (diff < day) {
247
+ return '今天'
248
+ } else if (diff < day * 2) {
249
+ return '昨天'
250
+ } else {
251
+ return time.substring(0, 10)
252
+ }
253
+ },
254
+ pullQuestion () {
255
+ this.pullQuestionLoading = true
256
+ post('/api/af-system/logic/openapi/getCommonData', {
257
+ type: 'ai-question',
258
+ content: ''
259
+ }).then(res => {
260
+ const _questionsLib = []
261
+ res.forEach(item => {
262
+ const _item = JSON.parse(item.f_json)
263
+ if (_item.data && _item.data.length) {
264
+ if (!this.questionsLib.some(_ => _.uuid === _item.uuid)) {
265
+ _item.date = formatDate('now')
266
+ _questionsLib.push(_item)
267
+ indexedDB.add('question-lib-' + _item.uuid, _item)
268
+ }
269
+ }
270
+ })
271
+ // _questionsLib 根据问题question文字排序
272
+ _questionsLib.sort((a, b) => a.question.localeCompare(b.question))
273
+ // 把_questionsLib 放到 questionsLib 上面
274
+ this.questionsLib = _questionsLib.concat(this.questionsLib)
275
+ this.pullQuestionLoading = false
276
+ }).catch(e => {
277
+ this.pullQuestionLoading = false
278
+ })
279
+ },
280
+ loadData () {
281
+ this.questions = []
282
+ this.favorites = []
283
+ indexedDB.getAll((data) => {
284
+ // 遍历data,将question和favorites分别赋值给questions和favorites
285
+ for (const datum of data) {
286
+ if (datum.key.includes('question-lib')) {
287
+ this.questionsLib.push(datum.data)
288
+ } else if (datum.key.includes('favorites')) {
289
+ this.favorites.push(datum.data)
290
+ } else if (datum.key.includes('question')) {
291
+ this.questions.push(datum.data)
292
+ }
293
+ }
294
+ this.questions.sort((a, b) => new Date(b.date) - new Date(a.date))
295
+ this.favorites.sort((a, b) => new Date(b.date) - new Date(a.date))
296
+ this.questionsLib.sort((a, b) => new Date(b.date) - new Date(a.date))
297
+ }
298
+ )
299
+ },
300
+ handleOpenFavorite (item, reSearch) {
301
+ this.$emit('handleOpenFavorite', item, reSearch)
302
+ },
303
+ handleOnlyOpen (item) {
304
+ this.$emit('handleOnlyOpen', item)
305
+ },
306
+ submitEvaluationLib (value, uuid) {
307
+ // 根据uuid 在 questionslib里卖弄找到这个对象
308
+ const item = this.questionsLib.find(item => item.uuid === uuid)
309
+ const key = 'question-lib-' + uuid
310
+ // 收藏状态不存储到库里
311
+ delete item.isFavorite
312
+ const content = Object.assign(item, {
313
+ evaluation: value
314
+ })
315
+ // 使用 content 替换 item
316
+ this.questionsLib = this.questionsLib.map(_item => {
317
+ if (_item.uuid === uuid) {
318
+ _item = content
319
+ }
320
+ return _item
321
+ })
322
+ if (content.sql) {
323
+ // 处理sql的单引号
324
+ content.sql = content.sql.replaceAll(/'/g, "''")
325
+ }
326
+ if (content.oldSql) {
327
+ // 处理sql的单引号
328
+ content.oldSql = content.oldSql.replaceAll(/'/g, "''")
329
+ }
330
+ console.log(content)
331
+ // 保存到数据库中
332
+ post('/api/af-system/logic/openapi/updateCommonData', {
333
+ type: 'ai-question',
334
+ content: uuid,
335
+ newContent: content
336
+ }).then(res => {
337
+ this.$message.success('评论成功')
338
+ indexedDB.delete(key)
339
+ indexedDB.add(key, content)
340
+ })
341
+ },
342
+ reTrySearch (item, index) {
343
+ this.delQuestion(item, index)
344
+ this.$emit('handleSearch', item.question, null, item.uuid)
345
+ },
346
+ add (question) {
347
+ // 检查 questions 数组中是否已经存在这个问题 替换掉
348
+ const index = this.questions.findIndex(item => item.uuid === question.uuid)
349
+ const index2 = this.favorites.findIndex(item => item.uuid === question.uuid)
350
+ if (index2 !== -1) {
351
+ return
352
+ }
353
+ if (index !== -1) {
354
+ if (question.data) {
355
+ this.questions.splice(index, 1, Object.assign(question, { date: this.questions[index].date }))
356
+ } else {
357
+ this.questions.splice(index, 1, question)
358
+ }
359
+ this.updateQuestion(question)
360
+ } else {
361
+ this.questions.push(question)
362
+ this.handleOpenFavorite(question)
363
+ indexedDB.add('question-' + question.uuid, question)
364
+ this.loadData()
365
+ }
366
+ },
367
+ updateQuestion (question) {
368
+ console.log(question)
369
+ const questionKey = 'question-' + question.uuid
370
+ indexedDB.delete(questionKey)
371
+ indexedDB.add(questionKey, question)
372
+ },
373
+ openMetaDataModal (item) {
374
+ this.item = item
375
+ this.metaDataModalVisible = true
376
+ },
377
+ handleCancel () {
378
+ this.metaDataModalVisible = false
379
+ },
380
+ toFavorites (question, index) {
381
+ this.questions[index].isFavorite = !this.questions[index].isFavorite
382
+ if (this.questions[index].isFavorite) {
383
+ const key = 'favorites-' + question.uuid
384
+ question.date = formatDate('now')
385
+ question.isFavorite = true
386
+ indexedDB.add(key, question)
387
+ this.favorites.push(question)
388
+ this.$message.success('收藏成功')
389
+ } else {
390
+ // 根据 uuid 删除 favorites 中的对应项
391
+ this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
392
+ // 删除收藏的储存
393
+ const key = 'favorites-' + question.uuid
394
+ indexedDB.delete(key)
395
+ }
396
+ this.updateQuestion(question)
397
+ },
398
+ libToFavorites (question, index) {
399
+ this.questionsLib[index].isFavorite = !this.questionsLib[index].isFavorite
400
+ this.questionsLib = JSON.parse(JSON.stringify(this.questionsLib))
401
+ if (this.questionsLib[index].isFavorite) {
402
+ const key = 'favorites-' + question.uuid
403
+ question.isFavorite = true
404
+ // 避免从其他地方收藏了这个 uuid
405
+ indexedDB.delete(key)
406
+ indexedDB.add(key, question)
407
+ this.favorites.push(Object.assign({}, question, { date: formatDate('now') }))
408
+ this.$message.success('收藏成功')
409
+ } else {
410
+ // 根据 uuid 删除 favorites 中的对应项
411
+ this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
412
+ // 删除收藏的储存
413
+ const key = 'favorites-' + question.uuid
414
+ indexedDB.delete(key)
415
+ }
416
+
417
+ const questionKey = 'question-lib-' + question.uuid
418
+ indexedDB.delete(questionKey)
419
+ indexedDB.add(questionKey, this.questionsLib[index])
420
+ },
421
+ delQuestion (item, index) {
422
+ // 删除对话历史
423
+ this.questions.splice(index, 1)
424
+ const key = 'question-' + item.uuid
425
+ indexedDB.delete(key)
426
+ // 删除收藏
427
+ const favoritesKey = 'favorites-' + item.uuid
428
+ indexedDB.delete(favoritesKey)
429
+ },
430
+ delFavorites (item, index) {
431
+ this.favorites.splice(index, 1)
432
+ // 根据uuid寻找 questions 中的对应项
433
+ // 重新赋值给 questions
434
+ this.questions = this.questions.map(_item => {
435
+ if (_item.uuid === item.uuid) {
436
+ _item.isFavorite = false
437
+ }
438
+ return _item
439
+ })
440
+ const key = 'favorites-' + item.uuid
441
+ indexedDB.delete(key)
442
+ this.$message.success('取消收藏成功')
443
+ // 如果favorites为空,切换到对话历史
444
+ if (this.favorites.length === 0) {
445
+ this.activeKey = '1'
446
+ }
447
+ this.updateQuestion(item)
448
+ }
449
+ ,
450
+ }
451
+ }
452
+ </script>
453
+
454
+ <style scoped lang="less">
455
+
456
+ #question-history {
457
+
458
+ margin-right: 10px;
459
+ height: 100%;
460
+ border-radius: 8px;
461
+
462
+ .question-history-active-bug {
463
+ border-left: 4px solid #FF0036;
464
+ border-radius: 4px;
465
+ padding: 18px 18px 18px 14px;
466
+ background-color: rgba(#ff0000, 0.04);
467
+ }
468
+
469
+ .question-history-active {
470
+ border-left: 4px solid #1890FF;
471
+ border-radius: 4px;
472
+ padding: 18px 18px 18px 14px;
473
+ }
474
+
475
+ .question-history-inactive-bug {
476
+ border-radius: 4px;
477
+ padding: 18px;
478
+ background-color: rgba(#ff0000, 0.04);
479
+ }
480
+
481
+ .question-history-inactive {
482
+ border-radius: 4px;
483
+ padding: 18px;
484
+ }
485
+
486
+ .ant-list-item-meta /deep/ {
487
+ width: 60%;
488
+ }
489
+
490
+ .ant-list-item-meta-content /deep/ {
491
+ width: 98%;
492
+ }
493
+
494
+ .ant-list-item-meta-title /deep/ {
495
+ width: 90%;
496
+ white-space: nowrap;
497
+ overflow: hidden;
498
+ text-overflow: ellipsis;
499
+ }
500
+
501
+ .ant-card {
502
+ height: 100%;
503
+ overflow-y: auto;
504
+ }
505
+
506
+ .startActive {
507
+ color: #FFD700;
508
+ font-size: 1rem;
509
+ }
510
+
511
+ .startInactive {
512
+ font-size: 1rem;
513
+ }
514
+
515
+ .delClass {
516
+ font-size: 1rem;
517
+ color: #777;
518
+ }
519
+
520
+ .reSearch {
521
+ font-size: 1rem;
522
+ color: #1890FF;
523
+ }
524
+
525
+ .reSearch:hover {
526
+ animation: rotate 0.5s ease-in-out both;
527
+ }
528
+
529
+ @keyframes rotate {
530
+ 0% {
531
+ transform: rotate(0deg);
532
+ }
533
+ 100% {
534
+ transform: rotate(180deg);
535
+ }
536
+ }
537
+
538
+ .startActive, .startInactive, .reSearch {
539
+ transition: transform 0.1s;
540
+ }
541
+
542
+ .startActive:hover, .startInactive:hover {
543
+ animation: shake 0.5s ease-in-out both;
544
+ }
545
+
546
+ @keyframes shake {
547
+ 0% {
548
+ transform: rotate(0deg);
549
+ }
550
+ 25% {
551
+ transform: rotate(-20deg);
552
+ }
553
+ 50% {
554
+ transform: rotate(0deg);
555
+ }
556
+ 75% {
557
+ transform: rotate(20deg);
558
+ }
559
+ 100% {
560
+ transform: rotate(0deg);
561
+ }
562
+ }
563
+
564
+ .pullQuestion {
565
+ width: 100%;
566
+ margin-bottom: 10px;
567
+ }
568
+
569
+ .evaluation {
570
+
571
+ }
572
+
573
+ .mgtop-20 {
574
+ margin-top: 20px;
575
+ }
576
+
577
+ .questionItemDivider {
578
+ position: absolute;
579
+ top: -25px
580
+ }
581
+
582
+ .questionItem {
583
+ position: relative;
584
+ }
585
+ }
586
+
587
+ .scroller {
588
+ height: 100%;
589
+ overflow-y: auto;
590
+ }
591
+ </style>