前端:

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
+2 -2
View File
@@ -30,12 +30,12 @@ public partial class Admin
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
public DateTimeOffset Created { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime Updated { get; set; }
public DateTimeOffset Updated { get; set; }
public virtual Role Role { get; set; } = null!;
}
+5 -4
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -20,14 +21,14 @@ public partial class Conversation
/// <summary>
/// 最后一条未读消息ID
/// </summary>
public int? LastReadMessageId { get; set; }
public long? LastReadSequenceId { get; set; }
/// <summary>
/// 未读消息数
/// </summary>
public int UnreadCount { get; set; }
public int ChatType { get; set; }
public ChatType ChatType { get; set; }
/// <summary>
/// 消息推送唯一标识符
@@ -42,9 +43,9 @@ public partial class Conversation
/// <summary>
/// 最后一条消息发送时间
/// </summary>
public DateTime LastMessageTime { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset LastMessageTime { get; set; }
public virtual Message? LastReadMessage { get; set; }
public virtual User User { get; set; } = null!;
}
+18
View File
@@ -0,0 +1,18 @@
using IM_API.Dtos.Conversation;
namespace IM_API.Models
{
public partial class Conversation
{
public ChatType ChatTypeEnum {
get
{
return ChatType;
}
set
{
ChatType = value;
}
}
}
}
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -21,7 +22,8 @@ public partial class Device
/// <summary>
/// 最后一次登录
/// </summary>
public DateTime LastLogin { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset LastLogin { get; set; }
public virtual User User { get; set; } = null!;
}
+4 -2
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -25,7 +26,7 @@ public partial class File
/// <summary>
/// 文件类型
/// </summary>
public string Type { get; set; } = null!;
public string FileType { get; set; } = null!;
/// <summary>
/// 关联消息ID
@@ -35,7 +36,8 @@ public partial class File
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual Message Message { get; set; } = null!;
}
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -26,7 +27,8 @@ public partial class Friend
/// <summary>
/// 好友关系创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
/// <summary>
/// 好友备注名
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -20,7 +21,8 @@ public partial class FriendRequest
/// <summary>
/// 申请时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
/// <summary>
/// 申请附言
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -42,7 +43,8 @@ public partial class Group
/// <summary>
/// 群聊创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
/// <summary>
/// 群头像
+1 -1
View File
@@ -31,7 +31,7 @@ public partial class GroupInvite
/// <summary>
/// 创建时间
/// </summary>
public DateTime? Created { get; set; }
public DateTimeOffset? Created { get; set; }
public virtual Group Group { get; set; } = null!;
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -25,7 +26,8 @@ public partial class GroupMember
/// <summary>
/// 加入群聊时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual Group Group { get; set; } = null!;
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -31,7 +32,8 @@ public partial class GroupRequest
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual Group Group { get; set; } = null!;
+1 -1
View File
@@ -19,7 +19,7 @@ namespace IM_API.Models
});
modelBuilder.Entity<Conversation>(entity =>
{
entity.Ignore(e => e.ChatTypeEnum);
});
modelBuilder.Entity<Device>(entity =>
+9 -10
View File
@@ -101,7 +101,8 @@ public partial class ImContext : DbContext
entity.HasIndex(e => e.UserId, "Userid");
entity.HasIndex(e => e.LastReadMessageId, "lastMessageId");
entity.HasIndex(e => e.LastReadSequenceId, "LastReadSequenceId");
entity.Property(e => e.Id)
.HasColumnType("int(11)")
@@ -113,7 +114,7 @@ public partial class ImContext : DbContext
entity.Property(e => e.LastMessageTime)
.HasComment("最后一条消息发送时间")
.HasColumnType("datetime");
entity.Property(e => e.LastReadMessageId)
entity.Property(e => e.LastReadSequenceId)
.HasComment("最后一条未读消息ID ")
.HasColumnType("int(11)")
.HasColumnName("lastReadMessageId");
@@ -130,10 +131,6 @@ public partial class ImContext : DbContext
.HasComment("用户")
.HasColumnType("int(11)");
entity.HasOne(d => d.LastReadMessage).WithMany(p => p.Conversations)
.HasForeignKey(d => d.LastReadMessageId)
.HasConstraintName("conversations_ibfk_2");
entity.HasOne(d => d.User).WithMany(p => p.Conversations)
.HasForeignKey(d => d.UserId)
.OnDelete(DeleteBehavior.ClientSetNull)
@@ -197,7 +194,7 @@ public partial class ImContext : DbContext
entity.Property(e => e.Size)
.HasComment("文件大小(单位:KB ")
.HasColumnType("int(11)");
entity.Property(e => e.Type)
entity.Property(e => e.FileType)
.HasMaxLength(10)
.HasComment("文件类型 ");
entity.Property(e => e.Url)
@@ -529,6 +526,11 @@ public partial class ImContext : DbContext
entity.HasIndex(e => e.Sender, "Sender");
//设置联合唯一索引
entity.HasIndex(e => new { e.SequenceId, e.StreamKey })
.IsUnique();
entity.Property(e => e.Id)
.HasColumnType("int(11)")
.HasColumnName("ID");
@@ -541,9 +543,6 @@ public partial class ImContext : DbContext
entity.Property(e => e.Created)
.HasComment("发送时间 ")
.HasColumnType("datetime");
entity.Property(e => e.GroupMemberId)
.HasComment("若为群消息则表示具体的成员id")
.HasColumnType("int(11)");
entity.Property(e => e.MsgType)
.HasComment("消息类型\r\n(0:文本,1:图片,2:语音,3:视频,4:文件,5:语音聊天,6:视频聊天)")
.HasColumnType("tinyint(4)");
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -15,7 +16,8 @@ public partial class LoginLog
/// <summary>
/// 登录时间
/// </summary>
public DateTime Logined { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Logined { get; set; }
/// <summary>
/// 登录用户
+7 -3
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -18,6 +19,7 @@ public partial class Message
/// (0:文本,1:图片,2:语音,3:视频,4:文件,5:语音聊天,6:视频聊天)
/// </summary>
public sbyte MsgType { get; set; }
public Guid ClientMsgId { get; set; }
/// <summary>
/// 消息内容
@@ -42,7 +44,8 @@ public partial class Message
/// <summary>
/// 发送时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
/// <summary>
/// 消息推送唯一标识符
@@ -50,9 +53,10 @@ public partial class Message
public string StreamKey { get; set; } = null!;
/// <summary>
/// 若为群消息则表示具体的成员id
/// 消息排序标识
/// </summary>
public int? GroupMemberId { get; set; }
public long SequenceId { get; set; }
public virtual ICollection<Conversation> Conversations { get; set; } = new List<Conversation>();
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -30,7 +31,8 @@ public partial class Notification
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual User User { get; set; } = null!;
}
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -25,7 +26,8 @@ public partial class Permission
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual ICollection<Permissionarole> Permissionaroles { get; set; } = new List<Permissionarole>();
}
+3 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -20,7 +21,8 @@ public partial class Role
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset Created { get; set; }
public virtual ICollection<Admin> Admins { get; set; } = new List<Admin>();
+4 -2
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace IM_API.Models;
@@ -32,12 +33,13 @@ public partial class User
/// <summary>
/// 创建时间
/// </summary>
public DateTime Created { get; set; }
public DateTimeOffset Created { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? Updated { get; set; }
[Column(TypeName = "datetimeoffset")]
public DateTimeOffset? Updated { get; set; }
/// <summary>
/// 账户状态