vue2-client 1.8.310 → 1.8.311

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 (215) hide show
  1. package/.env +19 -19
  2. package/.eslintrc.js +90 -90
  3. package/CHANGELOG.md +824 -824
  4. package/Components.md +60 -60
  5. package/babel.config.js +21 -21
  6. package/docs/LowCode/lowcode.md +155 -155
  7. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  8. package/docs/index.md +30 -30
  9. package/index.js +31 -31
  10. package/jest-transform-stub.js +8 -8
  11. package/jest.config.js +21 -21
  12. package/jest.setup.js +7 -7
  13. package/package.json +97 -97
  14. package/public/index.html +27 -27
  15. package/src/App.vue +188 -188
  16. package/src/ReportView.js +19 -19
  17. package/src/assets/img/querySlotDemo.svg +15 -15
  18. package/src/assets/svg/badtwo.svg +1 -1
  19. package/src/assets/svg/goodtwo.svg +1 -1
  20. package/src/base-client/components/common/AMisRender/index.js +3 -3
  21. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  22. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +438 -416
  23. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  24. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  25. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  26. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  27. package/src/base-client/components/common/CitySelect/index.js +3 -3
  28. package/src/base-client/components/common/CitySelect/index.md +109 -109
  29. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  30. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  31. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  32. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  33. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  34. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  35. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  36. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  37. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  38. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  39. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  40. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  41. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  42. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  43. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  44. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  45. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +350 -350
  46. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  47. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +699 -699
  48. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  49. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +162 -162
  50. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  51. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  52. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  53. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  54. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  55. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  56. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  57. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  58. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  59. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  60. package/src/base-client/components/common/Tree/index.js +2 -2
  61. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  62. package/src/base-client/components/common/Upload/index.js +3 -3
  63. package/src/base-client/components/common/XAddForm/XAddForm.vue +105 -105
  64. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +807 -807
  65. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  66. package/src/base-client/components/common/XAddNativeForm/lowcodeEditorRegister.js +16 -16
  67. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  68. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  69. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  70. package/src/base-client/components/common/XBadge/XBadge.vue +78 -78
  71. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  72. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  73. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  74. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  75. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +187 -187
  76. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +306 -306
  77. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  78. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  79. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  80. package/src/base-client/components/common/XDescriptions/lowcodeEditorRegister.js +31 -31
  81. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +214 -214
  82. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  83. package/src/base-client/components/common/XForm/XForm.vue +294 -294
  84. package/src/base-client/components/common/XForm/XFormItem.vue +911 -911
  85. package/src/base-client/components/common/XForm/XTreeSelect.vue +207 -207
  86. package/src/base-client/components/common/XForm/index.md +178 -178
  87. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  88. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +241 -241
  89. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  90. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  91. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  92. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  93. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  94. package/src/base-client/components/common/XFormTable/XFormTable.vue +539 -539
  95. package/src/base-client/components/common/XFormTable/demo.vue +72 -72
  96. package/src/base-client/components/common/XFormTable/index.md +98 -98
  97. package/src/base-client/components/common/XFormTable/lowcodeEditorRegister.js +30 -30
  98. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +147 -147
  99. package/src/base-client/components/common/XReport/XReport.vue +858 -858
  100. package/src/base-client/components/common/XReport/XReportDemo.vue +266 -266
  101. package/src/base-client/components/common/XReport/XReportDesign.vue +509 -509
  102. package/src/base-client/components/common/XReport/XReportJsonRender.vue +295 -295
  103. package/src/base-client/components/common/XReport/XReportTrGroup.vue +801 -801
  104. package/src/base-client/components/common/XReport/index.js +3 -3
  105. package/src/base-client/components/common/XReport/index.md +44 -44
  106. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  107. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  108. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  109. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  110. package/src/base-client/components/common/XStepView/index.js +3 -3
  111. package/src/base-client/components/common/XStepView/index.md +31 -31
  112. package/src/base-client/components/common/XTable/XTable.vue +676 -676
  113. package/src/base-client/components/common/XTable/index.md +255 -255
  114. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  115. package/src/base-client/components/common/XTree/index.js +3 -3
  116. package/src/base-client/components/common/XTree/index.md +36 -36
  117. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +114 -114
  118. package/src/base-client/components/common/XTreeOne/lowcodeEditorRegister.js +11 -11
  119. package/src/base-client/components/index.js +51 -51
  120. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  121. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  122. package/src/base-client/plugins/AppData.js +121 -121
  123. package/src/base-client/plugins/Config.js +19 -19
  124. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  125. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  126. package/src/bootstrap.js +39 -39
  127. package/src/components/FilePreview/FilePreview.vue +166 -166
  128. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  129. package/src/components/STable/index.js +361 -361
  130. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  131. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  132. package/src/components/menu/SideMenu.vue +75 -75
  133. package/src/components/menu/menu.js +273 -273
  134. package/src/components/tool/AStepItem.vue +60 -60
  135. package/src/config/default/antd.config.js +89 -89
  136. package/src/config/default/setting.config.js +55 -55
  137. package/src/font-style/font.css +4 -4
  138. package/src/layouts/CommonLayout.vue +56 -56
  139. package/src/layouts/PageLayout.vue +151 -151
  140. package/src/layouts/SinglePageView.vue +138 -138
  141. package/src/layouts/header/AdminHeader.vue +132 -132
  142. package/src/layouts/header/HeaderNotice.vue +177 -177
  143. package/src/layouts/tabs/TabsHead.vue +189 -189
  144. package/src/layouts/tabs/TabsView.vue +387 -387
  145. package/src/lib.js +1 -1
  146. package/src/main.js +26 -26
  147. package/src/mock/extend/index.js +84 -84
  148. package/src/mock/goods/index.js +108 -108
  149. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  150. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  151. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  152. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  153. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  154. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  155. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  156. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  157. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  158. package/src/pages/DynamicStatistics/index.vue +282 -282
  159. package/src/pages/Example/index.vue +33 -33
  160. package/src/pages/ServiceReview/index.vue +284 -284
  161. package/src/pages/XReportView/index.vue +62 -62
  162. package/src/pages/login/Login.vue +378 -378
  163. package/src/pages/login/LoginV3.vue +389 -389
  164. package/src/pages/lowCode/lowCodeEditor.vue +1030 -1030
  165. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  166. package/src/pages/resourceManage/orgListManage.vue +98 -98
  167. package/src/pages/system/dictionary/index.vue +44 -44
  168. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  169. package/src/pages/system/monitor/operLog/index.vue +37 -37
  170. package/src/pages/system/settings/modifyPassword.vue +117 -117
  171. package/src/pages/system/ticket/index.vue +480 -480
  172. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  173. package/src/router/async/config.async.js +34 -34
  174. package/src/router/async/router.map.js +104 -104
  175. package/src/router/guards.js +223 -223
  176. package/src/router/index.js +27 -27
  177. package/src/router.js +19 -19
  178. package/src/services/api/TicketDetailsViewApi.js +46 -46
  179. package/src/services/api/cas.js +79 -79
  180. package/src/services/api/common.js +307 -307
  181. package/src/services/api/entity.js +18 -18
  182. package/src/services/api/index.js +17 -17
  183. package/src/services/api/restTools.js +46 -46
  184. package/src/services/apiService.js +14 -14
  185. package/src/services/user.js +71 -71
  186. package/src/services/v3Api.js +81 -81
  187. package/src/store/modules/index.js +5 -5
  188. package/src/store/modules/lowCode.js +33 -33
  189. package/src/store/modules/setting.js +119 -119
  190. package/src/theme/default/style.less +58 -58
  191. package/src/theme/global.less +139 -139
  192. package/src/utils/authority-utils.js +85 -85
  193. package/src/utils/errorCode.js +6 -6
  194. package/src/utils/formatter.js +80 -80
  195. package/src/utils/htmlToPDF.js +108 -108
  196. package/src/utils/htmlToPDFApi.js +5 -5
  197. package/src/utils/indexedDB.js +258 -258
  198. package/src/utils/login.js +188 -188
  199. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  200. package/src/utils/lowcode/lowcodeLog.js +29 -29
  201. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  202. package/src/utils/lowcode/registerComponentForEditor.js +11 -11
  203. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  204. package/src/utils/map-utils.js +47 -47
  205. package/src/utils/reg.js +95 -95
  206. package/src/utils/request.js +347 -347
  207. package/src/utils/routerUtil.js +435 -435
  208. package/src/utils/runEvalFunction.js +6 -6
  209. package/src/utils/util.js +241 -241
  210. package/src/utils/waterMark.js +31 -31
  211. package/test/Amis.spec.js +163 -163
  212. package/test/Tree.spec.js +167 -167
  213. package/test/myDialog.spec.js +46 -46
  214. package/vue.config.js +181 -181
  215. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -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>