1. 需求背景
- 当前 `訊息` 列表存在大量未读会话时,用户只能逐条进入或依赖零散红点判断,缺少对当前列表的统一已读处理动作。
- 当前聊天室消息流缺少一致的发送者身份标识,普通用户等级、群主、群管、主播角色分辨成本高。
- 业务需要同时补足 `列表级已读收敛` 与 `对话气泡角色识别` 两个场景,且不改变现有消息列表与聊天室主体布局。
- 本期目标是让用户在列表页快速清理未读,在聊天室内快速识别发送者角色。
本方案覆盖两个主场景:`聊天列表` 新增 `一键已读` 悬浮按钮,用于处理当前 `訊息` 列表全部未读; `聊天室` 内则新增发送者 `Badge` 展示,用于区分普通用户等级、群主、群管、主播角色。点击列表页 `一键已读` 后,统一将当前 `訊息` 列表未读会话置已读,并同步刷新列表未读数、底部聊天入口角标与按钮显隐; 聊天室内每位发送者仅展示一个 Badge,并按既定优先级选择最终样式。
以下原型直接使用你提供的两张截图:图1说明聊天列表页 `一键已读` 的悬浮入口、总未读数与 `999+` 上限; 图2说明聊天室内对话气泡 Badge 的展示位置、角色类型与现有右侧功能入口的共存关系。
| 3. 字段定义 |
列表一键已读字段 1. 入口位置:位于 `訊息` 聊天列表右下悬浮区,不进入 `聯絡`、`群組` 页签。 2. 展示条件:仅当当前 `訊息` 列表总未读数 list_unread_total > 0 时展示。3. 按钮文案:固定展示 `一键已读`。 4. 计数展示:按钮右侧展示 list_unread_total;当 list_unread_total > 999 时固定展示 `999+`。5. 点击动作:请求参数至少带 tab_type = message、request_id、last_sync_version。6. 成功结果:当前 `訊息` 列表全部未读置已读,列表红点、底部聊天角标、按钮计数同步刷新。 7. 失败结果:按钮恢复可点击,toast 提示 `一键已读失败,请稍后重试`。 对话气泡 Badge 字段 1. 展示位置:位于发送者昵称右侧,与消息时间、消息正文分层展示。 2. 普通用户等级:展示 `Lv. 1-51` 等级头盔;实际样式按等级资源映射。 3. 群主标签:角色为群主时展示 `群主` 标签。 4. 群管标签:角色为后台指定群管时展示 `群管` 标签。 5. 主播标签:角色为后台指定主播账号时展示 `主播` 标签。 6. 互斥规则:同一发送者同时存在多角色时,仅展示优先级最高的一个 Badge,顺序为:群主、群管、主播、用户等级降序。 7. 昵称截断:当 `昵称 + Badge` 超出单行宽度时,仅截断昵称并补 `...`,Badge 不截断。 |
|||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4. 聊天室角色Badge栏位 |
|
|||||||||||||||
| 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,不叠加多枚标签,顺序为:群主、群管、主播、用户等级降序。 |
| 模块 | 建议新增字段 | 说明 |
|---|---|---|
| 列表一键已读 | 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 的快照展示。 |