diff --git a/src/stores/chat.js b/src/stores/chat.js index acf2566..c9e8753 100644 --- a/src/stores/chat.js +++ b/src/stores/chat.js @@ -55,7 +55,7 @@ export const useChatStore = defineStore("chat", () => { lastMessage: "", unreadCount: 0, }, - currentUserId, + currentUserId ) } } @@ -69,7 +69,7 @@ export const useChatStore = defineStore("chat", () => { friend.lastMessage = "" friend.unreadCount = 0 }) - friends.value = friendList + friends.value = friend极 } } @@ -162,6 +162,7 @@ export const useChatStore = defineStore("chat", () => { } else { // 更新未读消息计数 const friend = friends.value.find((f) => f.id == senderId) + console.log(f.id == senderId, senderId, f) if (friend) { friend.unreadCount = (friend.unreadCount || 0) + 1 @@ -183,7 +184,11 @@ export const useChatStore = defineStore("chat", () => { // 根据消息类型编号获取类型字符串 const getMessageType = (type) => { - const types = ["text", "image", "audio", "video", "prescription", "medical-record", "video-call", "audio-call", "file"] + const types = [ + "text", "image", "audio", "video", + "prescription", "medical-record", + "video-call", "audio-call", "file" + ] return types[type] || "text" } @@ -274,14 +279,13 @@ export const useChatStore = defineStore("chat", () => { callStatus.value = "calling" - // 发送通话邀请 + // 修复参数传递问题 sendMessage({ - sender_user_id: userStore.currentUser?.id, - receiver_user_id: peerId, - message_type: type === "video" ? 6 : 7, // 6=视频,7=语音 - message_content: "", // 对于邀请,内容为空 - call_id: callId, - call_status: "invite" + senderId: userStore.currentUser?.id, + receiverId: peerId, + type: type === "video" ? "video-call" : "audio-call", + callId: callId, + callStatus: "invite" }) console.log("发起通话:", currentCall.value) @@ -291,14 +295,13 @@ export const useChatStore = defineStore("chat", () => { const acceptCall = () => { if (!incomingCall.value) return - // 发送接受响应 + // 修复参数传递问题 sendMessage({ - sender_user_id: userStore.currentUser?.id, - receiver_user_id: incomingCall.value.callerId, - message_type: incomingCall.value.callType === "video" ? 6 : 7, - message_content: "", // 对于接受,内容为空 - call_id: incomingCall.value.callId, - call_status: "accepted" + senderId: userStore.currentUser?.id, + receiverId: incomingCall.value.callerId, + type: incomingCall.value.callType === "video" ? "video-call" : "audio-call", + callId: incomingCall.value.callId, + callStatus: "accepted" }) currentCall.value = { @@ -316,14 +319,13 @@ export const useChatStore = defineStore("chat", () => { const rejectCall = () => { if (!incomingCall.value) return - // 发送拒绝响应 + // 修复参数传递问题 sendMessage({ - sender_user_id: userStore.currentUser?.id, - receiver_user_id: incomingCall.value.callerId, - message_type: incomingCall.value.callType === "video" ? 6 : 7, - message_content: "", // 对于拒绝,内容为空 - call_id: incomingCall.value.callId, - call_status: "rejected" + senderId: userStore.currentUser?.id, + receiverId: incomingCall.value.callerId, + type: incomingCall.value.callType === "video" ? "video-call" : "audio-call", + callId: incomingCall.value.callId, + callStatus: "rejected" }) callStatus.value = "idle" @@ -339,14 +341,13 @@ export const useChatStore = defineStore("chat", () => { if (!callId || !peerId) return - // 发送结束通知 + // 修复参数传递问题 sendMessage({ - sender_user_id: userStore.currentUser?.id, - receiver_user_id: peerId, - message_type: callType === "video" ? 6 : 7, - message_content: "", - call_id: callId, - call_status: "ended" + senderId: userStore.currentUser?.id, + receiverId: peerId, + type: callType === "video" ? "video-call" : "audio-call", + callId: callId, + callStatus: "ended" }) callStatus.value = "idle" diff --git a/src/utils/request.js b/src/utils/request.js index cddbf78..0b29474 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -3,149 +3,160 @@ import { message } from "ant-design-vue" // 创建 Axios 实例 const service = axios.create({ - baseURL: "/api/", - timeout: 15000, + baseURL: "/api/", + timeout: 15000, }) // 请求拦截器 service.interceptors.request.use( (config) => { - const token = localStorage.getItem("token") - if (token) { - config.headers["Authorization"] = `Bearer ${token}` - } - return config + const token = localStorage.getItem("token") + if (token) { + config.headers["Authorization"] = `Bearer ${token}` + } + return config }, (error) => { - console.error("Request error:", error) - return Promise.reject(error) - }, + console.error("Request error:", error) + return Promise.reject(error) + } ) // 响应拦截器 service.interceptors.response.use( (response) => { - const { code, result, message: msg } = response.data - if (code === 0) { - return result - } else { - if (code === 401) { - message.error(msg) - localStorage.removeItem("token") - localStorage.removeItem("chatUser") - window.location.href = "/login" - return Promise.reject(new Error(msg)) + const { code, result, message: msg } = response.data + if (code === 0) { + return result + } else { + if (code === 401) { + message.error(msg) + localStorage.removeItem("token") + localStorage.removeItem("chatUser") + window.location.href = "/login" + return Promise.reject(new极(msg)) + } + message.error(msg) + return Promise.reject(new Error(msg)) } - message.error(msg) - return Promise.reject(new Error(msg)) - } }, (error) => { - console.error("Response error:", error) + console.error("Response error:", error) - // 详细的错误处理 - if (error.code === "ECONNABORTED") { - console.log("请求超时,请检查网络连接") - } else if (error.response?.status === 0 || error.message.includes("CORS")) { - console.log("CORS错误检测到,尝试备用方案...") - handleCORSError(error.config) - } else if (error.response?.status >= 400 && error.response?.status < 500) { - console.log("客户端错误:", error.response.status, error.response.data) - } else if (error.response?.status >= 500) { - console.log("服务器错误:", error.response.status) - } else { - console.log("网络错误:", error.message) - } + // 详细的错误处理 + if (error.code === "ECONNABORTED") { + console.log("请求超时,请检查网络连接") + } else if (error.response?.status === 0 || error.message.includes("CORS")) { + console.log("CORS错误检测到,尝试备用方案...") + handleCORSError(error.config) + } else if (error.response?.status >= 400 && error.response?.status < 500) { + console.log("客户端错误:", error.response.status, error.response.data) + } else if (error.response?.status >= 500) { + console.log("服务器错误:", error.response.status) + } else { + console.log("网络错误:", error.message) + } - message.error("网络请求失败") - return Promise.reject(error) - }, + message.error("网络请求失败") + return Promise.reject(error) + } ) // CORS错误的备用处理方案 const handleCORSError = (config) => { - console.log("执行CORS错误备用方案...") + console.log("执行CORS错误备用方案...") + const apiUrl = config.url.replace("/api", "") - // /* "http://g-ws.nailaoyun.cn" + */ - const apiUrl = config.url.replace("/api", "") - - return fetch(apiUrl, { - method: config.method.toUpperCase(), - headers: { - "Content-Type": "application/json", - ...config.headers, - }, - mode: "cors", - body: config.data ? JSON.stringify(config.data) : undefined, - }) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`) - } - return response.json() - }) - .catch((error) => { - console.error("备用方案也失败:", error) - throw error - }) + return fetch(apiUrl, { + method: config.method.toUpperCase(), + headers: { + "Content-Type": "application/json", + ...config.headers, + }, + mode: "cors", + body: config.data ? JSON.stringify(config.data) : undefined, + }) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + return response.json() + }) + .catch((error) => { + console.error("备用方案也失败:", error) + throw error + }) } // 封装请求方法 export const get = (url, params = {}) => { - return service.get(url, { params }) + return service.get(url, { params }) } export const post = (url, data = {}) => { - return service.post(url, data) + return service.post(url, data) } export const upload = (url, file) => { - const formData = new FormData() - formData.append("file", file) - return service.post(url, formData, { - headers: { - "Content-Type": "multipart/form-data", - }, - }) -} - -// WebSocket消息发送API -export const sendMessage = (data) => { - const messageTypeMap = { - text: 0, - image: 1, - audio: 2, - video: 3, - } - - // 直接使用固定的后端接口地址 - const apiUrl = "/api/send-to-user" - - const requestData = { - sender_user_id: data.senderId, - receiver_user_id: data.receiverId, - message_type: messageTypeMap[data.type] || 0, - message_content: data.content, - } - - console.log("发送消息到API:", apiUrl, requestData) - - return axios - .post(apiUrl, requestData, { + const formData = new FormData() + formData.append("file", file) + return service.post(url, formData, { headers: { - "Content-Type": "application/json", + "Content-Type": "multipart/form-data", }, - timeout: 15000, - withCredentials: false, - }) - .then((response) => { - console.log("消息发送成功:", response.data) - return response.data - }) - .catch((error) => { - console.error("消息发送失败:", error) - throw error - }) + }) } -export default service +// 发送消息API(支持普通消息和通话信令) +export const sendMessage = (data) => { + const apiUrl = "/api/send-to-user" + + // 消息类型映射 - 根据用户提供的完整映射更新 + const messageTypeMap = { + text: 0, + image: 1, + audio: 2, + video: 3, + prescription: 4, + "medical-record": 5, + "video-call": 6, + "audio-call": 7, + file: 8 + } + + const requestData = { + sender_user_id: data.senderId, + receiver_user_id: data.receiverId, + message_type: messageTypeMap[data.type] || 0, + message_content: data.content || "", + } + + // 如果包含通话信令,添加call_id和call_status + if (data.callId) { + requestData.call_id = data.callId + } + if (data.callStatus) { + requestData.call_status = data.callStatus + } + + console.log("发送消息到API:", apiUrl, requestData) + + return axios + .post(apiUrl, requestData, { + headers: { + "Content-Type": "application/json", + }, + timeout: 15000, + withCredentials: false, + }) + .then((response) => { + console.log("消息发送成功:", response.data) + return response.data + }) + .catch((error) => { + console.error("消息发送失败:", error) + throw error + }) +} + +export default service \ No newline at end of file