3.0 KiB
3.0 KiB
表单数据保护方案 - 进度跟踪
最后更新: 2026-04-20
当前状态: 试点改造完成,等待用户确认效果
已完成
- 项目代码扫描
- 技术栈分析 (React 18 + Ant Design 5 + Zustand + react-router-dom 6)
- 表单组件清单整理 (13个Modal表单 + 1个页面级表单)
- 输出详细改造方案
- 用户确认方案(所有决策点已确认)
- 创建 useFormDraft Hook (src/hooks/useFormDraft.ts)
- 创建 useFormGuard Hook (src/hooks/useFormGuard.ts)
- 试点改造: ReimbursementsPage (Modal表单,含detailItems外部状态)
- 试点改造: BudgetProjectCreate (页面级表单,含路由离开拦截)
待完成
- 用户确认试点效果
- 推广至全项目 (11个剩余组件)
已确认的决策
| 决策项 | 决定 | 理由 |
|---|---|---|
| 第三方库 vs 自定义Hook | 自定义Hook | 项目表单模式统一(Ant Design Form),第三方库兼容性不确定 |
| sessionStorage vs localStorage | sessionStorage | 关闭标签自动清理,避免脏数据残留 |
| 草稿恢复时机 | 弹确认框让用户选择 | 给用户选择权 |
| 草稿过期策略 | savedAt超过24小时自动忽略 | 避免过期脏数据 |
| Modal关闭拦截 | 是,但只拦截有改动的情况 | 防止误关,但不干扰正常操作 |
| 试点组件 | ReimbursementsPage + BudgetProjectCreate | 最复杂Modal表单 + 唯一页面级表单 |
新增文件
src/hooks/useFormDraft.ts- 表单草稿自动保存/恢复/清理src/hooks/useFormGuard.ts- 离开拦截(浏览器刷新/关闭 + 路由跳转 + 移动端切后台)
改造要点
ReimbursementsPage (Modal表单)
- Modal关闭时保存草稿而非丢弃
- 重新打开时检测草稿,弹确认框让用户选择恢复或重新填写
- detailItems外部状态通过extraData同步保存
- 表单提交成功后清理草稿
- maskClosable=false 防止误点遮罩关闭
- onValuesChanged 监听表单变化自动保存
BudgetProjectCreate (页面级表单)
- 页面加载时检测草稿,弹确认框让用户选择恢复
- useBlocker 拦截路由跳转,弹确认框
- beforeunload 拦截浏览器刷新/关闭
- visibilitychange + pagehide 处理移动端切后台
- 附件变化时同步保存草稿
- 取消按钮有改动时弹确认
剩余待改造组件 (11个)
- AdvancesPage.tsx - 预支申请(Modal, 附件)
- PaymentRequestsPage.tsx - 付款申请(Modal, 收款单位联动, 附件)
- SuppliersPage.tsx - 供应商(Modal, 联系人/收款信息)
- SubcontractorsPage.tsx - 分包商(Modal, 联系人/收款信息)
- CustomersPage.tsx - 客户(Modal, 联系人/收款信息)
- LogisticsCompaniesPage.tsx - 物流公司(Modal)
- ProcurementPage.tsx - 采购(Modal)
- PurchaseRequestsPage.tsx - 采购申请(Modal)
- PurchaseOrdersPage.tsx - 采购订单(Modal, 商品明细)
- ContractCreateModal.tsx - 快速签约(Modal)
- QuotationCreateModal.tsx - 新增报价版本(Modal)
- ProfilePage.tsx - 个人资料(页面表单+密码修改Modal)