Skip to content

项目架构和模块 ​

项目架构图 ​

Web 框架 ​

本项目使用 Gin 作为 Web 框架,提供 HTTP 服务。 其中,将 Gin 的路由和 handler 封装成 gateway, 用于统一接入网关。 路由包括用户服务、好友服务、消息服务等。 网关会对请求通过用户服务使用 Bearer Token 进行鉴权,并将请求转发到对应的服务中。

微服务框架 ​

项目中使用 Go-Zero 作为微服务框架,提供服务注册与发现等功能。 每个单独的服务分别对应 service 目录下的一个子目录,每个子目录下包含了对应的服务配置、服务逻辑、数据访问层、数据模型等。

数据库 ​

数据库使用 MySQL, 用于存储用户信息、好友信息、消息记录等。

项目中使用Gorm 作为 ORM 框架,进行数据库操作。

Redis 作为缓存中间件,Minio 作为 bucket 存储组件。

user 服务数据库定义 ​

img.png

User 表结构 ​

字段名类型属性说明
UIDbigintprimaryKey, autoIncrement, index用户唯一标识符
Usernamevarchar(64)uniqueIndex用户名
Passwordvarchar(128)用户密码
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • UID 是主键,且自动递增,类型为 bigint,并且有索引。
  • Username 是唯一索引,确保每个用户的用户名唯一。
  • Password 存储用户密码,长度限制为 128 字符。
  • CreatedAt, UpdatedAt 自动记录创建和更新的时间。
  • DeletedAt 是一个逻辑删除字段,提供软删除功能,并且有索引。

UserProfile 表结构 ​

字段名类型属性说明
IDbigintprimaryKey, autoIncrement主键
UIDbigintuniqueIndex, not null用户唯一标识符
Avatarvarchar(256)用户头像 URL
Nicknamevarchar(64)用户昵称
Emailvarchar(128)用户邮箱
Statustinyintdefault:1用户状态
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • UID 是外键,唯一索引,指向 User 表中的 UID,确保一对一关系。
  • Avatar 字段用于存储用户头像的 URL。
  • Nickname 字段存储用户的显示昵称。
  • Email 字段存储用户邮箱地址。
  • Status 字段默认值为 1,表示用户的当前状态,暂时未使用到。
  • CreatedAt, UpdatedAt, DeletedAt 记录对应的时间信息。

关系设计说明 ​

  • User 表与 UserProfile 表之间是 一对一 关系。通过 UID 字段连接,UserProfile 表中的 UID 字段是外键,指向 User 表中的 UID。
  • GORM 通过 foreignKey:UID 和 references:UID 来定义这两个表的外键关系。UserProfile 中每条记录都唯一对应 User 表中的一条记录。

friend 服务数据库定义 ​

img_3.png

Friend 表结构 ​

字段名类型属性说明
IDbigintprimaryKey, autoIncrement主键
UserIDbigintindex, not null用户 ID
FriendIDbigintindex, not null好友 ID
Statustinyintnot null好友状态
InitiatorIDbigintnot null发起好友请求的用户
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • UserID 和 FriendID 用于存储好友关系的用户和他们的好友,两个字段都有索引。
  • Status 是一个枚举类型,定义了好友关系的不同状态(如未添加、已添加等)。
  • InitiatorID 记录发起好友请求的用户 ID,用于区分谁发起了好友关系。

FriendGroup 表结构 ​

字段名类型属性说明
IDbigintprimaryKey, autoIncrement主键
UIDbigintindex, not null分组所属用户 ID
Namevarchar(64)not null分组名称
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • UID 表示分组所属用户。
  • Name 是分组的名称,长度限制为 64 字符,不能为空。
  • GroupMembers 定义了与 FriendGroupMember 表的关联关系,通过外键 GroupID 关联分组成员。

FriendGroupMember 表结构 ​

字段名类型属性说明
GroupIDbigintprimaryKey, not null分组 ID
FriendIDbigintprimaryKey, not null好友 ID
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • 复合主键:GroupID 和 FriendID 共同组成复合主键,确保每个好友在每个分组中只出现一次,避免重复记录。
  • GroupID:表示好友所属分组的 ID。
  • FriendID:表示被分配到该分组的好友 ID。
  • CreatedAt, UpdatedAt, DeletedAt:分别用于记录创建时间、更新时间和删除时间,其中 DeletedAt 提供软删除功能并有索引。

功能 ​

  • 唯一性约束:通过复合主键,确保在每个分组中同一个好友只能存在一次。
  • 多对多关系:该表用于管理 FriendGroup 和 Friend 之间的多对多关系,一个分组可以包含多个好友,一个好友也可以属于多个分组。

关系设计说明 ​

  • 好友关系 (Friend):每条记录表示用户与另一个用户(好友)的关系,包含好友状态和请求发起者信息。
  • 好友分组 (FriendGroup):用户可以创建多个好友分组,每个分组属于特定用户。
  • 好友分组成员 (FriendGroupMember):用于记录分组中的好友,通过 GroupID 字段与 FriendGroup 表关联,通过 FriendID 字段关联 Friend 表中的好友。

关系设计 ​

  • FriendGroup 和 FriendGroupMember 之间是一对多关系,通过 GroupID 连接,每个分组可以包含多个好友。
  • Friend 表和 FriendGroupMember 表通过 FriendID 关联,确保分组成员是用户的好友。

message 服务数据库定义 ​

msg

Message 表结构 ​

字段名类型属性说明
MsgIDbigintprimaryKey, autoIncrement消息唯一标识符
SenderIdbigintindex, not null发送者用户 ID
ReceiverIdbigintindex, not null接收者用户 ID
Contenttextnot null消息内容
Timestamptimestampnot null消息发送时间

说明:

  • MsgID 是主键,自动递增,用于唯一标识每条消息。
  • SenderId 和 ReceiverId 表示消息发送者和接收者的用户 ID,都有索引以优化查询性能。
  • Content 字段存储消息的文本内容,类型为 text,长度没有限制。
  • Timestamp 字段记录消息发送的时间,确保每条消息有一个时间戳。

关系设计说明 ​

  • 发送者和接收者:SenderId 和 ReceiverId 都表示用户之间的点对点消息通信,这两个字段使用了索引以提高检索发送或接收消息的效率。
  • 消息内容:Content 字段类型为 text,适合存储长文本内容,能够支持较长的消息。

GroupMessage 表结构 ​

字段名类型属性说明
MsgIDbigintprimaryKey, autoIncrement消息唯一标识符
SenderIdbigintindex, not null发送者用户 ID
GroupIdbigintindex, not null群组 ID
Contenttextnot null消息内容
Timestamptimestampnot null消息发送时间

说明:

  • MsgID 是群消息的唯一标识符,自动递增,作为主键。
  • SenderId 表示发送消息的用户,有索引以优化查询。
  • GroupId 表示消息所属的群组,有索引以加速消息的查询。
  • Content 字段为消息的文本内容,类型为 text,无长度限制。
  • Timestamp 记录消息的发送时间。

ChatGroup 表结构 ​

字段名类型属性说明
GIDbigintprimaryKey, autoIncrement群组唯一标识符
Namevarchar(64)uniqueIndex群组名称
Avatarvarchar(256)群组头像 URL
OwnerIDbigintindex, not null群主用户 ID
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间
DeletedAttimestampindex删除时间

说明:

  • GID 是群组的唯一标识符,自动递增,作为主键。
  • Name 是群组名称,有唯一索引以确保每个群组的名称唯一。
  • Avatar 是群组的头像 URL,最多允许 256 字符。
  • OwnerID 是群主的用户 ID,有索引以优化查询。
  • CreatedAt, UpdatedAt, DeletedAt 记录群组的创建、更新和删除时间。

ChatGroupMember 表结构 ​

字段名类型属性说明
GroupIDbigintprimaryKey, not null群组 ID
UserIDbigintprimaryKey, not null用户 ID
CreatedAttimestamp创建时间
UpdatedAttimestamp更新时间

说明:

  • GroupID 和 UserID 组成复合主键,确保用户在每个群组中的唯一性。
  • CreatedAt, UpdatedAt 用于记录记录的创建和更新时间。

关系设计说明 ​

  • 群组与群成员 (ChatGroup 和 ChatGroupMember):ChatGroupMember 表通过 GroupID 连接到 ChatGroup 表,表示群组与成员之间的多对多关系。每个用户可以加入多个群组,每个群组也可以有多个用户。
  • 群组消息与群成员 (GroupMessage 和 ChatGroupMember):GroupMessage 表通过 SenderId 和 GroupId 连接到相应的群组和发送消息的用户。每条消息属于一个特定群组,并由一个特定的群成员发送。