diff --git a/miniapp/api/chat.js b/miniapp/api/chat.js index 59740a5..8fe48db 100644 --- a/miniapp/api/chat.js +++ b/miniapp/api/chat.js @@ -23,6 +23,7 @@ export async function getSessions() { targetUserId: item.otherUserId, targetNickname: item.otherNickname, targetAvatar: item.otherAvatar, + otherIsRealName: item.otherIsRealName, lastMessage: item.lastMessageContent, lastMessageType: item.lastMessageType, lastMessageTime: item.lastMessageTime, diff --git a/miniapp/pages/search/result.vue b/miniapp/pages/search/result.vue index 80001f9..3c99665 100644 --- a/miniapp/pages/search/result.vue +++ b/miniapp/pages/search/result.vue @@ -176,9 +176,13 @@ - - 🔒 - 开通诚意会员 联系对方 + + 🔒 + {{ isSincereMemberOrAbove ? '联系对方' : '开通诚意会员 联系对方' }} @@ -191,7 +195,7 @@ - + 查看诚意会员其他特权 @@ -216,6 +220,11 @@ const statusBarHeight = ref(20) // 会员状态 const isMember = computed(() => userStore.isMember) +// 是否是诚意会员及以上(memberLevel >= 2) +const isSincereMemberOrAbove = computed(() => { + return userStore.isMember && userStore.memberLevel >= 2 +}) + // 获取会员图标URL const getMemberIconUrl = (memberLevel) => { if (!memberLevel) return '' @@ -397,6 +406,21 @@ const loadMore = () => { // 点击用户卡片 const handleCardClick = (userId) => { + // 检查是否是诚意会员及以上 + if (!isSincereMemberOrAbove.value) { + uni.showModal({ + title: '提示', + content: '开通诚意会员后,才能查看搜索结果的详细资料', + confirmText: '去开通', + success: (res) => { + if (res.confirm) { + goToMember() + } + } + }) + return + } + uni.navigateTo({ url: `/pages/profile/detail?userId=${userId}` }) @@ -407,8 +431,18 @@ const handleContact = (userId) => { // 从列表中找到对应用户 const targetUser = results.value.find(item => item.userId === userId) - if (!isMember.value) { - goToMember() + // 检查是否是诚意会员及以上 + if (!isSincereMemberOrAbove.value) { + uni.showModal({ + title: '提示', + content: '开通诚意会员后,才能联系搜索结果中的用户', + confirmText: '去开通', + success: (res) => { + if (res.confirm) { + goToMember() + } + } + }) return } @@ -737,6 +771,15 @@ onMounted(() => { font-size: 28rpx; color: #333; } + + // 诚意会员及以上的按钮样式 + &.contact-btn-member { + background: linear-gradient(90deg, #FFBDC2 0%, #FF8A93 100%); + + text { + color: #fff; + } + } } } diff --git a/server/src/XiangYi.Application/Services/ChatService.cs b/server/src/XiangYi.Application/Services/ChatService.cs index 876d2df..4840fb8 100644 --- a/server/src/XiangYi.Application/Services/ChatService.cs +++ b/server/src/XiangYi.Application/Services/ChatService.cs @@ -77,6 +77,21 @@ public class ChatService : IChatService throw new BusinessException(ErrorCodes.InvalidMessageType, "无效的消息类型"); } + // 当收到新消息时,自动恢复接收者已删除的会话 + var needUpdateSession = false; + if (session.User1Id == receiverId && session.User1Deleted) + { + session.User1Deleted = false; + needUpdateSession = true; + _logger.LogInformation("恢复接收者已删除的会话: SessionId={SessionId}, ReceiverId={ReceiverId}", session.Id, receiverId); + } + else if (session.User2Id == receiverId && session.User2Deleted) + { + session.User2Deleted = false; + needUpdateSession = true; + _logger.LogInformation("恢复接收者已删除的会话: SessionId={SessionId}, ReceiverId={ReceiverId}", session.Id, receiverId); + } + // 检查是否是该会话的首条消息(用于发送首次消息通知) var isFirstMessage = !await _messageRepository.ExistsAsync(m => m.SessionId == request.SessionId && @@ -101,8 +116,8 @@ public class ChatService : IChatService var createdMessage = await _messageRepository.AddAsync(message); - // 更新会话最后消息信息和未读数 - await UpdateSessionLastMessageAsync(session, createdMessage, senderId); + // 更新会话最后消息信息和未读数(如果需要恢复会话,也一并更新) + await UpdateSessionLastMessageAsync(session, createdMessage, senderId, needUpdateSession); _logger.LogInformation("发送消息成功: MessageId={MessageId}, SessionId={SessionId}, SenderId={SenderId}, ReceiverId={ReceiverId}", createdMessage.Id, request.SessionId, senderId, request.ReceiverId); @@ -151,10 +166,26 @@ public class ChatService : IChatService /// public async Task> GetSessionsAsync(long userId) { + _logger.LogInformation("获取会话列表: UserId={UserId}", userId); + + // 先查询所有相关会话(包括已删除的),用于诊断 + var allSessions = await _sessionRepository.GetListAsync(s => + s.User1Id == userId || s.User2Id == userId); + + _logger.LogInformation("用户相关的所有会话(含已删除): Count={Count}, UserId={UserId}", allSessions.Count, userId); + + foreach (var s in allSessions) + { + _logger.LogInformation("会话详情: SessionId={SessionId}, User1Id={User1Id}, User2Id={User2Id}, User1Deleted={User1Deleted}, User2Deleted={User2Deleted}, LastMessageTime={LastMessageTime}", + s.Id, s.User1Id, s.User2Id, s.User1Deleted, s.User2Deleted, s.LastMessageTime); + } + // 获取用户参与的所有会话,排除已删除的 var sessions = await _sessionRepository.GetListAsync(s => (s.User1Id == userId && !s.User1Deleted) || (s.User2Id == userId && !s.User2Deleted)); + _logger.LogInformation("查询到会话数量(排除已删除): Count={Count}, UserId={UserId}", sessions.Count, userId); + // 按最后消息时间排序 sessions = sessions.OrderByDescending(s => s.LastMessageTime ?? s.CreateTime).ToList(); @@ -204,6 +235,27 @@ public class ChatService : IChatService if (existingSession != null) { + // 如果会话存在但被当前用户删除了,恢复它 + var needUpdate = false; + if (userId1 == user1Id && existingSession.User1Deleted) + { + existingSession.User1Deleted = false; + needUpdate = true; + } + else if (userId1 == user2Id && existingSession.User2Deleted) + { + existingSession.User2Deleted = false; + needUpdate = true; + } + + if (needUpdate) + { + existingSession.UpdateTime = DateTime.Now; + await _sessionRepository.UpdateAsync(existingSession); + _logger.LogInformation("恢复已删除的聊天会话: SessionId={SessionId}, UserId={UserId}", + existingSession.Id, userId1); + } + return existingSession.Id; } @@ -688,7 +740,11 @@ public class ChatService : IChatService /// /// 更新会话最后消息信息 /// - private async Task UpdateSessionLastMessageAsync(ChatSession session, ChatMessage message, long senderId) + /// 会话 + /// 消息 + /// 发送者ID + /// 是否强制更新(用于恢复已删除会话等场景) + private async Task UpdateSessionLastMessageAsync(ChatSession session, ChatMessage message, long senderId, bool forceUpdate = false) { session.LastMessageId = message.Id; session.LastMessageTime = message.CreateTime;