From 8b7d95c8df47befb5a4225a99cc9e5b6aeef77f6 Mon Sep 17 00:00:00 2001 From: digua Date: Wed, 3 Dec 2025 01:29:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AI=E8=81=8A=E5=A4=A9=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/momo.png | Bin 0 -> 13485 bytes src/components.d.ts | 3 + src/components/analysis/ai/ChatExplorer.vue | 190 ++++++++++-------- src/components/analysis/ai/ChatInput.vue | 93 +++------ src/components/analysis/ai/ChatMessage.vue | 17 +- .../analysis/ai/ConversationList.vue | 2 +- src/composables/useAIChat.ts | 43 +++- 7 files changed, 178 insertions(+), 170 deletions(-) create mode 100644 src/assets/images/momo.png diff --git a/src/assets/images/momo.png b/src/assets/images/momo.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e9e0f31da677b69b71adba3142b3f90b96c2ce GIT binary patch literal 13485 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 bb42|gUFE1mhB%?a00000NkvXXu0mjfudIi+ literal 0 HcmV?d00001 diff --git a/src/components.d.ts b/src/components.d.ts index deb6e5ef..76c82aff 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -16,6 +16,9 @@ declare module 'vue' { UApp: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/App.vue')['default'] UBadge: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/Badge.vue')['default'] UButton: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/Button.vue')['default'] + UCard: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/Card.vue')['default'] + UChatPrompt: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/ChatPrompt.vue')['default'] + UChatPromptSubmit: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/ChatPromptSubmit.vue')['default'] UContextMenu: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/ContextMenu.vue')['default'] UIcon: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/vue/components/Icon.vue')['default'] UInput: typeof import('./../node_modules/.pnpm/@nuxt+ui@4.2.1_@babel+parser@7.28.5_axios@1.13.2_embla-carousel@8.6.0_typescript@5.9.3__1572391ae10a8169a5c9784ec5cec455/node_modules/@nuxt/ui/dist/runtime/components/Input.vue')['default'] diff --git a/src/components/analysis/ai/ChatExplorer.vue b/src/components/analysis/ai/ChatExplorer.vue index 92d1ceee..9c73f2da 100644 --- a/src/components/analysis/ai/ChatExplorer.vue +++ b/src/components/analysis/ai/ChatExplorer.vue @@ -152,111 +152,131 @@ watch( + + diff --git a/src/components/analysis/ai/ChatInput.vue b/src/components/analysis/ai/ChatInput.vue index 48bc2f86..3e7bf86e 100644 --- a/src/components/analysis/ai/ChatInput.vue +++ b/src/components/analysis/ai/ChatInput.vue @@ -5,96 +5,57 @@ import { ref, computed } from 'vue' const props = defineProps<{ disabled?: boolean placeholder?: string + status?: 'ready' | 'submitted' | 'streaming' | 'error' }>() // Emits const emit = defineEmits<{ send: [content: string] + stop: [] }>() // 输入内容 const inputValue = ref('') -const textareaRef = ref(null) -// 是否可以发送 -const canSend = computed(() => inputValue.value.trim() && !props.disabled) +// 计算 status +const chatStatus = computed(() => { + if (props.disabled) { + return props.status || 'submitted' + } + return 'ready' +}) // 发送消息 -function handleSend() { - if (!canSend.value) return +function handleSubmit() { + if (!inputValue.value.trim() || props.disabled) return emit('send', inputValue.value.trim()) inputValue.value = '' - - // 重置 textarea 高度 - if (textareaRef.value) { - textareaRef.value.style.height = 'auto' - } } -// 处理键盘事件 -function handleKeydown(e: KeyboardEvent) { - // Enter 发送(Shift+Enter 换行) - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault() - handleSend() - } -} - -// 自动调整 textarea 高度 -function handleInput(e: Event) { - const target = e.target as HTMLTextAreaElement - target.style.height = 'auto' - target.style.height = Math.min(target.scrollHeight, 200) + 'px' +// 停止生成 +function handleStop() { + emit('stop') }