/** * 聊天接口模块 * Requirements: 7.1, 7.2, 7.3 */ import { get, post } from './request' import config from '../config/index' import { getToken } from '../utils/storage' /** * 获取会话列表 * * @returns {Promise} 会话列表 */ export async function getSessions() { const response = await get('/chat/sessions') // 统一返回格式 if (response && response.code === 0) { // 后端字段映射到前端字段 const list = Array.isArray(response.data) ? response.data : (response.data?.list || []) const mappedList = list.map(item => ({ sessionId: item.sessionId, targetUserId: item.otherUserId, targetNickname: item.otherNickname, targetAvatar: item.otherAvatar, lastMessage: item.lastMessageContent, lastMessageType: item.lastMessageType, lastMessageTime: item.lastMessageTime, unreadCount: item.unreadCount })) return { success: true, data: mappedList } } return { success: false, data: [] } } /** * 获取消息列表 * WHEN a user opens chat page, THE XiangYi_MiniApp SHALL call endpoint and display message history * Requirements: 7.1 * * @param {number} sessionId - 会话ID * @param {number} [pageIndex=1] - 页码 * @param {number} [pageSize=20] - 每页数量 * @returns {Promise} 消息列表 */ export async function getMessages(sessionId, pageIndex = 1, pageSize = 20) { const response = await get('/chat/messages', { sessionId, pageIndex, pageSize }) return response } /** * 发送消息 * WHEN a user sends a text message, THE XiangYi_MiniApp SHALL call endpoint * Requirements: 7.2 * * @param {Object} data - 消息数据 * @param {number} data.sessionId - 会话ID * @param {number} data.receiverId - 接收者ID * @param {number} data.messageType - 消息类型:1文本 2语音 3图片 * @param {string} data.content - 消息内容 * @returns {Promise} 发送结果 */ export async function sendMessage(data) { const response = await post('/chat/send', data) return response } /** * 请求交换微信 * WHEN a user clicks "交换微信" button, THE XiangYi_MiniApp SHALL call endpoint * Requirements: 7.3 * * @param {number} sessionId - 会话ID * @param {number} receiverId - 接收者ID * @returns {Promise} 交换请求结果 */ export async function exchangeWeChat(sessionId, receiverId) { const response = await post('/chat/exchangeWeChat', { sessionId, receiverId }) return response } /** * 请求交换照片 * * @param {number} sessionId - 会话ID * @param {number} receiverId - 接收者ID * @returns {Promise} 交换请求结果 */ export async function exchangePhoto(sessionId, receiverId) { const response = await post('/chat/exchangePhoto', { sessionId, receiverId }) return response } /** * 响应交换请求 * * @param {number} requestMessageId - 请求消息ID * @param {boolean} accept - 是否接受 * @returns {Promise} 响应结果 */ export async function respondExchange(requestMessageId, accept) { const response = await post('/chat/respondExchange', { requestMessageId, isAgreed: accept }) return response } /** * 获取未读消息数 * * @returns {Promise} 未读消息数 */ export async function getUnreadCount() { const response = await get('/chat/unreadCount') return response } /** * 获取或创建会话 * * @param {number} targetUserId - 目标用户ID * @returns {Promise} 会话ID */ export async function getOrCreateSession(targetUserId) { const response = await get('/chat/session', { targetUserId }) return response } /** * 删除会话 * * @param {number} sessionId - 会话ID * @returns {Promise} 删除结果 */ export async function deleteSession(sessionId) { const response = await post('/chat/session/delete', { sessionId }) return response } /** * 上传语音文件 * * @param {string} filePath - 临时文件路径 * @returns {Promise} 上传结果,包含 voiceUrl */ export async function uploadVoice(filePath) { return new Promise((resolve, reject) => { // 简化 URL 拼接 const uploadUrl = `${config.API_BASE_URL}/upload/voice` uni.uploadFile({ url: uploadUrl, filePath: filePath, name: 'file', header: { 'Authorization': `Bearer ${getToken()}` }, success: (res) => { if (res.statusCode === 200) { try { const data = JSON.parse(res.data) if (data.code === 0) { resolve(data) } else { reject(new Error(data.message || '上传失败')) } } catch (e) { reject(new Error('解析响应失败')) } } else { reject(new Error(`上传失败: ${res.statusCode}`)) } }, fail: (err) => { reject(new Error(err.errMsg || '网络错误')) } }) }) } export default { getSessions, getMessages, sendMessage, exchangeWeChat, exchangePhoto, respondExchange, getUnreadCount, getOrCreateSession, deleteSession, uploadVoice }