php+ajax实现答题总量数据的实时更新

背景:最近给我们学生处搭建了一个新生学生手册考试平台。平台使用人数差不多达到近5000余人。自由练习模块几乎是每时每刻都有人在做题。于是好奇心颇强的我就写了个答题总量数据的事实更新。做成之后的效果如下:http://newer.gailvlunpt.com/EntranceEducation/admin.php/Statis/sum

看着每时每刻都在增长的答题数据,心中未免不欣喜。

 

涉及到的技术:前台网页用javascipt+ajax每隔2秒钟请求后台服务器数据。后台接口是统计数据库答题总量。

此功能的实现,大量参考了

 

前端html+css+js代码

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <title></title>
  5     <style type="text/css">
  6         #container{background:black;min-width:600px;}.flip{margin:0 auto;width:500px;height:100px;color:yellow;padding-top:40px;}.price-div{font:12px tahoma,Arial,Verdana,sans-serif;}.price-div > div,.total-price > div{float:left;text-align:center;}.price-icon{background:dimgrey;width:25px;height:30px;line-height:30px;font-size:26px;font-weight:bold;float:left;margin-right:2px;}.price-div .number{background:dimgrey;width:32px;height:48px;line-height:48px;font-size:43px;font-weight:bold;overflow:hidden;margin-right:1px;}.price-div .sign{font-size:40px;font-weight:bold;line-height:68px;height:48px;}
  7     </style>
  8 </head>
  9 <body>
 10     <div id="container">
 11     <div class="flip" style="width: 800px;">
 12         <!-- <div>浙江工商大学新生始业平台答题数据实时统计</div> -->
 13         <div class="price-div">
 14           <div class="comma sign" style="line-height: 42px;">新生始业平台答题总计</div>
 15           <div class="h-k number"></div>
 16           <div class="t-k number"></div>
 17           <div class="comma sign">,</div>
 18           <div class="k number"></div>
 19           <div class="h number"></div>
 20           <div class="t number"></div>
 21           <div class="comma sign">,</div>
 22           <div class="single number"></div>
 23           <div class="t-d number"></div>
 24           <div class="h-d number"></div>
 25           <div class="comma sign" style="line-height: 42px;"></div>
 26         </div>
 27       </div>
 28     </div>
 29   <a href="{:U('index')}" target="_blank">实时统计每分钟的做题数据</a>
 30 
 31 
 32 
 33     <!-- 推荐开源CDN来选取需引用的外部JS //-->
 34     <script type="text/javascript" src="http://cdn.gbtags.com/jquery/1.11.1/jquery.min.js"></script>
 35 
 36 </body>
 37 </html>
 38 
 39 <script type="text/javascript">
 40     //乘法函数  
 41 function accMul(arg1, arg2) {  
 42     var m = 0, s1 = arg1.toString(), s2 = arg2.toString();  
 43     try {  
 44         m += s1.split(".")[1].length;  
 45     }  
 46     catch (e) {  
 47     }  
 48     try {  
 49         m += s2.split(".")[1].length;  
 50     }  
 51     catch (e) {  
 52     }  
 53     return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);  
 54 }   
 55 
 56 //给Number类型增加一个mul方法,使用时直接用 .mul 即可完成计算。   
 57 Number.prototype.mul = function (arg) {  
 58     return accMul(arg, this);  
 59 };   
 60 
 61 //除法函数  
 62 function accDiv(arg1, arg2) {  
 63     var t1 = 0, t2 = 0, r1, r2;  
 64     try {  
 65         t1 = arg1.toString().split(".")[1].length;  
 66     }  
 67     catch (e) {  
 68     }  
 69     try {  
 70         t2 = arg2.toString().split(".")[1].length;  
 71     }  
 72     catch (e) {  
 73     }  
 74     with (Math) {  
 75         r1 = Number(arg1.toString().replace(".", ""));  
 76         r2 = Number(arg2.toString().replace(".", ""));  
 77         return (r1 / r2) * pow(10, t2 - t1);  
 78     }  
 79 }   
 80 //给Number类型增加一个div方法,,使用时直接用 .div 即可完成计算。   
 81 Number.prototype.div = function (arg) {  
 82     return accDiv(this, arg);  
 83 };
 84 function accAdd(arg1, arg2) {  
 85     var r1, r2, m;  
 86     try {  
 87         r1 = arg1.toString().split(".")[1].length;  
 88     }  
 89     catch (e) {  
 90         r1 = 0;  
 91     }  
 92     try {  
 93         r2 = arg2.toString().split(".")[1].length;  
 94     }  
 95     catch (e) {  
 96         r2 = 0;  
 97     }  
 98     m = Math.pow(10, Math.max(r1, r2));  
 99     return (arg1.mul(m) + arg2.mul(m)).div(m);  
100 }   
101 
102 //给Number类型增加一个add方法,,使用时直接用 .add 即可完成计算。   
103 Number.prototype.add = function (arg) {  
104     return accAdd(arg, this);  
105 };  
106 
107   
108 //减法函数  
109 function Subtr(arg1, arg2) {  
110     var r1, r2, m, n;  
111     try {  
112         r1 = arg1.toString().split(".")[1].length;  
113     }  
114     catch (e) {  
115         r1 = 0;  
116     }  
117     try {  
118         r2 = arg2.toString().split(".")[1].length;  
119     }  
120     catch (e) {  
121         r2 = 0;  
122     }  
123     m = Math.pow(10, Math.max(r1, r2));  
124      //last modify by deeka  
125      //动态控制精度长度  
126     n = (r1 >= r2) ? r1 : r2;  
127     return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n));  
128 }  
129   
130 //给Number类型增加一个add方法,,使用时直接用 .sub 即可完成计算。   
131 Number.prototype.sub = function (arg) {  
132     return Subtr(this, arg);  
133 };
134 
135 var $hk = $(".h-k"); // Ê®Íò
136 var $tk = $(".t-k"); // Íò
137 var $k = $(".k"); // ǧ
138 var $h = $(".h"); // °Ù
139 var $t = $(".t"); // Ê®
140 var $single = $(".single"); // ¸ö
141 var $td = $(".t-d"); // Ê®·Öλ
142 var $hd = $(".h-d"); // °Ù·Öλ
143 var $comma = $(".comma.sign");
144 var $dot = $(".dot.sign");
145 var $bigMap = $(".big-map");
146 
147 var data = {
148   numbers: ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"],
149   targetClass: {
150     "hk": $hk,
151     "tk": $tk,
152     "k": $k,
153     "h": $h,
154     "t": $t,
155     "single": $single,
156     "td": $td,
157     "hd": $hd
158   },
159   zero: {
160     hk: 0,
161     tk: 0,
162     k: 0,
163     h: 0,
164     t: 0,
165     single: 0,
166     td: 0,
167     hd: 0
168   },
169   numbersTmp: ""
170 };
171 
172 (function (){
173   function numberDiv(num){
174     return "<div class='" + data.numbers[num] + "'>" + num + "</div>";
175   }
176   
177   for(var i = 0; i < 10; i ++) {
178     data.numbersTmp += numberDiv(i);
179   }
180   
181   $(".price-div .number").append("<div class='numbers-view'>" + data.numbersTmp + "</div>");
182 })();
183 
184 function priceToObj(price){
185   if(price == 0) {
186     return data.zero;
187   }
188   var obj = {};
189   obj.hd = parseInt((price.mul(100)) % 10);
190   obj.td = parseInt((price.mul(10)) % 10);
191   obj.single = parseInt(price % 10);
192   obj.t = parseInt((price.div(10)) % 10);
193   obj.h = parseInt((price.div(100)) % 10);
194   obj.k = parseInt((price.div(1000)) % 10);
195   obj.tk = parseInt((price.div(10000)) % 10);
196   obj.hk = parseInt((price.div(100000)) % 10);
197   return obj;
198 }
199 
200 function objToPrice(obj) {
201   return obj.hk.mul(100000).add(obj.tk.mul(10000))
202       .add(obj.k.mul(1000)).add(obj.h.mul(100))
203       .add(obj.t.mul(10)).add(obj.single)
204       .add(obj.td.div(10)).add(obj.hd.div(100));
205 }
206 
207 function animateQueue(){
208   locking = false;
209   if(eventQueue.length > 0) {
210     eventQueue.shift()();
211   }
212 }
213 
214 $.fn.extend({
215   scrollToNumber: function(num, pos){
216     var $this = $(this);
217     var target = data.numbers[num];
218 
219     $this.find(".numbers-view").stop(true, true);
220 
221     var top = num * $this.find(".zero").height();
222     var currentTop = -parseFloat($this.find(".numbers-view").css("marginTop").split("px")[0]);
223     
224     if(top == currentTop) {
225       return;
226     } else if(currentTop < top) {
227       $this.find(".numbers-view").animate({marginTop: -top}, 1500, "swing");
228     } else {
229       $this.find(".numbers-view").append($(data.numbersTmp).addClass("temp"));
230       top = $this.find("." + target + ".temp").offset().top - $this.find(".numbers-view").offset().top;
231       
232       $this.find(".numbers-view").animate({marginTop: -top}, 1500, "swing", function(){
233         if($this.find(".zero").size() > 1) {
234           var top = $this.find("." + target + ":not(.temp)").first().offset().top - $this.find(".numbers-view").offset().top;
235           $this.find(".numbers-view").css({marginTop: -top});
236           $this.find(".numbers-view .temp").remove();
237         }
238       });
239     }
240   }
241 })
242 
243 $.animateToPrice = function(price){
244   var obj = priceToObj(price);
245   
246   $.each(obj, function(key, value){
247     data.targetClass[key].scrollToNumber(value, key);
248   });
249 };
250 
251 
252 
253 url = "{:U('Statis/getSum')}";
254 
255 $.get(url).done(function (data) {
256 
257     $.animateToPrice(data/100);
258 
259 });
260 
261 setInterval(function () {
262     $.get(url).done(function (data) {
263         $.animateToPrice(data/100);
264     });
265 
266 }, 2000);  //每2秒统计一次
267 </script>

 

 

后台php代码

1  public function getSum() {
2 
3         $sum = D('Exercise')->count();
4 
5         $this->ajaxReturn($sum);
6     }

 

转载于:https://www.cnblogs.com/hello-lijj/p/7874758.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机竞赛 '转发时请保留此声明信息,这段声明不并会影响你的速度! '*************************计算机竞赛******************* ' '作者tww(qq:43637507)、lyl '网站:http:// '电子邮件:43637507@qq.com 'WEB开发群:4531488 'QQ:43637507 '版权声明:版权所有,源代码公开,各种用途均可免费使用,但是修改后必须把修改后的文件 '发送一份给作者.并且保留作者此版权信息 '****************************************************************************** 更新: 2008-8-21 完成计算机竞赛程序框架 2008-8-22 修改竞赛规则,使文字录入不能粘贴,增加注册验证 修改录入分计算程序,增加笑话, 随机抽题程序采用首记录随机顺序取题 2008-8-23 增加竞赛个人心情下拉框 2008-8-24 修改随机抽题程序计算方法为任意抽取 修改顶部下拉框显示, 2008-8-25 去除随机英文句子、笑话、心情下拉框,增加用户查分、管理员查分, 将顶部文字调大,文字录入题放到最后, 修改提交答案程序,提交答案后先让用户确认,用户确定提交答案后不显示答案信息结束比赛 修改得分>0且<1时显示 修改退出比赛、结束比赛、提交等程序逻辑 2008-8-28 修改查分程序,增加管理功能 2008-9-3 修改界面颜色为蓝色天空 2008-9-4 修改录入题不输入时提交出错的问题,增加顶部图片 2008-9-5 完善计算机竞赛管理程序 计算机竞赛规则 总时间1小时,定时器倒记时,结束前15分钟提醒。题型包括文字录入题(20分),选择题(30题,每题2分),判断题(20题,每题1分),总分100 评分标准:用户提交答案后,由系统自动评分。文字录入题按文字录入数量判定基础分,再扣除错误文字的分(每错1字扣0.1分),如果扣除分大于基础分,则文字录入不得分。选择题和判断题根据标准答案,选择题做正确1题得2分,判断题做正确1题得1分。 文字录入题相同,选择题从选择题库中随机抽取30题,选择题答案大小写均可(输入A、B、C、D或a、b、c、d)判断题从判断题库中随机抽取20题,判断题答案大小写均可(正确则输入A或a,错误则输入B或b) 进入比赛界面后,点左上角“开始比赛”按钮正式进入比赛。 如果你感觉状态不佳想重新进行比赛,点左上角“退出比赛”按钮回到登录页面重新登录。注意当提交答案后,点"退出比赛",该用户不能再次登录,因为该用户已经结束比赛。 用户登录后不允许刷新页面,否则会自动退出比赛界面,然后需要重新登录才能进来。 所有题目在比赛界面显示,用户做完题目后,点提交按钮即可。当完成答题后,在比赛页面顶部左上角或提交按钮处可以看到得分,做错的题目后面会红字显示“错误”。 用户提交答案后,不能继续进行下一次竞赛答题,即只能进行一次竞赛答题,系统自动记录。
<h3>回答1:</h3><br/>PHP、MySQL和Ajax可以一起使用来实现留言管理系统。PHP用于处理服务器端的逻辑,MySQL用于存储数据,而Ajax则可以实现异步请求和响应,使得用户可以在不刷新页面的情况下进行留言操作。 具体实现步骤如下: 1. 创建数据库表格,包括留言ID、留言内容、留言时间、留言人等字段。 2. 使用PHP连接MySQL数据库,并编写相应的增删改查操作。 3. 在前端页面中使用Ajax发送异步请求,将用户输入的留言内容发送到服务器端。 4. 服务器端接收到请求后,将留言内容插入到数据库中,并返回插入成功的信息。 5. 前端页面接收到服务器端返回的信息后,更新页面上的留言列表,显示最新的留言内容。 6. 可以添加一些额外的功能,如留言的编辑、删除、分页等。 通过以上步骤,就可以实现一个简单的留言管理系统。 <h3>回答2:</h3><br/>在网站开发中,留言管理是一个常见的需求。PHP和MySQL是两个常用的技术,而AJAX则可以提高用户体验。下面将介绍如何使用这三种技术实现留言管理。 1. 创建数据库 首先需要创建一个数据库,可以使用phpMyAdmin等工具。创建一个名为“guestbook”的数据库,其中包含一个“message”表,该表包含以下字段:id(int,主键),name(varchar),message(varchar),timestamp(datetime)。 2. 编写PHP脚本 建立一个名为“index.php”的文件。首先,需要连接到数据库,然后在页面顶部输出留言表单,并接收用户输入的姓名和留言内容。 然后,需要编写插入留言的PHP脚本,将用户输入的数据插入到数据库的“message”表中。还需要编写从数据库中检索留言并显示在页面上的PHP脚本。此外,还需要编写删除留言的PHP脚本。 3. 使用AJAX实现页面无刷新 为了提高用户体验,可以使用AJAX使留言的插入、删除和显示不需要刷新整个页面。 在页面中添加相应的JavaScript代码来监听表单提交、删除和显示留言的事件。当表单提交时,JavaScript代码使用AJAX数据发送到后端的PHP脚本进行处理。相应地,当用户删除留言时,JavaScript代码也会触发AJAX请求查询数据库进行删除。 4. 输出留言 最后,在页面中输出从数据库查询出的留言信息。留言通常按时间顺序显示,最新的留言显示在最上面。 使用HTML和CSS设计留言的显示样式,如留言框、姓名、留言内容和时间戳等。在显示留言时,还可以添加分页、筛选和搜索功能。 以上就是使用PHP、MySQL和AJAX实现留言管理的过程。通过这种方式,可以有效地记录用户的留言信息,并提高用户体验。 <h3>回答3:</h3><br/>为了实现留言管理,我们可以使用php、mysql和ajax技术来完成。下面将介绍具体的步骤: 1. 创建数据库 首先需要创建一个数据库,可以在phpMyAdmin中通过SQL语句进行创建。我们可以在数据库中创建一个表,名称为messages,包含id(主键)、name、email、content、created_time等字段。 2. 编写PHP脚本 接下来,我们需要编写PHP脚本来连接数据库,并处理留言的数据。可以使用PDO来连接数据库,并使用预处理语句来处理查询、插入、更新等操作。对于查询留言列表,可以使用SELECT语句;对于添加新留言,可以使用INSERT语句。在处理数据后,需要将结果以JSON格式返回给前端。 3. 编写AJAX脚本 在前端页面中使用AJAX来请求数据,并通过DOM操作将数据展示给用户。可以使用jQuery框架来简化AJAX的操作,并使用模板引擎来渲染页面。 4. 实现留言板功能 在页面中添加一个留言表单,通过AJAX将表单提交到PHP脚本中,后台进行数据处理,再通过AJAX将处理结果返回到前端更新留言列表。 通过以上步骤,我们可以实现一个简单的留言管理系统。当然,还可以对其进行扩展,比如增加留言审核功能、分页功能等。总之,PHP、MySQL和AJAX等技术的运用,使得我们可以方便地实现各种Web应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值