From 6c16412fd6f833d05a2e01feae9cffb8f71662e3 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Thu, 29 Jan 2026 16:11:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9C=8B=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniapp/config/index.js | 2 +- .../Services/InteractService.cs | 99 ++++++++----------- .../XiangYi.Core/Entities/Biz/UserFavorite.cs | 5 + .../XiangYi.Core/Entities/Biz/UserUnlock.cs | 5 + .../src/XiangYi.Core/Entities/Biz/UserView.cs | 5 + 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/miniapp/config/index.js b/miniapp/config/index.js index 6bdbd8d..7794e45 100644 --- a/miniapp/config/index.js +++ b/miniapp/config/index.js @@ -23,7 +23,7 @@ const ENV = { } // 当前环境 - 开发时使用 development,打包时改为 production -const CURRENT_ENV = 'production' +const CURRENT_ENV = 'development' // 导出配置 export const config = { diff --git a/server/src/XiangYi.Application/Services/InteractService.cs b/server/src/XiangYi.Application/Services/InteractService.cs index 2e07c41..87e8996 100644 --- a/server/src/XiangYi.Application/Services/InteractService.cs +++ b/server/src/XiangYi.Application/Services/InteractService.cs @@ -72,7 +72,7 @@ public class InteractService : IInteractService if (existingView != null) { - // 更新浏览次数和时间 + // 更新浏览次数和时间(不重置IsRead状态,同一用户多次查看不重复计数) existingView.ViewCount++; existingView.ViewDate = today; // 更新为最新日期 existingView.LastViewTime = DateTime.Now; @@ -94,6 +94,7 @@ public class InteractService : IInteractService ViewDate = today, ViewCount = 1, LastViewTime = DateTime.Now, + IsRead = false, // 新记录默认未读 CreateTime = DateTime.Now, UpdateTime = DateTime.Now }; @@ -819,52 +820,18 @@ public class InteractService : IInteractService /// public async Task GetInteractCountsAsync(long userId) { - var user = await _userRepository.GetByIdAsync(userId); - if (user == null) - { - return new InteractCountsResponse(); - } - - // 如果用户从未查看过互动列表,初始化已读时间为当前时间 - // 这样只统计从现在开始的新互动,避免历史数据一直显示未读 - var needUpdate = false; - var now = DateTime.Now; - - if (user.LastViewedMeReadTime == null) - { - user.LastViewedMeReadTime = now; - needUpdate = true; - } - if (user.LastFavoritedMeReadTime == null) - { - user.LastFavoritedMeReadTime = now; - needUpdate = true; - } - if (user.LastUnlockedMeReadTime == null) - { - user.LastUnlockedMeReadTime = now; - needUpdate = true; - } - - if (needUpdate) - { - user.UpdateTime = now; - await _userRepository.UpdateAsync(user); - _logger.LogInformation("初始化用户互动已读时间: UserId={UserId}", userId); - } - - // 统计各类互动的新增数量 - // 看过我:统计首次查看时间(CreateTime)在上次已读之后的新用户数量 - // 这样同一用户多次查看只计算一次(首次查看时) - // 注意:使用 > 而不是 >= 来避免边界情况,但需要在标记已读时加1秒的缓冲 + // 统计各类互动的未读数量(IsRead = false) var viewedMeCount = await _viewRepository.CountAsync(v => - v.TargetUserId == userId && v.CreateTime > user.LastViewedMeReadTime); + v.TargetUserId == userId && !v.IsRead); var favoritedMeCount = await _favoriteRepository.CountAsync(f => - f.TargetUserId == userId && f.CreateTime > user.LastFavoritedMeReadTime); + f.TargetUserId == userId && !f.IsRead); var unlockedMeCount = await _unlockRepository.CountAsync(u => - u.TargetUserId == userId && u.CreateTime > user.LastUnlockedMeReadTime); + u.TargetUserId == userId && !u.IsRead); + + _logger.LogInformation("获取互动统计: UserId={UserId}, ViewedMeCount={ViewedMeCount}, FavoritedMeCount={FavoritedMeCount}, UnlockedMeCount={UnlockedMeCount}", + userId, viewedMeCount, favoritedMeCount, unlockedMeCount); return new InteractCountsResponse { @@ -877,34 +844,52 @@ public class InteractService : IInteractService /// public async Task MarkInteractAsReadAsync(long userId, string type) { - var user = await _userRepository.GetByIdAsync(userId); - if (user == null) - { - throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在"); - } - - // 加1秒缓冲,避免因时间精度问题导致刚标记已读的记录仍被统计为未读 - var now = DateTime.Now.AddSeconds(1); + int updatedCount = 0; switch (type.ToLower()) { case "viewedme": - user.LastViewedMeReadTime = now; + // 批量更新所有未读的"看过我"记录 + var unreadViews = await _viewRepository.GetListAsync(v => + v.TargetUserId == userId && !v.IsRead); + foreach (var view in unreadViews) + { + view.IsRead = true; + view.UpdateTime = DateTime.Now; + await _viewRepository.UpdateAsync(view); + updatedCount++; + } break; case "favoritedme": - user.LastFavoritedMeReadTime = now; + // 批量更新所有未读的"收藏我"记录 + var unreadFavorites = await _favoriteRepository.GetListAsync(f => + f.TargetUserId == userId && !f.IsRead); + foreach (var favorite in unreadFavorites) + { + favorite.IsRead = true; + favorite.UpdateTime = DateTime.Now; + await _favoriteRepository.UpdateAsync(favorite); + updatedCount++; + } break; case "unlockedme": - user.LastUnlockedMeReadTime = now; + // 批量更新所有未读的"解锁我"记录 + var unreadUnlocks = await _unlockRepository.GetListAsync(u => + u.TargetUserId == userId && !u.IsRead); + foreach (var unlock in unreadUnlocks) + { + unlock.IsRead = true; + unlock.UpdateTime = DateTime.Now; + await _unlockRepository.UpdateAsync(unlock); + updatedCount++; + } break; default: throw new BusinessException(ErrorCodes.InvalidParameter, "无效的互动类型"); } - user.UpdateTime = DateTime.Now; - await _userRepository.UpdateAsync(user); - - _logger.LogInformation("标记互动已读: UserId={UserId}, Type={Type}, ReadTime={ReadTime}", userId, type, now); + _logger.LogInformation("标记互动已读: UserId={UserId}, Type={Type}, UpdatedCount={UpdatedCount}", + userId, type, updatedCount); } #endregion diff --git a/server/src/XiangYi.Core/Entities/Biz/UserFavorite.cs b/server/src/XiangYi.Core/Entities/Biz/UserFavorite.cs index 5feba0e..0fb2584 100644 --- a/server/src/XiangYi.Core/Entities/Biz/UserFavorite.cs +++ b/server/src/XiangYi.Core/Entities/Biz/UserFavorite.cs @@ -18,6 +18,11 @@ public class UserFavorite : BaseEntity /// public long TargetUserId { get; set; } + /// + /// 被收藏者是否已读 + /// + public bool IsRead { get; set; } = false; + #region 导航属性 /// diff --git a/server/src/XiangYi.Core/Entities/Biz/UserUnlock.cs b/server/src/XiangYi.Core/Entities/Biz/UserUnlock.cs index d338ae3..5020c58 100644 --- a/server/src/XiangYi.Core/Entities/Biz/UserUnlock.cs +++ b/server/src/XiangYi.Core/Entities/Biz/UserUnlock.cs @@ -18,6 +18,11 @@ public class UserUnlock : BaseEntity /// public long TargetUserId { get; set; } + /// + /// 被解锁者是否已读 + /// + public bool IsRead { get; set; } = false; + #region 导航属性 /// diff --git a/server/src/XiangYi.Core/Entities/Biz/UserView.cs b/server/src/XiangYi.Core/Entities/Biz/UserView.cs index cd6ae5b..af3a2da 100644 --- a/server/src/XiangYi.Core/Entities/Biz/UserView.cs +++ b/server/src/XiangYi.Core/Entities/Biz/UserView.cs @@ -34,6 +34,11 @@ public class UserView : BaseEntity /// public DateTime LastViewTime { get; set; } + /// + /// 被浏览者是否已读 + /// + public bool IsRead { get; set; } = false; + #region 导航属性 ///