This commit is contained in:
18631081161 2026-01-29 20:31:24 +08:00
parent e66142eb9d
commit 56456a1c04
3 changed files with 109 additions and 9 deletions

View File

@ -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,

View File

@ -176,9 +176,13 @@
</view>
<!-- 联系按钮 -->
<view class="contact-btn" @click.stop="handleContact(user.userId)">
<text class="lock-icon">🔒</text>
<text>开通诚意会员 联系对方</text>
<view
class="contact-btn"
:class="{ 'contact-btn-member': isSincereMemberOrAbove }"
@click.stop="handleContact(user.userId)"
>
<text class="lock-icon" v-if="!isSincereMemberOrAbove">🔒</text>
<text>{{ isSincereMemberOrAbove ? '联系对方' : '开通诚意会员 联系对方' }}</text>
</view>
</view>
</view>
@ -191,7 +195,7 @@
</scroll-view>
<!-- 底部会员按钮 -->
<view class="bottom-bar" v-if="!isMember">
<view class="bottom-bar" v-if="!isSincereMemberOrAbove">
<button class="member-btn" @click="goToMember">开通诚意会员</button>
<text class="member-tip" @click="goToMember">查看诚意会员其他特权</text>
</view>
@ -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;
}
}
}
}

View File

@ -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
/// <inheritdoc />
public async Task<List<ChatSessionResponse>> 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
/// <summary>
/// 更新会话最后消息信息
/// </summary>
private async Task UpdateSessionLastMessageAsync(ChatSession session, ChatMessage message, long senderId)
/// <param name="session">会话</param>
/// <param name="message">消息</param>
/// <param name="senderId">发送者ID</param>
/// <param name="forceUpdate">是否强制更新(用于恢复已删除会话等场景)</param>
private async Task UpdateSessionLastMessageAsync(ChatSession session, ChatMessage message, long senderId, bool forceUpdate = false)
{
session.LastMessageId = message.Id;
session.LastMessageTime = message.CreateTime;