feat(circle): 集成HaveADrink SDK实现酒友圈功能
- 集成HaveADrink SDK版本从1.0.4升级至1.0.8 - 实现酒友圈API接口,替换原有的mock数据 - 添加地理位置权限配置(requiredPrivateInfos) - 重构API调用方式,统一使用client实例调用真实接口 - 更新WebSocket协议与SDK保持一致,支持聊天、输入状态、已读回执等功能 - 实现游标分页获取动态信息流 - 添加文件上传API支持图片上传 - 优化API错误处理,支持业务级错误提示 - 调整酒局状态显示,新增upcoming待开始状态 - 优化自我感觉标签映射逻辑,支持更多状态类型 - 更新websocket连接认证方式,使用Authorization header传递token - 添加服务端连接确认和被踢下线事件处理
This commit is contained in:
+37
-27
@@ -119,7 +119,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { GetMessages, MarkRead } from '../../common/api'
|
||||
import { GetMessages, MarkRead, GetConversations } from '../../common/api'
|
||||
import wsManager from '../../common/websocket'
|
||||
import themeMixin from '../../common/theme-mixin'
|
||||
|
||||
@@ -140,7 +140,7 @@ export default {
|
||||
isOnline: false,
|
||||
peerTyping: false,
|
||||
typingTimer: null,
|
||||
page: 1,
|
||||
lastID: 0,
|
||||
hasMore: true
|
||||
}
|
||||
},
|
||||
@@ -148,9 +148,7 @@ export default {
|
||||
this.friendId = options.friendId || ''
|
||||
this.nickname = decodeURIComponent(options.nickname || '')
|
||||
this.conversationId = options.conversationId || ''
|
||||
this.loadMessages()
|
||||
this.markRead()
|
||||
this.bindWsEvents()
|
||||
this.initChat()
|
||||
// 监听键盘高度变化,动态调整输入栏位置(避免键盘顶起整个页面)
|
||||
uni.onKeyboardHeightChange(res => {
|
||||
this.keyboardHeight = res.height
|
||||
@@ -176,12 +174,32 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// === 初始化聊天 ===
|
||||
async initChat() {
|
||||
// 如果没有传入 conversationId,通过会话列表查找
|
||||
if (!this.conversationId && this.friendId) {
|
||||
try {
|
||||
const res = await GetConversations()
|
||||
const conv = (res.data.list || []).find(c => String(c.friendId) === String(this.friendId))
|
||||
if (conv) {
|
||||
this.conversationId = conv.id
|
||||
}
|
||||
} catch (e) { /* ignore */ }
|
||||
}
|
||||
this.loadMessages()
|
||||
this.markRead()
|
||||
this.bindWsEvents()
|
||||
},
|
||||
// === 数据加载 ===
|
||||
async loadMessages() {
|
||||
try {
|
||||
const res = await GetMessages({ conversationId: this.conversationId, page: this.page })
|
||||
this.messages = res.data.list
|
||||
const res = await GetMessages({ conversationId: this.conversationId, lastID: this.lastID, pageSize: 20 })
|
||||
this.messages = res.data.list || []
|
||||
this.hasMore = res.data.hasMore
|
||||
// 记录最早一条消息ID作为加载更多游标
|
||||
if (this.messages.length) {
|
||||
this.lastID = this.messages[0].id
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.scrollToBottom()
|
||||
})
|
||||
@@ -219,12 +237,12 @@ export default {
|
||||
/** 收到新消息 */
|
||||
onWsMessage(data) {
|
||||
// 只处理当前会话的消息
|
||||
if (data.senderId !== this.friendId) return
|
||||
if (String(data.senderId) !== String(this.friendId)) return
|
||||
const msg = {
|
||||
id: data.msgId || 'msg_' + Date.now(),
|
||||
conversationId: this.conversationId,
|
||||
id: data.msgId ? String(data.msgId) : 'msg_' + Date.now(),
|
||||
conversationId: data.conversationId || this.conversationId,
|
||||
senderId: data.senderId,
|
||||
receiverId: 'user_001',
|
||||
receiverId: data.receiverId,
|
||||
type: data.msgType || 'text',
|
||||
content: data.content,
|
||||
timestamp: data.timestamp || Date.now(),
|
||||
@@ -242,7 +260,7 @@ export default {
|
||||
|
||||
/** 对方正在输入 */
|
||||
onWsTyping(data) {
|
||||
if (data.senderId !== this.friendId) return
|
||||
if (String(data.senderId) !== String(this.friendId)) return
|
||||
this.peerTyping = true
|
||||
if (this.typingTimer) clearTimeout(this.typingTimer)
|
||||
this.typingTimer = setTimeout(() => {
|
||||
@@ -252,9 +270,9 @@ export default {
|
||||
|
||||
/** 消息送达确认 */
|
||||
onWsAck(data) {
|
||||
const msg = this.messages.find(m => m.id === data.clientMsgId)
|
||||
const msg = this.messages.find(m => m.id === data.clientMsgId || m.id === String(data.clientMsgId))
|
||||
if (msg) {
|
||||
msg.id = data.msgId || msg.id
|
||||
msg.id = data.msgId ? String(data.msgId) : msg.id
|
||||
msg.status = data.status || 'sent'
|
||||
}
|
||||
},
|
||||
@@ -268,7 +286,7 @@ export default {
|
||||
const msg = {
|
||||
id: clientMsgId,
|
||||
conversationId: this.conversationId,
|
||||
senderId: 'user_001',
|
||||
senderId: wsManager.userId || 'self',
|
||||
receiverId: this.friendId,
|
||||
type: 'text',
|
||||
content: text,
|
||||
@@ -288,13 +306,8 @@ export default {
|
||||
receiverId: this.friendId,
|
||||
content: text,
|
||||
msgType: 'text',
|
||||
clientMsgId
|
||||
clientMesgId: clientMsgId
|
||||
})
|
||||
|
||||
// 模拟确认(Mock模式下直接标记为已发送)
|
||||
setTimeout(() => {
|
||||
msg.status = 'sent'
|
||||
}, 500)
|
||||
},
|
||||
|
||||
/** 重发失败消息 */
|
||||
@@ -303,12 +316,9 @@ export default {
|
||||
wsManager.send('chat', {
|
||||
receiverId: this.friendId,
|
||||
content: msg.content,
|
||||
msgType: msg.type,
|
||||
clientMsgId: msg.id
|
||||
msgType: msg.type || 'text',
|
||||
clientMesgId: msg.id
|
||||
})
|
||||
setTimeout(() => {
|
||||
msg.status = 'sent'
|
||||
}, 500)
|
||||
},
|
||||
|
||||
/** 点击发送按钮时记录时间戳 */
|
||||
@@ -334,7 +344,7 @@ export default {
|
||||
|
||||
// === 辅助方法 ===
|
||||
isSelf(msg) {
|
||||
return msg.senderId === 'user_001'
|
||||
return String(msg.senderId) === String(wsManager.userId) || msg.senderId === 'self'
|
||||
},
|
||||
|
||||
showTimeDivider(idx) {
|
||||
|
||||
Reference in New Issue
Block a user