在Laravel框架中实现测验答题时长限制功能的相关咨询
结论
你需要额外新增timestamp类型的字段,但不建议加在quiz表中,应该加在「用户答题参与记录表」(比如命名为user_quiz_attempts)中。
原因说明
你目前纯前端实现的JS计时只具备给用户展示倒计时的作用,完全不具备校验效力:用户可以通过修改本地系统时间、禁用JS、控制台篡改定时器参数、刷新页面等方式直接绕过超时限制,甚至可以手动构造请求提交答案,计时规则会彻底失效。
quiz表的duration字段存的是这套测验的固定时长,属于公共配置,而每个用户开始答题的时间是独立的,所以需要额外存储每个用户的答题开始时间,才能做后端的超时校验:
- 新增的timestamp字段建议命名为
start_at,存在用户答题参与记录表中,用户点击「开始答题」时,直接取服务端当前时间写入该字段,不要接收前端传的时间参数,避免篡改。 - 用户提交答案时,后端直接计算:
当前服务端时间 - start_at得到实际答题耗时,和quiz表的duration(换算为毫秒/秒单位后)对比,如果耗时超过duration,直接判定超时,拒绝接受答案提交。 - 哪怕用户绕开了前端的超时自动跳转逻辑,提交请求时也会被后端拦截,保证计时规则生效。
现有前端代码优化建议
你当前的代码存在刷新页面后倒计时重置的问题,可以配合后端存储的start_at做优化:
用户刷新页面重新进入答题页时,后端先根据start_at和duration计算出剩余答题时长,再传给前端初始化倒计时,避免用户通过刷新页面重置计时。
内容的提问来源于stack exchange,提问作者kxh
相关产品推荐
相关产品推荐

