99 lines
2.8 KiB
Markdown
99 lines
2.8 KiB
Markdown
# 消息系统架构设计方案
|
||
|
||
## 1. 架构图
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph Admin端
|
||
A[发送消息] -->|类型转换| B(server/routes_io_messages.ts)
|
||
end
|
||
subgraph Server
|
||
B --> C{消息类型}
|
||
C -->|ANNOUNCE| D[存入DB+推announce]
|
||
C -->|PRIVATE| E[存入DB+推user_[id]]
|
||
C -->|SYSTEM| F[存入DB+推system]
|
||
D & E & F --> G[Socket推送]
|
||
end
|
||
subgraph Mobile端
|
||
G --> H[多频道订阅]
|
||
H --> I[按类型处理UI]
|
||
end
|
||
```
|
||
|
||
## 2. 关键数据结构
|
||
|
||
### 消息类型枚举 (client/share/types.ts)
|
||
```typescript
|
||
export enum MessageType {
|
||
SYSTEM = 'system', // 系统消息
|
||
ANNOUNCE = 'announce', // 公告
|
||
PRIVATE = 'private' // 私信
|
||
}
|
||
|
||
export enum MessageStatus {
|
||
UNREAD = 0, // 未读
|
||
READ = 1, // 已读
|
||
DELETED = 2 // 已删除
|
||
}
|
||
```
|
||
|
||
### 消息表结构
|
||
```sql
|
||
CREATE TABLE messages (
|
||
id SERIAL PRIMARY KEY,
|
||
title VARCHAR(255) NOT NULL,
|
||
content TEXT NOT NULL,
|
||
type ENUM('SYSTEM','ANNOUNCE','PRIVATE') NOT NULL,
|
||
sender_id INTEGER REFERENCES users(id),
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
CREATE TABLE user_messages (
|
||
user_id INTEGER REFERENCES users(id),
|
||
message_id INTEGER REFERENCES messages(id),
|
||
status ENUM('UNREAD','READ') DEFAULT 'UNREAD',
|
||
PRIMARY KEY (user_id, message_id)
|
||
);
|
||
```
|
||
|
||
## 3. 事件流说明
|
||
|
||
### Socket.IO 事件规范
|
||
| 事件名称 | 方向 | 描述 |
|
||
|---------|------|------|
|
||
| message:subscribe | 客户端→服务端 | 订阅消息频道 |
|
||
| message:unsubscribe | 客户端→服务端 | 取消订阅 |
|
||
| message:send | 客户端→服务端 | 发送消息 |
|
||
| message:received | 服务端→客户端 | 消息接收确认 |
|
||
| message:broadcasted | 服务端→客户端 | 广播新消息 |
|
||
|
||
### 频道订阅规范
|
||
| 消息类型 | 目标频道 | 订阅方式 |
|
||
|----------|----------|----------|
|
||
| SYSTEM | system | socket.join('system') |
|
||
| ANNOUNCE | announce | socket.join('announce') |
|
||
| PRIVATE | user_[id]| socket.join(`user_${userId}`) |
|
||
|
||
### 实时推送流程
|
||
1. Admin发送消息 → 服务端接收(message:send)
|
||
2. 服务端处理:
|
||
- 存储消息到数据库
|
||
- 根据类型推送:
|
||
* SYSTEM: io.to('system').emit('message:broadcasted')
|
||
* ANNOUNCE: io.to('announce').emit('message:broadcasted')
|
||
* PRIVATE: io.to(`user_${targetId}`).emit('message:broadcasted')
|
||
3. Mobile端:
|
||
- 初始化时订阅相关频道
|
||
- 按频道接收处理消息
|
||
|
||
## 4. 接口定义
|
||
|
||
### HTTP API
|
||
- GET /api/messages - 获取消息列表
|
||
- POST /api/messages - 发送消息
|
||
- GET /api/messages/unread - 获取未读消息数
|
||
- PUT /api/messages/:id/read - 标记消息为已读
|
||
|
||
### 权限控制
|
||
- 系统消息: 仅管理员可发送
|
||
- 公告: 管理员和特定角色可发送
|
||
- 私信: 所有用户可发送 |