fix: 聊天功能(部分)
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled

This commit is contained in:
2025-07-22 16:55:09 +08:00
parent b17e6c53ad
commit 2423326951
7 changed files with 55 additions and 52 deletions

View File

@@ -62,7 +62,7 @@ const initWebsocket = () => {
chatStore.initDB();
// 加载好友列表使用用户ID
chatStore.loadFriends(userStore.presetUsers, userStore.currentUser?.id);
chatStore.loadFriends(userStore.presetUsers, userStore.currentUser?.doctor_id);
// 创建WebSocket连接
connectWebSocket();

View File

@@ -312,6 +312,7 @@ const handleAudioRecorded = (event) => {
sendMessage({
senderId: userStore.currentUser.id,
receiverId: chatStore.currentFriend.id,
roomId: chatStore.currentFriend.room_id,
type: 'audio',
content: url
}).catch(error => {

View File

@@ -1,67 +1,70 @@
import {ref} from "vue"
import {message} from "ant-design-vue"
import { ref } from 'vue';
import { message } from 'ant-design-vue';
export function useRecording() {
const isRecording = ref(false)
const mediaRecorder = ref(null)
const audioChunks = ref([])
const recordingStartTime = ref(0)
const isRecording = ref(false);
const mediaRecorder = ref(null);
const audioChunks = ref([]);
const recordingStartTime = ref(0);
const startRecording = () => {
if (isRecording.value) return
if (isRecording.value) return;
navigator.mediaDevices
.getUserMedia({audio: true})
.getUserMedia({ audio: true })
.then((stream) => {
isRecording.value = true
audioChunks.value = []
recordingStartTime.value = Date.now()
isRecording.value = true;
audioChunks.value = [];
recordingStartTime.value = Date.now();
mediaRecorder.value = new MediaRecorder(stream)
mediaRecorder.value = new MediaRecorder(stream);
mediaRecorder.value.ondataavailable = (event) => {
audioChunks.value.push(event.data)
}
audioChunks.value.push(event.data);
};
mediaRecorder.value.onstop = () => {
const audioBlob = new Blob(audioChunks.value, {type: "audio/wav"})
const audioUrl = URL.createObjectURL(audioBlob)
const duration = Math.floor((Date.now() - recordingStartTime.value) / 1000)
const audioBlob = new Blob(audioChunks.value, { type: 'audio/wav' });
const audioUrl = URL.createObjectURL(audioBlob);
const duration = Math.floor(
(Date.now() - recordingStartTime.value) / 1000,
);
console.log(' aaa', 'ssssssssssssssss')
console.log(' aaa', 'ssssssssssssssss');
// 触发音频消息发送事件
const event = new CustomEvent("audioRecorded", {
const event = new CustomEvent('audioRecorded', {
detail: {
url: audioUrl,
duration: duration,
duration,
blob: audioBlob,
},
})
window.dispatchEvent(event)
});
window.dispatchEvent(event);
// 停止所有音频轨道
stream.getTracks().forEach((track) => track.stop())
}
stream.getTracks().forEach((track) => track.stop());
};
mediaRecorder.value.start()
mediaRecorder.value.start();
})
.catch((error) => {
console.error("录音失败:", error)
message.error("无法访问麦克风,请检查权限设置")
isRecording.value = false
})
}
console.error('录音失败:', error);
message.error('无法访问麦克风,请检查权限设置');
isRecording.value = false;
});
};
const stopRecording = () => {
if (!isRecording.value || !mediaRecorder.value) return
if (!isRecording.value || !mediaRecorder.value) return;
isRecording.value = false
mediaRecorder.value.stop()
}
isRecording.value = false;
mediaRecorder.value.stop();
};
return {
isRecording,
startRecording,
stopRecording,
}
};
}

View File

@@ -411,7 +411,7 @@ export function useWebRTC() {
);
try {
await callAPI.sendCandidate(
userStore.currentUser?.id,
userStore.currentUser?.doctor_id,
peerId,
callId,
event.candidate,

View File

@@ -48,8 +48,8 @@ export function useWebSocket() {
console.log(userStore.currentUser, 'ssssssssss')
// 绑定当前用户
if (userStore.currentUser?.id) {
bindUser(userStore.currentUser.id);
if (userStore.currentUser?.doctor_id) {
bindUser(userStore.currentUser.doctor_id);
}
};
@@ -66,7 +66,7 @@ export function useWebSocket() {
// 处理普通消息 - 添加来源判断防止循环
if (data.sender_user_id && data.receiver_user_id) {
chatStore.handleIncomingMessage(data, userStore.currentUser?.id);
chatStore.handleIncomingMessage(data, userStore.currentUser?.doctor_id);
}
} catch (error) {
console.error('解析WebSocket消息失败:', error);
@@ -135,7 +135,7 @@ export function useWebSocket() {
const sendMessage = (receiverUserId, messageType, content) => {
const message = {
request_type: 'send_message',
sender_user_id: userStore.currentUser?.id,
sender_user_id: userStore.currentUser?.doctor_id,
receiver_user_id: receiverUserId,
message_type: messageType,
message_content: content,
@@ -148,7 +148,7 @@ export function useWebSocket() {
return send({
request_type: 'call_signal',
...signal,
sender_user_id: userStore.currentUser?.id,
sender_user_id: userStore.currentUser?.doctor_id,
});
};

View File

@@ -99,7 +99,7 @@ export const useChatStore = defineStore("chat", () => {
try {
logWithTime("log", "发送通话信令:", signal)
if (!userStore.currentUser?.id) {
if (!userStore.currentUser?.doctor_id) {
throw new Error("用户未登录")
}
@@ -672,7 +672,7 @@ export const useChatStore = defineStore("chat", () => {
type: currentCall.value.callType === "video" ? "video-call" : "audio-call",
content: "[对方已拒绝]",
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: 0,
@@ -760,7 +760,7 @@ export const useChatStore = defineStore("chat", () => {
type: currentCall.value.callType === "video" ? "video-call" : "audio-call",
content: "[未接来电]",
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: 0,
@@ -790,7 +790,7 @@ export const useChatStore = defineStore("chat", () => {
type: currentCall.value.callType === "video" ? "video-call" : "audio-call",
content: "[对方忙线]",
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: 0,
@@ -936,7 +936,7 @@ export const useChatStore = defineStore("chat", () => {
return
}
if (!userStore.currentUser?.id) {
if (!userStore.currentUser?.doctor_id) {
alert("用户未登录,无法发起通话")
return
}
@@ -984,7 +984,7 @@ export const useChatStore = defineStore("chat", () => {
type: type === "video" ? "video-call" : "audio-call",
content: "[未接来电]",
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: 0,
@@ -1119,7 +1119,7 @@ export const useChatStore = defineStore("chat", () => {
type: incomingCall.value.callType === "video" ? "video-call" : "audio-call",
content: content,
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: 0,
@@ -1177,7 +1177,7 @@ export const useChatStore = defineStore("chat", () => {
type: callTypeVal === "video" ? "video-call" : "audio-call",
content: content,
time: new Date().toLocaleTimeString().slice(0, 5),
senderId: userStore.currentUser?.id,
senderId: userStore.currentUser?.doctor_id,
read: true,
timestamp: Date.now(),
duration: duration,

View File

@@ -130,8 +130,7 @@ export const sendMessage = (data) => {
receiver_user_id: data.receiverId.toString(),
message_type: messageTypeMap[data.type] || 0,
message_content: data.content || '',
// 添加来源标记
isFromHttp: true,
duration: data.duration || 0,
};
// 如果包含通话信令添加call_id和call_status