消息系统架构设计方案
1. 架构图
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)
export enum MessageType {
SYSTEM = 'system', // 系统消息
ANNOUNCE = 'announce', // 公告
PRIVATE = 'private' // 私信
}
export enum MessageStatus {
UNREAD = 0, // 未读
READ = 1, // 已读
DELETED = 2 // 已删除
}
消息表结构
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}) |
实时推送流程
- Admin发送消息 → 服务端接收(message:send)
- 服务端处理:
- 存储消息到数据库
- 根据类型推送:
- SYSTEM: io.to('system').emit('message:broadcasted')
- ANNOUNCE: io.to('announce').emit('message:broadcasted')
- PRIVATE: io.to(
user_${targetId}).emit('message:broadcasted')
- Mobile端:
4. 接口定义
HTTP API
- GET /api/messages - 获取消息列表
- POST /api/messages - 发送消息
- GET /api/messages/unread - 获取未读消息数
- PUT /api/messages/:id/read - 标记消息为已读
权限控制
- 系统消息: 仅管理员可发送
- 公告: 管理员和特定角色可发送
- 私信: 所有用户可发送