活动 11 月 10 日 24 点结束,页面按钮已经置灰,接口照样能提交,12 日对账发现又多出 37 条报名,名单已经交给场地了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,截止判断只写在前端,按钮禁用是唯一防线,接口拿到请求就直接入库。有人用旧页面或者直接调接口,绕过了这一层。
「活动结束校验」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
if (now() > activity.ends_at) {
return response()->json(['error' => '活动已结束'], 410);
}
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,提交接口里按活动 ID 查一次结束时间,超过就返回 410 并带上结束提示;数据库层加一个检查约束,截止后写入直接拒绝;用 curl 在结束时间之后提交一次,确认返回 410 而不是 200。
最后用这个标准收尾,活动结束后再提交返回 410,报名表条数不再增加。
