草稿自动保存需自主管理数据生命周期:存数据库更可靠,用 drafts 表配 user_id、form_key、content 和 updated_at;简单场景可用带过期时间的 session;前端防抖+beforeunload 强制保存;后端 PUT 更新、提交后立即清理草稿;须校验登录、分离 old() 逻辑、处理网络失败。

草稿自动保存在 Laravel 里不是靠“开启某个开关”,而是你得自己管好数据生命周期——临时存哪、存多久、怎么读、怎么清,漏一环就丢内容。
草稿存在 session 还是数据库?
session 简单但不可靠:用户换设备、清浏览器、session 过期,草稿就没了;数据库更稳,但得多建一张 drafts 表,加个 user_id、form_key(比如 "post_create")、content(JSON 或 TEXT)、updated_at 字段。
- 表单字段多、内容长(如富文本),用数据库 +
JSON类型存整个请求体最灵活 - 如果是简单表单(如搜索筛选条件),用
session()->put('draft.search', $request->all())足够,但记得设短过期时间:session()->put('draft.search', $data, 3600) - 别用 cache(如 Redis)存草稿而不设 user 绑定前缀——不同用户可能互相覆盖
前端怎么触发自动保存?
靠 JS 定时或监听输入事件,但别每敲一个字都发请求。实际做法是「防抖 + 节流」结合:
- 用
lodash.debounce延迟 1.5 秒再发,用户停手即存 - 关键操作(如切换 tab、关闭页面)前强制调一次
saveDraft(),用window.addEventListener('beforeunload', ...) - 后端接口别用
POST /drafts,改用PUT /drafts/{form_key},方便幂等更新 - 响应里返回
updated_at时间戳,前端可据此判断是否要提示“已保存”
怎么避免草稿和正式提交冲突?
用户可能一边编辑草稿,一边又提交了正式表单——这时草稿该自动删,否则下次打开又是旧内容。
- 在正式保存成功后,立刻调用
Draft::where('user_id', auth()->id())->where('form_key', $key)->delete() - 如果用 session,对应执行
session()->forget("draft.{$key}") - 别等用户手动点“清空草稿”,系统得自己守规矩:提交成功 = 草稿作废
- 额外加个逻辑:如果草稿的
updated_at比当前时间早 7 天,后台任务定期清理(防止垃圾堆积)
为什么用户总说“刚写的不见了”?
绝大多数不是代码问题,是没处理好这三件事:
- 没校验
auth()->check()就直接读草稿——游客访问也走草稿逻辑,结果读到空或别人的数据 - 表单里用了
old()辅助函数,但它只回显上次提交失败的内容,和草稿无关;两者逻辑必须分开维护 - 前端没做 loading 状态或错误重试,网络抖动导致保存请求静默失败,用户毫无感知
草稿不是“自动兜底”,它是一条需要前后端对齐状态的链路——中间断一节,用户就以为你丢了他写的东西。


















