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:UIDreferences: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删除时间

说明:

  • UserIDFriendID 用于存储好友关系的用户和他们的好友,两个字段都有索引。
  • 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删除时间

说明:

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

功能

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

关系设计说明

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

关系设计

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

message 服务数据库定义

msg

Message 表结构

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

说明:

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

关系设计说明

  • 发送者和接收者SenderIdReceiverId 都表示用户之间的点对点消息通信,这两个字段使用了索引以提高检索发送或接收消息的效率。
  • 消息内容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更新时间

说明:

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

关系设计说明

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