## Purpose 按原始需求(`111.md` §15.7)为后台关联查看补齐「绑定资产数量」与「最近解绑人」两个投影字段,使运营无需逐条计数即可判断某手机号还可绑定多少资产、并在解绑后直接看到处理人。 ## MODIFIED Requirements ### Requirement: 后台查看关联 仅超级管理员和平台用户可在其资产数据范围内查看关联手机号。资产详情 MUST 列出该资产全部当前关联手机号;资产列表、卡与设备两类导出以及批量任务结果中,具备资产数据权限的账号可见完整关联手机号,不做脱敏。按资产查询 MUST 一次批量聚合完成。后台 MUST NOT 提供补录或修改关联的入口。 关联查询 SHALL 额外返回两项投影:该手机号当前有效关联资产数量,以及每条关系的最近解绑人与最近解绑时间。数量口径 MUST 与该手机号「最多关联十项」的上限判定完全一致(只统计当前有效关系、卡与设备分别计一项),MUST 按当页涉及的手机号集合一次批量聚合,MUST NOT 逐手机号或逐资产放大查询次数。最近解绑人 MUST 取最近一次解除该关系的后台账号名称与账号标识快照,并随既有解绑方式、解绑时间、解绑原因一并返回;关系仍有效时该字段为空,MUST NOT 以创建人或最后更新人填充。以上字段 MUST 只读,MUST NOT 改变既有解绑、换绑、上限判定与审计规则。 #### Scenario: 数据范围外不可见 - **WHEN** 平台用户查询其资产数据范围之外的资产的关联手机号 - **THEN** 系统不返回该资产的关联手机号 #### Scenario: 列表一次聚合 - **WHEN** 请求一页包含多项资产的列表 - **THEN** 系统按该页资产集合一次读取关联手机号并按资产装配,不逐资产查询 #### Scenario: 解绑后仍可查看完整快照 - **WHEN** 一次批量解绑任务执行完成、关系已失效后查看该任务结果 - **THEN** 结果中仍返回该次解除时记录的完整手机号快照 #### Scenario: 两类导出均含关联手机号 - **WHEN** 导出 IoT 卡场景或设备场景 - **THEN** 两类导出均包含关联手机号列,且设备导出列组解析对新增列保持正确 #### Scenario: 数量与上限口径一致 - **GIVEN** 某手机号当前有效关联十项资产 - **WHEN** 查询其中任一关联 - **THEN** 返回的当前有效关联资产数量为十,与上限判定使用的计数相同 #### Scenario: 已解绑关系展示解绑人 - **GIVEN** 一条关系已被后台账号 A 通过单项解绑失效 - **WHEN** 查询该关系 - **THEN** 返回最近解绑人为 A 的名称与标识、解绑时间与解绑原因 #### Scenario: 有效关系无解绑人 - **WHEN** 查询一条仍有效的关联 - **THEN** 最近解绑人与最近解绑时间均为空,且不以创建人或更新时间填充 #### Scenario: 数量批量聚合 - **GIVEN** 一页返回多项资产或手机号的关联 - **WHEN** 查询该页 - **THEN** 系统按该页涉及的手机号集合一次读取计数,查询次数不随行数线性增长 ## ADDED Requirements ### Requirement: 短信验证码校验失败次数限制 系统 SHALL 对短信验证码校验实施失败次数限制,作用域覆盖注册、绑定、换绑与换证的全部短信验证码校验流程:失败计数按窗口续期维护——每次校验失败在窗口内累加计数并重置窗口时长,相邻两次失败间隔不超过窗口时长即持续累加;计数达到上限后短时间内的后续校验 MUST 被拒绝并返回可定位的限流错误码与提示;校验成功 MUST 清零该手机号的失败计数。失败计数与锁定 MUST 以手机号维度按原子操作维护,并发提交 MUST NOT 绕过计数;锁定检查 MUST 先于验证码比对,锁定期内即使提交正确验证码也 MUST NOT 通过;锁定期为自计数达到上限起的一个窗口时长,锁定期间的提交在比对前即被拒绝且不再计数,因此锁定不因再次提交而续期;锁定到期后 MUST 自动恢复可校验状态,MUST NOT 需要人工解锁。阈值与窗口 MUST 为固定常量或既有服务端配置,MUST NOT 新增对外可配置项或接口。错误提示 MUST NOT 泄露验证码正确性、剩余失败次数或内部键名。 失败计数的写入或读取失败 MUST NOT 阻断校验流程的成功路径:计数不可用时系统 MUST 放行并记录,MUST NOT 因限流计数故障阻断注册、绑定、换绑、换证与登录的成功路径。发送侧既有频率限制、验证码有效期与一次性消费语义 MUST 保持不变;校验失败 MUST NOT 消费验证码,MUST NOT 影响既有链路的成功结果。 #### Scenario: 连续失败达到上限 - **WHEN** 同一手机号在窗口内连续提交错误验证码达到上限 - **THEN** 后续校验被拒绝并返回限流错误,即使提交的是正确验证码也不通过 #### Scenario: 锁定到期恢复 - **GIVEN** 某手机号因失败次数达到上限被短时锁定 - **WHEN** 锁定窗口结束且提交正确验证码 - **THEN** 系统正常通过校验 #### Scenario: 成功后清零 - **GIVEN** 某手机号已有若干次失败计数但未达上限 - **WHEN** 一次校验成功 - **THEN** 该手机号失败计数被清零,后续失败重新计数 #### Scenario: 并发提交不绕过计数 - **WHEN** 同一手机号并发提交多个错误验证码 - **THEN** 失败计数按实际提交次数累加,不因并发而丢失计数 #### Scenario: 失败不消费验证码 - **WHEN** 一次校验因验证码错误或限流失败 - **THEN** 该验证码保持可再次校验(在有效期与计数限制允许范围内),不产生任何业务事实 #### Scenario: 计数不可用不阻断成功路径 - **GIVEN** 失败计数所依赖的存储不可用 - **WHEN** 注册、绑定、换绑、换证或登录提交正确验证码 - **THEN** 校验正常通过,不因计数故障被拒绝,且计数不可用的事实被记录