这是基于vue-vben-admin 模板适用于abp vNext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

14 KiB

会话实体设计

**本文档引用的文件** - [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs) - [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs) - [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs) - [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs) - [MessageType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs) - [MessageSourceType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSourceType.cs) - [UserOnlineState.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs) - [UserFriendStatus.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendStatus.cs)

目录

  1. 简介
  2. 会话实体字段定义
  3. 会话类型设计
  4. 会话生命周期管理
  5. 会话与消息关联关系
  6. 会话成员管理
  7. 会话元数据存储
  8. 性能优化策略
  9. 会话功能扩展指导
  10. 结论

简介

本文档详细说明了实时消息模块中会话实体的设计与实现。系统通过ChatMessage实体表示消息会话,支持单聊、群聊等多种会话类型,并提供了完整的会话生命周期管理机制。会话实体与用户卡片、好友关系等元数据紧密关联,形成了完整的实时通信解决方案。

文档来源

  • ChatMessage.cs
  • UserChatCard.cs

会话实体字段定义

会话实体主要由ChatMessage类定义,包含以下核心字段:

字段名称 数据类型 约束条件 业务规则
TenantId Guid? 可为空 租户标识,支持多租户架构
GroupId string 可为空 群组标识,为空表示单聊会话
MessageId string 必填 消息唯一标识,由系统自动生成
FormUserId Guid 必填 发送者用户标识
FormUserName string 必填 发送者用户名
ToUserId Guid? 可为空 接收用户标识,群聊时可为空
Content string 必填 消息内容,不进行审计记录
SendTime DateTime 必填 消息发送时间,使用系统时钟
IsAnonymous bool 必填 是否匿名发送,存储在扩展字段中
MessageType MessageType 必填 消息类型,默认为文本消息
Source MessageSourceType 必填 消息来源,默认为用户发送

会话实体字段定义来源

  • ChatMessage.cs

会话类型设计

系统支持多种会话类型,通过MessageTypeMessageSourceType枚举进行区分:

classDiagram
class MessageType {
+Text = 0
+Image = 10
+Link = 20
+Video = 30
+Voice = 40
+File = 50
+Notifier = 100
}
class MessageSourceType {
+User = 0
+System = 10
}
class ChatMessage {
+MessageType MessageType
+MessageSourceType Source
+string GroupId
}
ChatMessage --> MessageType : "has"
ChatMessage --> MessageSourceType : "has"

会话类型设计来源

  • MessageType.cs
  • MessageSourceType.cs
  • ChatMessage.cs

会话生命周期管理

会话的创建、更新和关闭通过MessageStore服务进行管理,完整的生命周期流程如下:

sequenceDiagram
participant Client as "客户端"
participant MessageSender as "MessageSender"
participant EventBus as "分布式事件总线"
participant MessageStore as "MessageStore"
participant Repository as "消息存储库"
Client->>MessageSender : SendMessageAsync(chatMessage)
MessageSender->>MessageSender : 生成MessageId
MessageSender->>EventBus : PublishAsync(RealTimeEto<ChatMessage>)
EventBus->>MessageStore : HandleEventAsync(eventData)
MessageStore->>MessageStore : 消息拦截处理
MessageStore->>Repository : StoreMessageAsync(message)
Repository->>Repository : 根据GroupId判断单聊/群聊
Repository->>Repository : 保存消息到数据库
Repository-->>MessageStore : 保存成功
MessageStore-->>EventBus : 处理完成
EventBus-->>MessageSender : 事件处理完成
MessageSender-->>Client : 返回MessageId

会话生命周期管理来源

  • MessageSender.cs
  • ChatMessageEventHandler.cs
  • MessageStore.cs

会话与消息关联关系

会话实体与消息存储之间存在紧密的关联关系,通过MessageStore服务实现消息的持久化和查询:

erDiagram
CHAT_MESSAGE {
string MessageId PK
guid FormUserId FK
guid? ToUserId FK
string? GroupId FK
string Content
datetime SendTime
int MessageType
int Source
guid? TenantId
}
USER_CHAT_CARD {
long Id PK
guid UserId UK
string UserName
int Sex
string NickName
string AvatarUrl
datetime? Birthday
int Age
guid? TenantId
}
USER_CHAT_FRIEND {
long Id PK
guid UserId FK
guid FrientId FK
bool Black
bool DontDisturb
bool SpecialFocus
string RemarkName
byte Status
guid? TenantId
}
CHAT_MESSAGE ||--o{ USER_CHAT_CARD : "发送者"
CHAT_MESSAGE }o--|| USER_CHAT_CARD : "接收者"
CHAT_MESSAGE }o--|| USER_CHAT_GROUP : "群组"
USER_CHAT_CARD ||--o{ USER_CHAT_FRIEND : "好友关系"

会话与消息关联关系来源

  • ChatMessage.cs
  • UserChatCard.cs
  • UserChatFriend.cs

会话成员管理

会话成员管理通过UserChatCardUserChatFriend实体实现,包含用户基本信息和好友关系管理:

classDiagram
class UserChatCard {
+Guid? TenantId
+Guid UserId
+string UserName
+Sex Sex
+string NickName
+string AvatarUrl
+DateTime? Birthday
+int Age
+DateTime? LastOnlineTime
+UserOnlineState State
+SetBirthday(birthday, clock)
+SetAvatarUrl(url)
+ChangeState(clock, state)
+ToUserCard()
}
class UserChatFriend {
+Guid? TenantId
+Guid UserId
+Guid FrientId
+bool IsStatic
+bool Black
+bool DontDisturb
+bool SpecialFocus
+string RemarkName
+string Description
+UserFriendStatus Status
+SetStatus(status)
}
class UserOnlineState {
+Online
+Offline
+Busy
+Stealth
}
class UserFriendStatus {
+NeedValidation
+Added
+Blocked
}
UserChatCard --> UserOnlineState : "has"
UserChatFriend --> UserFriendStatus : "has"
UserChatCard --> UserChatFriend : "has many"

会话成员管理来源

  • UserChatCard.cs
  • UserChatFriend.cs
  • UserOnlineState.cs
  • UserFriendStatus.cs

会话元数据存储

会话元数据存储设计包含用户卡片、好友关系和群组信息,确保会话上下文的完整性:

用户卡片表 (AppUserChatCards)

字段 类型 约束 说明
Id bigint PK, AI 主键
TenantId uniqueidentifier NULL 租户标识
UserId uniqueidentifier NOT NULL 用户标识
UserName nvarchar(256) NOT NULL 用户名
Sex int NOT NULL 性别
NickName nvarchar(256) NULL 昵称
Sign nvarchar(30) NULL 签名
AvatarUrl nvarchar(max) NULL 头像地址
Birthday datetime2 NULL 生日
Age int NOT NULL 年龄
LastOnlineTime datetime2 NULL 最后在线时间
State int NOT NULL 在线状态

好友关系表 (AppUserChatFriends)

字段 类型 约束 说明
Id bigint PK, AI 主键
TenantId uniqueidentifier NULL 租户标识
UserId uniqueidentifier NOT NULL 用户标识
FrientId uniqueidentifier NOT NULL 好友标识
IsStatic bit NOT NULL 是否系统预置
Black bit NOT NULL 是否黑名单
DontDisturb bit NOT NULL 是否免打扰
SpecialFocus bit NOT NULL 是否特别关注
RemarkName nvarchar(256) NULL 备注名称
Description nvarchar(50) NULL 附加说明
Status smallint NOT NULL 好友状态

会话元数据存储来源

  • UserChatCard.cs
  • UserChatFriend.cs
  • 20250409030245_Initial-Single-Project-MSSQL.cs

性能优化策略

系统采用多种性能优化策略来提升会话处理效率:

会话缓存机制

flowchart TD
A[消息发送请求] --> B{是否需要缓存?}
B --> |是| C[检查缓存中是否存在会话]
C --> D{缓存命中?}
D --> |是| E[从缓存获取会话信息]
D --> |否| F[从数据库加载会话信息]
F --> G[存入缓存]
G --> H[处理消息]
B --> |否| H
H --> I[持久化消息]
I --> J[发布消息事件]
J --> K[通知在线用户]

批量处理优化

  • 消息批量存储:通过StoreMessageAsync方法实现消息的批量存储
  • 事务管理:使用IUnitOfWorkManager确保数据一致性
  • 异步处理:所有消息处理操作均采用异步模式

分布式事件驱动

系统采用分布式事件总线实现消息的异步处理,解耦消息发送与持久化逻辑,提高系统吞吐量。

性能优化策略来源

  • MessageStore.cs
  • ChatMessageEventHandler.cs
  • MessageSender.cs

会话功能扩展指导

为开发人员提供会话功能扩展的指导建议:

支持临时会话

// 创建临时会话的工厂方法
public static ChatMessage Temporary(
    Guid formUserId,
    string formUserName,
    Guid toUserId,
    string content,
    IClock clock,
    Guid? tenantId = null)
{
    return new ChatMessage
    {
        FormUserId = formUserId,
        FormUserName = formUserName,
        ToUserId = toUserId,
        Content = content,
        SendTime = clock.Now,
        IsAnonymous = false,
        MessageType = MessageType.Text,
        TenantId = tenantId,
        Source = MessageSourceType.User,
    }.SetProperty("Temporary", true);
}

支持系统通知会话

// 系统通知会话的工厂方法
public static ChatMessage SystemNotification(
    Guid formUserId,
    Guid toUserId,
    string content,
    IClock clock,
    Guid? tenantId = null)
{
    return new ChatMessage
    {
        FormUserId = formUserId,
        FormUserName = "system",
        ToUserId = toUserId,
        Content = content,
        SendTime = clock.Now,
        IsAnonymous = false,
        MessageType = MessageType.Notifier,
        TenantId = tenantId,
        Source = MessageSourceType.System,
    }.SetProperty("Priority", "High");
}

扩展建议

  1. 敏感词过滤:在MessageBlocker.InterceptAsync方法中扩展敏感词过滤逻辑
  2. 消息加密:在ExtraProperties中添加消息加密标识和密钥信息
  3. 消息撤回:添加消息撤回状态和时间戳到ExtraProperties
  4. 消息已读:通过ExtraProperties跟踪消息已读状态

会话功能扩展指导来源

  • ChatMessage.cs
  • MessageStore.cs

结论

本文档详细介绍了实时消息模块中会话实体的设计与实现。系统通过ChatMessage实体统一管理单聊和群聊会话,结合UserChatCardUserChatFriend实体实现完整的会话成员管理。采用分布式事件驱动架构,确保消息处理的高效性和可靠性。通过合理的元数据存储设计和性能优化策略,为实时通信功能提供了坚实的基础。开发人员可以根据业务需求,通过扩展ExtraProperties和添加新的工厂方法来支持临时会话和系统通知会话等高级功能。