vue2-client 1.8.239 → 1.8.241

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 (210) 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/index.md +30 -30
  7. package/docs/lowcode.md +188 -188
  8. package/docs/lowcodeForDeveloper.md +192 -192
  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 +98 -98
  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 +408 -408
  23. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  24. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  25. package/src/base-client/components/common/CitySelect/CitySelect.vue +346 -346
  26. package/src/base-client/components/common/CitySelect/index.js +3 -3
  27. package/src/base-client/components/common/CitySelect/index.md +109 -109
  28. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  29. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  30. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  31. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  32. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  33. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  34. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  35. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  36. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  37. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  38. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  39. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  40. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  41. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  42. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  43. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +355 -386
  44. package/src/base-client/components/common/LowCodePageRender/LowCodePageRender.vue +29 -29
  45. package/src/base-client/components/common/LowCodePageRender/editorPageRender.vue +467 -467
  46. package/src/base-client/components/common/LowCodePageRender/index.js +3 -3
  47. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  48. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  49. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  50. package/src/base-client/components/common/Tree/index.js +2 -2
  51. package/src/base-client/components/common/Upload/Upload.vue +197 -197
  52. package/src/base-client/components/common/Upload/index.js +3 -3
  53. package/src/base-client/components/common/XAddForm/XAddForm.vue +92 -92
  54. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +729 -729
  55. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  56. package/src/base-client/components/common/XAddNativeForm/lowcodeEditorRegister.js +12 -12
  57. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  58. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  59. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  60. package/src/base-client/components/common/XBadge/XBadge.vue +78 -78
  61. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  62. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  63. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  64. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  65. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +167 -167
  66. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +299 -299
  67. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  68. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  69. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  70. package/src/base-client/components/common/XDescriptions/lowcodeEditorRegister.js +1 -3
  71. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +214 -214
  72. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  73. package/src/base-client/components/common/XForm/XForm.vue +256 -256
  74. package/src/base-client/components/common/XForm/XFormItem.vue +766 -761
  75. package/src/base-client/components/common/XForm/XTreeSelect.vue +206 -206
  76. package/src/base-client/components/common/XForm/index.md +178 -178
  77. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  78. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +242 -242
  79. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  80. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  81. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  82. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  83. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  84. package/src/base-client/components/common/XFormTable/XFormTable.vue +519 -519
  85. package/src/base-client/components/common/XFormTable/index.md +98 -98
  86. package/src/base-client/components/common/XFormTable/lowcodeEditorRegister.js +12 -12
  87. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +147 -147
  88. package/src/base-client/components/common/XReport/XReport.vue +837 -837
  89. package/src/base-client/components/common/XReport/XReportDemo.vue +2225 -2225
  90. package/src/base-client/components/common/XReport/XReportDesign.vue +470 -470
  91. package/src/base-client/components/common/XReport/XReportJsonRender.vue +267 -267
  92. package/src/base-client/components/common/XReport/XReportTrGroup.vue +742 -742
  93. package/src/base-client/components/common/XReport/index.js +3 -3
  94. package/src/base-client/components/common/XReport/index.md +44 -44
  95. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  96. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  97. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  98. package/src/base-client/components/common/XStepView/index.js +3 -3
  99. package/src/base-client/components/common/XStepView/index.md +31 -31
  100. package/src/base-client/components/common/XTable/XTable.vue +636 -636
  101. package/src/base-client/components/common/XTable/index.md +255 -255
  102. package/src/base-client/components/common/XTree/XTree.vue +320 -320
  103. package/src/base-client/components/common/XTree/index.js +3 -3
  104. package/src/base-client/components/common/XTree/index.md +36 -36
  105. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +114 -114
  106. package/src/base-client/components/common/XTreeOne/lowcodeEditorRegister.js +9 -9
  107. package/src/base-client/components/index.js +47 -47
  108. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  109. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  110. package/src/base-client/plugins/AppData.js +115 -115
  111. package/src/base-client/plugins/Config.js +19 -19
  112. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  113. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  114. package/src/bootstrap.js +39 -39
  115. package/src/components/CodeMirror/inedx.vue +118 -118
  116. package/src/components/CodeMirror/setting.js +40 -40
  117. package/src/components/FilePreview/FilePreview.vue +166 -166
  118. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  119. package/src/components/STable/index.js +323 -323
  120. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  121. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  122. package/src/components/menu/SideMenu.vue +75 -75
  123. package/src/components/menu/menu.js +273 -273
  124. package/src/components/tool/AStepItem.vue +60 -60
  125. package/src/config/CreateQueryConfig.js +322 -322
  126. package/src/config/default/antd.config.js +89 -89
  127. package/src/config/default/setting.config.js +55 -55
  128. package/src/font-style/font.css +4 -4
  129. package/src/layouts/CommonLayout.vue +56 -56
  130. package/src/layouts/PageLayout.vue +151 -151
  131. package/src/layouts/SinglePageView.vue +138 -138
  132. package/src/layouts/header/AdminHeader.vue +132 -132
  133. package/src/layouts/header/HeaderNotice.vue +177 -177
  134. package/src/layouts/tabs/TabsHead.vue +189 -189
  135. package/src/layouts/tabs/TabsView.vue +387 -387
  136. package/src/lib.js +1 -1
  137. package/src/main.js +26 -26
  138. package/src/mock/extend/index.js +84 -84
  139. package/src/mock/goods/index.js +108 -108
  140. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  141. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  142. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  143. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  144. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  145. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  146. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  147. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  148. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  149. package/src/pages/DynamicStatistics/index.vue +282 -282
  150. package/src/pages/Example/index.vue +32 -32
  151. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  152. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  153. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  154. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  155. package/src/pages/NewDynamicStatistics/FavoriteList.vue +51 -51
  156. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  157. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  158. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  159. package/src/pages/ServiceReview/index.vue +284 -284
  160. package/src/pages/XReportView/index.vue +62 -62
  161. package/src/pages/login/Login.vue +378 -378
  162. package/src/pages/login/LoginV3.vue +389 -389
  163. package/src/pages/lowCode/lowCodeEditor.vue +1285 -1288
  164. package/src/pages/lowCode/lowCodeRender.vue +39 -39
  165. package/src/pages/resourceManage/orgListManage.vue +98 -98
  166. package/src/pages/system/dictionary/index.vue +44 -44
  167. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  168. package/src/pages/system/monitor/operLog/index.vue +37 -37
  169. package/src/pages/system/settings/modifyPassword.vue +117 -117
  170. package/src/pages/system/ticket/index.vue +480 -480
  171. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  172. package/src/router/async/config.async.js +33 -33
  173. package/src/router/async/router.map.js +107 -107
  174. package/src/router/guards.js +220 -220
  175. package/src/router/index.js +27 -27
  176. package/src/router.js +19 -19
  177. package/src/services/api/TicketDetailsViewApi.js +46 -46
  178. package/src/services/api/cas.js +79 -79
  179. package/src/services/api/common.js +284 -284
  180. package/src/services/api/entity.js +18 -18
  181. package/src/services/api/index.js +17 -17
  182. package/src/services/api/restTools.js +46 -46
  183. package/src/services/apiService.js +14 -14
  184. package/src/services/user.js +71 -71
  185. package/src/store/modules/setting.js +119 -119
  186. package/src/theme/default/style.less +57 -57
  187. package/src/theme/global.less +130 -130
  188. package/src/utils/authority-utils.js +85 -85
  189. package/src/utils/errorCode.js +6 -6
  190. package/src/utils/htmlToPDF.js +108 -108
  191. package/src/utils/htmlToPDFApi.js +5 -5
  192. package/src/utils/indexedDB.js +201 -201
  193. package/src/utils/login.js +144 -144
  194. package/src/utils/lowcode/lowcodeComponentMixin.js +78 -78
  195. package/src/utils/lowcode/lowcodeLog.js +29 -29
  196. package/src/utils/lowcode/lowcodeUtils.js +129 -129
  197. package/src/utils/lowcode/registerComponentForEditor.js +11 -11
  198. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  199. package/src/utils/map-utils.js +47 -47
  200. package/src/utils/reg.js +19 -19
  201. package/src/utils/request.js +343 -343
  202. package/src/utils/routerUtil.js +435 -435
  203. package/src/utils/runEvalFunction.js +6 -6
  204. package/src/utils/util.js +231 -231
  205. package/src/utils/waterMark.js +31 -31
  206. package/test/Amis.spec.js +163 -163
  207. package/test/Tree.spec.js +167 -167
  208. package/test/myDialog.spec.js +46 -46
  209. package/vue.config.js +177 -177
  210. 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>