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
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:
@@ -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();
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -411,7 +411,7 @@ export function useWebRTC() {
|
||||
);
|
||||
try {
|
||||
await callAPI.sendCandidate(
|
||||
userStore.currentUser?.id,
|
||||
userStore.currentUser?.doctor_id,
|
||||
peerId,
|
||||
callId,
|
||||
event.candidate,
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user