完善移动端错误提示中文化

This commit is contained in:
czl231
2026-09-02 21:07:47 +08:00
parent 0f2475098f
commit dd250d80a0
10 changed files with 521 additions and 156 deletions

View File

@@ -160,6 +160,7 @@ apps/user_app/lib/
- 设备命令 UI 至少表示待发送、已发送、设备已确认、执行失败、超时待确认、已撤销。创建命令成功后按命令 `identity` 查询回执;超时只能显示“待确认”,不能回退为“已成功”。
- 写请求生成并持久化幂等键;重试复用原键。余额支付、充值、提现、订单提交、报修和设备命令均不得因页面重建或网络重连重复创建事实。
- ViewModel 根据稳定错误码映射可操作文案与恢复入口不得解析后端错误文案驱动流程。401/403、状态冲突、限流、外部依赖不可用和未知错误分别处理。
- 所有面向用户的接口错误必须显示中文;已知错误按稳定错误码映射,未知英文技术信息统一收敛为安全的中文失败提示。登录页在请求前校验纯 11 位中国大陆手机号,并在输入框下显示格式错误原因。
- 金额以最小货币单位整数进入领域层,只在格式化组件中转换为展示文本;时间统一解析为 UTC 并按用户时区展示,同时保留数据更新时间。
### 7.5 本地数据、安全与平台能力

View File

@@ -191,6 +191,7 @@ apps/service_app/lib/
- 不合格、高风险、测试失败、围栏异常、金额差异、证据缺失和设备回执不确定时只能进入异常、待整改或待确认,不能由客户端跳到已完成。
- 关阀、设备激活、任务完结、收款和提现均显示服务端确认状态。请求成功、文件进入上传队列或本地步骤完成不得显示为最终成功。
- 检查项使用稳定代码;照片类型、材料、风险等级和错误原因由契约映射,禁止根据中文标题或错误文案驱动状态流转。
- 所有面向工作人员的接口错误必须显示中文;已知错误按稳定错误码映射,未知英文技术信息统一收敛为安全的中文失败提示。登录页在请求前校验纯 11 位中国大陆手机号,并在输入框下显示格式错误原因。
### 9.5 离线队列、定位与证据

View File

@@ -0,0 +1,72 @@
# 移动端错误提示中文化操作日志
操作时间2026-09-02 20:56:00
操作类型:修改、扩展
影响模块:用户端 App、工作人员端 App、移动端需求文档
## 操作前状态
用户端和工作人员端的 HTTP 客户端会直接展示服务端 `message`。当接口返回 `Invalid Argument``Password Incorrect` 等 SDK 英文错误时,页面直接向用户暴露英文技术信息。登录页未在本地校验后端要求的纯 11 位中国大陆手机号,输入带 `+86` 的号码后只能得到服务端通用参数错误。
工作区原有 `apps/service_app/pubspec.lock` 修改,本次未覆盖或调整。
## 具体操作
1. 在两个 App 的 `ApiClient` 中增加稳定错误码到中文提示的统一映射,覆盖当前 BSM SDK 的请求、业务、令牌、基础设施和标准状态错误码。
2. 保留服务端返回的中文业务提示;无法识别的纯英文消息统一显示“操作失败,请稍后重试”。
3. 将网络连接异常和无效 JSON 响应转换为明确中文提示。
4. 在两个登录页提交前校验纯 11 位中国大陆手机号格式错误时在手机号输入框下显示“请输入正确的11位手机号”。按已确认方案不增加 `+86` 自动转换或兼容。
5. 登录接口返回密码错误码 `1108` 时统一提示“手机号或密码错误”,避免泄露账号是否存在。
6. 补充 Widget 与错误映射回归测试,并同步两类 App 的错误处理需求。
## 操作后状态
- `Invalid Argument` 不再直接显示;登录页会在请求前给出手机号中文格式提示。
- 两个 App 的已知接口错误按稳定错误码展示中文。
- 未知英文接口消息不再透传到界面。
- 后端路由、请求体、响应结构和错误码保持不变,公共接口兼容。
## 代码变更
- `apps/user_app/lib/data/services/api_client.dart`
- `localizeApiErrorMessage`:新增错误码中文映射和未知英文兜底。
- `ApiClient._sendRequest``ApiClient._decode`:统一处理网络异常、响应解析和中文错误。
- `apps/user_app/lib/ui/features/auth/login_page.dart`
- `_LoginPageState._login`:新增手机号校验和登录密码错误专用提示。
- 手机号输入框:新增字段级错误展示与输入后清除行为。
- `apps/service_app/lib/data/services/api_client.dart`
- 与用户端保持一致的错误码中文映射和请求异常处理。
- `apps/service_app/lib/ui/features/auth/login_page.dart`
- 与用户端保持一致的手机号校验和登录错误提示。
- `apps/user_app/test/ui/login_page_test.dart`
- 新增手机号格式错误和接口错误中文化测试。
- `apps/service_app/test/ui/login_page_test.dart`
- 新增手机号格式错误和接口错误中文化测试。
- `docs/03-用户端App需求.md``docs/04-服务端App需求.md`
- 补充移动端接口错误中文化和登录手机号校验要求。
## 行为变化
| 场景 | 修改前 | 修改后 |
| --- | --- | --- |
| 登录手机号带 `+86` | 服务端返回并展示 `Invalid Argument` | 输入框提示“请输入正确的11位手机号”不发起请求 |
| 密码错误 | 展示 `Password Incorrect` | 展示“手机号或密码错误” |
| 已知 SDK 接口错误 | 可能展示英文原文 | 按稳定错误码展示中文 |
| 未知纯英文错误 | 直接展示英文原文 | 展示“操作失败,请稍后重试” |
| 中文业务错误 | 直接展示中文原文 | 保持中文原文 |
## 验证结果
- `apps/user_app` 执行 `flutter analyze`:通过,无问题。
- `apps/user_app` 执行 `flutter test`4 个测试全部通过。
- `apps/service_app` 执行 `flutter analyze`:通过,无问题。
- `apps/service_app` 执行 `flutter test`5 个测试全部通过。
- 执行 `git diff --check`:未发现空白符错误;仅提示仓库现有的 LF/CRLF 转换规则。
- 边界测试覆盖:带 `+86` 的手机号、参数错误码、密码错误码、未知中文业务消息和未知英文消息。
## 风险评估
- 当前手机号规则与后端保持一致,仅接受纯 11 位号码;系统自动填充带 `+86` 时仍需用户手动修改,这是已确认的产品选择。
- 未知英文消息会被安全兜底文案替代,客户端界面不再包含原始诊断信息;排障应依赖稳定错误码和服务端日志。
- 两个 App 目前各自维护同一份映射;后端 SDK 新增错误码时需要同步补充两端映射及测试。
- 本次不修改认证逻辑、令牌、服务端错误码或数据库,影响仅限客户端输入校验和错误展示。