docs: EchoChat 音视频会议直播系统整体设计方案

包含系统架构、项目结构、数据库设计、通信协议、API 设计、
前端页面结构、关键技术方案和开发分期规划。

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-02-27 15:44:38 +08:00
parent 3070acda40
commit d8a10d7e98

View File

@@ -0,0 +1,693 @@
# EchoChat 音视频会议直播系统 - 整体设计方案
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**目标:** 构建一套跨端可用、可扩展、可演进的实时音视频会议直播系统第一期MVP实现用户体系、即时聊天、好友管理、多人音视频会议、消息通知五大核心功能。
**架构:** 精简单体 + 媒体微服务。Go 单体模块化服务处理所有业务逻辑mediasoup Node 服务独立管理媒体资源。模块间按微服务边界组织代码,预留后期拆分能力。
**技术栈:** Go (Gin + GORM + Wire) / Node.js + mediasoup / uniapp (Vue 3) / Vue 3 + Element Plus / PostgreSQL / Redis / Docker Compose
---
## 一、需求确认汇总
| 维度 | 决策 |
|------|------|
| 后端 | 纯 Go 语言(移除 PHP |
| 前台前端 | uniapp (Vue 3) + mediasoup-client |
| 后台前端 | 独立 Vue 3 + Vite + Element PlusPC 端专注) |
| 媒体层 | Node.js + mediasoup保留官方 Node 中间层) |
| 存储 | PostgreSQL 16 + Redis 7 |
| 认证 | 邮箱+密码、用户名+密码(微信授权后期迭代) |
| MVP 功能 | 用户体系、即时聊天、好友管理、音视频会议、消息通知 |
| 多端优先级 | H5 > 桌面端 > 微信小程序 > Android |
| 并发规模 | 中型单场50人总用户千级 |
| 部署 | Docker Compose初期预留 K8s 编排 |
| 团队 | 个人 + AI 辅助开发 |
---
## 二、系统架构总览
```
┌─────────────────────────────────────┐
│ 负载均衡 (Nginx) │
└──────┬──────────────┬───────────────┘
│ │
┌────────────┴───┐ ┌──────┴────────────┐
│ 前台用户端 │ │ 后台管理端 │
│ uniapp │ │ Vue3+ElementPlus │
│ (H5/App/小程序)│ │ (PC Web) │
└────────┬───────┘ └──────┬─────────────┘
│ │
WebSocket + HTTPS HTTPS (RESTful)
│ │
┌────────┴──────────────────┴─────────────┐
│ Go 单体服务(模块化) │
│ │
│ ┌────────┐ ┌──────┐ ┌────────────────┐ │
│ │ auth │ │ im │ │ meeting │ │
│ │ 用户鉴权│ │ 聊天 │ │ 会议/信令 │ │
│ ├────────┤ ├──────┤ ├────────────────┤ │
│ │contact │ │notify│ │ admin │ │
│ │ 联系人 │ │ 通知 │ │ 后台管理 │ │
│ └────────┘ └──────┘ └────────────────┘ │
│ │ │ │
│ PostgreSQL Redis │
└──────────┼──────────────┼─────────────────┘
│ HTTP/gRPC
┌──────────┴──────────────┴─────────────────┐
│ mediasoup Node 服务 │
│ ┌──────────┐ ┌──────────┐ │
│ │ Worker 1 │ │ Worker N │ (C++ SFU) │
│ └──────────┘ └──────────┘ │
└────────────────────────────────────────────┘
```
### 架构选型:精简单体 + 媒体微服务
- **方案一(已采用):** Go 单体模块化服务 + mediasoup Node 独立服务
- **演进路径:** 单体 → 分组服务(实时/业务分离) → 完全微服务
- **微服务预留规则:**
- 模块间零直接引用,通过 interface 通信
- 每个模块有独立的路由注册
- 数据库表按模块前缀命名
- Redis key 按模块命名空间
### 用户体系设计
采用统一用户表 + RBAC 权限体系,认证入口分离:
- 前台用户和后台管理员共用 `auth_users`
- 通过 `auth_roles``auth_user_roles` 区分角色user / admin / super_admin
- 前台 API 路由:`/api/v1/auth/*` — 仅需 JWT 验证
- 后台 API 路由:`/api/v1/admin/*` — JWT 验证 + 角色检查双重中间件
---
## 三、项目目录结构
```
EchoChat/
├── frontend/ # 前台用户端 (uniapp)
│ ├── src/
│ │ ├── api/ # API 请求封装
│ │ ├── components/ # 公共组件
│ │ ├── composables/ # 组合式函数
│ │ ├── pages/ # 页面
│ │ │ ├── auth/ # 登录/注册
│ │ │ ├── chat/ # 聊天相关
│ │ │ ├── contact/ # 联系人
│ │ │ ├── meeting/ # 会议相关
│ │ │ ├── notification/ # 通知中心
│ │ │ └── profile/ # 个人中心
│ │ ├── store/ # Pinia 状态管理
│ │ ├── utils/ # 工具函数
│ │ ├── services/ # 业务服务WebSocket、mediasoup-client
│ │ └── static/ # 静态资源
│ └── package.json
├── admin/ # 后台管理端 (Vue 3 + Element Plus)
│ ├── src/
│ │ ├── api/
│ │ ├── components/
│ │ ├── views/
│ │ │ ├── dashboard/ # 数据看板
│ │ │ ├── user/ # 用户管理
│ │ │ ├── meeting/ # 会议监控
│ │ │ ├── permission/ # 权限管理
│ │ │ ├── system/ # 系统配置
│ │ │ └── layout/ # 布局框架
│ │ ├── router/
│ │ └── store/
│ └── package.json
├── backend/
│ └── go-service/ # Go 单体服务
│ ├── cmd/
│ │ └── server/main.go # 入口
│ ├── config/ # 配置
│ ├── app/
│ │ ├── auth/ # 用户鉴权模块
│ │ │ ├── controller/
│ │ │ │ ├── auth_controller.go
│ │ │ │ └── admin_auth_controller.go
│ │ │ ├── service/
│ │ │ ├── dao/
│ │ │ └── model/
│ │ ├── im/ # 即时通讯模块
│ │ ├── contact/ # 联系人模块
│ │ ├── meeting/ # 会议模块
│ │ ├── notify/ # 通知模块
│ │ ├── admin/ # 后台管理模块
│ │ ├── constants/ # 常量定义
│ │ └── dto/ # 数据传输对象
│ ├── pkg/ # 公共工具包
│ │ ├── db/ # 数据库连接
│ │ ├── redis/ # Redis 客户端
│ │ ├── ws/ # WebSocket 管理
│ │ ├── middleware/ # 中间件
│ │ ├── utils/ # 工具函数
│ │ └── logs/ # 日志
│ ├── go.mod
│ └── go.sum
├── media-server/ # mediasoup Node 服务
│ ├── src/
│ │ ├── worker-manager.js # Worker 管理
│ │ ├── room.js # 房间媒体资源管理
│ │ ├── peer.js # 参与者媒体管理
│ │ └── api.js # 对外 HTTP API
│ ├── config/
│ └── package.json
├── deploy/ # 部署配置
│ ├── docker/ # Dockerfile 集合
│ ├── docker-compose.yml
│ ├── docker-compose.dev.yml
│ ├── nginx/
│ └── k8s/ # 预留 K8s 配置
├── docs/ # 文档
│ ├── plans/ # 设计方案与实施计划
│ ├── api/ # API 文档
│ └── architecture/ # 架构文档
├── scripts/ # 脚本
│ ├── init-db.sql
│ └── dev-setup.sh
└── README.md
```
---
## 四、数据库设计
### 4.1 PostgreSQL 核心表
#### auth 模块 — 用户与权限
```sql
CREATE TABLE auth_users (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
nickname VARCHAR(50) NOT NULL DEFAULT '',
avatar VARCHAR(500) NOT NULL DEFAULT '',
gender SMALLINT NOT NULL DEFAULT 0, -- 0:未知 1:男 2:女
phone VARCHAR(20) DEFAULT NULL,
status SMALLINT NOT NULL DEFAULT 1, -- 1:正常 2:禁用 3:注销
last_login_at TIMESTAMPTZ DEFAULT NULL,
last_login_ip VARCHAR(50) DEFAULT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE auth_roles (
id SERIAL PRIMARY KEY,
code VARCHAR(50) UNIQUE NOT NULL, -- user, admin, super_admin
name VARCHAR(50) NOT NULL,
description VARCHAR(200) DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE auth_user_roles (
user_id BIGINT NOT NULL REFERENCES auth_users(id),
role_id INT NOT NULL REFERENCES auth_roles(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (user_id, role_id)
);
```
#### contact 模块 — 联系人与好友
```sql
CREATE TABLE contact_friendships (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES auth_users(id),
friend_id BIGINT NOT NULL REFERENCES auth_users(id),
remark VARCHAR(50) DEFAULT '',
group_id BIGINT DEFAULT NULL,
status SMALLINT NOT NULL DEFAULT 0, -- 0:待确认 1:已接受 2:已拒绝 3:已拉黑
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (user_id, friend_id)
);
CREATE TABLE contact_groups (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES auth_users(id),
name VARCHAR(50) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
#### im 模块 — 即时通讯(统一会话模型)
单聊和群聊统一抽象为"会话",本质都是"一组人在一个空间里收发消息"。这是微信、钉钉、Slack 等主流 IM 的标准模型。
```sql
CREATE TABLE im_conversations (
id BIGSERIAL PRIMARY KEY,
type SMALLINT NOT NULL, -- 1:单聊 2:群聊
name VARCHAR(100) DEFAULT '',
avatar VARCHAR(500) DEFAULT '',
owner_id BIGINT DEFAULT NULL,
max_members INT NOT NULL DEFAULT 200,
status SMALLINT NOT NULL DEFAULT 1, -- 1:正常 2:已解散
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE im_conversation_members (
id BIGSERIAL PRIMARY KEY,
conversation_id BIGINT NOT NULL REFERENCES im_conversations(id),
user_id BIGINT NOT NULL REFERENCES auth_users(id),
role SMALLINT NOT NULL DEFAULT 0, -- 0:普通成员 1:管理员 2:群主
nickname VARCHAR(50) DEFAULT '',
is_muted BOOLEAN NOT NULL DEFAULT FALSE,
is_pinned BOOLEAN NOT NULL DEFAULT FALSE,
last_read_msg_id BIGINT DEFAULT 0,
joined_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (conversation_id, user_id)
);
CREATE TABLE im_messages (
id BIGSERIAL PRIMARY KEY,
conversation_id BIGINT NOT NULL,
sender_id BIGINT NOT NULL,
type SMALLINT NOT NULL DEFAULT 1, -- 1:文本 2:图片 3:文件 4:语音 5:系统消息
content TEXT NOT NULL DEFAULT '',
extra JSONB DEFAULT '{}',
status SMALLINT NOT NULL DEFAULT 1, -- 1:正常 2:已撤回 3:已删除
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_im_messages_conv_time ON im_messages(conversation_id, created_at DESC);
```
#### meeting 模块 — 音视频会议
```sql
CREATE TABLE meeting_rooms (
id BIGSERIAL PRIMARY KEY,
room_code VARCHAR(20) UNIQUE NOT NULL, -- 会议号
title VARCHAR(200) NOT NULL,
host_id BIGINT NOT NULL REFERENCES auth_users(id),
type SMALLINT NOT NULL DEFAULT 1, -- 1:即时会议 2:预约会议
password VARCHAR(50) DEFAULT NULL,
max_members INT NOT NULL DEFAULT 50,
status SMALLINT NOT NULL DEFAULT 0, -- 0:未开始 1:进行中 2:已结束
scheduled_at TIMESTAMPTZ DEFAULT NULL, -- 预约时间即时会议为NULL
started_at TIMESTAMPTZ DEFAULT NULL,
ended_at TIMESTAMPTZ DEFAULT NULL,
settings JSONB DEFAULT '{}', -- 会议设置
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE meeting_participants (
id BIGSERIAL PRIMARY KEY,
room_id BIGINT NOT NULL REFERENCES meeting_rooms(id),
user_id BIGINT NOT NULL REFERENCES auth_users(id),
role SMALLINT NOT NULL DEFAULT 0, -- 0:参与者 1:主持人 2:联合主持人
joined_at TIMESTAMPTZ DEFAULT NULL,
left_at TIMESTAMPTZ DEFAULT NULL,
duration INT DEFAULT 0,
UNIQUE (room_id, user_id)
);
```
会议类型状态流转:
- 即时会议:创建 → 进行中(1) → 已结束(2)
- 预约会议:创建 → 未开始(0) → 进行中(1) → 已结束(2)
#### notify 模块 — 消息通知
```sql
CREATE TABLE notify_notifications (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES auth_users(id),
type VARCHAR(50) NOT NULL, -- meeting_invite, friend_request, system
title VARCHAR(200) NOT NULL,
content TEXT DEFAULT '',
extra JSONB DEFAULT '{}',
is_read BOOLEAN NOT NULL DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_notify_user_read ON notify_notifications(user_id, is_read, created_at DESC);
```
#### admin 模块 — 管理操作日志
```sql
CREATE TABLE admin_operation_logs (
id BIGSERIAL PRIMARY KEY,
admin_id BIGINT NOT NULL REFERENCES auth_users(id),
module VARCHAR(50) NOT NULL,
action VARCHAR(50) NOT NULL,
target_type VARCHAR(50) DEFAULT '',
target_id BIGINT DEFAULT NULL,
detail JSONB DEFAULT '{}',
ip VARCHAR(50) DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```
### 4.2 Redis 数据结构
```
# 用户认证
echo:auth:token:{user_id} → JWT Token (STRING, TTL 7天)
echo:auth:refresh:{user_id} → Refresh Token (STRING, TTL 30天)
# 用户在线状态
echo:user:online → 在线用户集合 (SET)
echo:user:status:{user_id} → 用户状态 JSON (STRING, TTL 自动过期)
# 即时通讯
echo:im:unread:{user_id} → 各会话未读数 (HASH: conv_id → count)
echo:im:typing:{conversation_id} → 正在输入的用户 (SET, TTL 5秒)
# 会议实时状态
echo:meeting:room:{room_code} → 房间实时状态 JSON (STRING)
echo:meeting:members:{room_code} → 房间在线成员 (HASH: user_id → 状态JSON)
echo:meeting:transport:{room_code} → Transport/Producer 映射 (HASH)
# WebSocket 连接映射
echo:ws:user:{user_id} → 连接所在的服务实例ID (STRING)
echo:ws:conn:{conn_id} → 连接信息 JSON (STRING)
```
---
## 五、通信协议与 API 设计
### 5.1 通信方式总览
| 通信路径 | 协议 | 用途 |
|---------|------|------|
| 客户端 ↔ Go 服务 | WebSocket | 实时消息、信令、状态同步 |
| 客户端 ↔ Go 服务 | HTTPS RESTful | 用户操作、数据查询、管理功能 |
| 管理端 ↔ Go 服务 | HTTPS RESTful | 后台管理 CRUD |
| Go 服务 ↔ mediasoup Node | HTTP | 媒体资源创建/管理 |
| 客户端 ↔ mediasoup Worker | WebRTC (DTLS/RTP) | 音视频媒体流直连 |
### 5.2 WebSocket 消息协议
统一 JSON 格式:
```json
{
"event": "im.message.send",
"seq": 1001,
"data": {},
"timestamp": 1740700000
}
```
事件命名规范:`{模块}.{对象}.{动作}`
```
# 即时通讯
im.message.send / im.message.new / im.message.revoke / im.message.read
im.typing.start / im.typing.stop
# 会议信令
meeting.room.join / meeting.room.leave / meeting.room.info
meeting.member.join / meeting.member.leave / meeting.member.mute / meeting.member.video
# mediasoup 信令
meeting.transport.create / meeting.transport.connect
meeting.produce.start / meeting.produce.stop
meeting.consume.start / meeting.consume.resume
# 用户状态
user.status.online / user.status.offline
# 通知
notify.new / notify.meeting.invite / notify.friend.request
```
服务端响应格式:
```json
{
"event": "im.message.send.ack",
"seq": 1001,
"code": 0,
"message": "ok",
"data": { "msg_id": 10086 }
}
```
### 5.3 前台用户 RESTful API
```
# 认证模块
POST /api/v1/auth/register
POST /api/v1/auth/login
POST /api/v1/auth/logout
POST /api/v1/auth/refresh-token
GET /api/v1/auth/profile
PUT /api/v1/auth/profile
PUT /api/v1/auth/password
# 联系人模块
GET /api/v1/contacts
POST /api/v1/contacts/request
POST /api/v1/contacts/accept
POST /api/v1/contacts/reject
DELETE /api/v1/contacts/:id
PUT /api/v1/contacts/:id/remark
GET /api/v1/contacts/groups
POST /api/v1/contacts/groups
# 即时通讯模块
GET /api/v1/conversations
POST /api/v1/conversations
GET /api/v1/conversations/:id
GET /api/v1/conversations/:id/messages
POST /api/v1/conversations/:id/members
DELETE /api/v1/conversations/:id/members/:uid
# 会议模块
POST /api/v1/meetings
POST /api/v1/meetings/schedule
GET /api/v1/meetings/:code
POST /api/v1/meetings/:code/join
POST /api/v1/meetings/:code/leave
GET /api/v1/meetings/upcoming
GET /api/v1/meetings/ongoing
GET /api/v1/meetings/history
# 通知模块
GET /api/v1/notifications
PUT /api/v1/notifications/:id/read
PUT /api/v1/notifications/read-all
```
### 5.4 后台管理 RESTful API
```
# 管理员认证
POST /api/v1/admin/auth/login
# 用户管理
GET /api/v1/admin/users
GET /api/v1/admin/users/:id
PUT /api/v1/admin/users/:id/status
PUT /api/v1/admin/users/:id/role
POST /api/v1/admin/users
GET /api/v1/admin/users/:id/meetings
# 会议管理
GET /api/v1/admin/meetings
GET /api/v1/admin/meetings/:id
PUT /api/v1/admin/meetings/:id/close
GET /api/v1/admin/meetings/stats
# 系统管理
GET /api/v1/admin/dashboard
GET /api/v1/admin/logs
GET /api/v1/admin/system/config
PUT /api/v1/admin/system/config
```
### 5.5 Go ↔ mediasoup Node 通信 API
```
POST /media/router/create
POST /media/transport/create
POST /media/transport/connect
POST /media/producer/create
POST /media/producer/close
POST /media/consumer/create
POST /media/consumer/resume
GET /media/router/:id/capabilities
DELETE /media/room/:id
```
### 5.6 统一响应格式与错误码
```json
{
"code": 0,
"message": "ok",
"data": {},
"timestamp": 1740700000
}
```
| 错误码 | 含义 |
|--------|------|
| 0 | 成功 |
| 1001 | 参数错误 |
| 1002 | 未认证 |
| 1003 | 权限不足 |
| 2001 | 用户相关错误 |
| 3001 | IM 相关错误 |
| 4001 | 会议相关错误 |
| 5001 | 系统内部错误 |
---
## 六、前端页面结构
### 6.1 前台用户端页面uniapp
```
pages/
├── auth/
│ ├── login.vue # 登录页
│ ├── register.vue # 注册页
│ └── forgot-password.vue # 忘记密码
├── chat/
│ ├── index.vue # 会话列表
│ ├── conversation.vue # 聊天对话页
│ └── group-create.vue # 创建群聊
├── contact/
│ ├── index.vue # 联系人列表
│ ├── add-friend.vue # 添加好友
│ ├── friend-requests.vue # 好友申请列表
│ └── detail.vue # 好友资料页
├── meeting/
│ ├── index.vue # 会议首页(即将开始 + 进行中 + 快速入口)
│ ├── create.vue # 创建即时会议
│ ├── schedule.vue # 预约会议
│ ├── room.vue # 会议房间(音视频画面)
│ ├── history.vue # 历史会议
│ └── detail.vue # 会议详情
├── notification/
│ └── index.vue # 通知中心
├── profile/
│ ├── index.vue # 个人中心
│ └── edit.vue # 编辑资料
└── index/
└── index.vue # 启动页/首页
```
TabBar 导航底部4标签消息 | 联系人 | 会议 | 我的
### 6.2 后台管理端页面Vue 3 + Element Plus
```
views/
├── login.vue # 管理员登录
├── dashboard/index.vue # 数据看板
├── user/
│ ├── list.vue # 用户列表
│ └── detail.vue # 用户详情含会议记录Tab
├── meeting/
│ ├── list.vue # 会议列表
│ ├── detail.vue # 会议详情
│ └── monitor.vue # 实时监控
├── permission/
│ ├── role.vue # 角色管理
│ └── assign.vue # 权限分配
├── system/
│ ├── config.vue # 系统配置
│ └── logs.vue # 操作日志
└── layout/
├── index.vue # 布局框架
├── sidebar.vue # 侧边栏
└── header.vue # 顶部栏
```
---
## 七、关键技术方案
### 7.1 WebSocket 连接管理
- 心跳保活30秒一次 ping/pong
- 断线自动重连指数退避1s → 2s → 4s → 8s → 最大30s
- 消息队列缓冲:断线期间消息先缓存,重连后重发
- 多页面共享:通过 Pinia store 管理连接状态
### 7.2 mediasoup-client 集成
```
services/
├── websocket.js # WebSocket 连接管理(单例)
├── mediasoup-client.js # mediasoup Device 管理
└── media-utils.js # 音视频工具
```
会议加入完整信令流程:
1. HTTP: POST /api/v1/meetings/:code/join → 验证权限
2. WS: meeting.room.join → Go 通知 Node 创建 Router
3. WS: meeting.transport.create → Go 转发 Node 创建 Transport
4. mediasoup-client: device.load(routerRtpCapabilities)
5. sendTransport.produce(videoTrack/audioTrack) → WS 信令
6. 服务端通知其他成员 → 其他成员 consume
7. 音视频流直连 mediasoup Worker
### 7.3 状态管理Pinia
```
store/
├── user.js # 用户信息、Token、登录状态
├── chat.js # 会话列表、当前会话、消息缓存
├── contact.js # 好友列表、好友请求
├── meeting.js # 会议状态、参与者、本地媒体
├── notification.js # 通知列表、未读数
└── websocket.js # WebSocket 连接状态、消息分发
```
### 7.4 Docker Compose 编排
```yaml
services:
go-service: # Go 后端 → 8080
media-server: # mediasoup → 3000 + 40000-40100/udp (RTP)
postgres: # PostgreSQL → 5432
redis: # Redis → 6379
nginx: # 反向代理 → 80/443
```
---
## 八、开发分期规划
### 第一期MVP
- 用户注册/登录(邮箱+密码、用户名+密码)
- 即时聊天(单聊 + 群聊,文字/图片/文件)
- 联系人/好友管理
- 多人音视频会议(即时会议 + 预约会议)
- 消息通知系统
### 第二期
- 屏幕共享
- 微信授权登录
- 互动直播(主播开播、观众观看、弹幕互动)
- 会议录制与回放
### 第三期
- 微服务拆分
- Kubernetes 部署编排
- 跨服务器会议(多 Worker 集群)
- AI 辅助功能(语音转文字、会议纪要等)