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     }
时间: 2024-10-18 04:18:44

php+ajax实现答题总量数据的实时更新的相关文章

AJAX制作JSON格式的局部实时更新数据的方法

废话不多,上代码,前台: 主要使用了死循环一秒钟读取JS一次去刷新页面(递归的思想)单独对ShowData这个DIV的数据进行刷新 ,个人觉得还是需要优化的.请大神指点 <script type="text/javascript"> $(function () { var i = 0; function setTimeOutPost() { $.ajax({ type: "post", url: "/UserControl/DoData.ash

angular2 获取到的数据无法实时更新的问题

在修改完组件数据之后调用下面两句: this.changeDetectorRef.markForCheck(); this.changeDetectorRef.detectChanges(); 注入到构造函数 constructor( private changeDetectorRef:ChangeDetectorRef ){} 原文地址:https://www.cnblogs.com/eleven24/p/8361857.html

通过Flink实现个推海量消息数据的实时统计

背景 消息报表主要用于统计消息任务的下发情况.比如,单条推送消息下发APP用户总量有多少,成功推送到手机的数量有多少,又有多少APP用户点击了弹窗通知并打开APP等.通过消息报表,我们可以很直观地看到消息推送的流转情况.消息下发到达成功率.用户对消息的点击情况等. 个推在提供消息推送服务时,为了更好地了解每天的推送情况,会从不同的维度进行数据统计,生成消息报表.个推每天下发的消息推送数巨大,可以达到数百亿级别,原本我们采用的离线统计系统已不能满足业务需求.随着业务能力的不断提升,我们选择了Fli

AJAX+REA实现前后台数据交互的加密解密

AJAX+REA实现前后台数据交互的加密解密 1.创建js文件Encryption.js /**  * 加密解密  */ /** RSA加密用 生成key */ function bodyRSA(){ /** 1024位的key参数写130,2014位的key参数写260 */ setMaxDigits(130); /** ajax 调用后台方法,取回公钥 */ var keyR ;     $.ajax({      url: "/GHGL/Key/pk",//请求后台的url,本例

Java语言实现通过Ajax抓取后台数据及图片

1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计 create table picture( pic_id number not null, pic_name varchar(200)not null, pic_url varchar2(200) not null, pic_descp varchar2(200) not null, pic_price varchar2(200) not null ) insert into picture values(1 ,'小米5s

ajax请求获取的数据无法赋值给全局变量问题总结

一.总结: 1.问题描述: 今天做项目遇到在用表单显示详细信息的过程中ajax请求获取的数据无法赋值给全局变量的情况,从列表页面进入详情页,在详情页面被渲染了之后就会调用js文件里的接口向服务器请求数据,除了详情页面被加载之后需要向服务器发送ajax请求,在详情页面还有几个表单控件的属性需要去请求服务器获取实际项目中要求要显示的数据. 如下代码,直接在ajax请求中改变表单控件的值,避开了给全局变量赋值. 给全局变量赋值的解决办法,给ajax请求设置async为false,表示请求为同步请求:

使用Flume进行数据的实时收集处理

在已经成功安装Flume的基础上,本文将总结使用Flume进行数据的实时收集处理,具体步骤如下: 第一步,在$FLUME_HOME/conf目录下,编写Flume的配置文件,命名为flume_first_conf,具体内容如下: #agent1表示代理名称 agent1.sources=source1 agent1.sinks=sink1 agent1.channels=channel1 #Spooling Directory是监控指定文件夹中新文件的变化,一旦新文件出现,就解析该文件内容,然后

rsync+inotify 实现数据的实时备份

我这个人写一些东西难免要发一番感慨,今天做rsync+inotify实现实时备份,做了好长时间没做出来,这段时间我看了好多博文还有一些视频,但自己做的时候还是没做出来,非常郁闷,就拿起书慢慢的看起来,最终我把思路整理好,又重新试验了一遍终于成功了.是的,你百分之九十的时间在实践,而剩下百分之十的时间才能到达成功,坚持加再看一遍很重要. 我先整理一下大致思路,如有时间,我再整理完整的文档出来. 1.先在两台主机里面安装rsync. 2.在服务节点上配置rsync. 3.在内容发布节点上安装inot

jquery 或ajax返回的中文数据总是乱码解决方案

要将Servlet中的 response.setContentType("text/html;charset=utf-8")这行代码放在 PrintWriter out = response.getWriter()之前. jquery 或ajax返回的中文数据总是乱码解决方案,布布扣,bubuko.com