st-comp 0.0.274 → 0.0.276

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 (143) hide show
  1. package/es/ChartLayout.js +4 -4
  2. package/es/CustomFunction.cjs +1 -1
  3. package/es/CustomFunction.js +70 -71
  4. package/es/FactorWarning.cjs +1 -1
  5. package/es/FactorWarning.js +35 -36
  6. package/es/Kline.cjs +1 -1
  7. package/es/Kline.js +19 -20
  8. package/es/KlineBasic.cjs +1 -1
  9. package/es/KlineBasic.js +28 -29
  10. package/es/KlineConfig.cjs +1 -1
  11. package/es/KlineConfig.js +49 -50
  12. package/es/KlineNew.cjs +1 -1
  13. package/es/KlineNew.js +18 -19
  14. package/es/KlinePlus.cjs +1 -1
  15. package/es/KlinePlus.js +21 -22
  16. package/es/MonacoEditor.cjs +1 -1
  17. package/es/MonacoEditor.js +26 -27
  18. package/es/Pagination.cjs +1 -1
  19. package/es/Pagination.js +76 -77
  20. package/es/PasswordPrompt.js +3 -3
  21. package/es/Table.cjs +1 -1
  22. package/es/Table.js +37 -38
  23. package/es/User.cjs +1 -1
  24. package/es/User.js +141 -142
  25. package/es/VarSelectDialog.cjs +1 -1
  26. package/es/VarSelectDialog.js +27 -28
  27. package/es/VarietyAiHelper.cjs +7 -7
  28. package/es/VarietyAiHelper.js +488 -479
  29. package/es/VarietyAutoComplete.cjs +1 -1
  30. package/es/VarietyAutoComplete.js +12 -13
  31. package/es/VarietySearch.cjs +9 -9
  32. package/es/VarietySearch.js +298 -298
  33. package/es/{VarietySelect-7da473c5.cjs → VarietySelect-610903f0.cjs} +1 -1
  34. package/es/{VarietySelect-b01281d3.js → VarietySelect-6a166293.js} +4 -4
  35. package/es/VarietyTextCopy.cjs +1 -1
  36. package/es/VarietyTextCopy.js +22 -23
  37. package/es/VirtualTable.js +14 -14
  38. package/es/{_initCloneObject-6243b839.js → _initCloneObject-152b4f4e.js} +3 -3
  39. package/es/aiTools-9fd42de8.cjs +2 -0
  40. package/es/aiTools-d7bd47c3.js +113 -0
  41. package/es/aiTools.js +12 -2
  42. package/es/{base-29f73b05.js → base-a5af3db3.js} +2 -2
  43. package/es/{castArray-609a313e.js → castArray-7741a212.js} +1 -1
  44. package/es/{config-provider-20b05e99.js → config-provider-7a3aca55.js} +4 -4
  45. package/es/{debounce-a09ce9a3.js → debounce-8d53f4dd.js} +1 -1
  46. package/es/{dropdown-f8d9fe56.js → dropdown-01e09205.js} +19 -20
  47. package/es/dropdown-987c47fb.cjs +1 -0
  48. package/es/el-autocomplete-16f66b34.cjs +1 -0
  49. package/es/{el-autocomplete-3f34a1c3.js → el-autocomplete-342ae823.js} +17 -18
  50. package/es/{el-button-cd144ee1.js → el-button-314171a0.js} +4 -4
  51. package/es/{el-checkbox-d6c883f4.js → el-checkbox-5899681f.js} +4 -4
  52. package/es/el-checkbox-bdf64663.cjs +1 -0
  53. package/es/el-dialog-0ef95df6.cjs +1 -0
  54. package/es/{el-dialog-59a23c2b.js → el-dialog-86a3eec2.js} +6 -6
  55. package/es/{el-divider-523e5874.js → el-divider-4e059794.js} +1 -1
  56. package/es/{el-empty-f5a1607a.js → el-empty-33cb66f1.js} +3 -3
  57. package/es/{el-form-item-3475aaad.cjs → el-form-item-77ef6784.cjs} +1 -1
  58. package/es/{el-form-item-a9556441.js → el-form-item-cda4d93c.js} +8 -8
  59. package/es/el-input-89222943.cjs +1 -0
  60. package/es/{el-input-1f14a6e2.js → el-input-fa1445ad.js} +14 -14
  61. package/es/{el-input-number-411ac93d.js → el-input-number-8f6dbf74.js} +6 -6
  62. package/es/el-input-number-d3338e5e.cjs +1 -0
  63. package/es/{el-loading-cbeb3b86.js → el-loading-9b671203.js} +2 -2
  64. package/es/el-menu-item-4531fd0e.cjs +1 -0
  65. package/es/{el-menu-item-77152904.js → el-menu-item-535fef90.js} +17 -18
  66. package/es/{el-message-box-a26e3ed4.js → el-message-box-621ed2f1.js} +11 -11
  67. package/es/el-message-box-f5717070.cjs +1 -0
  68. package/es/el-overlay-151708cb.cjs +1 -0
  69. package/es/{el-overlay-465cd11e.js → el-overlay-23de4324.js} +19 -19
  70. package/es/el-popconfirm-b8aa490e.cjs +1 -0
  71. package/es/{el-popconfirm-289b3e89.js → el-popconfirm-bcff0aa5.js} +20 -21
  72. package/es/el-popper-03988662.js +2094 -0
  73. package/es/el-popper-43ec37f4.cjs +1 -0
  74. package/es/el-segmented-79a1367c.cjs +1 -0
  75. package/es/{el-segmented-598b92b0.js → el-segmented-db3a86be.js} +4 -4
  76. package/es/{el-select-d47b5923.js → el-select-4bd0010d.js} +43 -44
  77. package/es/el-select-ec04e7ce.cjs +1 -0
  78. package/es/el-table-column-35e47229.cjs +14 -0
  79. package/es/{el-table-column-f1017e75.js → el-table-column-7af2bec7.js} +24 -25
  80. package/es/el-tag-5d5608e0.cjs +1 -0
  81. package/es/{el-tag-0a4197f5.js → el-tag-bef9e83d.js} +13 -13
  82. package/es/{el-text-c3ee80fe.js → el-text-f998902c.js} +2 -2
  83. package/es/{index-67180968.js → index-102edf6c.js} +3 -3
  84. package/es/{index-a76e80d9.cjs → index-2d7ac156.cjs} +2 -2
  85. package/es/{index-1b97095f.js → index-5c44d71a.js} +1 -1
  86. package/es/{index-d3e9a6f2.js → index-5ed42e9c.js} +11 -11
  87. package/es/{index-3301d870.js → index-6290ae0f.js} +3 -3
  88. package/es/{index-a17c90c5.js → index-936e7dec.js} +2 -2
  89. package/es/{index-8391a3df.js → index-960806da.js} +3 -3
  90. package/es/index-a00e0534.cjs +1 -0
  91. package/es/{index-33430c9f.js → index-a83ec4b7.js} +3 -3
  92. package/es/index-c58e90e9.cjs +1 -0
  93. package/es/{index-499cf989.js → index-ce21e2ce.js} +17 -17
  94. package/es/index-cfd00899.cjs +1 -0
  95. package/es/{index-afc4a1e5.js → index-d1b554ac.js} +3 -3
  96. package/es/{index-de24705f.js → index-d77a7336.js} +1 -1
  97. package/es/{index-3ed7914e.cjs → index-db846633.cjs} +1 -1
  98. package/es/{index-5b47cf8f.js → index-f3f6ee27.js} +11 -11
  99. package/es/{python-df3d529e.js → python-6cc6ec1b.js} +28 -29
  100. package/es/{python-b5d87b74.cjs → python-71f59893.cjs} +1 -1
  101. package/es/{raf-744cf95a.js → raf-80ef0c0a.js} +1 -1
  102. package/es/{scroll-6799bafc.js → scroll-679bd6bf.js} +1 -1
  103. package/es/style.css +1 -1
  104. package/es/{use-form-common-props-dd9617de.js → use-form-common-props-76a09d89.js} +28 -28
  105. package/es/{use-global-config-4dfc7236.js → use-global-config-0f43458b.js} +4 -4
  106. package/es/{validator-029bfc98.js → validator-0e037618.js} +1 -1
  107. package/es/{vnode-a83e6de8.js → vnode-5ddb7ed1.js} +1 -1
  108. package/es/{zh-cn-89e434f9.js → zh-cn-1227eb8a.js} +2 -2
  109. package/lib/aiTools.js +12 -2
  110. package/lib/bundle.js +1 -1
  111. package/lib/bundle.umd.cjs +172 -172
  112. package/lib/{index-a854f18c.js → index-8b55d8c8.js} +13934 -13924
  113. package/lib/{python-77c3b638.js → python-f164f783.js} +1 -1
  114. package/lib/style.css +1 -1
  115. package/package.json +1 -1
  116. package/packages/VarietyAiHelper/images/like.png +0 -0
  117. package/packages/VarietyAiHelper/images/like_no.png +0 -0
  118. package/packages/VarietyAiHelper/index.vue +351 -410
  119. package/packages/VarietySearch/index.vue +1 -1
  120. package/public/aiTools.js +12 -2
  121. package/es/aiTools-4412c56c.cjs +0 -2
  122. package/es/aiTools-e6e4e996.js +0 -111
  123. package/es/dropdown-33c19e56.cjs +0 -1
  124. package/es/el-autocomplete-525ca867.cjs +0 -1
  125. package/es/el-checkbox-95325acd.cjs +0 -1
  126. package/es/el-dialog-4056070b.cjs +0 -1
  127. package/es/el-input-c7bf8e44.cjs +0 -1
  128. package/es/el-input-number-9d810842.cjs +0 -1
  129. package/es/el-menu-item-18d7d869.cjs +0 -1
  130. package/es/el-message-box-e4b8cc99.cjs +0 -1
  131. package/es/el-overlay-d26a1b98.cjs +0 -1
  132. package/es/el-popconfirm-12f6f35c.cjs +0 -1
  133. package/es/el-popper-c7648df6.cjs +0 -1
  134. package/es/el-popper-f96fc206.js +0 -1662
  135. package/es/el-segmented-f0bce6f2.cjs +0 -1
  136. package/es/el-select-f3cc464f.cjs +0 -1
  137. package/es/el-table-column-220ae131.cjs +0 -14
  138. package/es/el-tag-51bd491c.cjs +0 -1
  139. package/es/index-09ce1753.cjs +0 -1
  140. package/es/index-4b95bae1.cjs +0 -1
  141. package/es/index-68798830.cjs +0 -1
  142. package/es/index-8e88a0bd.js +0 -440
  143. package/es/index-d2cfd4a3.cjs +0 -1
@@ -6,7 +6,6 @@ import { inject, ref, nextTick, watch, reactive, computed } from "vue";
6
6
  import { sendToNodeVarietyAiHelper } from "../../public/aiTools";
7
7
  import { UserFilled, Service, Promotion, Refresh, SuccessFilled } from "@element-plus/icons-vue";
8
8
 
9
- // ==================== 基础配置 ====================
10
9
  const stConfig = inject("stConfig");
11
10
  const userData = reactive(getUserData());
12
11
  const visible = ref(false);
@@ -19,137 +18,41 @@ const props = defineProps({
19
18
  },
20
19
  });
21
20
 
22
- // ==================== 响应式数据 ====================
23
21
  const isSending = ref(false);
24
22
  const isThinking = ref(false);
25
- const nodeProgressList = ref([]);
26
23
  const showFinalResult = ref(false);
27
24
  const messageListRef = ref(null);
28
25
  const messageList = ref([
29
26
  {
30
- role: "assistant",
27
+ role: "defaultMessage", // defaultMessage-组件内置, assistant-智能体, user-用户
31
28
  content: props.defaultMessage,
29
+ fullQuery: "",
32
30
  userContent: null,
33
31
  showFeedback: false,
34
- hasFeedback: false,
35
32
  createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
36
33
  resTime: 0,
37
34
  firstPackageTime: 0,
38
35
  },
39
36
  ]);
40
-
37
+ const sessionId = ref(null);
41
38
  const userInput = ref("");
39
+
40
+ // 反馈相关
42
41
  const feedbackDialogVisible = ref(false);
43
42
  const feedbackContent = ref("");
44
43
  const feedbackMessageIndex = ref({});
45
44
 
46
- // ==================== 计算属性 ====================
47
- const completedCount = computed(() => nodeProgressList.value.filter((n) => n.status === "success").length);
45
+ // 节点相关
46
+ const nodeProgressList = ref([]);
48
47
  const totalCount = computed(() => nodeProgressList.value.length);
48
+ const completedCount = computed(() => nodeProgressList.value.filter((n) => n.status === "success").length);
49
49
  const progressPercent = computed(() => (totalCount.value ? (completedCount.value / totalCount.value) * 100 : 0));
50
50
  const currentStepName = computed(() => {
51
51
  const running = nodeProgressList.value.find((n) => n.status === "executing");
52
52
  return running ? running.name : "处理中";
53
53
  });
54
54
 
55
- // ==================== 工具函数 ====================
56
- const isJSONSerializable = (str) => {
57
- if (typeof str !== "string") return false;
58
- try {
59
- const parsed = JSON.parse(str);
60
- return parsed !== null && typeof parsed === "object";
61
- } catch {
62
- return false;
63
- }
64
- };
65
-
66
- const formatJSONContent = (content) => {
67
- if (!isJSONSerializable(content)) return null;
68
- try {
69
- const jsonData = JSON.parse(content);
70
- const { parsedConditions, ...webParams } = jsonData;
71
- return { parsedConditions, webParams };
72
- } catch {
73
- return null;
74
- }
75
- };
76
-
77
- const renderJSONContent = (jsonData) => {
78
- if (!jsonData) return "";
79
- let html = "";
80
- if (jsonData.parsedConditions?.length) {
81
- html += '<div class="parsed-conditions">';
82
- jsonData.parsedConditions.forEach((text) => {
83
- html += `<div class="parsed-conditions-item">${text}</div>`;
84
- });
85
- html += "</div>";
86
- }
87
- return html;
88
- };
89
-
90
- // ==================== 反馈处理 ====================
91
- const handleFeedbackAction = async (action, messageIndex) => {
92
- switch (action) {
93
- case "satisfied": {
94
- const message = messageList.value[messageIndex];
95
- await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
96
- userName: userData.username,
97
- userContent: message.userContent,
98
- aiContent: message.content,
99
- type: 1,
100
- createTime: message.createTime,
101
- resTime: message.resTime,
102
- firstPackageTime: message.firstPackageTime,
103
- isSolved: 1,
104
- logOrigin: 1,
105
- });
106
- ElMessage.success("感谢您的评价!");
107
- messageList.value[messageIndex].hasFeedback = true;
108
- break;
109
- }
110
- case "open": {
111
- feedbackMessageIndex.value = messageIndex;
112
- feedbackDialogVisible.value = true;
113
- break;
114
- }
115
- case "unsatisfied": {
116
- const message = messageList.value[messageIndex];
117
- await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
118
- userName: userData.username,
119
- userContent: message.userContent,
120
- userSuggestion: feedbackContent.value,
121
- aiContent: message.content,
122
- type: 2,
123
- resTime: message.resTime,
124
- createTime: message.createTime,
125
- firstPackageTime: message.firstPackageTime,
126
- isSolved: 0,
127
- logOrigin: 1,
128
- });
129
- ElMessage.success("感谢您的反馈!我们将持续跟踪并进行优化");
130
- feedbackDialogVisible.value = false;
131
- messageList.value[messageIndex].hasFeedback = true;
132
- break;
133
- }
134
- case "default": {
135
- const message = messageList.value[messageIndex];
136
- await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
137
- userName: userData.username,
138
- userContent: message.userContent,
139
- userSuggestion: feedbackContent.value,
140
- aiContent: message.content,
141
- type: null,
142
- resTime: message.resTime,
143
- createTime: message.createTime,
144
- firstPackageTime: message.firstPackageTime,
145
- isSolved: 1,
146
- logOrigin: 1,
147
- });
148
- }
149
- }
150
- };
151
-
152
- // ==================== 消息发送 ====================
55
+ // 发送消息
153
56
  const sendMessage = async () => {
154
57
  const content = userInput.value.trim();
155
58
  if (!content) return ElMessage.warning("请输入消息内容");
@@ -169,9 +72,9 @@ const sendMessage = async () => {
169
72
  messageList.value.push({
170
73
  role: "assistant",
171
74
  content: "",
75
+ fullQuery: "",
172
76
  userContent: content,
173
77
  showFeedback: false,
174
- hasFeedback: false,
175
78
  createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
176
79
  resTime: 0,
177
80
  firstPackageTime: 0,
@@ -190,24 +93,15 @@ const sendMessage = async () => {
190
93
  baseUrl: stConfig.env.VITE_BASE_URL,
191
94
  token: getToken(),
192
95
  value: content,
96
+ sessionId: sessionId.value,
193
97
  callback: (type, data) => {
194
- if (type === "error") {
195
- isThinking.value = false;
196
- isSending.value = false;
197
- messageList.value.pop();
198
- messageList.value.push({
199
- role: "assistant",
200
- userContent: content,
201
- content: `❌ ${data}`,
202
- showFeedback: false,
203
- hasFeedback: false,
204
- createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
205
- resTime: new Date().getTime() - resTime,
206
- firstPackageTime: 0,
207
- });
208
- handleFeedbackAction("default", messageList.value.length - 1);
209
- scrollToBottom();
210
- return;
98
+ if (type === "session") {
99
+ sessionId.value = data;
100
+ }
101
+ if (type === "fullQuery") {
102
+ const lastMessage = messageList.value[messageList.value.length - 1];
103
+ lastMessage.fullQuery = data;
104
+ console.log(data);
211
105
  }
212
106
  if (type === "node") {
213
107
  if (!firstNodeReceived) {
@@ -246,16 +140,23 @@ const sendMessage = async () => {
246
140
  lastMessage.resTime = new Date().getTime() - resTime;
247
141
  handleFeedbackAction("default", messageList.value.length - 1);
248
142
  }
249
-
250
- try {
251
- const jsonResponse = JSON.parse(fullResponse);
252
- if (jsonResponse.parsedConditions) {
253
- delete jsonResponse.parsedConditions;
254
- }
255
- emit("callBack", jsonResponse);
256
- } catch (error) {
257
- emit("callBack", fullResponse);
258
- }
143
+ }
144
+ if (type === "error") {
145
+ isThinking.value = false;
146
+ isSending.value = false;
147
+ messageList.value.pop();
148
+ messageList.value.push({
149
+ role: "assistant",
150
+ userContent: content,
151
+ content: `❌ ${data}`,
152
+ showFeedback: false,
153
+ createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
154
+ resTime: new Date().getTime() - resTime,
155
+ firstPackageTime: 0,
156
+ });
157
+ handleFeedbackAction("default", messageList.value.length - 1);
158
+ scrollToBottom();
159
+ return;
259
160
  }
260
161
  },
261
162
  });
@@ -267,7 +168,6 @@ const sendMessage = async () => {
267
168
  userContent: content,
268
169
  content: "❌ 抱歉,AI服务响应异常,请稍后重试。",
269
170
  showFeedback: true,
270
- hasFeedback: false,
271
171
  createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
272
172
  resTime: new Date().getTime() - resTime,
273
173
  firstPackageTime: 0,
@@ -278,8 +178,74 @@ const sendMessage = async () => {
278
178
  isThinking.value = false;
279
179
  }
280
180
  };
281
-
282
- // ==================== 键盘事件 ====================
181
+ // 查看结果
182
+ const lookResult = (content) => {
183
+ const { parsedConditions, ...webParams } = JSON.parse(content);
184
+ console.log({ parsedConditions, webParams });
185
+ emit("callBack", webParams);
186
+ };
187
+ // 用户反馈
188
+ const handleFeedbackAction = async (action, messageIndex) => {
189
+ switch (action) {
190
+ case "satisfied": {
191
+ const message = messageList.value[messageIndex];
192
+ await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
193
+ userName: userData.username,
194
+ userContent: message.userContent,
195
+ aiContent: message.content,
196
+ type: 1,
197
+ createTime: message.createTime,
198
+ resTime: message.resTime,
199
+ firstPackageTime: message.firstPackageTime,
200
+ isSolved: 1,
201
+ logOrigin: 1,
202
+ });
203
+ ElMessage.success("感谢您的评价!");
204
+ messageList.value[messageIndex].showFeedback = false;
205
+ break;
206
+ }
207
+ case "open": {
208
+ feedbackMessageIndex.value = messageIndex;
209
+ feedbackDialogVisible.value = true;
210
+ break;
211
+ }
212
+ case "unsatisfied": {
213
+ const message = messageList.value[messageIndex];
214
+ await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
215
+ userName: userData.username,
216
+ userContent: message.userContent,
217
+ userSuggestion: feedbackContent.value,
218
+ aiContent: message.content,
219
+ type: 2,
220
+ resTime: message.resTime,
221
+ createTime: message.createTime,
222
+ firstPackageTime: message.firstPackageTime,
223
+ isSolved: 0,
224
+ logOrigin: 1,
225
+ });
226
+ ElMessage.success("感谢您的反馈!我们将持续跟踪并进行优化");
227
+ feedbackDialogVisible.value = false;
228
+ messageList.value[messageIndex].showFeedback = false;
229
+ break;
230
+ }
231
+ case "default": {
232
+ const message = messageList.value[messageIndex];
233
+ await stConfig.request.post("/alarm/deliversign/addVarietyAiHelperLog", {
234
+ userName: userData.username,
235
+ userContent: message.userContent,
236
+ userSuggestion: feedbackContent.value,
237
+ aiContent: message.content,
238
+ type: null,
239
+ resTime: message.resTime,
240
+ createTime: message.createTime,
241
+ firstPackageTime: message.firstPackageTime,
242
+ isSolved: 1,
243
+ logOrigin: 1,
244
+ });
245
+ }
246
+ }
247
+ };
248
+ // 键盘事件
283
249
  const handleKeydown = (event) => {
284
250
  if (event.key === "Enter") {
285
251
  if (event.ctrlKey) {
@@ -297,14 +263,37 @@ const handleKeydown = (event) => {
297
263
  }
298
264
  }
299
265
  };
300
-
301
- // ==================== 滚动 & 初始化 ====================
266
+ // 滚动到底部
302
267
  const scrollToBottom = async () => {
303
268
  await nextTick();
304
269
  if (messageListRef.value) {
305
270
  messageListRef.value.scrollTop = messageListRef.value.scrollHeight;
306
271
  }
307
272
  };
273
+ // 校验是否支持JSON解析
274
+ const isJSONSerializable = (str) => {
275
+ if (typeof str !== "string") return false;
276
+ try {
277
+ const parsed = JSON.parse(str);
278
+ return parsed !== null && typeof parsed === "object";
279
+ } catch {
280
+ return false;
281
+ }
282
+ };
283
+ // 动态生成渲染DOM
284
+ const renderJSONContent = (content) => {
285
+ const { parsedConditions } = JSON.parse(content);
286
+ // 创建DOM
287
+ let html = "";
288
+ if (parsedConditions?.length) {
289
+ html += '<div class="parsed-conditions">';
290
+ parsedConditions.forEach((text) => {
291
+ html += `<div class="parsed-conditions-item">${text}</div>`;
292
+ });
293
+ html += "</div>";
294
+ }
295
+ return html;
296
+ };
308
297
 
309
298
  watch(
310
299
  () => messageList.value,
@@ -313,7 +302,6 @@ watch(
313
302
  },
314
303
  { deep: true },
315
304
  );
316
-
317
305
  watch(
318
306
  () => feedbackDialogVisible.value,
319
307
  (newValue) => {
@@ -344,6 +332,7 @@ defineExpose({
344
332
  :modal-penetrable="true"
345
333
  >
346
334
  <div class="ai-dialog-body">
335
+ <!-- 对话展示 -->
347
336
  <div
348
337
  ref="messageListRef"
349
338
  class="message-list"
@@ -355,14 +344,17 @@ defineExpose({
355
344
  class="message-item"
356
345
  >
357
346
  <template v-if="message.content || (index === messageList.length - 1 && message.role === 'assistant' && nodeProgressList.length > 0)">
347
+ <!-- 头像 -->
358
348
  <div class="avatar">
359
349
  <el-avatar
360
350
  :size="32"
361
351
  :icon="message.role === 'user' ? UserFilled : Service"
362
352
  />
363
353
  </div>
364
-
354
+ <!-- 响应 -->
365
355
  <div class="message-content">
356
+ <div v-if="message.fullQuery" style="font-weight: bold; margin-bottom: 10px;">筛选结果: {{ message.fullQuery }}</div>
357
+ <!-- 节点展示 -->
366
358
  <div
367
359
  v-if="index === messageList.length - 1 && message.role === 'assistant' && nodeProgressList.length > 0 && !showFinalResult"
368
360
  class="node-progress"
@@ -397,60 +389,67 @@ defineExpose({
397
389
  <span class="progress-text">第 {{ completedCount }}/{{ totalCount }} 步 · {{ currentStepName }}</span>
398
390
  </div>
399
391
  </div>
400
-
392
+ <!-- 成功结果展示 -->
401
393
  <div
402
394
  v-if="isJSONSerializable(message.content)"
403
- class="message-json"
395
+ class="message-content-json"
404
396
  :class="{ 'result-animation': index === messageList.length - 1 && showFinalResult }"
405
- v-html="renderJSONContent(formatJSONContent(message.content))"
406
- ></div>
407
-
397
+ v-html="renderJSONContent(message.content)"
398
+ />
399
+ <!-- 失败结果展示 -->
408
400
  <div
409
401
  v-else-if="message.content"
410
- class="message-text"
402
+ class="message-content-text"
411
403
  :class="{ 'result-animation': index === messageList.length - 1 && showFinalResult }"
412
404
  >
413
405
  {{ message.content }}
414
406
  </div>
415
407
 
416
- <div class="message-createTime">{{ message.createTime }}</div>
417
-
418
- <template v-if="message.role === 'assistant'">
419
- <template v-if="message.showFeedback && !message.hasFeedback">
420
- <div class="message-createTime">请问对本轮查询结果是否满意?</div>
421
- <div class="feedback-buttons">
422
- <button
423
- class="feedback-btn satisfied-btn"
408
+ <!-- 消息底部按钮 -->
409
+ <div
410
+ v-if="message.role === 'assistant'"
411
+ class="message-content-footer"
412
+ >
413
+ <!-- 反馈按钮 -->
414
+ <div
415
+ v-if="message.showFeedback"
416
+ class="feedback-box"
417
+ >
418
+ <el-tooltip
419
+ content="满意"
420
+ placement="bottom"
421
+ >
422
+ <img
423
+ src="./images/like.png"
424
+ alt="满意"
424
425
  @click="handleFeedbackAction('satisfied', index)"
425
- >
426
- <span class="btn-emoji">👍</span>
427
- <span class="btn-text">满意</span>
428
- </button>
429
- <button
430
- class="feedback-btn unsatisfied-btn"
426
+ />
427
+ </el-tooltip>
428
+ <el-tooltip
429
+ content="满意"
430
+ placement="bottom"
431
+ >
432
+ <img
433
+ src="./images/like_no.png"
434
+ alt="不满意"
431
435
  @click="handleFeedbackAction('open', index)"
432
- >
433
- <span class="btn-emoji">👎</span>
434
- <span class="btn-text">不满意</span>
435
- </button>
436
- </div>
437
- </template>
438
- <template v-if="message.showFeedback && message.hasFeedback">
439
- <div class="message-createTime">感谢您进行的评价反馈</div>
440
- </template>
441
- </template>
436
+ />
437
+ </el-tooltip>
438
+ </div>
439
+ <!-- 查看结果 -->
440
+ <el-button
441
+ v-if="isJSONSerializable(message.content)"
442
+ class="confirm-btn"
443
+ @click="lookResult(message.content)"
444
+ >
445
+ 查看结果
446
+ </el-button>
447
+ </div>
442
448
  </div>
443
449
  </template>
444
450
  </div>
445
-
446
- <div
447
- v-if="isThinking && nodeProgressList.length === 0 && !messageList[messageList.length - 1]?.content"
448
- class="thinking-placeholder"
449
- >
450
- 🤔 正在分析您的需求...
451
- </div>
452
451
  </div>
453
-
452
+ <!-- 用户输入 -->
454
453
  <div class="input-area">
455
454
  <el-input
456
455
  class="message-input"
@@ -480,6 +479,7 @@ defineExpose({
480
479
  </div>
481
480
  </el-dialog>
482
481
 
482
+ <!-- 窗口: 反馈意见 -->
483
483
  <el-dialog
484
484
  v-model="feedbackDialogVisible"
485
485
  title="📝 反馈意见"
@@ -515,12 +515,11 @@ defineExpose({
515
515
  flex-direction: column;
516
516
  height: 480px;
517
517
  background: transparent;
518
-
518
+ // 对话展示
519
519
  .message-list {
520
520
  flex: 1;
521
521
  overflow-y: auto;
522
522
  padding: 20px 24px;
523
-
524
523
  &::-webkit-scrollbar {
525
524
  width: 6px;
526
525
  }
@@ -535,11 +534,9 @@ defineExpose({
535
534
  background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);
536
535
  }
537
536
  }
538
-
539
537
  .message-item {
540
538
  display: flex;
541
539
  margin-bottom: 20px;
542
-
543
540
  .avatar {
544
541
  flex-shrink: 0;
545
542
  :deep(.el-avatar) {
@@ -551,258 +548,202 @@ defineExpose({
551
548
  }
552
549
  }
553
550
  }
554
-
555
551
  .message-content {
552
+ width: calc(100% - 88px);
556
553
  display: flex;
557
554
  flex-direction: column;
558
- max-width: 70%;
559
555
  }
560
556
  }
561
-
562
- .user {
563
- flex-direction: row-reverse;
564
- .avatar {
565
- margin-left: 12px;
566
- margin-right: 0;
567
- }
568
- .message-content {
569
- align-items: flex-end;
570
- .message-text {
571
- color: white;
572
- border-radius: 18px 18px 4px 18px;
573
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
574
- }
575
- .message-createTime {
576
- text-align: right;
577
- }
578
- }
579
- }
580
-
557
+ // 智能体
558
+ .defaultMessage,
581
559
  .assistant {
582
560
  .avatar {
583
561
  margin-right: 12px;
584
562
  }
585
563
  .message-content {
586
564
  align-items: flex-start;
587
- }
588
- }
589
- }
590
-
591
- .node-progress {
592
- background: linear-gradient(135deg, #f8f9ff 0%, #f0f2ff 100%);
593
- border: 1px solid rgba(102, 126, 234, 0.15);
594
- border-radius: 16px;
595
- padding: 12px 16px;
596
- margin-bottom: 8px;
597
- min-width: 200px;
598
- animation: breathe 2s ease-in-out infinite;
599
-
600
- .node-progress-item {
601
- display: flex;
602
- align-items: center;
603
- gap: 10px;
604
- padding: 6px 0;
605
- position: relative;
606
- animation: slideIn 0.3s ease-out;
607
-
608
- &:not(:last-child)::after {
609
- content: "";
610
- position: absolute;
611
- left: 9px;
612
- top: 28px;
613
- width: 2px;
614
- height: calc(100% - 8px);
615
- background: linear-gradient(to bottom, #c7d2fe, transparent);
616
- }
617
-
618
- .node-status-icon {
619
- position: relative;
620
- z-index: 1;
621
- border-radius: 50%;
622
- width: 20px;
623
- height: 20px;
624
- display: inline-flex;
625
- align-items: center;
626
- justify-content: center;
627
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
628
- }
565
+ .node-progress {
566
+ background: linear-gradient(135deg, #f8f9ff 0%, #f0f2ff 100%);
567
+ border: 1px solid rgba(102, 126, 234, 0.15);
568
+ border-radius: 16px;
569
+ padding: 12px 16px;
570
+ margin-bottom: 8px;
571
+ min-width: 200px;
572
+ animation: breathe 2s ease-in-out infinite;
573
+
574
+ .node-progress-item {
575
+ display: flex;
576
+ align-items: center;
577
+ gap: 10px;
578
+ padding: 6px 0;
579
+ position: relative;
580
+ animation: slideIn 0.3s ease-out;
581
+
582
+ &:not(:last-child)::after {
583
+ content: "";
584
+ position: absolute;
585
+ left: 9px;
586
+ top: 28px;
587
+ width: 2px;
588
+ height: calc(100% - 8px);
589
+ background: linear-gradient(to bottom, #c7d2fe, transparent);
590
+ }
591
+
592
+ .node-status-icon {
593
+ position: relative;
594
+ z-index: 1;
595
+ border-radius: 50%;
596
+ width: 20px;
597
+ height: 20px;
598
+ display: inline-flex;
599
+ align-items: center;
600
+ justify-content: center;
601
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
602
+ }
603
+
604
+ .node-icon {
605
+ font-size: 12px;
606
+ &.done {
607
+ color: #22c55e;
608
+ }
609
+ &.running {
610
+ color: #667eea;
611
+ animation: spin 0.6s linear infinite;
612
+ }
613
+ &.waiting {
614
+ color: #d1d5db;
615
+ animation: spin 0.8s linear infinite;
616
+ }
617
+ }
618
+
619
+ .node-name {
620
+ font-size: 13px;
621
+ color: #6b7280;
622
+ line-height: 20px;
623
+ }
624
+
625
+ &:has(.running) .node-name {
626
+ font-weight: 500;
627
+ color: #667eea;
628
+ }
629
+ }
629
630
 
630
- .node-icon {
631
- font-size: 12px;
632
- &.done {
633
- color: #22c55e;
631
+ .progress-footer {
632
+ margin-top: 12px;
633
+ padding-top: 8px;
634
+ border-top: 1px solid rgba(102, 126, 234, 0.1);
635
+
636
+ :deep(.el-progress) {
637
+ margin-bottom: 6px;
638
+ }
639
+
640
+ .progress-text {
641
+ font-size: 11px;
642
+ color: #9ca3af;
643
+ display: block;
644
+ text-align: center;
645
+ }
646
+ }
634
647
  }
635
- &.running {
636
- color: #667eea;
637
- animation: spin 0.6s linear infinite;
648
+ .message-content-json {
649
+ width: 100%;
650
+ overflow: hidden;
651
+ :deep(.parsed-conditions) {
652
+ margin: 0;
653
+ padding: 0;
654
+ .parsed-conditions-item {
655
+ text-align: center;
656
+ color: #f56c6c;
657
+ margin-bottom: 8px;
658
+ padding: 8px 12px;
659
+ background: linear-gradient(135deg, #ffebeb 0%, #ffe0e0 100%);
660
+ border-radius: 12px;
661
+ font-weight: 500;
662
+ transition: all 0.2s ease;
663
+ &:last-child {
664
+ margin-bottom: 0;
665
+ }
666
+ }
667
+ }
638
668
  }
639
- &.waiting {
640
- color: #d1d5db;
641
- animation: spin 0.8s linear infinite;
669
+ .message-content-footer {
670
+ width: 100%;
671
+ display: flex;
672
+ align-items: center;
673
+ justify-content: space-between;
674
+ .feedback-box {
675
+ display: flex;
676
+ align-items: center;
677
+ margin-top: 10px;
678
+ img {
679
+ cursor: pointer;
680
+ width: 26px;
681
+ height: 26px;
682
+ margin-right: 10px;
683
+ &:hover {
684
+ transition: 0.2s;
685
+ transform: scale(1.1);
686
+ }
687
+ }
688
+ }
689
+ .confirm-btn {
690
+ margin-left: auto;
691
+ margin-top: 8px;
692
+ padding: 6px 20px;
693
+ font-size: 13px;
694
+ border-radius: 20px;
695
+ background: linear-gradient(135deg, #f8f9ff 0%, #f0f2ff 100%);
696
+ color: #667eea;
697
+ border: 1px solid rgba(102, 126, 234, 0.15);
698
+ cursor: pointer;
699
+ transition: all 0.2s ease;
700
+ font-weight: 500;
701
+
702
+ &:hover {
703
+ background: linear-gradient(135deg, #f0f2ff 0%, #e8ecff 100%);
704
+ border-color: rgba(102, 126, 234, 0.3);
705
+ transform: translateY(-1px);
706
+ box-shadow: 0 2px 8px rgba(102, 126, 234, 0.1);
707
+ }
708
+ }
642
709
  }
643
- }
644
-
645
- .node-name {
646
- font-size: 13px;
647
- color: #6b7280;
648
- line-height: 20px;
649
- }
650
-
651
- &:has(.running) .node-name {
652
- font-weight: 500;
653
- color: #667eea;
654
- }
655
- }
656
-
657
- .progress-footer {
658
- margin-top: 12px;
659
- padding-top: 8px;
660
- border-top: 1px solid rgba(102, 126, 234, 0.1);
661
-
662
- :deep(.el-progress) {
663
- margin-bottom: 6px;
664
- }
665
-
666
- .progress-text {
667
- font-size: 11px;
668
- color: #9ca3af;
669
- display: block;
670
- text-align: center;
671
- }
672
- }
673
- }
674
-
675
- .thinking-placeholder {
676
- display: inline-flex;
677
- align-items: center;
678
- gap: 8px;
679
- padding: 10px 16px;
680
- background: rgba(102, 126, 234, 0.08);
681
- border-radius: 18px;
682
- font-size: 13px;
683
- color: #667eea;
684
- width: fit-content;
685
-
686
- &::before {
687
- content: "";
688
- width: 14px;
689
- height: 14px;
690
- border: 2px solid #667eea;
691
- border-top-color: transparent;
692
- border-radius: 50%;
693
- animation: spin 0.8s linear infinite;
694
- }
695
- }
696
-
697
- .message-json,
698
- .message-text {
699
- padding: 12px 16px;
700
- font-size: 14px;
701
- line-height: 1.6;
702
- word-wrap: break-word;
703
- white-space: pre-wrap;
704
- border-radius: 18px 18px 18px 4px;
705
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
706
- border: 1px solid rgba(102, 126, 234, 0.2);
707
- transition: all 0.3s ease;
708
- }
709
-
710
- .message-json {
711
- width: 100%;
712
- overflow: hidden;
713
-
714
- :deep(.parsed-conditions) {
715
- margin: 0;
716
- padding: 0;
717
-
718
- .parsed-conditions-item {
719
- text-align: center;
720
- color: #f56c6c;
721
- margin-bottom: 8px;
722
- padding: 8px 12px;
723
- background: linear-gradient(135deg, #ffebeb 0%, #ffe0e0 100%);
724
- border-radius: 12px;
725
- font-weight: 500;
726
- transition: all 0.2s ease;
727
- &:last-child {
728
- margin-bottom: 0;
710
+ .result-animation {
711
+ animation: resultAppear 0.5s cubic-bezier(0.2, 0.9, 0.4, 1.1);
729
712
  }
730
713
  }
731
714
  }
732
- }
733
-
734
- .result-animation {
735
- animation: resultAppear 0.5s cubic-bezier(0.2, 0.9, 0.4, 1.1);
736
- }
737
-
738
- .message-createTime {
739
- font-size: 11px;
740
- color: #9ca3af;
741
- margin-top: 6px;
742
- }
743
-
744
- .feedback-buttons {
745
- display: flex;
746
- gap: 12px;
747
- margin-top: 12px;
748
-
749
- .feedback-btn {
750
- display: flex;
751
- align-items: center;
752
- gap: 6px;
753
- padding: 4px 10px;
754
- border: none;
755
- border-radius: 20px;
756
- font-size: 13px;
757
- font-weight: 500;
758
- cursor: pointer;
759
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
760
- background: rgba(255, 255, 255, 0.9);
761
- backdrop-filter: blur(10px);
762
-
763
- .btn-emoji {
764
- font-size: 16px;
765
- transition: transform 0.2s ease;
766
- }
767
- .btn-text {
768
- font-size: 13px;
715
+ // 用户
716
+ .user {
717
+ flex-direction: row-reverse;
718
+ .avatar {
719
+ margin-left: 12px;
720
+ margin-right: 0;
769
721
  }
770
- &:hover {
771
- transform: translateY(-2px);
772
- .btn-emoji {
773
- transform: scale(1.1);
722
+ .message-content {
723
+ align-items: flex-end;
724
+ .message-content-text {
725
+ color: white;
726
+ border-radius: 18px 18px 4px 18px;
727
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
774
728
  }
775
729
  }
776
- &:active {
777
- transform: translateY(0);
778
- }
779
730
  }
780
-
781
- .satisfied-btn {
782
- background: linear-gradient(135deg, #f0f9ff 0%, #e6f7ff 100%);
783
- color: #1890ff;
784
- border: 1px solid rgba(24, 144, 255, 0.2);
785
- box-shadow: 0 2px 8px rgba(24, 144, 255, 0.1);
786
- &:hover {
787
- background: linear-gradient(135deg, #e6f7ff 0%, #bae7ff 100%);
788
- border-color: #1890ff;
789
- box-shadow: 0 4px 12px rgba(24, 144, 255, 0.2);
790
- }
791
- }
792
-
793
- .unsatisfied-btn {
794
- background: linear-gradient(135deg, #fff1f0 0%, #ffe7e5 100%);
795
- color: #ff4d4f;
796
- border: 1px solid rgba(255, 77, 79, 0.2);
797
- box-shadow: 0 2px 8px rgba(255, 77, 79, 0.1);
798
- &:hover {
799
- background: linear-gradient(135deg, #ffe7e5 0%, #ffccc7 100%);
800
- border-color: #ff4d4f;
801
- box-shadow: 0 4px 12px rgba(255, 77, 79, 0.2);
802
- }
731
+ .message-content-json,
732
+ .message-content-text {
733
+ box-sizing: border-box;
734
+ padding: 12px 16px;
735
+ font-size: 14px;
736
+ line-height: 1.6;
737
+ word-wrap: break-word;
738
+ white-space: pre-wrap;
739
+ border-radius: 18px 18px 18px 4px;
740
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
741
+ border: 1px solid rgba(102, 126, 234, 0.2);
742
+ transition: all 0.3s ease;
803
743
  }
804
744
  }
805
745
 
746
+ // 用户输入
806
747
  .input-area {
807
748
  padding: 16px 24px 24px;
808
749
  backdrop-filter: blur(10px);