From 84deeacd4d127ca6b009d51d0d802903167b8416 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 24 Aug 2025 21:30:39 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ai=20=E5=A4=A7=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E3=80=91=E5=AF=B9=E8=AF=9D=E5=88=97=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20attachment-urls=20=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/ai/chat/message/index.ts | 7 +- src/utils/file.ts | 19 ++ src/utils/index.ts | 1 - .../index/components/message/MessageFiles.vue | 165 ++++++++++++++++++ .../index/components/message/MessageList.vue | 8 + 5 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 src/utils/file.ts create mode 100644 src/views/ai/chat/index/components/message/MessageFiles.vue diff --git a/src/api/ai/chat/message/index.ts b/src/api/ai/chat/message/index.ts index 023333665..193e87b79 100644 --- a/src/api/ai/chat/message/index.ts +++ b/src/api/ai/chat/message/index.ts @@ -14,6 +14,7 @@ export interface ChatMessageVO { modelId: number // 模型编号 content: string // 聊天内容 reasoningContent?: string // 推理内容 + attachmentUrls?: string[] // 附件 URL 数组 tokens: number // 消耗 Token 数量 segmentIds?: number[] // 段落编号 segments?: { @@ -45,7 +46,8 @@ export const ChatMessageApi = { enableContext: boolean, onMessage, onError, - onClose + onClose, + attachmentUrls?: string[] ) => { const token = getAccessToken() return fetchEventSource(`${config.base_url}/ai/chat/message/send-stream`, { @@ -58,7 +60,8 @@ export const ChatMessageApi = { body: JSON.stringify({ conversationId, content, - useContext: enableContext + useContext: enableContext, + attachmentUrls: attachmentUrls || [] }), onmessage: onMessage, onerror: onError, diff --git a/src/utils/file.ts b/src/utils/file.ts new file mode 100644 index 000000000..c8bccbd30 --- /dev/null +++ b/src/utils/file.ts @@ -0,0 +1,19 @@ +/** 从 URL 中提取文件名 */ +export const getFileNameFromUrl = (url: string): string => { + try { + const urlObj = new URL(url) + const pathname = urlObj.pathname + const fileName = pathname.split('/').pop() || 'unknown' + return decodeURIComponent(fileName) + } catch { + // 如果 URL 解析失败,尝试从字符串中提取 + const parts = url.split('/') + return parts[parts.length - 1] || 'unknown' + } +} + +/** 判断是否为图片 */ +export const isImage = (filename: string): boolean => { + const ext = filename.split('.').pop()?.toLowerCase() || '' + return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext) +} diff --git a/src/utils/index.ts b/src/utils/index.ts index f0b4faaef..0bcedb438 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -529,7 +529,6 @@ export function jsonParse(str: string) { * @param start 开始位置 * @param end 结束位置 */ - export const subString = (str: string, start: number, end: number) => { if (str.length > end) { return str.slice(start, end) diff --git a/src/views/ai/chat/index/components/message/MessageFiles.vue b/src/views/ai/chat/index/components/message/MessageFiles.vue new file mode 100644 index 000000000..9362c994b --- /dev/null +++ b/src/views/ai/chat/index/components/message/MessageFiles.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/src/views/ai/chat/index/components/message/MessageList.vue b/src/views/ai/chat/index/components/message/MessageList.vue index 5efd39c5f..12ce67101 100644 --- a/src/views/ai/chat/index/components/message/MessageList.vue +++ b/src/views/ai/chat/index/components/message/MessageList.vue @@ -22,6 +22,7 @@ class="text-[var(--el-text-color-primary)] text-[0.95rem]" :content="item.content" /> +
@@ -52,8 +53,14 @@
{{ formatDate(item.createTime) }}
+ +
+ +
+
{{ item.content }} @@ -104,6 +111,7 @@ import { formatDate } from '@/utils/formatTime' import MarkdownView from '@/components/MarkdownView/index.vue' import MessageKnowledge from './MessageKnowledge.vue' import MessageReasoning from './MessageReasoning.vue' +import MessageFiles from './MessageFiles.vue' import { useClipboard } from '@vueuse/core' import { ArrowDownBold, Edit, RefreshRight } from '@element-plus/icons-vue' import { ChatMessageApi, ChatMessageVO } from '@/api/ai/chat/message'