3.9 KiB
3.9 KiB
用户端 App 报修草稿操作日志
操作时间:2026-09-07(开发环境时区)。操作类型:扩展。影响模块:图05报修表单、本人照片读取。
操作前后
原先页面销毁会丢失表单和请求号。现在生产依赖注入 SecureRepairDraftStore,按 API 地址与认证账户隔离保存;照片先上传,草稿只保存 URI。点击暂存退出才离开,失败保留表单。提交前持久化请求号与待确认标记,未知结果恢复后复用原请求号;恢复不自动提交,成功才尝试清理草稿。
未发出的草稿恢复时重新查询本人地址,已删除地址回到选择步骤;未知提交保留首次地址快照。照片或草稿损坏不会自动删除,用户明确清除前提示先检查已有工单。
关键代码
apps/user_app/lib/data/services/repair_draft_store.dart:新建安全存储接口与实现,schema=1,只保留一个账户草稿。apps/user_app/lib/ui/features/tickets/repair_page.dart:_loadDraft(49行)、_persistDraft(173行)、_saveAndExit(194行)、_next(291行),扩展恢复、保存、清理及发送顺序。apps/user_app/lib/app/dependencies.dart、router.dart:注入存储;测试可显式不持久化。apps/user_app/lib/data/repositories/client_repository.dart:认证草稿所属账户、受保护照片字节读取。backend/api/internal/logic/upload/ticket_photo.go:ServeOwnedTicketPhoto(23行),只构造当前账户目录。backend/api/internal/logic/client/user/ticket_photo.go:UploadedTicketPhoto(34行),先校验登录用户。backend/api/internal/routers/client.go:新增第35行 GET/ticket-photos/:name。原有上传、工单照片和提交接口兼容。test/data/repair_draft_store_test.dart、test/ui/repair_draft_test.dart:隔离、恢复重试、写入失败、清理和损坏恢复覆盖。tool/a1_visual_test.dart:保留生产暂存入口的内存夹具。scripts/compare-user-app-a1.ps1纳入图05并排核对。
仓库此前已有大量未提交变更,以上为本次职责范围;不把累积 Git 行数当作本次改动统计。没有新增依赖、数据库列、迁移或容器。
验证
- 用户端 analyze 无问题;全量63项测试通过后新增损坏草稿案例,草稿组件5项定向测试全部通过,另有安全存储隔离1项通过。
- Go
test ./...、vet ./...通过;新草稿图片读取测试覆盖本人200、他人404、路径穿越404、无效文件名404。go build ./cmd/main通过。 - 平台契约同步与检查通过,48个资源。
- 图05的8组宽度/文本缩放截图通过;已实际打开设计源图及390像素实现图。步骤条、表单分区、照片占位和联系地址预览仍不同,严格1:1未通过。
- Web Release 构建使用
--dart-define=API_BASE_URL=http://127.0.0.1:12426。首次遗漏该参数导致浏览器连接模拟器默认地址失败,已重新构建修正。 - 浏览器真实验证:授权测试账户填写“草稿恢复浏览器验收:只暂存,不提交工单。”并选择既有蓝白验收图,暂存返回个人中心。完整刷新后重新登录同一账户,出现恢复提示;选择恢复后文字与照片均正确显示。API运行日志记录一次草稿照片读取、零次工单创建请求。验收结束通过“不保存”删除本次草稿。
风险和维护
草稿保存在当前设备及浏览器存储,不跨设备同步;暂存照片需要网络。删除本地草稿不会删除可能已关联工单的照片,未关联文件的过期清理仍需独立实现。提交已成功但本地清理失败时保留原请求号,下次重试由后端返回原工单,避免重复创建。
继续使用原远程 PostgreSQL、Redis,本机只运行 API 与 Web。语音、真实采集位置/时间、原生设备和完整设计还原仍未验收,不能将本次草稿完成等同于图05或全部58图完成。