当前位置:

首页 > 编程开发 > ThinkPHP文章草稿箱实现方法详解

ThinkPHP文章草稿箱实现方法详解

草稿应存数据库而非缓存,因缓存易丢失;推荐与正式文章共用表,用status字段区分状态,并通过id判断新增或更新,配合服务端限频(cache锁10秒)和前端防抖(1500ms),登录态强制绑定,游客草稿需用guest_token持久化并提供手动合并入口。

草稿应存数据库而非缓存,因缓存易丢失;推荐与正式文章共用表,用status字段区分状态,并通过id判断新增或更新,配合服务端限频(cache锁10秒)和前端防抖(1500ms),登录态强制绑定,游客草稿需用guest_token持久化并提供手动合并入口。

ThinkPHP如何实现文章草稿箱_ThinkPHP临时保存功能汇总【汇总】

草稿数据该存数据库还是缓存?

直接存数据库最稳妥,别被“临时”二字误导。ThinkPHP 的 session 或 cache 存草稿容易丢——用户换设备、清浏览器、缓存过期或服务端清理都会导致草稿消失。真实场景中,用户写 20 分钟后切屏回来看到空白,基本等于流失。

推荐做法是:草稿和正式文章共用一张表(如 article),靠字段区分状态:

  • status 设为 'draft'(字符串)或 0(整型),发布时再改为 'published' 或 1
  • 加 is_draft 布尔字段也行,但注意 MySQL 5.7+ 才原生支持 TINYINT(1) 当布尔用,否则查出来是数字
  • 避免用单独的 draft 表——后期要合并、预览、定时清理都多一层 join 和逻辑

如何避免重复保存覆盖草稿?

用户边写边点“保存草稿”,如果每次都是 save() 全量更新,可能把中途删掉的内容又刷回来。关键是识别“谁在编辑这篇草稿”。

ThinkPHP 6+ 推荐用以下组合策略:

  • 前端每次保存时带上当前草稿的 id(新增草稿则传 null 或空字符串)
  • 后端判断:if ($data['id']) { Article::update($data); } else { Article::create(array_merge($data, ['status' => 'draft'])); }
  • 加个 updated_at 字段自动更新,再加个 last_edit_ip 字段记录最后编辑 IP,方便排查冲突
  • 不要依赖前端传来的 created_at,一律由服务端用 date('Y-m-d H:i:s') 或 time() 写入

自动保存草稿的接口怎么防抖和限频?

前端用 setInterval 每 30 秒发一次草稿请求,后端不做限制的话,用户切到别的标签页再切回来,可能瞬间触发多次请求,造成冗余写入甚至死锁。

简单有效的服务端控制方式:

  • 在控制器里加基础限频:用 cache('draft_lock_' . $userId, $draftId, 10),10 秒内只允许一次写入,命中则直接返回成功(不真写库)
  • 前端也要做防抖:clearTimeout(saveTimer); saveTimer = setTimeout(submitDraft, 1500);
  • 接口返回值必须包含 saved_at 时间戳,前端比对上一次响应时间,避免“以为没保存成功”而反复点
  • 别用 lockTable() —— 草稿写入不是强事务场景,锁表反而拖慢其他请求

用户退出登录后草稿还能找回吗?

不能默认找回。ThinkPHP 的 session 绑定登录态,登出即销毁;cache 若用文件驱动,也随 session 清除;Redis 驱动虽可独立,但没绑定用户 ID 就没法区分。

真正可行的方案只有两个:

  • 强制登录后才能写草稿(推荐)。在中间件里拦截未登录用户的 /api/draft/save 请求,返回 401
  • 若真要支持游客草稿,必须用持久化手段:把草稿存在数据库,用随机生成的 guest_token(如 md5(uniqid() . $_SERVER['REMOTE_ADDR']))关联,并存进 cookie(带 HttpOnly=false,前端能读),用户注册/登录后再把 guest_token 对应的草稿迁移到其账号下

这个迁移动作容易漏掉——比如用户先用手机号注册,又用微信登录,得在用户中心提供“合并历史草稿”手动入口,不然数据就卡在那儿了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 thinkphp
相关文章 更多
thinkphp项目部署指南详解服务器部署步骤
thinkphp项目部署指南详解服务器部署步骤

详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】
为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】

ThinkPHP6.0模型关联返回null的常见原因包括:with闭包遗漏外键和主键字段、嵌套预加载语法不兼容低版本、关联方法内部误用with或field导致数据失控,以及全局作用域与软删除未显式处理。通过检查SQL日志、显式声明关键字段、升级版本或改用正确语法、清理关联方法中的查询条件即可解决。

TP6.0 构建支持断点续传的超大附件上传服务【分片】
TP6.0 构建支持断点续传的超大附件上传服务【分片】

在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

thinkphp排序怎么实现动态排序 开发技巧解析
thinkphp排序怎么实现动态排序 开发技巧解析

动态排序时,order()应置于查询链式调用中且必须在paginate()之前;字段和方向需通过白名单硬校验,使用数组语法防SQL注入;分页调用appends()传递参数;多字段排序用关联数组,确保安全稳定。

TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】
TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】

在复杂业务逻辑中,事务嵌套的回滚问题一直是ThinkPHP开发者容易踩的坑,尤其是TP6.0版本。先说核心结论:TP6.0并不支持真正意义上的嵌套事务。很多人以为调用两次Db::transaction()就能在内部自动管理回滚,实际上这只是一层“伪装”——内层事务的提交或回滚操作会被直接忽略,异常也

thinkphp排序怎么实现倒序排列 教程简单易懂
thinkphp排序怎么实现倒序排列 教程简单易懂

ThinkPHP 实现倒序排列,说穿了就是 order() 方法配合 desc 方向,一句话的事儿,根本不需要什么复杂的循环或额外逻辑。 来看看最直接的方式:用 order('字段名 desc') 搞定。这招的好处是数据库层直接干活,效率高,逻辑也清晰。比如你想让文章列表按照发布时间从新到旧排,那就

TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】
TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】

在企业系统逐渐转向统一身份认证的背景下,ThinkPHP 5.1 项目接入 LDAP 实现后台管理员统一认证,是不少团队正在推进的标准化改造。核心思路并不复杂——把框架默认基于数据库的账号校验逻辑彻底换掉,让登录请求直接交给企业 LDAP 目录服务来完成验证。说白了,不是简单改个密码字段,而是要重构

TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】
TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】

在基于TP5.1框架的项目开发中,通过全局配置Cookie的HTTP只读属性、手动设置特定Cookie、修改PHP配置文件强制会话Cookie启用HTTP只读属性,并结合跨站脚本攻击入口过滤,能够有效地防范跨站脚本攻击窃取Cookie,形成多层次纵深防御体系。

thinkphp排序如何按创建时间排序 配置指南
thinkphp排序如何按创建时间排序 配置指南

ThinkPHP中按创建时间排序可通过order()方法实现,支持固定排序、多字段组合及带GET参数的动态排序。分页时需传递query参数保持页码。按天聚合可使用orderRaw()配合DATE_FORMAT函数。对于数组数据,可用array_multisort或usort结合strtotime进行排序。时间格式需统一。

TP8.0 基于 JWT 实现单设备登录挤下线功能【单点登录】
TP8.0 基于 JWT 实现单设备登录挤下线功能【单点登录】

在ThinkPHP8.0中,通过Redis存储用户版本号实现JWT单设备登录强制挤下线机制。每次登录时递增版本号并写入JWT令牌,中间件校验版本一致性,若不一致则返回401状态码。登出或后台踢人时删除Redis键值,从而确保旧会话立即失效。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。