开发日常小结(14):项目小功能:实现倒计时功能(js实现),基于java数据传递

2018年5月13日17:26:50

【1】前言

运营部姐姐发来一个留言:加个倒计时吧,这样看着舒服。然后,我就开始重新看模块的相关代码了(了解数据流的传递过程,是非常重要的)。经过努力,还是解决了这个问题,如下图所示:



【2】原理

开发必须注重效率,因此要明确需求:

1)假如查询的玩家没有封号,那就不需要倒计时了;

2)假如查询的玩家被封号了,那就要获取封禁开始时间、封禁所需时间和当前时间了,然后就是js的特效展示;

3)做了倒计时功能还不算结束,因为还要考虑到如下3个问题:

    3.1 倒计时正常结束时,需要自动解封功能的;

    3.2 倒计时还没结束,运营部姐姐点击了解封(强制结束禁封状态),那就需要对倒计时做些动作了;

    3.3 倒计时有了,假如新开了一个标签页,然后对玩家操作,会不会有并发风险??


【3】后端的数据获取(当前倒计时的初值)

忽略掉数据库和企业框架,下面是一段java代码:

	//玩家的是否被封禁的信息
	BlackWhiteListInfo blackWhiteListInfo = blackWhiteListData.getBlackRoleInfo(roleId);
	if(null != blackWhiteListInfo && blackWhiteListInfo.getIsBlockNow()){
		json.element("isBlockNow", true);
		//int leftHours = (int)(blackWhiteListInfo.getExpireTime() - (System.currentTimeMillis() - blackWhiteListInfo.getBlockTime().getTime())/60/60/1000);
		long leftSeconds = (long)(blackWhiteListInfo.getExpireTime()*3600 - (System.currentTimeMillis() - blackWhiteListInfo.getBlockTime().getTime())/1000);
		json.element("leftAccountReleaseHour", leftSeconds/3600);
		json.element("leftAccountReleaseMinute", (leftSeconds%3600)/60);
		json.element("leftAccountReleaseSecond", (leftSeconds%3600)%60);
		json.element("expireTime", blackWhiteListInfo.getExpireTime());
	}else{
		json.element("isBlockNow", false);
		json.element("leftAccountReleaseTime", 0);
		json.element("expireTime", -1);
	}

这里使用了json封装好 leftAccountReleaseHour、leftAccountReleaseMinute、leftAccountReleaseSecond;然后通过request请求,发送给前端页面,这里不做过多讲解;


【4】js实现页面倒计时

大部分的jsp页面获取值,都是用json,这里也不例外;下面是倒计时的相关代码:

1. 

				<div id="unBlockAccount" class="form-horizontal" id="unBlockAccount">
					<label class="text text-center center-block" id="accountDesc">
							距离自动解封时间还有4小时
					</label>
					<button id="unBlockAccountBtn" type="submit" class="btn btn-primary center-block">解封</button>
				</div>

2.

	<script type="text/javascript">
		//开启全局定时器
		var hour = -1;//倒计时
		var minute = -1;
		var second = -1; 
		var state = -1; //0:禁封状态;1:解禁状态或永久禁封
		var intDiff = parseInt(60);
		var timer = window.setInterval(function(){
			if(state == 0){
			    if(intDiff > 0){ //禁封状态
			    	if(second == 0){
			    		if(minute > 0){
				    		second = 60;
				    		minute --;
			    		}else if(minute == 0){
			    			if(hour > 0){
					    		second = 60;
			    				minute = 59;
				    			hour --;
				    		}else if(hour == 0){
				    			//alert("自动解封!!");
		    					state = 1;
			    				$("#unBlockAccountBtn").click();
			    				$("#search-btn").click();
			    			}
			    		}
			    	}
			    	second--;
				    //console.log("test "+hour+":"+minute+":"+second+" state: "+state);
					$("#accountDesc").html("距离自动解封时间还有"+hour+" 小时 "+minute+" 分钟 "+second+" 秒 ");
			    }else if(intDiff == 0){
			    	intDiff = 60;
			    }
			    intDiff--;	
			}
	    }, 1000);
</script>

3.

				$("#forbiddenCount").html("历史被封次数: "+data.forbiddenCount+"次");
	  	 		//判断玩家是已封号还是未被封号
				if(data.isBlockNow){
					//已经被封号
					$("#blockAccount").hide();
					$("#unBlockAccount").show();
					if(data.expireTime == -1){
						$("#accountDesc").html("此账号永久封号,可手动解封");
					}else{
						hour  = data.leftAccountReleaseHour;
						minute = data.leftAccountReleaseMinute;
						second = data.leftAccountReleaseSecond;  
						state = 0;
					}
				}else{
					//未被封号
					$("#blockAccount").show();
					$("#unBlockAccount").hide();
				} 
					

解释:

1、是页面布局控件;

2、倒计时使用的是:window.setInterval(),赋值给一个全局变量;

3、每当刷新页面时,获取json的值,赋值给全局变量(hour、minute和second),并设置状态位;这样每1000ms循环执行一次操作;然后实现倒计时的效果。

4、如果有解封,那么对state变量设置一下即可;定时器是不断地在跑的;


参考:《http://www.jq22.com/jquery-info327》


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值