Files
nl-im-pc/src/utils/request.js
liqi 56d6a51754 修复:
1. 接听电话以实现
2. 后端接口适配实现

现有问题:
1. rtc通话问题待修复
2. 点击接听会有挂断的报错,需要检查逻辑
3. 修复lastMessage的更新问题
2025-07-09 09:34:26 +08:00

343 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import axios from "axios"
import { message } from "ant-design-vue"
// 创建 Axios 实例
const service = axios.create({
baseURL: "/api/",
timeout: 15000,
})
// 请求拦截器
service.interceptors.request.use(
(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)
},
)
// 响应拦截器
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))
}
message.error(msg)
return Promise.reject(new Error(msg))
}
},
(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)
}
message.error("网络请求失败")
return Promise.reject(error)
},
)
// CORS错误的备用处理方案
const handleCORSError = (config) => {
console.log("执行CORS错误备用方案...")
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
})
}
// 封装请求方法
export const get = (url, params = {}) => {
return service.get(url, { params })
}
export const 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",
},
})
}
// 发送普通消息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 || "",
// 添加来源标记
isFromHttp: true,
}
// 如果包含通话信令添加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 const sendCallSignal = (signalData) => {
const apiUrl = "/api/send-to-user"
// 验证必要参数
if (!signalData.sender_user_id) {
throw new Error("缺少发送方用户ID")
}
if (!signalData.receiver_user_id) {
throw new Error("缺少接收方用户ID")
}
if (!signalData.call_id) {
throw new Error("缺少通话ID")
}
if (!signalData.call_status) {
throw new Error("缺少通话状态")
}
// 构建通话信令请求数据
const requestData = {
sender_user_id: signalData.sender_user_id,
receiver_user_id: signalData.receiver_user_id,
message_type: signalData.message_type || 6, // 默认视频通话
message_content: signalData.message_content || JSON.stringify(signalData.data || {}),
call_id: signalData.call_id,
call_status: signalData.call_status,
// 添加来源标记
isFromHttp: true,
}
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)
// 提供更详细的错误信息
if (error.response) {
console.error("响应错误:", error.response.data)
console.error("响应状态:", error.response.status)
console.error("响应头:", error.response.headers)
} else if (error.request) {
console.error("请求错误:", error.request)
} else {
console.error("配置错误:", error.message)
}
throw error
})
}
// 通话相关的便捷方法
export const callAPI = {
// 发起通话邀请
invite: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "invite",
message_type: callType, // 6=视频, 7=语音
})
},
// 接受通话
accept: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "accepted",
message_type: callType,
})
},
// 拒绝通话
reject: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "rejected",
message_type: callType,
})
},
// 结束通话
end: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "ended",
message_type: callType,
})
},
// 发送WebRTC Offer
sendOffer: (senderUserId, receiverUserId, callId, offerData, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "offer",
message_type: callType,
data: offerData,
})
},
// 发送WebRTC Answer
sendAnswer: (senderUserId, receiverUserId, callId, answerData, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "answer",
message_type: callType,
data: answerData,
})
},
// 发送ICE候选
sendCandidate: (senderUserId, receiverUserId, callId, candidateData, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "candidate",
message_type: callType,
data: candidateData,
})
},
// 发送忙线状态
sendBusy: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "busy",
message_type: callType,
})
},
// 发送无人接听
sendNoAnswer: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "no-answer",
message_type: callType,
})
},
// 发送通话失败
sendFailed: (senderUserId, receiverUserId, callId, callType = 6) => {
return sendCallSignal({
sender_user_id: senderUserId,
receiver_user_id: receiverUserId,
call_id: callId,
call_status: "failed",
message_type: callType,
})
},
}
export default service