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:
cg
2026-07-22 23:03:40 +08:00
parent 9052a6f4da
commit c7c023975d
21 changed files with 5677 additions and 385 deletions
+37 -27
View File
@@ -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) {