## ADDED Requirements ### Requirement: 后台新登录密码统一校验 后台既有设置新登录密码的表单 SHALL 按 2026-10-14 用户修正规则校验:长度 8~12 位,大写字母、小写字母、数字、半角特殊符号四类至少包含三类。可打印 ASCII 标点符号 MUST 允许;空白、中文、控制字符、emoji 等非 ASCII 字符 MUST 拒绝,不静默 trim。 #### Scenario: 有效新密码 - **WHEN** 用户在后台本人改密、账号创建、店铺初始账号、企业创建或企业改密入口输入 `Abc12345` - **THEN** 新密码校验 MUST 通过 - **AND** 新密码/确认密码输入限制及说明 MUST 为 8~12 位,四类字符至少包含三类,允许半角特殊符号 - **AND** 需要确认密码的表单 MUST 验证其与新密码一致 #### Scenario: 无效新密码 - **WHEN** 用户输入 7 位、13 位、只包含两类字符的密码,或包含空白、中文、emoji 等非法字符的密码 - **THEN** 前端 MUST 阻止提交并展示具体规则提示 - **AND** MUST NOT 静默 trim 密码后当作合法值提交 #### Scenario: 含特殊符号且满足三类 - **WHEN** 用户输入 `Admin@12345`、`ABC1234!`、`abc1234!` 或 `Abcdefg!` - **THEN** 前端 MUST 按至少三类规则放行,不额外要求大写、小写和数字三者同时存在 - **AND** 提示 MUST 不再显示「不允许特殊符号」 #### Scenario: 修改账号未设置新密码 - **WHEN** 既有账号修改操作未提供可选 `password` - **THEN** 页面 MUST NOT 因缺少密码阻止其他字段修改 - **AND** MUST NOT 提交空密码覆盖原值 - **AND** 本批次 MUST NOT 仅为接口清单补建当前没有的账号密码编辑入口 ### Requirement: 后台密码接口字段与旧密码兼容 后台密码服务 SHALL 保持各接口规定的请求字段;本人改密和账号独立改密的新密码使用 `new_password`,账号创建/可选修改及企业创建/改密使用 `password`,店铺初始密码使用 `init_password`。后端字段级错误 MUST 以既有 `msg` 或提供的 `message` 展示,不替换为笼统提示,不记录密码。 #### Scenario: 独立修改账号密码 - **WHEN** 既有服务调用 `PUT /api/admin/accounts/{id}/password` - **THEN** 请求体 MUST 按本批次说明使用 `new_password`,而不是当前旧封装的 `password` - **AND** 本批次 MUST NOT 将其他账号接口的 `password` 改名 #### Scenario: 使用旧密码登录和本人改密 - **WHEN** 用户使用仍被后端接受的旧密码登录或填写本人改密 `old_password` - **THEN** 前端 MUST NOT 对这些旧密码输入套用新的 8~12 位/至少三类限制 - **AND** 本人改密成功后的清理表单、清理登录态和返回登录页行为 MUST 保留 #### Scenario: 非登录密码与其余 C 端保持不变 - **WHEN** 实施本批次密码适配 - **THEN** 操作密码、WiFi 密码和通用校验器其他调用行为 MUST 保持不变 - **AND** 除用户明确追加的代理扫码注册密码校验及失败提示外,其余 C 端页面和 `/api/c/v1` 服务 MUST 不修改 #### Scenario: 展示后端字段级原因 - **WHEN** 密码相关请求返回包含具体校验原因的 `msg` 或 `message` - **THEN** 页面 MUST 展示该原因且不重复弹错 - **AND** 请求、日志和错误反馈 MUST NOT 输出输入的密码值 ### Requirement: 本人改密遮罩覆盖整个后台 本人修改密码弹窗 SHALL 使用 `append-to-body` 脱离顶栏堆叠上下文;遮罩 MUST 覆盖左侧菜单、顶栏和内容区,避免白色菜单压在遮罩上层,同时保留原表单、确认和关闭行为。 #### Scenario: 从顶栏打开改密弹窗 - **WHEN** 已登录用户打开本人修改密码弹窗 - **THEN** 弹窗遮罩 MUST 挂载到 body,左侧菜单 MUST 与页面其他背景一起变暗且不可点击 - **AND** 弹窗 MUST 继续支持 375px 视口,规则说明与错误提示不得重叠 ### Requirement: 代理扫码注册密码复用统一规则 公开代理扫码注册表单及注册服务 SHALL 按用户明确追加范围复用后台新密码规则:8~12 位,大写字母、小写字母、数字、半角特殊符号至少三类,禁止空格和中文等非法字符,不静默 trim。注册路径、其他字段、短信验证码和免 Token 行为 MUST 保持不变,不扩大到其他 C 端功能。 #### Scenario: 输入有效注册密码 - **WHEN** 用户输入 `Abc12345`、`ABC1234!`、`abc1234!` 或 `Abcdefg!` - **THEN** 表单及服务 MUST 校验通过,原样发送 `password` 至既有注册接口 - **AND** 页面 MUST 展示完整规则、12 位输入上限和「密码符合规则」反馈 #### Scenario: 输入无效注册密码 - **WHEN** 用户输入过短、过长、仅两类字符,或带空格/中文的密码 - **THEN** 表单及服务 MUST 阻止注册提交 - **AND** 页面 MUST 展示具体校验原因,不能把空格/中文显示为满足规则 - **AND** 规则说明和长错误文本 MUST 正常换行,不覆盖下一个表单项 ### Requirement: 代理扫码注册失败仅提示一次 原公开代理注册请求 SHALL 关闭公共错误消息,由扫码注册页面统一处理失败;后台接口、短信及其他请求 MUST 保留原错误处理。错误码 1050/1001 MUST 显示「注册失败, 请联系管理员」,不暴露企业微信审批场景/模板配置细节。 #### Scenario: 企业微信模板错误阻止注册 - **WHEN** 注册接口以业务响应或 HTTP 错误返回 1050/1001 - **THEN** 每次失败 MUST 只显示一次「注册失败, 请联系管理员」 - **AND** 表单 MUST 保留供重试,不能显示提交成功或再显示「分销码不可用」 #### Scenario: 其他注册错误 - **WHEN** 注册失败不是 1050/1001,且后端提供可读 `msg` 或 `message` - **THEN** 页面 MUST 只提示一次具体业务原因,不一律错误归因于分销码 - **AND** 无业务消息的网络错误 MUST 使用既有安全降级提示,不记录密码 #### Scenario: 注册提交仍在进行 - **WHEN** 用户重复点击提交,且上一次注册请求尚未完成 - **THEN** 页面 MUST 阻止并行重复提交,避免重复申请和重复失败提示