# message-system **Repository Path**: sulir/message-system ## Basic Information - **Project Name**: message-system - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-08 - **Last Updated**: 2025-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 消息通知功能需求文档 ###消息通知功能 - 1.需要一个管理消息列表页面,页面包含添加消息的功能按钮,另外还需要一个列表要包含,标题,通知人群(所有用户/指定角色/指定用户),发布时间,生效时间区间, 已阅人数, 状态,操作(删除/修改编辑), - 2.管理页面,可以选择通知的用户群体(所有用户/指定角色/指定用户)的单选属性,通知类型(App弹框/App推送)多选,但目前只做App弹框,不做App推送(因为App推送应用场景设计复杂且实际应用需求不多见), 多语言(中/英/柬/菲),标题,内容,正文(富文本),生效时间区间. - 3.获取消息的接口,当前接口是由接受通知的用户进行访问获取消息的,假设有一条消息,当前用户携带token请求接口,那么就要获取当前生效时间区间的消息,且当前用户未读的消息. - 4.上报已读接口,用户携带token和消息id去访问这个接口,标记成已读,当消息为已读时,下次用户再请求"获取消息接口"时,则不再返回消息. ## 管理功能 ### 消息列表页面 - **功能按钮**:添加新消息 - **列表展示字段**: - 标题 - 通知人群(所有用户/指定角色/指定用户) - 发布时间 - 生效时间区间(以Unix时间戳形式存储为`bigint`) - 已阅人数 - 状态(草稿、已发布、未生效、已过期、已删除) - 优先级 - 操作(删除/修改编辑) - **分页功能**:支持对管理列表进行分页展示 - **搜索与筛选功能**: - 按标题搜索 - 按通知人群筛选 - 按状态筛选(生效中/已过期/未生效) - 按时间范围筛选 - 按优先级筛选 ### 消息编辑页面 - **通知用户群体**:单选(所有用户/指定角色/指定用户) - **通知类型**:多选(App弹框/App推送) - **多语言支持** - **标题** - **内容** - **正文**(富文本编辑器) - **生效时间区间设置**(使用Unix时间戳格式化为`bigint`) - **优先级设置**:设置消息的显示优先级 ## API接口 ### 获取消息接口 - 用户通过携带token请求获取消息 - 返回条件: - 当前生效时间区间内的消息 - 当前用户未读的消息 - 返回数据排序: - 首先按优先级排序(高到低) - 然后按发布时间排序(新到旧) - 一次性返回所有符合条件的消息(不分页) ### 上报已读接口 - 用户携带token和消息id访问 - 功能:标记指定消息为已读状态 - 效果:已读消息在下次"获取消息接口"请求中不再返回 ## 数据处理策略 ### 消息删除机制 - 管理员删除消息时进行物理删除 - 同时删除与该消息关联的所有数据(包括已读记录等) ### 技术实现建议 #### 数据库设计 - 使用PostgreSQL存储消息信息,并采用`bigint`类型来记录时间戳。 - Redis用于缓存热门消息,减少数据库查询压力。 #### 后端技术栈 - html + js + Node.js + Express框架 - 对于日期时间转换,可以在应用层使用JavaScript Date对象或moment.js库来处理Unix时间戳。 # 消息通知系统详细设计方案 ## 1. 数据库设计 ### 消息主表 (message) ```sql CREATE TABLE message ( id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, target_type SMALLINT NOT NULL COMMENT '通知人群类型: 1-所有用户, 2-指定角色, 3-指定用户', notification_type JSONB NOT NULL COMMENT '通知类型: ["app_popup", "app_push"]', status SMALLINT NOT NULL DEFAULT 1 COMMENT '状态: 1-草稿, 2-已发布, 3-未生效, 4-已过期, 5-已删除', priority SMALLINT NOT NULL DEFAULT 3 COMMENT '优先级: 1-紧急, 2-高, 3-中, 4-低', created_at BIGINT NOT NULL COMMENT '创建时间戳', published_at BIGINT COMMENT '发布时间戳', effective_start_at BIGINT NOT NULL COMMENT '生效开始时间戳', effective_end_at BIGINT NOT NULL COMMENT '生效结束时间戳', created_by INTEGER NOT NULL COMMENT '创建者ID', updated_at BIGINT COMMENT '更新时间戳', updated_by INTEGER COMMENT '更新者ID' ); CREATE INDEX idx_message_status ON message(status); CREATE INDEX idx_message_effective ON message(effective_start_at, effective_end_at); ``` ### 消息内容表 (message_content) ```sql CREATE TABLE message_content ( id SERIAL PRIMARY KEY, message_id INTEGER NOT NULL REFERENCES message(id) ON DELETE CASCADE, language VARCHAR(10) NOT NULL COMMENT '语言代码: zh, en, km, fil', title VARCHAR(255) NOT NULL, content TEXT NOT NULL COMMENT '简短内容', body TEXT COMMENT '富文本正文内容', UNIQUE(message_id, language) ); CREATE INDEX idx_message_content_message_id ON message_content(message_id); ``` ### 消息目标角色表 (message_target_role) ```sql CREATE TABLE message_target_role ( id SERIAL PRIMARY KEY, message_id INTEGER NOT NULL REFERENCES message(id) ON DELETE CASCADE, role_id INTEGER NOT NULL COMMENT '角色ID', UNIQUE(message_id, role_id) ); CREATE INDEX idx_message_target_role_message_id ON message_target_role(message_id); ``` ### 消息目标用户表 (message_target_user) ```sql CREATE TABLE message_target_user ( id SERIAL PRIMARY KEY, message_id INTEGER NOT NULL REFERENCES message(id) ON DELETE CASCADE, user_id INTEGER NOT NULL COMMENT '用户ID', UNIQUE(message_id, user_id) ); CREATE INDEX idx_message_target_user_message_id ON message_target_user(message_id); CREATE INDEX idx_message_target_user_user_id ON message_target_user(user_id); ``` ### 消息阅读记录表 (message_read) ```sql CREATE TABLE message_read ( id SERIAL PRIMARY KEY, message_id INTEGER NOT NULL REFERENCES message(id) ON DELETE CASCADE, user_id INTEGER NOT NULL COMMENT '用户ID', read_at BIGINT NOT NULL COMMENT '阅读时间戳', UNIQUE(message_id, user_id) ); CREATE INDEX idx_message_read_message_id ON message_read(message_id); CREATE INDEX idx_message_read_user_id ON message_read(user_id); ``` ## 2. API接口设计 ### 管理端API #### 获取消息列表 ``` GET /api/admin/messages ``` 请求参数: ```json { "page": 1, // 页码,默认1 "page_size": 10, // 每页条数,默认10 "title": "", // 按标题搜索(可选) "target_type": null, // 通知人群过滤(可选): 1-所有用户, 2-指定角色, 3-指定用户 "status": null, // 状态过滤(可选): 1-草稿, 2-已发布, 3-未生效, 4-生效中, 5-已过期 "priority": null, // 优先级过滤(可选): 1-紧急, 2-高, 3-中, 4-低 "start_time": null, // 开始时间过滤(可选) "end_time": null // 结束时间过滤(可选) } ``` 响应: ```json { "code": 0, "message": "success", "data": { "total": 100, "page": 1, "page_size": 10, "list": [ { "id": 1, "title": "系统维护通知", "target_type": 1, "target_type_text": "所有用户", "notification_type": ["app_popup", "app_push"], "status": 4, "status_text": "生效中", "priority": 1, "priority_text": "紧急", "created_at": 1642153228000, "published_at": 1642153228000, "effective_start_at": 1642153228000, "effective_end_at": 1644745228000, "read_count": 1205, "total_user_count": 2500 } ] } } ``` #### 创建消息 ``` POST /api/admin/messages ``` 请求体: ```json { "title": "系统维护通知", "target_type": 1, // 1-所有用户, 2-指定角色, 3-指定用户 "role_ids": [], // 当target_type=2时必填 "user_ids": [], // 当target_type=3时必填 "notification_type": ["app_popup", "app_push"], "priority": 1, "effective_start_at": 1642153228000, "effective_end_at": 1644745228000, "contents": [ { "language": "zh", "title": "系统维护通知", "content": "系统将于今晚22:00-24:00进行维护", "body": "
尊敬的用户:
我们的系统将于今晚22:00-24:00进行例行维护升级,期间部分功能可能无法正常使用。
给您带来的不便,敬请谅解!
" }, { "language": "en", "title": "System Maintenance Notice", "content": "The system will undergo maintenance tonight from 22:00 to 24:00", "body": "Dear user:
Our system will undergo routine maintenance and upgrades tonight from 22:00 to 24:00, during which some functions may not be available.
We apologize for any inconvenience this may cause!
" } ], "status": 1 // 1-草稿(默认), 2-已发布 } ``` 响应: ```json { "code": 0, "message": "success", "data": { "id": 1 } } ``` #### 更新消息 ``` PUT /api/admin/messages/{id} ``` 请求体: 同创建消息 #### 删除消息 ``` DELETE /api/admin/messages/{id} ``` 响应: ```json { "code": 0, "message": "success" } ``` #### 获取消息详情 ``` GET /api/admin/messages/{id} ``` 响应: ```json { "code": 0, "message": "success", "data": { "id": 1, "title": "系统维护通知", "target_type": 1, "role_ids": [], "user_ids": [], "notification_type": ["app_popup", "app_push"], "status": 2, "priority": 1, "created_at": 1642153228000, "published_at": 1642153228000, "effective_start_at": 1642153228000, "effective_end_at": 1644745228000, "contents": [ { "language": "zh", "title": "系统维护通知", "content": "系统将于今晚22:00-24:00进行维护", "body": "尊敬的用户:
我们的系统将于今晚22:00-24:00进行例行维护升级,期间部分功能可能无法正常使用。
给您带来的不便,敬请谅解!
" }, { "language": "en", "title": "System Maintenance Notice", "content": "The system will undergo maintenance tonight from 22:00 to 24:00", "body": "Dear user:
Our system will undergo routine maintenance and upgrades tonight from 22:00 to 24:00, during which some functions may not be available.
We apologize for any inconvenience this may cause!
" } ], "read_count": 1205, "total_user_count": 2500 } } ``` #### 发布消息 ``` POST /api/admin/messages/{id}/publish ``` 响应: ```json { "code": 0, "message": "success" } ``` ### 用户端API #### 获取消息列表 ``` GET /api/messages ``` 请求参数: ```json { "language": "zh" } ``` 响应: ```json { "code": 0, "message": "success", "data": [ { "id": 1, "title": "系统维护通知", "content": "系统将于今晚22:00-24:00进行维护", "body": "尊敬的用户:
我们的系统将于今晚22:00-24:00进行例行维护升级,期间部分功能可能无法正常使用。
给您带来的不便,敬请谅解!
", "notification_type": ["app_popup", "app_push"], "priority": 1, "published_at": 1642153228000 } ] } ``` #### 标记消息已读 ``` POST /api/messages/read ``` 请求体: ```json { "message_id": 1 } ``` 响应: ```json { "code": 0, "message": "success" } ``` #### 批量标记消息已读 ``` POST /api/messages/read-all ``` 响应: ```json { "code": 0, "message": "success" } ``` ## 3. 前端组件设计 ### 管理端组件 #### 消息列表页面 组件结构: - 顶部操作区 (搜索框、筛选条件、添加按钮) - 消息表格 (分页) - 批量操作按钮 - 状态标签 (不同颜色表示不同状态) #### 消息编辑页面 组件结构: - 表单布局 (分步骤或分区块) - 语言切换标签 - 富文本编辑器 - 用户/角色选择器 - 时间选择器 - 提交/保存按钮 ### 安全性考虑 1. 消息权限控制:确保用户只能看到发给自己的消息 2. 防止XSS攻击:富文本内容过滤和清洗 3. 操作日志:记录消息的创建、修改、删除等操作 ## 5. 部署架构建议 ### 前端部署 1. 管理端:通过Nginx部署 2. 用户端:集成到现有App中 ### 后端部署 1. 应用服务器:Node.js 2. 数据库:PostgreSQL主从复制确保高可用 3. 缓存:Redis集群