From c93cbec021ca838752ea8a5db4f6be7ffb63dbc5 Mon Sep 17 00:00:00 2001 From: lq Date: Fri, 25 Jul 2025 13:02:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=81=8A=E5=A4=A9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=88=E9=83=A8=E5=88=86=EF=BC=89=EF=BC=8C=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=8F=91=E9=80=81=EF=BC=8C=E8=A7=86=E9=A2=91=E5=8F=91=E9=80=81?= =?UTF-8?q?=EF=BC=8C=E9=9F=B3=E9=A2=91=E5=8F=91=E9=80=81=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E5=A5=BD=E5=8F=8B=E5=88=97=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E8=AE=B0=E5=BD=95=E4=BB=A5=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/public/audio/sys.mp3 | Bin 0 -> 10493 bytes apps/web-antd/src/api/core/upload.ts | 7 + apps/web-antd/src/util/tool.ts | 18 + .../src/views/business/chat/api/index.ts | 10 + .../business/chat/components/ChatHeader.vue | 196 ++- .../business/chat/components/FriendList.vue | 14 +- .../business/chat/components/MediaPreview.vue | 311 ++-- .../chat/components/MessageBubble.vue | 311 ++-- .../business/chat/components/MessageInput.vue | 274 +-- .../business/chat/components/MessageItem.vue | 97 -- .../business/chat/components/MessageList.vue | 199 ++- .../chat/composables/useFileUpload.ts | 35 +- .../business/chat/composables/useRecording.ts | 23 +- .../src/views/business/chat/stores/chat.ts | 1537 ++++++++++------- .../src/views/business/chat/stores/user.ts | 1 + 15 files changed, 1740 insertions(+), 1293 deletions(-) create mode 100644 apps/web-antd/public/audio/sys.mp3 delete mode 100644 apps/web-antd/src/views/business/chat/components/MessageItem.vue diff --git a/apps/web-antd/public/audio/sys.mp3 b/apps/web-antd/public/audio/sys.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..870c9ec085f15fb3c4d6147bf6196e9f78b29b4f GIT binary patch literal 10493 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 O{%hzbb@bmZ=Dz@TC!taR literal 0 HcmV?d00001 diff --git a/apps/web-antd/src/api/core/upload.ts b/apps/web-antd/src/api/core/upload.ts index c57aae95..7290f4f6 100644 --- a/apps/web-antd/src/api/core/upload.ts +++ b/apps/web-antd/src/api/core/upload.ts @@ -7,6 +7,13 @@ import { requestClient } from '#/api/request'; export async function uploadFile(data: any) { return requestClient.upload('upload/image', data); } +/** + * 文件上传 - 聊天信息 + * @param data + */ +export async function uploadChatFile(data: any) { + return requestClient.upload('upload/chat-file', data); +} /** * 通过文件id集合获取文件信息 diff --git a/apps/web-antd/src/util/tool.ts b/apps/web-antd/src/util/tool.ts index 60ae1a53..2c41d111 100644 --- a/apps/web-antd/src/util/tool.ts +++ b/apps/web-antd/src/util/tool.ts @@ -3,6 +3,24 @@ import type { DescItem } from '#/components/description'; import { isFunction } from '@vben/utils'; +import SysAudioMp3 from '/public/audio/sys.mp3'; + + +export const playOnceAndDestroySys = () => { + const audio = new Audio(SysAudioMp3); + + // 播放音频 + audio.play().catch((error) => { + console.error('音频播放失败:', error); + audio.remove(); // 如果播放失败,也移除音频对象 + }); + + // 播放结束后销毁音频对象 + audio.addEventListener('ended', () => { + audio.remove(); // 移除DOM中的audio元素(如果是动态创建的) + audio.src = ''; // 清空音频源以释放内存 + }); +}; export const omit = (obj: any, keysToOmit: string[]) => { // 如果 obj 不是对象或者 keysToOmit 不是数组,则直接返回 obj if (typeof obj !== 'object' || !Array.isArray(keysToOmit)) { diff --git a/apps/web-antd/src/views/business/chat/api/index.ts b/apps/web-antd/src/views/business/chat/api/index.ts index 0cf2fa1f..9e4d7251 100644 --- a/apps/web-antd/src/views/business/chat/api/index.ts +++ b/apps/web-antd/src/views/business/chat/api/index.ts @@ -8,3 +8,13 @@ const prefix = 'chat-friends/'; export async function getChatFriendsListApi(data: any = {}) { return requestClient.get(`${prefix}list`, { params: data }); } +// chat-friends/messages-by-room-id + +/** + * 获取当前登录的诊所信息 + * @param data + */ +export async function getChatMessageListApi(data: any = {}) { + // return requestClient.post(`${prefix}messages-by-room-id`, { params: data }); + return requestClient.post(`${prefix}messages-by-room-id`, data); +} diff --git a/apps/web-antd/src/views/business/chat/components/ChatHeader.vue b/apps/web-antd/src/views/business/chat/components/ChatHeader.vue index 55c2d15a..b27fcf7f 100644 --- a/apps/web-antd/src/views/business/chat/components/ChatHeader.vue +++ b/apps/web-antd/src/views/business/chat/components/ChatHeader.vue @@ -1,79 +1,10 @@ - - + +