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