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;