Files
d8d-admin-mobile-starter-pu…/docs/message-system-architecture.md

99 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 消息系统架构设计方案
## 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 - 标记消息为已读
### 权限控制
- 系统消息: 仅管理员可发送
- 公告: 管理员和特定角色可发送
- 私信: 所有用户可发送