zoukankan      html  css  js  c++  java
  • 前端加后端验证倒计时答题功能实现

    思路


      前端页面控制答题的开始,请求后台,后台记录开始的时间(发出请求的当前时间),再加上倒计时时间,得出结束时间。

      后端返回给前端剩余的时间,前端通过Jquery实现倒计时的动态效果。

      当倒计时结束,禁止答题,当用户刷新页面时,比较请求时间与结束时间,如果前者小于后者,答题继续,否则反之。

      其中,答题时间、开始时间、结束时间,均保存在内存中。

    实现(SpringMVC+Jquery)


    后端:

     1 /**
     2  * Copyright 2016 Zhengbin's Studio.
     3  * All right reserved.
     4  * 2016年6月3日 下午3:20:19
     5  */
     6 package zut.race.control.back;
     7 
     8 import java.util.Date;
     9 
    10 import javax.servlet.http.HttpServletRequest;
    11 
    12 import org.apache.log4j.Logger;
    13 import org.springframework.stereotype.Controller;
    14 import org.springframework.ui.ModelMap;
    15 import org.springframework.web.bind.annotation.RequestMapping;
    16 
    17 /**
    18  * @author zhengbinMac
    19  *
    20  */
    21 @Controller
    22 @RequestMapping("test")
    23 public class TestTimeController {
    24     private static final Logger logger = Logger.getLogger(TestTimeController.class);
    25     private static long beginTime = -1; // 毫秒
    26     private static long answerTime = 20 * 1000; // 毫秒
    27     private static long endTime = -1; // 毫秒
    28 
    29     /*
    30      * 1.裁判宣布开始答题 2.选手请求页面可以开始答题 3.选手中途关闭页面 4.倒计时结束,不可答题(前端加后端)
    31      */
    32     @RequestMapping("/begin")
    33     public String begin(HttpServletRequest request, ModelMap model) {
    34         // 裁判规定答题时间'answerTime'
    35         String tempTime = request.getParameter("answerTime");
    36         // 如果裁判没有规定答题时间,则为默认倒计时20秒
    37         if (tempTime != null) {
    38             answerTime = (Integer.parseInt(tempTime) + 2) * 1000; // 毫秒
    39         }
    40         // 记录裁判‘开始’的时间
    41         beginTime = new Date().getTime(); // 毫秒
    42         // 结束时间,开始时间加上答题时间
    43         endTime = beginTime + answerTime;
    44         return "redirect:/test/answer.do";
    45     }
    46 
    47     // 学生访问答题页面
    48     @RequestMapping("/answer")
    49     public String answer(ModelMap model) {
    50         // 判断学生当前请求的时间是否在结束时间内
    51         long nowTime = new Date().getTime();
    52         if (beginTime == -1) {
    53             model.addAttribute("message", "比赛未开始!");
    54             return "/index.jsp";
    55         }
    56         // 如果学生当前请求的时间大于结束时间,返回‘答题结束’,否则可以‘继续答题’
    57         if (nowTime >= endTime) {
    58             model.addAttribute("message", "答题结束!");
    59             logger.info("答题结束,当前时间:" + nowTime);
    60         } else {
    61             model.addAttribute("message", "请继续答题!");
    62             model.addAttribute("endTime", endTime - nowTime);
    63         }
    64         return "/index.jsp";
    65     }
    66 }

    前端:

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     3 <%
     4     response.setHeader("Cache-Control", "no-store");
     5     response.setHeader("Pragrma", "no-cache");
     6     response.setDateHeader("Expires", 0);
     7 %>
     8 <html xmlns="http://www.w3.org/1999/xhtml">
     9 <script type="text/javascript" src="<c:url value='/js/jquery.min.js'/>"></script>
    10 <script type="text/javascript">
    11     var a = 1001;
    12     $(function() {
    13         if ($("#endtime").val() != "") {
    14             a = $("#endtime").val();
    15         }
    16         fomtime();
    17     });
    18     //以毫秒为单位
    19     function fomtime() {
    20         if (a <= 1000) {
    21             console.log($("#message"));
    22             if ($("#message").text() == "请继续答题!") {
    23                 $("#message").text("答题结束!");
    24             }
    25             return;
    26         }
    27         a = a - 1000;
    28         var b = new Date();
    29         b.setTime(0);
    30         var c = new Date();
    31         c.setTime(a);
    32         var day1 = b.getDate(); //为方便调用,把天数、小时等单独定义
    33         var hours1 = b.getHours();
    34         var minu1 = b.getMinutes();
    35         var seco1 = b.getSeconds();
    36         var day2 = c.getDate();
    37         var hours2 = c.getHours();
    38         var minu2 = c.getMinutes();
    39         var seco2 = c.getSeconds();
    40         var day = day2 - day1;
    41         var hours = hours2 - hours1;
    42         var minu = minu2 - minu1;
    43         var seco = seco2 - seco1;
    44         document.getElementById('daya').innerHTML = day;
    45         document.getElementById('hoursa').innerHTML = hours;
    46         document.getElementById('minua').innerHTML = minu;
    47         document.getElementById('secoa').innerHTML = seco;
    48         setTimeout("fomtime()", 1000);
    49     }
    50 </script>
    51 <body>
    52     <input type="hidden" value="${endTime}" id="endtime" name="endtime" />
    53     <p style="color: red;" color="red" id="message">${message}</p>
    54     <form action="<c:url value='/test/begin.do'/>">
    55         <input type="text" name="answerTime"> <input type="submit"
    56             value="开始答题!">
    57     </form>
    58     <div>
    59         距答题结束还有: <span id='daya'></span>天 <span id='hoursa'></span>小时 <span
    60             id='minua'></span>分 <span id='secoa'></span>61     </div>
    62 
    63 </body>
    64 </html>

    *草草实现功能,代码不够优雅

  • 相关阅读:
    synchronized锁机制 之 代码块锁(转)
    执行mvn 报错 source-1.5 中不支持 diamond运算符
    Git常用命令及场景
    mysql数据库导入与导出
    Linux磁盘空间分析及清理(df、du、rm)
    IIs配置文件存放路径
    解决SQLite database is locked
    C#测试web服务是否可用
    Jquery easyui-combobox 的一个BUG
    iframe自适应方法
  • 原文地址:https://www.cnblogs.com/zhengbin/p/5557538.html
Copyright © 2011-2022 走看看