1. 需求背景
- 当前 `訊息` 列表存在大量未读会话时,用户只能逐条进入或依赖零散红点判断,缺少对当前列表的统一已读处理动作。
- 当前聊天室消息流缺少一致的发送者身份标识,普通用户等级、群主、群管、主播角色分辨成本高。
- 业务需要同时补足 `列表级已读收敛` 与 `对话气泡角色识别` 两个场景,且不改变现有消息列表与聊天室主体布局。
- 本期目标是让用户在列表页快速清理未读,在聊天室内快速识别发送者角色。
本方案覆盖两个主场景:`聊天列表` 新增 `一键已读` 下拉提示条入口,用于处理当前 `訊息` 列表全部未读; `聊天室` 内则新增发送者 `Badge` 展示,用于区分普通用户等级、群主、群管、主播角色。点击列表页 `一键已读` 后,统一将当前 `訊息` 列表未读会话置已读,并同步刷新列表未读数、底部聊天入口角标与下拉提示条状态; 聊天室内每位发送者仅展示一个 Badge,并按既定优先级选择最终样式。
以下原型直接使用你提供的两张截图:图1为聊天列表页 `一键已读` 的同页组合示意,上方展示下拉触发后的提示条与 `X` 关闭入口,下方展示成功后的 toast 反馈; 图2说明聊天室内对话气泡 Badge 的展示位置、角色类型与现有右侧功能入口的共存关系。
list_unread_total > 0 时,才露出提示条。
| 3. 字段定义 |
列表一键已读字段
对话气泡 Badge 字段
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4. 聊天室角色Badge栏位 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 5. 权限规则 |
1. `一键已读` 仅对当前登录用户本人可用,不影响其他成员的未读状态。 2. `一键已读` 仅作用当前 `訊息` 列表,不作用 `聯絡`、`群組` 页签的独立未读。 3. 当前用户无 `訊息` 列表访问权限、账号离线或消息能力关闭时,不展示 `一键已读` 提示条。 4. 聊天室内所有仍在群成员均可查看发送者 Badge。 5. 群主、群管、主播 Badge 由服务端角色映射返回,前端不自行推断。 6. 同一时刻仅允许一个 `一键已读` 请求进行中;进行中状态下重复点击 `一键已读` 不再次发起请求。 7. 仅允许在下拉展开区停留期间触发 `一键已读`;列表已回弹至静止态时不可点击该能力。 8. `X` 关闭仅影响当前设备当前次下拉提示条展示,不改变未读数据,也不影响其他终端或下一次重新下拉时的展示资格。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 6. 同步 / 异步更新规则 |
1. 同步更新范围:`一键已读` 成功后,同步刷新 `訊息` 列表各会话未读红点、提示条文案/显隐、底部聊天角标。 2. 异步更新范围:其他终端或 websocket 新未读回写进入时,重新计算 list_unread_total;若仍大于 `0`,仅在用户下一次下拉达到阈值时展示最新总数。3. 版本比较:前端以 list_read_sync_version 做幂等判断,仅接收大于等于当前本地版本的已读回包。4. Badge 更新:群主、群管、主播角色变化后,仅影响新拉取消息与当前已渲染消息刷新结果,不回改静态截图资源。 5. 列表手势冲突:下拉位移未达到阈值时,仅保留原有下拉回弹表现,不展示半露出的提示条。 6. 关闭同步:点击 `X` 后,仅本次下拉会话内隐藏提示条;若用户未松手继续停留在下拉态,也不重新露出。 7. 成功反馈:成功 toast 与顶部提示条状态同步更新;提示条先收起,再展示底部成功 toast。 8. 角色优先级:同一消息同时带多个角色时,按 `群主 > 群管 > 主播 > 用户等级Lv` 选择单一 Badge 输出。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 7. 异常场景 |
1. 当前列表总未读数为 `0`:不展示 `一键已读` 提示条。 2. 当前列表总未读数大于 `999`:提示条仍展示实际未读总数,例如 `2797`,不使用 `999+` 截断。 3. 点击 `一键已读` 时网络超时:toast 提示 `一键已读失败,请稍后重试`,提示条恢复可点击。 4. 点击过程中有新未读进入:旧请求成功后重新拉取 list_unread_total;若仍大于 `0`,提示条不立即常驻展示,仅在下一次下拉达到阈值时露出最新总数。5. 下拉位移不足阈值:不展示 `一键已读` 提示条,仅保留原有列表回弹效果。 6. 用户松手后列表立即回弹至静止态:若当前未发起 `一键已读` 请求,则提示条直接隐藏。 7. 提示条展示期间用户反向上滑:提示条随列表退出下拉展开区并隐藏,不发起已读请求。 8. 点击 `X` 后当前次下拉仍持续停留:提示条保持关闭,不重新自动露出;需松手回弹后重新下拉才可再次展示。 9. 成功 toast 期间用户继续滚动列表:toast 保持 2 秒后自动消失,不阻断列表滚动操作。 10. 成功 toast 展示期间又有新未读进入:toast 不回滚为失败态;2 秒结束后按最新未读状态等待用户下一次下拉再露出提示条。 11. 读取不到用户等级Badge:仅展示用户昵称。 12. 群主、群管、主播角色数据缺失:不展示对应角色标签,仅展示用户昵称。 13. 同一发送者同时命中多角色:仅展示优先级最高的一个 Badge,不叠加多枚标签,顺序为:群主、群管、主播、用户等级降序。 |
| 模块 | 建议新增字段 | 说明 |
|---|---|---|
| 列表一键已读 | list_unread_total / list_read_sync_version / has_list_unread / read_all_request_id / read_all_loading / read_all_success_count / pull_down_offset / read_all_exposed / read_all_dismissed / read_all_success_toast_text / read_all_success_toast_visible |
用于控制列表页 `一键已读` 提示条显隐、下拉阈值触发、`X` 关闭状态、请求进行中态、实际未读总数展示、成功 toast 计数文案与已读回包幂等刷新。 |
| 聊天室角色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 的快照展示。 |