成绩互动与内容反馈工作流
成绩页面的点赞、评论、回复和内容反馈既有用户动作,也有审核动作。客户端要显示状态差异、控制重复提交并保护评论中的个人信息。
互动对象
一条曲目互动摘要通常包含:
- 曲目编号;
- 点赞数和点踩数;
- 评论数;
- 更新时间;
- 当前用户的互动状态(如果返回)。
评论对象通常包含评论编号、曲目编号、父评论、作者显示名、正文、互动数和时间。显示时要考虑作者隐私和撤回状态。
读取流程
单曲读取
- 从当前页面得到曲目编号;
- 读取该曲目的互动摘要;
- 需要时读取评论;
- 对评论排序并显示分页/折叠状态;
- 缺少评论数组时显示空状态,不显示错误。
批量读取
批量读取时每次只提交合理数量的曲目编号,按服务限频。批量响应缺少某曲目时,不能把它当成“曲目不存在”;可以在页面上标记未返回并有限重试一次。
批量读取包含审核信息时,只对拥有权限的账号请求;普通客户端不要自行加入审核开关。
点赞和点踩
动作值必须来自页面允许的集合。点击后:
- 禁用当前按钮;
- 保存点击前摘要;
- 提交一次;
- 使用响应摘要更新页面;
- 必要时重新读取确认;
- 失败时恢复原显示并保留消息。
网络超时不能自动点第二次。先读取最新摘要,确认当前用户的互动状态,再允许下一次操作。
不要把本地计数直接加一当作最终值,因为其它用户可能同时互动。
发表评论
评论发送前校验:
- 正文非空;
- 长度不超过页面限制;
- 不包含 Token、密码、访问码或个人联系方式;
- 不直接复制未授权的聊天记录;
- 如果包含内容问题,使用可复现的非敏感描述。
提交中保留正文但锁定按钮。成功后以服务返回的评论对象为准,不要在本地自行生成永久评论编号。
回复评论
回复请求要携带父评论标识。显示层应明确“回复哪一条评论”,避免移动端滚动后把正文发送到错误父评论。父评论已经删除或不可见时,先刷新评论列表,不要用旧标识重试。
删除评论
删除前显示作者、时间和正文摘要,并确认当前用户拥有删除权限。删除请求超时后重新读取评论:
- 评论已不存在:按已删除处理;
- 评论仍存在:显示未确认,不自动重试;
- 返回权限失败:停止尝试并显示权限提示。
删除不应被实现成“清空本地列表”,否则用户无法区分本地刷新和服务端删除。
内容反馈
反馈的目的应是说明内容问题,而不是请求绕过权限。理由中写:
- 曲目编号和难度;
- 看到的现象;
- 发生时间或版本;
- 最小复现步骤;
- 是否只发生在一个环境;
- 已经尝试的安全动作。
不要写入完整日志、服务地址、私钥、账号备份或他人个人信息。
提交后状态可能是待处理、已通过、已拒绝或已隐藏/显示决定。客户端不能把提交成功直接显示成管理员已经同意。
撤回反馈
撤回只作用于页面返回且当前用户有权限的反馈。撤回前显示目标编号和原因摘要,确认后提交一次,成功后重新读取历史。
如果撤回请求超时,先查看历史状态。不要通过重复撤回改变已经处理的审核记录。
审核列表
审核列表可能按状态筛选。审核客户端应:
- 清楚显示当前筛选状态;
- 显示创建和更新时间;
- 区分提交人、处理人和内容作者;
- 不把内部备注显示给普通用户;
- 决定前读取最新对象;
- 保存结果并重新读取。
审核动作通常是隐藏或显示,备注应简洁、非敏感、可解释。不要在备注中粘贴内部地址、密码或完整日志。
审核历史
历史记录至少要展示事件时间、事件类型、曲目编号、操作者、理由/备注和状态。时间按带时区格式显示;客户端不要把不同来源的时间强行合并。
历史读取失败不应清空当前已显示的审核队列。可以标记历史暂时不可用,等待用户刷新。
互动数据隐私
公开评论、成绩记录和互动统计可能被多人看到。展示前:
- 不暴露 Token 和本地账号条目;
- 处理用户主动填写的联系方式;
- 不把私聊内容直接复制成公开评论;
- 图片或附件先检查个人信息;
- 删除/撤回后刷新视图,避免继续展示旧缓存。
互动错误矩阵
| 现象 | 第一动作 | 第二动作 |
|---|---|---|
| 点赞按钮处理中 | 等待当前请求 | 超时后读取摘要 |
| 评论发送失败 | 保留正文和错误 | 检查 Token/长度/权限 |
| 评论重复出现 | 刷新评论列表 | 不再重发原文 |
| 回复挂错父评论 | 读取最新评论树 | 让用户重新选择父项 |
| 删除显示成功但仍可见 | 重新读取 | 检查是否缓存或权限 |
| 反馈没有进审核 | 读取历史/状态 | 不重复提交同一原因 |
| 审核结果不一致 | 读取最新对象 | 检查当前筛选和更新时间 |
客户端回归清单
- [ ] 空评论被本地拦截;
- [ ] 长评论有明确提示;
- [ ] 评论和回复按钮在提交中禁用;
- [ ] 点赞/点踩以服务返回计数为准;
- [ ] 删除有二次确认;
- [ ] 超时不重放写入;
- [ ] 普通账号看不到审核字段;
- [ ] 审核账号的决定前会回读;
- [ ] 公开日志不含评论请求体和 Token;
- [ ] 页面切换后不会把旧响应写入新账号。
