IM直播 / 消息列表与聊天室扩展

列表一键已读+对话气泡Badge 功能 原型+PRD

本方案覆盖两个主场景:`聊天列表` 新增 `一键已读` 悬浮按钮,用于处理当前 `訊息` 列表全部未读; `聊天室` 内则新增发送者 `Badge` 展示,用于区分普通用户等级、群主、群管、主播角色。点击列表页 `一键已读` 后,统一将当前 `訊息` 列表未读会话置已读,并同步刷新列表未读数、底部聊天入口角标与按钮显隐; 聊天室内每位发送者仅展示一个 Badge,并按既定优先级选择最终样式。

列表动作 `訊息` 列表页新增 `一键已读` 悬浮按钮,展示当前列表总未读数,超过 `999` 固定展示 `999+`。
对话Badge 聊天室内按发送者角色展示对话气泡 Badge,覆盖 `用户 / 群主 / 群管 / 主播` 四类身份。
显示优先级 同一发送者同一时刻仅展示一个 Badge,优先级为 `群主 > 群管 > 主播 > 用户等级Lv`。
同步重点 需同步刷新列表未读数、底部聊天角标、会话行红点,以及聊天室内角色 Badge 的服务端角色映射。

H5 原型

以下原型直接使用你提供的两张截图:图1说明聊天列表页 `一键已读` 的悬浮入口、总未读数与 `999+` 上限; 图2说明聊天室内对话气泡 Badge 的展示位置、角色类型与现有右侧功能入口的共存关系。

01 聊天列表 / 列表一键已读 在 `訊息` 列表页右下新增 `一键已读` 悬浮按钮,展示当前列表总未读数;按钮文案与 `999+` 规则以图1为准。
聊天列表一键已读原型
落点说明: `一键已读` 为聊天列表级入口,固定悬浮于列表页右下区域,展示当前 `訊息` 列表总未读数。
交互说明: 点击后将当前 `訊息` 列表未读全部置已读;若刷新后仍有新增未读,则按钮继续展示最新计数。
02 聊天室 / 对话气泡Badge 在聊天室消息流内,发送者昵称右侧按角色展示 Badge;普通用户显示等级头盔,特殊角色显示 `群主`、`群管`、`主播` 标签。
聊天室对话气泡Badge原型
落点说明: Badge 固定挂载在发送者昵称右侧,与消息时间、消息正文分层展示,不进入消息正文区域。
展示说明: 同一发送者只展示一个 Badge;若同时满足多角色,按 `群主 > 群管 > 主播 > 用户等级Lv` 取最高优先级展示。

PRD 章节

1. 需求背景

  • 当前 `訊息` 列表存在大量未读会话时,用户只能逐条进入或依赖零散红点判断,缺少对当前列表的统一已读处理动作。
  • 当前聊天室消息流缺少一致的发送者身份标识,普通用户等级、群主、群管、主播角色分辨成本高。
  • 业务需要同时补足 `列表级已读收敛` 与 `对话气泡角色识别` 两个场景,且不改变现有消息列表与聊天室主体布局。
  • 本期目标是让用户在列表页快速清理未读,在聊天室内快速识别发送者角色。

2. 原型交互

  • 01:在 `訊息` 页签聊天列表右下展示 `一键已读` 悬浮按钮,按钮右侧展示当前列表总未读数;当总未读数大于 `999` 时固定展示 `999+`。
  • 02:点击 `一键已读` 后,按钮进入 loading 与不可重复点击状态,请求服务端将当前 `訊息` 列表全部未读会话更新为已读;成功后清空列表未读数并隐藏按钮。
  • 03:聊天室内发送者昵称右侧展示对话气泡 Badge;普通用户展示 `Lv. 1-51` 等级头盔,群主展示 `群主` 标签,群管展示 `群管` 标签,主播展示 `主播` 标签。
  • 04:同一发送者只展示一个 Badge;若角色冲突,则按 `群主 > 群管 > 主播 > 用户等级Lv` 的优先级选择最终展示样式。
3. 字段定义 列表一键已读字段
1. 入口位置:位于 `訊息` 聊天列表右下悬浮区,不进入 `聯絡`、`群組` 页签。
2. 展示条件:仅当当前 `訊息` 列表总未读数 list_unread_total > 0 时展示。
3. 按钮文案:固定展示 `一键已读`。
4. 计数展示:按钮右侧展示 list_unread_total;当 list_unread_total > 999 时固定展示 `999+`。
5. 点击动作:请求参数至少带 tab_type = messagerequest_idlast_sync_version
6. 成功结果:当前 `訊息` 列表全部未读置已读,列表红点、底部聊天角标、按钮计数同步刷新。
7. 失败结果:按钮恢复可点击,toast 提示 `一键已读失败,请稍后重试`。

对话气泡 Badge 字段
1. 展示位置:位于发送者昵称右侧,与消息时间、消息正文分层展示。
2. 普通用户等级:展示 `Lv. 1-51` 等级头盔;实际样式按等级资源映射。
3. 群主标签:角色为群主时展示 `群主` 标签。
4. 群管标签:角色为后台指定群管时展示 `群管` 标签。
5. 主播标签:角色为后台指定主播账号时展示 `主播` 标签。
6. 互斥规则:同一发送者同时存在多角色时,仅展示优先级最高的一个 Badge,顺序为:群主、群管、主播、用户等级降序。
7. 昵称截断:当 `昵称 + Badge` 超出单行宽度时,仅截断昵称并补 `...`,Badge 不截断。
4. 聊天室角色Badge栏位
角色名称 Badge示意 说明
用户
用户等级头盔示意
展示 `Lv. 1-51` 等级头盔。图3、图4为同一等级头盔示意;前端按 user_level 映射对应等级资源。
群主
群主标签示意
角色为群主时展示 `群主` 标签;展示后不再叠加普通用户等级头盔。
群管
群管标签示意
角色为后台指定群管时展示 `群管` 标签;展示后不再叠加普通用户等级头盔。
主播
主播标签示意
角色为后台指定主播账号时展示 `主播` 标签;若同时存在其他角色,则按既定优先级判断是否展示。
5. 权限规则 1. `一键已读` 仅对当前登录用户本人可用,不影响其他成员的未读状态。
2. `一键已读` 仅作用当前 `訊息` 列表,不作用 `聯絡`、`群組` 页签的独立未读。
3. 当前用户无 `訊息` 列表访问权限、账号离线或消息能力关闭时,不展示 `一键已读`。
4. 聊天室内所有仍在群成员均可查看发送者 Badge。
5. 群主、群管、主播 Badge 由服务端角色映射返回,前端不自行推断。
6. 同一时刻仅允许一个 `一键已读` 请求进行中;进行中状态下重复点击不再次发起请求。
6. 同步 / 异步更新规则 1. 同步更新范围:`一键已读` 成功后,同步刷新 `訊息` 列表各会话未读红点、按钮计数、底部聊天角标。
2. 异步更新范围:其他终端或 websocket 新未读回写进入时,重新计算 list_unread_total;若仍大于 `0`,按钮继续展示。
3. 版本比较:前端以 list_read_sync_version 做幂等判断,仅接收大于等于当前本地版本的已读回包。
4. Badge 更新:群主、群管、主播角色变化后,仅影响新拉取消息与当前已渲染消息刷新结果,不回改静态截图资源。
5. 角色优先级:同一消息同时带多个角色时,按 `群主 > 群管 > 主播 > 用户等级Lv` 选择单一 Badge 输出。
7. 异常场景 1. 当前列表总未读数为 `0`:不展示 `一键已读` 按钮。
2. 当前列表总未读数大于 `999`:按钮固定展示 `999+`,不展示更大真实数值。
3. 点击 `一键已读` 时网络超时:toast 提示 `一键已读失败,请稍后重试`,按钮恢复可点击。
4. 点击过程中有新未读进入:旧请求成功后重新拉取 list_unread_total;若仍大于 `0`,按钮继续展示最新计数。
5. 读取不到用户等级Badge:仅展示用户昵称。
6. 群主、群管、主播角色数据缺失:不展示对应角色标签,仅展示用户昵称。
7. 同一发送者同时命中多角色:仅展示优先级最高的一个 Badge,不叠加多枚标签,顺序为:群主、群管、主播、用户等级降序。

8. 建议新增字段

模块 建议新增字段 说明
列表一键已读 list_unread_total / list_read_sync_version / has_list_unread / read_all_request_id 用于控制列表页 `一键已读` 按钮显隐、`999+` 计数展示,以及已读回包幂等刷新。
聊天室角色Badge sender_role_type / sender_role_priority / user_level / user_level_badge / role_badge_text / role_badge_style 用于根据用户等级与后台角色映射输出最终单一 Badge,并控制对应样式资源。
会话行状态 conversation_unread_count / conversation_read_at / conversation_role_snapshot 用于一键已读后的列表逐行刷新,以及消息列表中昵称旁 Badge 的快照展示。