主题
IM即时通讯 PRD
文档信息
| 项目 | 内容 |
|---|---|
| 产品名称 | PMForge - IM即时通讯 |
| 文档版本 | v2.0 |
| 创建日期 | 2026-09-24 |
| 最后更新 | 2026-09-24 |
| 文档状态 | 评审中 |
| 优先级 | P1 |
一、功能概述
1.1 功能定位
IM即时通讯是 PMForge 平台的"内部微信"——让团队成员在不离开平台的前提下完成日常沟通。就像微信让你不用打电话就能发消息一样,IM模块让项目成员可以随时发起单聊或群聊、传输文件、@同事提醒,而管理者则可以通过后台进行消息审计、敏感词管控和活跃度分析。
通俗理解:把微信的聊天能力"搬"到项目管理平台里。用户在同一个界面里既能讨论工作,又能查看任务进度,不用在多个App之间来回切换。
1.2 目标用户与使用频率
| 用户类型 | 使用场景 | 使用频率 |
|---|---|---|
| 项目成员 | 日常沟通、任务讨论、文件传输 | 每日高频(日均30+次) |
| 团队负责人 | 创建群组、发布公告、团队协调 | 每日中频(日均10+次) |
| 系统管理员 | 消息审计、敏感词管控、系统配置 | 每周低频(按需操作) |
| 运营人员 | 活跃度分析、消息量监控 | 每周低频(数据查看) |
1.3 业务价值
| 价值维度 | 具体收益 | 衡量指标 |
|---|---|---|
| 沟通效率 | 减少在多个App间切换的时间浪费 | 消息响应时间缩短50% |
| 协作闭环 | 聊天与任务在同一平台,讨论完直接创建任务 | 任务创建来源中IM占比>20% |
| 内容合规 | 敏感词实时过滤,降低违规风险 | 敏感消息拦截率>99% |
| 运营支撑 | 活跃度数据为管理决策提供依据 | 可追踪日活/月活趋势 |
| 知识沉淀 | 群文件和聊天记录可追溯 | 群文件下载率可统计 |
1.4 功能范围
| 功能分类 | 后台管理端 | 前台用户端 | 使用频率 |
|---|---|---|---|
| 会话管理 | ✅ 管理全部会话 | ✅ 管理个人会话 | 每日 |
| 消息收发 | ✅ 审计消息 | ✅ 收发消息 | 每日高频 |
| 群组管理 | ✅ 管理全部群组 | ✅ 创建/管理群组 | 每周 |
| 敏感词管理 | ✅ 配置和监控 | ❌ | 按需 |
| IM 配置 | ✅ 全局参数配置 | ❌ | 极少 |
| IM 统计 | ✅ 数据分析 | ❌ | 每周 |
| 联系人/好友 | ❌ | ✅ 添加好友、黑名单 | 按需 |
| 消息互动 | ❌ | ✅ 撤回/回复/@/转发 | 每日高频 |
| 在线状态 | ✅ 查看 | ✅ 设置 | 每日 |
二、用户场景
2.1 用户角色
| 角色 | 描述 | 核心诉求 |
|---|---|---|
| 普通用户 | 项目团队成员 | 消息实时到达、文件传输稳定、聊天记录不丢失 |
| 群主/管理员 | 群组创建者或管理者 | 管理群成员、发布公告、维护群秩序 |
| 系统管理员 | 后台运维人员 | 消息审计、敏感词管控、系统配置 |
| 运营人员 | 数据分析人员 | IM活跃度统计、消息量趋势分析 |
2.2 使用场景
场景1:IM用户小王单聊沟通任务细节
- 角色:项目成员小王
- 背景:小王需要和同事小李确认一个任务的截止日期
- 操作流程:打开IM → 在会话列表找到小李 → 发送文字消息"那个报告周五前能交吗?" → 小李实时收到并回复 → 小王发送一份参考文件(图片消息辅助说明)→ 沟通完毕
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 消息发送后对方200ms内收到(同区域网络) | P0 |
| AC-2 | 图片消息支持点击放大预览,文件消息显示下载进度 | P0 |
| AC-3 | 断网后重连,离线消息在上线后3秒内补齐 | P0 |
| AC-4 | 消息状态正确显示:发送中→已发送→已送达→已读 | P1 |
| AC-5 | 会话列表自动更新最后一条消息预览和时间 | P0 |
场景2:团队负责人张经理创建项目群并发布通知
- 角色:团队负责人张经理
- 背景:新项目启动,需要拉一个项目讨论群
- 操作流程:点击"创建群组" → 选择"PMForge V2项目组" → 勾选8名项目成员 → 填写群名称和描述 → 确认创建 → 在群内@所有人发布启动会通知 → 成员收到特殊提醒并回复确认
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 创建者自动成为群主,被选成员自动入群并收到通知 | P0 |
| AC-2 | @所有人消息对所有群成员产生特殊提醒(声音+角标) | P0 |
| AC-3 | 群成员列表实时更新,新成员入群后可以看到历史消息 | P1 |
| AC-4 | 群公告发布后推送通知给所有群成员 | P1 |
| AC-5 | 群文件上传后所有成员可下载,显示文件名/大小/上传者 | P1 |
场景3:项目成员小赵撤回错误消息
- 角色:项目成员小赵
- 背景:小赵在群内发送了一条包含错误数据的消息
- 操作流程:发现消息有误 → 长按消息选择"撤回" → 消息被撤回 → 群内显示"小赵撤回了一条消息" → 小赵重新发送正确内容
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 发送后2分钟内(可配置)的消息可以撤回 | P0 |
| AC-2 | 撤回后所有群成员端显示"xxx撤回了一条消息"占位提示 | P0 |
| AC-3 | 超过撤回时限的消息,长按菜单不显示"撤回"选项 | P1 |
| AC-4 | 撤回操作对发送者自己也生效,本地消息同样替换为撤回提示 | P1 |
| AC-5 | 后台管理员可在消息管理中看到被撤回消息的原始内容 | P2 |
场景4:系统管理员进行消息审计
- 角色:系统管理员
- 背景:收到用户投诉有人在群内发送不当言论
- 操作流程:登录后台 → 进入消息管理 → 按发送者ID+时间范围筛选 → 定位到目标消息 → 查看消息详情(含发送者/接收者/群组/内容) → 删除违规消息 → 消息在相关用户端同步消失
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 支持按发送者、消息类型、时间范围、关键词多维度筛选 | P0 |
| AC-2 | 删除消息后,相关用户端同步更新显示 | P0 |
| AC-3 | 批量删除单次不超过100条,防止误操作 | P1 |
| AC-4 | 消息导出Excel包含完整字段:发送者、接收者、内容、时间、类型 | P1 |
| AC-5 | 消息列表按时间倒序,最新消息在最前 | P0 |
场景5:系统管理员配置敏感词库
- 角色:系统管理员
- 背景:需要上线一批新的敏感词防止违规内容
- 操作流程:进入敏感词管理 → 选择"暴力"分组 → 批量导入Excel文件(500个新敏感词) → 设置匹配策略为"替换" → 用户在聊天中发送包含敏感词的消息 → 系统自动将敏感词替换为*** → 管理员查看拦截记录
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 批量导入支持Excel/TXT格式,单次不超过1000条 | P1 |
| AC-2 | 敏感词变更后实时生效,无需重启服务 | P0 |
| AC-3 | 三种匹配策略(拦截/替换/审核)按配置执行 | P0 |
| AC-4 | 同一分组内敏感词不可重复,导入时自动去重 | P1 |
| AC-5 | 支持精确匹配和模糊匹配两种模式 | P1 |
场景6:新成员添加好友并开始聊天
- 角色:新加入的项目成员小陈
- 背景:小陈刚加入公司,需要添加同事为好友方便沟通
- 操作流程:进入联系人页面 → 搜索同事用户名"李明" → 发送好友申请(附验证消息"你好,我是新来的小陈") → 李明收到申请通知 → 李明接受申请 → 两人自动成为好友 → 小陈在会话列表看到李明 → 发起聊天
- 验收标准:
| 编号 | 验收条件 | 优先级 |
|---|---|---|
| AC-1 | 搜索支持用户名/昵称模糊匹配,结果3秒内返回 | P0 |
| AC-2 | 好友申请包含验证消息字段,对方可接受/拒绝 | P0 |
| AC-3 | 好友申请7天未处理自动过期 | P1 |
| AC-4 | 成为好友后自动创建会话,可直接发起聊天 | P0 |
| AC-5 | 拉黑后双方不可发消息、不可查看对方信息 | P1 |
三、功能需求
3.1 后台管理端
3.1.1 功能清单
| 功能 | 优先级 | 说明 | 使用频率 |
|---|---|---|---|
| 会话管理 | P0 | 查看/删除会话、查看会话详情 | 按需 |
| 消息管理 | P0 | 消息记录查看、搜索、删除 | 按需 |
| 群组管理 | P0 | 群组列表/创建/编辑/成员管理/解散 | 每周 |
| 敏感词管理 | P1 | 敏感词列表/分组/导入/导出 | 每月 |
| IM 配置 | P1 | 消息类型/文件大小/在线状态配置 | 极少 |
| IM 统计 | P2 | 消息量/活跃用户/群组统计 | 每周 |
3.1.2 会话管理
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 会话列表按最后消息时间倒序排列 | 管理员优先关注活跃会话 |
| R-02 | 删除会话为逻辑删除,数据保留但前台不可见 | 审计需要,防止数据丢失 |
| R-03 | 支持按会话类型(单聊/群聊)筛选 | 群聊和单聊的管理策略不同 |
| R-04 | 会话详情展示双方用户昵称和头像 | 方便管理员快速识别会话双方 |
| R-05 | 删除会话前需二次确认弹窗 | 防止误删,删除操作不可逆(前台不可见) |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取会话分页列表 | GET | /admin-api/im/conversation/page | 分页查询会话列表 |
| 获取会话详情 | GET | /admin-api/im/conversation/get | 获取单个会话详情 |
| 删除会话 | DELETE | /admin-api/im/conversation/delete | 删除指定会话 |
| 导出会话列表 | GET | /admin-api/im/conversation/export | 导出会话列表Excel |
请求参数(分页查询):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | Long | 否 | 用户ID |
| targetType | Integer | 否 | 会话类型(1-单聊 2-群聊) |
| status | Integer | 否 | 状态 |
| createTime | DateTime[] | 否 | 创建时间范围 |
| pageNo | Integer | 是 | 页码 |
| pageSize | Integer | 是 | 每页条数 |
3.1.3 消息管理
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 消息列表按创建时间倒序排列 | 最新消息优先展示 |
| R-02 | 支持按8种消息类型筛选 | 不同类型消息管理策略不同 |
| R-03 | 关键词搜索支持模糊匹配消息内容 | 快速定位特定消息 |
| R-04 | 删除消息后,相关用户端同步显示"消息已撤回" | 保证各端消息状态一致 |
| R-05 | 批量删除单次不超过100条 | 防止误操作造成大量数据丢失 |
| R-06 | 消息记录保留时长可配置(默认永久) | 满足不同合规要求 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取消息分页列表 | GET | /admin-api/im/message/page | 分页查询消息列表 |
| 获取消息详情 | GET | /admin-api/im/message/get | 获取单条消息详情 |
| 删除消息 | DELETE | /admin-api/im/message/delete | 删除指定消息 |
| 批量删除消息 | DELETE | /admin-api/im/message/batch-delete | 批量删除消息 |
| 导出消息记录 | GET | /admin-api/im/message/export | 导出消息记录Excel |
请求参数(分页查询):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| senderId | Long | 否 | 发送者ID |
| type | Integer | 否 | 消息类型 |
| content | String | 否 | 关键词搜索 |
| groupId | Long | 否 | 群组ID |
| createTime | DateTime[] | 否 | 发送时间范围 |
| pageNo | Integer | 是 | 页码 |
| pageSize | Integer | 是 | 每页条数 |
3.1.4 群组管理
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 群名称不能为空,长度不超过50字符 | 防止过长群名影响展示 |
| R-02 | 群最大成员数默认200,可配置上限500 | 平衡使用体验和服务器性能 |
| R-03 | 解散群组前需二次确认,解散后群成员全部移除 | 解散是不可逆操作,需防误操作 |
| R-04 | 群主不能直接退出群组,需先转让群主 | 防止群组变成"无主群" |
| R-05 | 管理员后台创建的群组需指定群主 | 每个群必须有明确的管理责任人 |
| R-06 | 群组状态:正常/禁用,禁用后群成员无法发送消息 | 支持临时冻结问题群组 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取群组分页列表 | GET | /admin-api/im/group/page | 分页查询群组列表 |
| 获取群组详情 | GET | /admin-api/im/group/get | 获取单个群组详情 |
| 创建群组 | POST | /admin-api/im/group/create | 创建新群组 |
| 更新群组 | PUT | /admin-api/im/group/update | 更新群组信息 |
| 删除/解散群组 | DELETE | /admin-api/im/group/delete | 解散群组 |
| 获取群成员列表 | GET | /admin-api/im/group-member/list | 获取群组成员列表 |
| 添加群成员 | POST | /admin-api/im/group-member/add | 添加群成员 |
| 移除群成员 | DELETE | /admin-api/im/group-member/remove | 移除群成员 |
| 设置群管理员 | PUT | /admin-api/im/group-member/set-admin | 设置/取消群管理员 |
| 转让群主 | PUT | /admin-api/im/group-member/transfer-owner | 转让群主 |
请求参数(创建群组):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 是 | 群组名称 |
| avatar | String | 否 | 群组头像URL |
| description | String | 否 | 群组描述 |
| ownerId | Long | 是 | 群主用户ID |
| maxMember | Integer | 否 | 最大成员数(默认200) |
| memberIds | Long[] | 否 | 初始成员ID列表 |
3.1.5 敏感词管理
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 敏感词不能重复(同一分组内) | 避免重复配置,减少检测开销 |
| R-02 | 支持模糊匹配和精确匹配两种模式 | 模糊匹配覆盖面广,精确匹配避免误伤 |
| R-03 | 匹配策略:拦截(不发送)、替换(用***替代)、审核(发送后审核) | 不同场景需要不同的处理力度 |
| R-04 | 批量导入支持 Excel 和 TXT 格式,单次不超过1000条 | 大批量导入可能影响性能 |
| R-05 | 敏感词分组自定义,默认分组:政治、色情、暴力、广告 | 方便按类别管理和统计 |
| R-06 | 敏感词变更实时生效,无需重启服务 | 紧急情况下可快速响应 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取敏感词分页列表 | GET | /admin-api/im/sensitive-word/page | 分页查询敏感词 |
| 获取敏感词详情 | GET | /admin-api/im/sensitive-word/get | 获取单个敏感词详情 |
| 创建敏感词 | POST | /admin-api/im/sensitive-word/create | 新增敏感词 |
| 更新敏感词 | PUT | /admin-api/im/sensitive-word/update | 更新敏感词 |
| 删除敏感词 | DELETE | /admin-api/im/sensitive-word/delete | 删除敏感词 |
| 批量导入敏感词 | POST | /admin-api/im/sensitive-word/import | 批量导入 |
| 导出敏感词 | GET | /admin-api/im/sensitive-word/export | 导出敏感词 |
| 获取敏感词分组列表 | GET | /admin-api/im/sensitive-word/group/list | 获取分组列表 |
| 创建敏感词分组 | POST | /admin-api/im/sensitive-word/group/create | 创建分组 |
| 删除敏感词分组 | DELETE | /admin-api/im/sensitive-word/group/delete | 删除分组 |
请求参数(批量导入):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| file | MultipartFile | 是 | 上传文件(Excel/TXT) |
| groupId | Long | 否 | 分组ID |
| matchType | Integer | 是 | 匹配方式(1-精确 2-模糊) |
3.1.6 IM 配置
业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 消息类型配置:可启用/禁用各类消息类型 | 按需控制,如禁止语音消息节省存储 |
| R-02 | 文件上传大小限制:单聊默认20MB,群聊默认10MB | 群聊文件影响更多人,限制更严 |
| R-03 | 在线状态刷新间隔:默认30秒,可配置范围10-120秒 | 间隔太短增加服务器压力 |
| R-04 | 消息撤回时限:默认2分钟,可配置范围1-15分钟 | 平衡用户需求和消息一致性 |
| R-05 | 消息已读回执:可全局开启/关闭 | 已读回执增加系统复杂度,按需开启 |
| R-06 | 群成员上限:可配置群组最大成员数 | 不同企业规模不同 |
| R-07 | 好友验证:可配置添加好友是否需要验证 | 内部团队可关闭验证简化流程 |
| R-08 | 配置变更后实时生效 | 管理员调整后无需等待 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取IM配置 | GET | /admin-api/im/config/get | 获取IM配置信息 |
| 更新IM配置 | PUT | /admin-api/im/config/update | 更新IM配置 |
请求参数(更新配置):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| enableText | Boolean | 否 | 是否启用文字消息 |
| enableImage | Boolean | 否 | 是否启用图片消息 |
| enableFile | Boolean | 否 | 是否启用文件消息 |
| enableVoice | Boolean | 否 | 是否启用语音消息 |
| enableVideo | Boolean | 否 | 是否启用视频消息 |
| enableEmoji | Boolean | 否 | 是否启用表情消息 |
| enableLocation | Boolean | 否 | 是否启用位置消息 |
| enableCard | Boolean | 否 | 是否启用名片消息 |
| privateFileMaxSize | Integer | 否 | 单聊文件大小限制(MB) |
| groupFileMaxSize | Integer | 否 | 群聊文件大小限制(MB) |
| onlineStatusInterval | Integer | 否 | 在线状态刷新间隔(秒) |
| recallTimeLimit | Integer | 否 | 消息撤回时限(分钟) |
| enableReadReceipt | Boolean | 否 | 是否开启已读回执 |
| groupMaxMember | Integer | 否 | 群组最大成员数 |
| friendNeedVerify | Boolean | 否 | 添加好友是否需要验证 |
3.1.7 IM 统计
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 统计数据每小时更新一次 | 平衡数据实时性和系统性能 |
| R-02 | 消息量统计支持按消息类型拆分 | 了解各类消息使用占比 |
| R-03 | 活跃用户定义:当日有发送消息行为的用户 | 仅登录不算活跃,需有实际沟通行为 |
| R-04 | 统计时间范围最长支持90天 | 过长范围查询性能差 |
| R-05 | 活跃用户排行榜展示前50名 | 过多排名无实际管理意义 |
| R-06 | 支持统计数据导出为Excel | 方便制作汇报材料 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取消息统计 | GET | /admin-api/im/statistics/message | 获取消息量统计数据 |
| 获取活跃用户统计 | GET | /admin-api/im/statistics/active-user | 获取活跃用户统计 |
| 获取活跃用户排行 | GET | /admin-api/im/statistics/active-user/rank | 获取活跃用户排行 |
| 获取群组统计 | GET | /admin-api/im/statistics/group | 获取群组统计数据 |
| 获取活跃群组排行 | GET | /admin-api/im/statistics/group/rank | 获取活跃群组排行 |
| 获取概览数据 | GET | /admin-api/im/statistics/overview | 获取IM统计概览 |
| 导出统计报表 | GET | /admin-api/im/statistics/export | 导出统计报表Excel |
请求参数(消息统计):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| startTime | Date | 是 | 开始日期 |
| endTime | Date | 是 | 结束日期 |
| granularity | String | 是 | 统计粒度(day/week/month) |
| messageType | Integer | 否 | 消息类型筛选 |
3.2 前台用户端
3.2.1 功能清单
| 功能 | 优先级 | 说明 | 使用频率 |
|---|---|---|---|
| 聊天界面 | P0 | 单聊/群聊、消息收发、富媒体消息 | 每日高频 |
| 会话列表 | P0 | 最近会话、置顶、免打扰、未读角标 | 每日高频 |
| 联系人 | P1 | 好友列表、添加好友、好友申请、黑名单 | 按需 |
| 群组 | P0 | 创建群组、邀请入群、群公告、群文件 | 每周 |
| 个人中心 | P2 | 在线状态设置、消息通知设置 | 极少 |
3.2.2 聊天界面
页面结构:

消息类型支持:
| 消息类型 | 说明 | 大小限制 | 使用频率 |
|---|---|---|---|
| 文字 | 纯文本消息,支持表情 | - | 极高 |
| 图片 | 支持 JPG/PNG/GIF,支持缩略图预览 | 20MB | 高 |
| 文件 | 支持任意格式文件传输 | 20MB | 中 |
| 语音 | 支持 AMR/MP3 格式,最长60秒 | 5MB | 低 |
| 视频 | 支持 MP4 格式,最长5分钟 | 50MB | 低 |
| 表情 | 系统内置表情 + 自定义表情 | - | 高 |
| 位置 | 发送当前位置信息 | - | 极低 |
| 名片 | 分享个人/群组名片 | - | 低 |
消息互动功能:
| 功能 | 操作方式 | 说明 | 使用频率 |
|---|---|---|---|
| 撤回 | 长按消息 → 撤回 | 2分钟内可撤回自己的消息 | 低 |
| 引用回复 | 长按消息 → 引用 → 输入内容发送 | 消息列表显示引用内容 | 中 |
| @提醒 | 输入框输入@ | 弹出群成员列表选择 | 高 |
| 复制 | 长按文字消息 → 复制 | 复制文字内容到剪贴板 | 高 |
| 转发 | 长按消息 → 转发 | 选择转发给其他联系人/群组 | 中 |
| 删除 | 长按消息 → 删除 | 仅删除自己端的消息记录 | 中 |
| 收藏 | 长按消息 → 收藏 | 收藏到个人收藏夹 | 低 |
业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 消息通过 WebSocket 实时推送,断线后自动重连 | 保证消息实时性和连接稳定性 |
| R-02 | 离线消息在用户上线后批量推送 | 用户不会错过任何消息 |
| R-03 | 消息已读状态:单聊显示已读/未读,群聊显示已读人数 | 让发送者知道消息是否被阅读 |
| R-04 | 消息撤回:发送后2分钟内可撤回(可配置) | 给用户纠错机会,但时限不宜过长 |
| R-05 | 撤回后双方显示"xxx撤回了一条消息" | 保持双方消息视图一致 |
| R-06 | 消息引用回复:长按消息选择"引用回复",输入区域显示引用内容 | 讨论多条话题时避免混乱 |
| R-07 | @提醒:群聊中输入@可选择@成员,被@方收到特殊提醒 | 确保重要信息被特定人注意到 |
| R-08 | 消息发送失败自动重试(最多3次) | 弱网环境下的容错机制 |
| R-09 | 敏感词检测:发送前客户端预检测,服务端二次检测 | 双重保障,防止违规内容发出 |
| R-10 | 历史消息加载:每次加载20条,向上滚动加载更多 | 避免一次性加载过多数据影响性能 |
| R-11 | 图片消息支持点击放大预览、左右切换 | 方便查看图片细节 |
| R-12 | 文件消息显示文件名、大小、进度条,支持下载 | 让用户了解传输状态 |
WebSocket 消息协议:
| 字段名 | 类型 | 说明 |
|---|---|---|
| type | String | 消息类型(chat/read/recall/typing/online) |
| from | Long | 发送者ID |
| to | Long | 接收者ID/群组ID |
| toType | Integer | 目标类型(1-用户 2-群组) |
| content | Object | 消息内容(根据type不同结构不同) |
| timestamp | Long | 消息时间戳 |
| msgId | String | 消息唯一ID |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取历史消息 | GET | /app-api/im/message/list | 获取与某用户/群组的历史消息 |
| 发送消息 | POST | /app-api/im/message/send | 发送消息(REST备用) |
| 撤回消息 | PUT | /app-api/im/message/recall | 撤回指定消息 |
| 标记已读 | PUT | /app-api/im/message/read | 标记消息为已读 |
| 上传文件 | POST | /app-api/im/message/upload | 上传聊天文件 |
| WebSocket连接 | WS | /ws/im/chat | WebSocket聊天连接 |
| 搜索消息 | GET | /app-api/im/message/search | 搜索聊天消息 |
请求参数(获取历史消息):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| targetId | Long | 是 | 目标ID(用户ID或群组ID) |
| targetType | Integer | 是 | 目标类型(1-用户 2-群组) |
| lastMsgId | Long | 否 | 最后一条消息ID(用于分页加载) |
| count | Integer | 否 | 加载条数(默认20) |
请求参数(发送消息):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| receiverId | Long | 是 | 接收者ID |
| receiverType | Integer | 是 | 接收者类型(1-用户 2-群组) |
| content | String | 是 | 消息内容 |
| type | Integer | 是 | 消息类型(1-文字 2-图片 3-文件 4-语音 5-视频 6-表情 7-位置 8-名片) |
| quoteMsgId | Long | 否 | 引用消息ID |
| atUserIds | Long[] | 否 | @用户ID列表 |
3.2.3 会话列表
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 会话按最后消息时间倒序排列 | 最近沟通过的会话优先展示 |
| R-02 | 置顶会话始终显示在列表顶部 | 重要会话不被淹没 |
| R-03 | 免打扰会话不弹出通知提醒,未读数仍以角标显示 | 减少干扰但不遗漏 |
| R-04 | 未读消息角标:数字超过99显示"99+" | 界面简洁,避免数字过长 |
| R-05 | 删除会话仅从列表移除,不删除聊天记录 | 防止误删聊天记录 |
| R-06 | 新消息自动更新会话列表排序 | 保持列表时效性 |
| R-07 | 最多支持置顶20个会话 | 置顶过多失去意义 |
| R-08 | 支持按会话名称搜索过滤 | 快速定位目标会话 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取会话列表 | GET | /app-api/im/conversation/list | 获取当前用户会话列表 |
| 置顶会话 | PUT | /app-api/im/conversation/top | 置顶/取消置顶会话 |
| 免打扰设置 | PUT | /app-api/im/conversation/mute | 设置/取消免打扰 |
| 删除会话 | DELETE | /app-api/im/conversation/delete | 从列表删除会话 |
| 标记已读 | PUT | /app-api/im/conversation/read-all | 全部标记已读 |
请求参数(会话列表):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | String | 否 | 搜索关键词 |
| onlyUnread | Boolean | 否 | 仅显示未读 |
3.2.4 联系人
页面结构:

业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 好友列表按昵称首字母分组排序 | 方便快速查找 |
| R-02 | 搜索支持用户名/昵称模糊匹配 | 降低搜索门槛 |
| R-03 | 发送好友申请需填写验证消息(可选) | 让对方了解申请意图 |
| R-04 | 好友申请有效期7天,过期自动失效 | 过期申请无意义,定期清理 |
| R-05 | 拉黑后双方不可发消息、不可查看对方动态 | 保护用户免受骚扰 |
| R-06 | 同一好友申请不能重复发送 | 避免重复打扰对方 |
| R-07 | 好友申请可配置是否需要验证(后台配置) | 内部团队可关闭验证简化流程 |
| R-08 | 好友上限可配置(默认2000人) | 防止滥用 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 获取好友列表 | GET | /app-api/im/friend/list | 获取好友列表 |
| 搜索用户 | GET | /app-api/im/user/search | 搜索用户(添加好友用) |
| 发送好友申请 | POST | /app-api/im/friend-apply/send | 发送好友申请 |
| 获取好友申请列表 | GET | /app-api/im/friend-apply/list | 获取收到的好友申请 |
| 处理好友申请 | PUT | /app-api/im/friend-apply/handle | 接受/拒绝好友申请 |
| 删除好友 | DELETE | /app-api/im/friend/delete | 删除好友 |
| 添加黑名单 | POST | /app-api/im/blacklist/add | 拉黑用户 |
| 移除黑名单 | DELETE | /app-api/im/blacklist/remove | 取消拉黑 |
| 获取黑名单列表 | GET | /app-api/im/blacklist/list | 获取黑名单列表 |
请求参数(发送好友申请):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| targetUserId | Long | 是 | 目标用户ID |
| remark | String | 否 | 验证消息 |
请求参数(处理好友申请):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| applyId | Long | 是 | 申请ID |
| action | Integer | 是 | 操作(1-接受 2-拒绝) |
3.2.5 群组
业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 创建者自动成为群主 | 明确群组责任人 |
| R-02 | 群主可设置管理员(最多10名) | 分担群主管理压力 |
| R-03 | 群公告仅群主和管理员可发布 | 防止公告被滥用 |
| R-04 | 群文件所有成员可上传,仅群主/管理员可删除他人文件 | 保护共享文件不被随意删除 |
| R-05 | 邀请入群:群成员均可邀请(可配置为仅管理员可邀请) | 平衡开放性和管控需求 |
| R-06 | 群成员上限:默认200人(后台可配置) | 控制群组规模保证体验 |
| R-07 | 群主退出需先转让群主 | 防止群组变成"无主群" |
| R-08 | 群公告发布后推送通知给所有群成员 | 确保重要信息传达到位 |
| R-09 | 群文件保留期限:可配置(默认永久) | 平衡存储成本和使用需求 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 创建群组 | POST | /app-api/im/group/create | 创建群组 |
| 获取群组详情 | GET | /app-api/im/group/get | 获取群组详情 |
| 更新群组信息 | PUT | /app-api/im/group/update | 更新群组信息 |
| 解散群组 | DELETE | /app-api/im/group/dismiss | 解散群组(仅群主) |
| 获取群成员列表 | GET | /app-api/im/group/member/list | 获取群成员列表 |
| 邀请成员入群 | POST | /app-api/im/group/member/invite | 邀请成员入群 |
| 移除群成员 | DELETE | /app-api/im/group/member/remove | 移除群成员 |
| 退出群组 | DELETE | /app-api/im/group/member/quit | 退出群组 |
| 发布群公告 | POST | /app-api/im/group/notice/publish | 发布群公告 |
| 获取群公告 | GET | /app-api/im/group/notice/get | 获取群公告 |
| 上传群文件 | POST | /app-api/im/group/file/upload | 上传群文件 |
| 获取群文件列表 | GET | /app-api/im/group/file/list | 获取群文件列表 |
| 下载群文件 | GET | /app-api/im/group/file/download | 下载群文件 |
| 删除群文件 | DELETE | /app-api/im/group/file/delete | 删除群文件 |
| 转让群主 | PUT | /app-api/im/group/transfer-owner | 转让群主 |
请求参数(创建群组):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 是 | 群组名称 |
| avatar | String | 否 | 群组头像 |
| description | String | 否 | 群组描述 |
| memberIds | Long[] | 否 | 初始成员ID列表 |
3.2.6 个人中心
业务规则:
| 规则编号 | 规则描述 | 设计原因 |
|---|---|---|
| R-01 | 在线状态:在线、忙碌、离开、隐身四种 | 让对方了解自己的可用状态 |
| R-02 | 隐身状态对其他用户不可见 | 用户想在线但不被打扰 |
| R-03 | 消息通知可设置为:全部通知、仅@我、免打扰 | 不同场景需要不同通知策略 |
| R-04 | 通知内容可配置:显示消息内容/仅显示"你有新消息" | 保护隐私,避免通知泄露内容 |
| R-05 | 可设置通知声音开关 | 会议等安静场景需要静音 |
| R-06 | 桌面通知需浏览器授权 | 浏览器安全策略要求 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 设置在线状态 | PUT | /app-api/im/user/online-status | 设置在线状态 |
| 获取在线状态 | GET | /app-api/im/user/online-status | 获取当前在线状态 |
| 获取通知设置 | GET | /app-api/im/user/notify-setting | 获取消息通知设置 |
| 更新通知设置 | PUT | /app-api/im/user/notify-setting | 更新消息通知设置 |
请求参数(设置在线状态):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | Integer | 是 | 在线状态(1-在线 2-忙碌 3-离开 4-隐身) |
四、非功能需求
4.1 性能要求
| 指标 | 要求 | 实现策略 |
|---|---|---|
| WebSocket 消息延迟 | < 200ms(同区域) | 长连接保持 + 消息队列异步投递 |
| 消息发送吞吐量 | 支持 10000 条/秒 | 消息批量入库 + Redis缓冲 |
| 在线用户承载量 | 单机 50000 并发连接 | Netty长连接 + 心跳检测 |
| 历史消息查询响应 | < 500ms | 分页加载 + 索引优化 |
| 会话列表加载响应 | < 300ms | Redis缓存最近会话 + 增量更新 |
| 文件上传速度 | 不低于网络带宽的 70% | 分片上传 + CDN加速 |
| WebSocket 断线重连 | < 5秒自动重连 | 指数退避重连策略 |
| 离线消息推送 | 用户上线后 3 秒内推送 | 离线消息队列 + 批量推送 |
4.2 安全要求
| 要求 | 说明 | 实现方式 |
|---|---|---|
| 传输加密 | WebSocket 使用 WSS 协议 | TLS加密通道 |
| 消息内容安全 | 敏感词实时检测和过滤 | DFA算法匹配敏感词库 |
| 身份验证 | WebSocket 连接需携带有效 Token | JWT Token校验 |
| 权限控制 | 用户只能查看自己的消息和会话 | 接口级+数据级权限校验 |
| 文件安全 | 上传文件类型校验 | 白名单校验文件扩展名和MIME |
| XSS防护 | 消息内容 HTML 标签过滤和转义 | 服务端过滤 + 前端渲染转义 |
| 消息防重放 | 消息ID唯一性校验 | 客户端生成UUID + 服务端幂等校验 |
| 频率限制 | 单用户消息发送频率限制(默认100条/分钟) | Redis滑动窗口限流 |
| 数据隔离 | 多租户数据严格隔离 | tenant_id字段隔离 |
4.3 错误码定义
| 错误码 | 说明 | 用户提示 |
|---|---|---|
| IM_MESSAGE_001 | 消息发送频率超限 | "发送过于频繁,请稍后再试" |
| IM_MESSAGE_002 | 消息内容包含敏感词 | "消息包含不当内容,请修改后重试" |
| IM_MESSAGE_003 | 文件大小超过限制 | "文件大小超过限制,请压缩后重试" |
| IM_MESSAGE_004 | 消息撤回超时 | "超过撤回时限,无法撤回" |
| IM_MESSAGE_005 | 消息不存在或已删除 | "该消息不存在或已被删除" |
| IM_GROUP_001 | 群成员数已达上限 | "群成员已满,无法加入" |
| IM_GROUP_002 | 非群管理员无权限操作 | "仅群管理员可执行此操作" |
| IM_GROUP_003 | 群主不可直接退出 | "请先转让群主后再退出" |
| IM_FRIEND_001 | 已是好友关系 | "你们已经是好友了" |
| IM_FRIEND_002 | 好友申请已发送 | "好友申请已发送,请等待对方处理" |
| IM_FRIEND_003 | 好友申请已过期 | "该好友申请已过期" |
| IM_FRIEND_004 | 好友数已达上限 | "好友数已达上限" |
| IM_BLACKLIST_001 | 对方已拉黑你 | "无法发送消息,对方已将你拉黑" |
4.4 兼容性要求
| 端 | 要求 |
|---|---|
| PC浏览器 | Chrome 80+、Firefox 75+、Safari 13+、Edge 80+ |
| 移动端浏览器 | iOS Safari 12+、Android Chrome 80+ |
| 微信内置浏览器 | 支持(WebSocket 兼容) |
| 小程序 | 微信基础库 2.0+(使用 WebSocket) |
| 网络环境 | 支持 4G/5G/WiFi,弱网环境自动降级 |
五、数据设计
5.1 数据表概览
| 表名 | 说明 | 核心字段 |
|---|---|---|
| im_message | 消息表 | sender_id, receiver_id, content, type, status |
| im_conversation | 会话表 | user_id, target_id, target_type, unread_count |
| im_group | 群组表 | name, owner_id, max_member, status |
| im_group_member | 群成员表 | group_id, user_id, role, mute |
| im_friend | 好友关系表 | user_id, friend_id, status |
| im_friend_apply | 好友申请表 | from_user_id, to_user_id, status |
| im_sensitive_word | 敏感词表 | word, group_id, match_type, action |
| im_sensitive_word_group | 敏感词分组表 | name, description |
| im_group_file | 群文件表 | group_id, file_name, file_url |
| im_user_online | 用户在线状态表 | user_id, status, device_type |
| im_config | IM配置表 | config_key, config_value |
5.2 表关系图

5.3 缓存策略
| 缓存Key | 数据内容 | 过期时间 | 更新策略 |
|---|---|---|---|
| im:online: | 用户在线状态 | 5分钟 | 心跳续期,离线删除 |
| im:conversation:unread: | 用户未读消息数 | 实时 | 消息收发时更新 |
| im:sensitive:words | 敏感词集合 | 不过期 | 敏感词变更时刷新 |
| im:config | IM全局配置 | 不过期 | 配置变更时刷新 |
| im:group:members: | 群成员列表 | 10分钟 | 成员变动时删除 |
5.4 数据表结构
5.4.1 消息表(im_message)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 消息ID(主键) |
| sender_id | BIGINT | 是 | 发送者ID |
| receiver_id | BIGINT | 是 | 接收者ID(用户ID或群组ID) |
| receiver_type | TINYINT | 是 | 接收者类型(1-用户 2-群组) |
| group_id | BIGINT | 否 | 群组ID(群聊时) |
| content | TEXT | 是 | 消息内容 |
| type | TINYINT | 是 | 消息类型(1-文字 2-图片 3-文件 4-语音 5-视频 6-表情 7-位置 8-名片) |
| status | TINYINT | 是 | 消息状态(0-发送中 1-已发送 2-已送达 3-已读 4-已撤回) |
| quote_msg_id | BIGINT | 否 | 引用消息ID |
| at_user_ids | VARCHAR(500) | 否 | @用户ID列表(逗号分隔) |
| file_url | VARCHAR(512) | 否 | 文件URL |
| file_name | VARCHAR(255) | 否 | 文件名 |
| file_size | BIGINT | 否 | 文件大小(字节) |
| extra_data | JSON | 否 | 扩展数据(位置坐标、名片信息等) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记(0-未删除 1-已删除) |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.2 会话表(im_conversation)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 会话ID(主键) |
| user_id | BIGINT | 是 | 用户ID |
| target_id | BIGINT | 是 | 目标ID(对方用户ID或群组ID) |
| target_type | TINYINT | 是 | 目标类型(1-用户 2-群组) |
| last_message | VARCHAR(255) | 否 | 最后一条消息预览 |
| last_message_time | DATETIME | 否 | 最后消息时间 |
| unread_count | INT | 是 | 未读消息数(默认0) |
| top | BIT | 是 | 是否置顶(0-否 1-是) |
| mute | BIT | 是 | 是否免打扰(0-否 1-是) |
| status | TINYINT | 是 | 状态(0-正常 1-已删除) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.3 群组表(im_group)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 群组ID(主键) |
| name | VARCHAR(50) | 是 | 群组名称 |
| avatar | VARCHAR(512) | 否 | 群组头像URL |
| description | VARCHAR(500) | 否 | 群组描述 |
| owner_id | BIGINT | 是 | 群主用户ID |
| max_member | INT | 是 | 最大成员数(默认200) |
| notice | TEXT | 否 | 群公告内容 |
| invite_permission | TINYINT | 是 | 邀请权限(1-所有人 2-仅管理员) |
| status | TINYINT | 是 | 状态(0-正常 1-禁用) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.4 群成员表(im_group_member)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| group_id | BIGINT | 是 | 群组ID |
| user_id | BIGINT | 是 | 用户ID |
| role | TINYINT | 是 | 角色(0-普通成员 1-管理员 2-群主) |
| nickname | VARCHAR(50) | 否 | 群内昵称 |
| mute | BIT | 是 | 是否禁言(0-否 1-是) |
| join_time | DATETIME | 是 | 加入时间 |
| join_type | TINYINT | 是 | 加入方式(1-创建 2-邀请 3-申请) |
| inviter_id | BIGINT | 否 | 邀请人ID |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.5 好友关系表(im_friend)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| user_id | BIGINT | 是 | 用户ID |
| friend_id | BIGINT | 是 | 好友用户ID |
| remark | VARCHAR(50) | 否 | 好友备注 |
| group_name | VARCHAR(50) | 否 | 好友分组名称 |
| status | TINYINT | 是 | 状态(0-正常 1-已拉黑) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.6 好友申请表(im_friend_apply)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| from_user_id | BIGINT | 是 | 申请人ID |
| to_user_id | BIGINT | 是 | 被申请人ID |
| remark | VARCHAR(200) | 否 | 验证消息 |
| status | TINYINT | 是 | 状态(0-待处理 1-已接受 2-已拒绝 3-已过期) |
| expire_time | DATETIME | 是 | 过期时间 |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.7 敏感词表(im_sensitive_word)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| word | VARCHAR(100) | 是 | 敏感词内容 |
| group_id | BIGINT | 否 | 分组ID |
| match_type | TINYINT | 是 | 匹配方式(1-精确 2-模糊) |
| action | TINYINT | 是 | 处理动作(1-拦截 2-替换 3-审核) |
| status | TINYINT | 是 | 状态(0-启用 1-禁用) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.8 敏感词分组表(im_sensitive_word_group)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| name | VARCHAR(50) | 是 | 分组名称 |
| description | VARCHAR(200) | 否 | 分组描述 |
| sort | INT | 是 | 排序值 |
| status | TINYINT | 是 | 状态(0-启用 1-禁用) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.9 群文件表(im_group_file)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| group_id | BIGINT | 是 | 群组ID |
| user_id | BIGINT | 是 | 上传用户ID |
| file_name | VARCHAR(255) | 是 | 文件名 |
| file_url | VARCHAR(512) | 是 | 文件URL |
| file_size | BIGINT | 是 | 文件大小(字节) |
| file_type | VARCHAR(50) | 否 | 文件类型(MIME) |
| download_count | INT | 是 | 下载次数(默认0) |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.10 用户在线状态表(im_user_online)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| user_id | BIGINT | 是 | 用户ID |
| status | TINYINT | 是 | 在线状态(1-在线 2-忙碌 3-离开 4-隐身) |
| device_type | VARCHAR(20) | 否 | 设备类型(PC/Mobile/Tablet) |
| login_time | DATETIME | 是 | 上线时间 |
| last_active_time | DATETIME | 是 | 最后活跃时间 |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.4.11 IM配置表(im_config)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键ID |
| config_key | VARCHAR(100) | 是 | 配置键 |
| config_value | VARCHAR(500) | 是 | 配置值 |
| config_type | TINYINT | 是 | 配置类型(1-消息类型 2-文件限制 3-在线状态 4-功能开关) |
| description | VARCHAR(200) | 否 | 配置描述 |
| creator | VARCHAR(64) | 否 | 创建者 |
| create_time | DATETIME | 是 | 创建时间 |
| updater | VARCHAR(64) | 否 | 更新者 |
| update_time | DATETIME | 是 | 更新时间 |
| deleted | BIT | 是 | 删除标记 |
| tenant_id | BIGINT | 是 | 租户ID |
5.5 状态机
消息状态流转

好友申请状态流转

六、跨模块联动
6.1 联动关系总览
| 联动模块 | 联动方向 | 联动场景 | 优先级 |
|---|---|---|---|
| 认证授权(01-01) | IM ← 认证 | 用户登录时建立WebSocket连接 | P0 |
| 角色权限(01-03) | IM ← 权限 | 后台管理功能受权限控制 | P0 |
| 用户管理(01-05) | IM ← 用户 | 搜索用户、好友列表依赖用户数据 | P0 |
| 消息通知(02-03) | IM → 通知 | @提醒、好友申请推送桌面通知 | P1 |
| 文件存储(02-02) | IM ← 存储 | 聊天文件、群文件上传依赖存储服务 | P0 |
| 日志审计(01-08) | IM → 日志 | 管理操作记录审计日志 | P1 |
6.2 详细联动设计
IM ↔ 认证授权(01-01)
| 联动场景 | 触发条件 | 联动行为 | 数据流向 |
|---|---|---|---|
| WebSocket鉴权 | 用户建立WS连接 | 验证JWT Token有效性 | IM → 认证 |
| 用户登出清理 | 用户退出登录 | 关闭WS连接、更新在线状态 | IM → 认证 |
| Token续期 | Token即将过期 | WS连接携带新Token | 认证 → IM |
IM ↔ 角色权限(01-03)
| 联动场景 | 触发条件 | 联动行为 | 数据流向 |
|---|---|---|---|
| 后台功能权限 | 访问后台IM管理页面 | 校验im:conversation:list等权限标识 | IM ← 权限 |
| 消息审计权限 | 管理员查看消息 | 仅拥有im:message:list权限可查看 | IM ← 权限 |
| 敏感词管理权限 | 管理员操作敏感词 | 仅拥有im:sensitive-word:create等权限可操作 | IM ← 权限 |
IM ↔ 用户管理(01-05)
| 联动场景 | 触发条件 | 联动行为 | 数据流向 |
|---|---|---|---|
| 用户搜索 | 添加好友时搜索 | 从用户管理模块获取用户列表 | IM → 用户 |
| 用户信息展示 | 聊天界面显示头像昵称 | 获取用户基本信息 | IM → 用户 |
| 用户禁用联动 | 用户被禁用 | 强制下线、关闭WS连接 | 用户 → IM |
IM ↔ 消息通知(02-03)
| 联动场景 | 触发条件 | 联动行为 | 数据流向 |
|---|---|---|---|
| @提醒通知 | 群聊中被@ | 推送桌面通知+站内通知 | IM → 通知 |
| 好友申请通知 | 收到好友申请 | 推送站内通知 | IM → 通知 |
| 群公告通知 | 群公告发布 | 推送通知给所有群成员 | IM → 通知 |
IM ↔ 文件存储(02-02)
| 联动场景 | 触发条件 | 联动行为 | 数据流向 |
|---|---|---|---|
| 聊天文件上传 | 发送图片/文件消息 | 调用文件存储服务上传 | IM → 存储 |
| 群文件上传 | 上传群文件 | 调用文件存储服务上传 | IM → 存储 |
| 文件下载 | 下载聊天文件 | 通过存储服务获取下载链接 | IM → 存储 |
七、附录
7.1 名词解释
| 术语 | 通俗理解 | 在本模块中的含义 |
|---|---|---|
| WebSocket | 像打电话一样的网络连接——接通后双方可以随时说话,不用每次重新拨号 | 消息实时推送的底层技术,保持客户端和服务器的长连接 |
| WSS | 加了密码锁的电话线,别人偷听不到 | 加密的WebSocket连接,保障消息传输安全 |
| 单聊 | 两个人私下打电话 | 两个用户之间的一对一聊天 |
| 群聊 | 在会议室里大家一起讨论 | 三个及以上用户在群组内的聊天 |
| 会话 | 微信里的聊天对话框 | 用户与另一个用户或群组的聊天对话记录 |
| 已读回执 | 微信里的"已读"标记 | 消息接收方阅读后反馈给发送方的状态通知 |
| 消息撤回 | 说错话后赶紧说"当我没说" | 发送者在一定时间内撤回已发送的消息 |
| 免打扰 | 手机开了静音模式 | 设置后不弹出消息通知提醒,但未读数仍记录 |
| 敏感词 | 某些场合不能说的"禁语" | 系统预设的违规词汇,发送时会被拦截或替换 |
| 离线消息 | 你关机时别人发的短信,开机后收到 | 用户不在线时收到的消息,上线后批量推送 |
| 心跳检测 | 像定期问"你还在吗?"保持联系 | 客户端定期发送心跳包维持WebSocket连接不断开 |
| DFA算法 | 一种快速在一篇文章中找到违禁词的方法 | 敏感词匹配算法,用于高效检测消息中的敏感词 |
| 群主 | 微信群的创建者和管理者 | 群组的最高权限管理者 |
| 置顶 | 把重要聊天框固定在列表最上面 | 将重要会话固定在会话列表顶部 |
| @提醒 | 在群里喊"小李,你来看一下" | 群聊中指定提醒某个成员 |
| 消息转发 | 把收到的消息转给其他人看 | 将消息转发给其他联系人或群组 |
| 好友申请 | 加微信好友时发的验证请求 | 请求添加某人为好友时发送的申请 |
| 黑名单 | 把某人拉黑,再也联系不上 | 拉黑某用户后双方不可发消息和查看对方信息 |
| 在线状态 | 微信头像旁的小绿点 | 显示用户当前是否在线及状态(在线/忙碌/离开/隐身) |
| 群公告 | 微信群里群主发的置顶通知 | 群组中由群主/管理员发布的重要通知 |
| 群文件 | 微信群里的共享文件柜 | 群组中成员上传的共享文件 |
7.2 权限标识汇总
| 权限标识 | 说明 | 所属模块 |
|---|---|---|
| im:conversation:list | 查看会话列表 | IM管理 |
| im:conversation:query | 查询会话详情 | IM管理 |
| im:conversation:delete | 删除会话 | IM管理 |
| im:conversation:export | 导出会话 | IM管理 |
| im:message:list | 查看消息列表 | IM管理 |
| im:message:query | 查询消息详情 | IM管理 |
| im:message:delete | 删除消息 | IM管理 |
| im:message:export | 导出消息 | IM管理 |
| im:group:list | 查看群组列表 | IM管理 |
| im:group:create | 创建群组 | IM管理 |
| im:group:update | 编辑群组 | IM管理 |
| im:group:delete | 解散群组 | IM管理 |
| im:group:member:list | 查看群成员 | IM管理 |
| im:group:member:add | 添加群成员 | IM管理 |
| im:group:member:remove | 移除群成员 | IM管理 |
| im:sensitive-word:list | 查看敏感词列表 | IM管理 |
| im:sensitive-word:create | 创建敏感词 | IM管理 |
| im:sensitive-word:update | 编辑敏感词 | IM管理 |
| im:sensitive-word:delete | 删除敏感词 | IM管理 |
| im:sensitive-word:import | 导入敏感词 | IM管理 |
| im:sensitive-word:export | 导出敏感词 | IM管理 |
| im:config:get | 查看IM配置 | IM管理 |
| im:config:update | 更新IM配置 | IM管理 |
| im:statistics:view | 查看IM统计 | IM管理 |
| im:statistics:export | 导出统计数据 | IM管理 |
7.3 变更记录
| 版本 | 日期 | 修改内容 | 修改人 |
|---|---|---|---|
| v1.0 | 2026-09-24 | 初始版本 | PM Team |
| v2.0 | 2026-09-24 | 增强版:补充业务场景验收标准、页面线框图、状态机、跨模块联动、名词解释 | PM Team |
本文档为IM即时通讯模块PRD v2.0,如有问题请联系产品负责人。