消息
This commit is contained in:
parent
e66142eb9d
commit
56456a1c04
|
|
@ -23,6 +23,7 @@ export async function getSessions() {
|
||||||
targetUserId: item.otherUserId,
|
targetUserId: item.otherUserId,
|
||||||
targetNickname: item.otherNickname,
|
targetNickname: item.otherNickname,
|
||||||
targetAvatar: item.otherAvatar,
|
targetAvatar: item.otherAvatar,
|
||||||
|
otherIsRealName: item.otherIsRealName,
|
||||||
lastMessage: item.lastMessageContent,
|
lastMessage: item.lastMessageContent,
|
||||||
lastMessageType: item.lastMessageType,
|
lastMessageType: item.lastMessageType,
|
||||||
lastMessageTime: item.lastMessageTime,
|
lastMessageTime: item.lastMessageTime,
|
||||||
|
|
|
||||||
|
|
@ -176,9 +176,13 @@
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 联系按钮 -->
|
<!-- 联系按钮 -->
|
||||||
<view class="contact-btn" @click.stop="handleContact(user.userId)">
|
<view
|
||||||
<text class="lock-icon">🔒</text>
|
class="contact-btn"
|
||||||
<text>开通诚意会员 联系对方</text>
|
:class="{ 'contact-btn-member': isSincereMemberOrAbove }"
|
||||||
|
@click.stop="handleContact(user.userId)"
|
||||||
|
>
|
||||||
|
<text class="lock-icon" v-if="!isSincereMemberOrAbove">🔒</text>
|
||||||
|
<text>{{ isSincereMemberOrAbove ? '联系对方' : '开通诚意会员 联系对方' }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -191,7 +195,7 @@
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
<!-- 底部会员按钮 -->
|
<!-- 底部会员按钮 -->
|
||||||
<view class="bottom-bar" v-if="!isMember">
|
<view class="bottom-bar" v-if="!isSincereMemberOrAbove">
|
||||||
<button class="member-btn" @click="goToMember">开通诚意会员</button>
|
<button class="member-btn" @click="goToMember">开通诚意会员</button>
|
||||||
<text class="member-tip" @click="goToMember">查看诚意会员其他特权</text>
|
<text class="member-tip" @click="goToMember">查看诚意会员其他特权</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -216,6 +220,11 @@ const statusBarHeight = ref(20)
|
||||||
// 会员状态
|
// 会员状态
|
||||||
const isMember = computed(() => userStore.isMember)
|
const isMember = computed(() => userStore.isMember)
|
||||||
|
|
||||||
|
// 是否是诚意会员及以上(memberLevel >= 2)
|
||||||
|
const isSincereMemberOrAbove = computed(() => {
|
||||||
|
return userStore.isMember && userStore.memberLevel >= 2
|
||||||
|
})
|
||||||
|
|
||||||
// 获取会员图标URL
|
// 获取会员图标URL
|
||||||
const getMemberIconUrl = (memberLevel) => {
|
const getMemberIconUrl = (memberLevel) => {
|
||||||
if (!memberLevel) return ''
|
if (!memberLevel) return ''
|
||||||
|
|
@ -397,6 +406,21 @@ const loadMore = () => {
|
||||||
|
|
||||||
// 点击用户卡片
|
// 点击用户卡片
|
||||||
const handleCardClick = (userId) => {
|
const handleCardClick = (userId) => {
|
||||||
|
// 检查是否是诚意会员及以上
|
||||||
|
if (!isSincereMemberOrAbove.value) {
|
||||||
|
uni.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: '开通诚意会员后,才能查看搜索结果的详细资料',
|
||||||
|
confirmText: '去开通',
|
||||||
|
success: (res) => {
|
||||||
|
if (res.confirm) {
|
||||||
|
goToMember()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/profile/detail?userId=${userId}`
|
url: `/pages/profile/detail?userId=${userId}`
|
||||||
})
|
})
|
||||||
|
|
@ -407,8 +431,18 @@ const handleContact = (userId) => {
|
||||||
// 从列表中找到对应用户
|
// 从列表中找到对应用户
|
||||||
const targetUser = results.value.find(item => item.userId === 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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -737,6 +771,15 @@ onMounted(() => {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 诚意会员及以上的按钮样式
|
||||||
|
&.contact-btn-member {
|
||||||
|
background: linear-gradient(90deg, #FFBDC2 0%, #FF8A93 100%);
|
||||||
|
|
||||||
|
text {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,21 @@ public class ChatService : IChatService
|
||||||
throw new BusinessException(ErrorCodes.InvalidMessageType, "无效的消息类型");
|
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 =>
|
var isFirstMessage = !await _messageRepository.ExistsAsync(m =>
|
||||||
m.SessionId == request.SessionId &&
|
m.SessionId == request.SessionId &&
|
||||||
|
|
@ -101,8 +116,8 @@ public class ChatService : IChatService
|
||||||
|
|
||||||
var createdMessage = await _messageRepository.AddAsync(message);
|
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}",
|
_logger.LogInformation("发送消息成功: MessageId={MessageId}, SessionId={SessionId}, SenderId={SenderId}, ReceiverId={ReceiverId}",
|
||||||
createdMessage.Id, request.SessionId, senderId, request.ReceiverId);
|
createdMessage.Id, request.SessionId, senderId, request.ReceiverId);
|
||||||
|
|
@ -151,10 +166,26 @@ public class ChatService : IChatService
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<List<ChatSessionResponse>> GetSessionsAsync(long userId)
|
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 =>
|
var sessions = await _sessionRepository.GetListAsync(s =>
|
||||||
(s.User1Id == userId && !s.User1Deleted) || (s.User2Id == userId && !s.User2Deleted));
|
(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();
|
sessions = sessions.OrderByDescending(s => s.LastMessageTime ?? s.CreateTime).ToList();
|
||||||
|
|
||||||
|
|
@ -204,6 +235,27 @@ public class ChatService : IChatService
|
||||||
|
|
||||||
if (existingSession != null)
|
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;
|
return existingSession.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -688,7 +740,11 @@ public class ChatService : IChatService
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 更新会话最后消息信息
|
/// 更新会话最后消息信息
|
||||||
/// </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.LastMessageId = message.Id;
|
||||||
session.LastMessageTime = message.CreateTime;
|
session.LastMessageTime = message.CreateTime;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user