前端:

1、优化消息排序逻辑
2、新增加载历史消息
3、修复已知问题
后端:
1、优化消息排序逻辑
2、增加用户信息缓存机制
3、修改日期类型为DateTimeOffset改善时区信息丢失问题
3、修复了已知问题
数据库:
1、新增SequenceId字段用于消息排序
2、新增ClientMsgId字段用于客户端消息回执
This commit is contained in:
2026-02-07 22:37:56 +08:00
118 changed files with 10691 additions and 452 deletions
@@ -0,0 +1,49 @@
using IM_API.Models;
namespace IM_API.Interface.Services
{
public interface ICacheService
{
/// <summary>
/// 设置缓存
/// </summary>
/// <typeparam name="T">缓存对象类型</typeparam>
/// <param name="key">缓存索引值</param>
/// <param name="value">要缓存的对象</param>
/// <param name="expiration">过期时间</param>
/// <returns></returns>
Task SetAsync<T>(string key, T value, TimeSpan? expiration = null);
/// <summary>
/// 获取缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">缓存索引</param>
/// <returns></returns>
Task<T?> GetAsync<T>(string key);
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="key">缓存索引</param>
/// <returns></returns>
Task RemoveAsync(string key);
/// <summary>
/// 设置用户缓存
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
Task SetUserCacheAsync(User user);
/// <summary>
/// 通过用户名获取用户缓存
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
Task<User?> GetUserCacheAsync(string username);
/// <summary>
/// 删除用户缓存
/// </summary>
/// <param name="id"></param>
/// <param name="username"></param>
/// <returns></returns>
Task RemoveUserCacheAsync(string username);
}
}
@@ -1,5 +1,6 @@
using IM_API.Dtos.Conversation;
using IM_API.Models;
using IM_API.VOs.Conversation;
namespace IM_API.Interface.Services
{
@@ -22,7 +23,7 @@ namespace IM_API.Interface.Services
/// </summary>
/// <param name="userId">用户id</param>
/// <returns></returns>
Task<List<ConversationDto>> GetConversationsAsync(int userId);
Task<List<ConversationVo>> GetConversationsAsync(int userId);
/// <summary>
/// 获取指定用户的所有推送标识符
/// </summary>
@@ -34,7 +35,7 @@ namespace IM_API.Interface.Services
/// </summary>
/// <param name="conversationId"></param>
/// <returns></returns>
Task<ConversationDto> GetConversationByIdAsync(int userId, int conversationId);
Task<ConversationVo> GetConversationByIdAsync(int userId, int conversationId);
/// <summary>
/// 清空未读消息
/// </summary>
@@ -50,5 +51,6 @@ namespace IM_API.Interface.Services
/// <param name="chatType"></param>
/// <returns></returns>
Task MakeConversationAsync(int userAId, int userBId, ChatType chatType);
Task UpdateConversationAfterSentAsync(UpdateConversationDto dto);
}
}
@@ -11,14 +11,14 @@ namespace IM_API.Interface.Services
/// <param name="groupId">群ID</param>
/// <param name="userIds">邀请的用户列表</param>
/// <returns></returns>
Task InviteUsers(int userId,int groupId, List<int> userIds);
Task InviteUsersAsync(int userId,int groupId, List<int> userIds);
/// <summary>
/// 加入群聊
/// </summary>
/// <param name="userId">操作者ID</param>
/// <param name="groupId">群ID</param>
/// <returns></returns>
Task JoinGroup(int userId,int groupId);
Task JoinGroupAsync(int userId,int groupId);
/// <summary>
/// 创建群聊
/// </summary>
@@ -26,14 +26,22 @@ namespace IM_API.Interface.Services
/// <param name="groupCreateDto">群信息</param>
/// <param name="userIds">邀请用户列表</param>
/// <returns></returns>
Task<GroupInfoDto> CreateGroup(int userId, GroupCreateDto groupCreateDto, List<int> userIds);
Task<GroupInfoDto> CreateGroupAsync(int userId, GroupCreateDto groupCreateDto);
/// <summary>
/// 删除群
/// </summary>
/// <param name="userId">操作者ID</param>
/// <param name="groupId">群ID</param>
/// <returns></returns>
Task DeleteGroup(int userId, int groupId);
//Task UpdateGroupAuthori
Task DeleteGroupAsync(int userId, int groupId);
/// <summary>
/// 获取当前用户群列表
/// </summary>
/// <param name="userId">操作者ID</param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <param name="desc"></param>
/// <returns></returns>
Task<List<GroupInfoDto>> GetGroupListAsync(int userId, int page, int limit, bool desc);
}
}
@@ -1,4 +1,7 @@
using IM_API.Dtos;
using IM_API.Dtos.Message;
using IM_API.Models;
using IM_API.VOs.Message;
namespace IM_API.Interface.Services
{
@@ -11,7 +14,7 @@ namespace IM_API.Interface.Services
/// <param name="receiverId">接收人</param>
/// <param name="dto"></param>
/// <returns></returns>
Task<MessageBaseDto> SendPrivateMessageAsync(int senderId,int receiverId,MessageBaseDto dto);
Task<MessageBaseVo> SendPrivateMessageAsync(int senderId,int receiverId,MessageBaseDto dto);
/// <summary>
/// 发送群聊消息
/// </summary>
@@ -19,16 +22,21 @@ namespace IM_API.Interface.Services
/// <param name="groupId">接收群id</param>
/// <param name="dto"></param>
/// <returns></returns>
Task<MessageBaseDto> SendGroupMessageAsync(int senderId,int groupId,MessageBaseDto dto);
Task<MessageBaseVo> SendGroupMessageAsync(int senderId,int groupId,MessageBaseDto dto);
/// <summary>
/// 获取消息列表
/// 消息入库
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
Task MakeMessageAsync(Message message);
/// <summary>
/// 获取历史消息列表
/// </summary>
/// <param name="conversationId">会话id(用于获取指定用户间聊天消息)</param>
/// <param name="msgId">消息id</param>
/// <param name="sequenceId">消息id</param>
/// <param name="pageSize">获取消息数量</param>
/// <param name="desc"></param>
/// <returns></returns>
Task<List<MessageBaseDto>> GetMessagesAsync(int userId, int conversationId,int? msgId,int? pageSize,bool desc);
Task<List<MessageBaseVo>> GetMessagesAsync(int userId,MessageQueryDto dto);
/// <summary>
/// 获取未读消息数
/// </summary>
@@ -0,0 +1,12 @@
namespace IM_API.Interface.Services
{
public interface ISequenceIdService
{
/// <summary>
/// 创建消息序号
/// </summary>
/// <param name="streamKey">聊天唯一标识/param>
/// <returns></returns>
Task<long> GetNextSquenceIdAsync(string streamKey);
}
}