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'