微信摇一摇统计次数微官网
发布时间:2017-07-07, 12:04:07 分类:PHP | 编辑 off 网址 | 辅助
图集1/5
正文 1850字数 1,320,336阅读
<?php
namespace Addons\Yaoyiyao\Controller;
use Home\Controller\AddonsController;
class YaoyiyaoController extends AddonsController{
var $model;
function _initialize() {
$this->model = $this->getModel ( 'yaoyiyao' );
parent::_initialize ();
$act = strtolower ( _ACTION );
$type = I ( 'type' );
$res ['title'] = '列表';
$res ['url'] = addons_url ( 'Yaoyiyao://Yaoyiyao/lists' );
$res ['class'] = $act == 'lists' || $type == 'text' ? 'current' : '';
$nav [] = $res;
$res ['title'] = '设置';
$res ['url'] = addons_url ( 'Yaoyiyao://Yaoyiyao/config' );
$res ['class'] = $act == 'config' || $type == 'config' ? 'current' : '';
$nav [] = $res;
$res ['title'] = '清零';
$res ['url'] = addons_url ( 'Yaoyiyao://Yaoyiyao/dc' );
$res ['class'] = $act == 'dc' || $type == 'dc' ? 'current' : '';
$nav [] = $res;
$this->assign ( 'nav', $nav );
}
public function dc() {
if($_GET['del']=='ok'){
$map['numm']=0;
$mapw['id']=array('gt',0);
M('yaoyiyao')->where($mapw)->save($map);
header('Location:/index.php?s=/addon/Yaoyiyao/Yaoyiyao/lists.html');
exit;
}
$templateFile = $this->model ['template_list'] ? $this->model ['template_list'] : '';
$this->display ( $templateFile );
}
// 通用插件的列表模型
public function lists() {
$map ['token'] = get_token ();
$list_data = $this->_get_model_list ( $this->model,0,'numm desc' );
foreach($list_data['list_data'] as &$lv){
$lk++;
if($_GET['p']<2) $_GET['p']=0;
$lkn=$lk+($_GET['p']*10);
$lv['user']=$lv['user'].' (第'.$lkn.'名)';
}
$this->assign ( $list_data );
$templateFile = $this->model ['template_list'] ? $this->model ['template_list'] : '';
$this->display ( $templateFile );
}
}
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 13 条评论 »
<extend name="Base/common" /> <block name="body"> <script src="/yaoyiyao/laydate/laydate.js"></script> <div class="span9 page_message"> <section id="contents"> <include file="Addons/_nav" /> <div class="tab-content has-weixinpreivew"> <form action="{:U('config')}" class="form-horizontal fl" method="post"> <empty name="custom_config"> <foreach name="data['config']" item="form" key="o_key"> <div class="form-item cf"> <label class="item-label"> {$form.title|default=''} <present name="form.tip"> <span class="check-tips">{$form.tip}</span> </present> </label> <switch name="form.type"> <case value="text"> <div class="controls"> <input id="cardName{$o_key}" type="text" name="config[{$o_key}]" class="text input-large" value="{$form.value}"> </div> </case> <case value="password"> <div class="controls"> <input type="password" name="config[{$o_key}]" class="text input-large" value="{$form.value}"> </div> </case> <case value="hidden"> <input type="hidden" name="config[{$o_key}]" id="hidden_{$o_key}" value="{$form.value}"> </case> <case value="radio"> <div class="controls"> <foreach name="form.options" item="opt" key="opt_k"> <label class="radio"> <input type="radio" name="config[{$o_key}]" value="{$opt_k}" <eq name="form.value" value="$opt_k"> checked</eq>>{$opt} </label> </foreach> </div> </case> <case value="checkbox"> <div class="controls"> <foreach name="form.options" item="opt" key="opt_k"> <label class="checkbox"> <php> is_null($form["value"]) && $form["value"] = array(); </php> <input type="checkbox" name="config[{$o_key}][]" value="{$opt_k}" <in name="opt_k" value="$form.value"> checked</in>>{$opt} </label> </foreach> </div> </case> <case value="select"> <div class="controls"> <select name="config[{$o_key}]" id="select_{$o_key}"> <foreach name="form.options" item="opt" key="opt_k"> <option value="{$opt_k}" <eq name="form.value" value="$opt_k"> selected</eq>>{$opt}</option> </foreach> </select> </div> <if condition="$o_key=='background'"> <!-- 自定义上传背景 --> <div class="controls uploadrow" id="uploadControls" style="display:none"> <input type="file" id="upload_picture_bg"> <input type="hidden" name="config[bg]" id="cover_id_bg"/> <div class="upload-img-box" rel='img'> <notempty name="data[bg]"> <div class="upload-pre-item"><img width="120" height="120" src="__ROOT__{$data[bg]|get_cover='path'}"/></div> </notempty> </div> </div> <script type="text/javascript"> //上传图片 /* 初始化上传插件 */ $("#upload_picture_bg").uploadify({ "height" : 120, "swf" : "__STATIC__/uploadify/uploadify.swf", "fileObjName" : "download", "buttonText" : "上传卡片图片", "uploader" : "{:U('home/File/uploadPicture',array('session_id'=>session_id()))}", "width" : 120, 'removeTimeout' : 1, 'fileTypeExts' : '*.jpg; *.png; *.gif;', "onUploadSuccess" : uploadPicturebg }); function uploadPicturebg(file, data){ var data = $.parseJSON(data); var src = ''; if(data.status){ $("#cover_id_bg").val(data.id); src = data.url || '__ROOT__' + data.path; $('#cardBg').attr("href",src); $('#cardBgImg').attr("src",src); $("#cover_id_bg").parent().find('.upload-img-box').html( '<div class="upload-pre-item"><img width="120" height="120" src="' + src + '"/></div>' ); } else { updateAlert(data.info); setTimeout(function(){ $('#top-alert').find('button').click(); $(that).removeClass('disabled').prop('disabled',false); },1500); } } </script> </if> </case> <case value="textarea"> <div class="controls"> <label class="textarea input-large"> <textarea name="config[{$o_key}]">{$form.value}</textarea> </label> </div> </case> </switch> </div> </foreach> <else /> <present name="custom_config"> {$custom_config} </present> </empty> <input type="hidden" name="id" value="{$data.id}" readonly> <button type="submit" class="btn submit-btn ajax-post" target-form="form-horizontal">确 定</button> </form> <!--<div class="card_preview fr"> <a id="cardBg" href="{:ADDON_PUBLIC_PATH}/card_bg_1.png" target="_blank"><img id="cardBgImg" src="{:ADDON_PUBLIC_PATH}/card_bg_1.png" width="100%" height="100%"></a> <span class="card_num" id="cardNumber">NO. 80001</span> <span class="card_name"></span> </div>--> </div> </section> </div> </block> <block name="script"> <script type="text/javascript" charset="utf-8"> //导航高亮 $('.side-sub-menu').find('a[href="{:U('Addons/index')}"]').closest('li').addClass('current'); if($('ul.tab-nav').length){ $('.btn-return').hide(); } $(function(){ showTab(); $('#select_background').change(function(){ if($(this).val()==11){ $('#uploadControls').show(); }else{ var cardBgUrl = '{:ADDON_PUBLIC_PATH}/card_bg_'+$(this).val()+".png"; $('#cardBg').attr("href",cardBgUrl); $('#cardBgImg').attr("src",cardBgUrl); $('#uploadControls').hide(); } }); $('#select_length').change(function(){ var val = 'NO. '+$(this).val(); $('#cardNumber').html(val); }); $('#cardName').keyup(function(){ $('.card_name').html($(this).val()); }) //初始化 $('.card_name').html($('#cardName').val()); $('#cardNumber').html('NO. '+$('#select_length').val()); if($('#select_background').val()==11){ $('#uploadControls').show(); var cardBgUrl = $("#hidden_background_custom").val(); }else{ var cardBgUrl = '{:ADDON_PUBLIC_PATH}/card_bg_'+$('#select_background').val()+".png"; } $('#cardBg').attr("href",cardBgUrl); $('#cardBgImg').attr("src",cardBgUrl); }) </script> <script> var start = { elem: '#cardNamestart', format: 'YYYY/MM/DD hh:mm:ss', /*min: laydate.now(), //设定最小日期为当前日期 max: '2099-06-16 23:59:59', //最大日期*/ istime: true, istoday: false, choose: function(datas){ end.min = datas; //开始日选好后,重置结束日的最小日期 end.start = datas //将结束日的初始值设定为开始日 } }; var end = { elem: '#cardNameend', format: 'YYYY/MM/DD hh:mm:ss', min: laydate.now(), max: '2099-06-16 23:59:59', istime: true, istoday: false, choose: function(datas){ start.max = datas; //结束日选好后,重置开始日的最大日期 } }; laydate(start); laydate(end); </script> </block>
<extend name="Base/common" /> <block name="body"> <include file="Addons/_nav" /> <button class="btn submit-btn ajax-post" style="margin-left: 9px;" onclick="location.href = '/index.php?s=/addon/Yaoyiyao/Yaoyiyao/dc/del/ok.html';">点击清零摇一摇次数(将不可恢复)</button> </block>
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0"> <title>摇一摇-蛙有道</title> <link rel="stylesheet" href="/yaoyiyao/css/shake.css"> <link rel="stylesheet" href="/yaoyiyao/css/myDialog.css"> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.min.js"></script> <!-- <script type="text/javascript" src="/js/jquery.min.js"></script> --> <script type="text/javascript" src="/yaoyiyao/js/howler.min.js"></script> <!--<script type="text/javascript" src="/yaoyiyao/js/fastclick.js"></script>--> <script type="text/javascript" src="/yaoyiyao/js/shake.js?9"></script> <!--<script type="text/javascript" src="/yaoyiyao/js/myDialog.js"></script>--> <style> *{padding:0px;margin:0px;font-size: 14px;} #maddd{ color: green;position: fixed; background: #babcc1; width: 90%; z-index: 999; bottom: 5%; left: 5%; /* text-align: center; */ border-radius: 12px;padding:12px 0;} #maddd p{padding:0 12px;}.red{color:red;} .sssfff{ font-weight: bold; color: #444;} body #maddd .ssjppp{border-bottom: 1px solid #b1b1b1; margin: 0 12px; padding: 0px; margin-bottom: 6px; padding-bottom: 6px;} #paiminnn{height: 120px; overflow-y: scroll; overflow-x: hidden;margin-right: 5%;} #paiminnn::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(255,255,255,0); background-color: #babcc1; } #paiminnn::-webkit-scrollbar { width:1px; background-color: #444; } #paiminnn::-webkit-scrollbar-thumb { background-color: #444; } .f12{font-size: 12px;} .w40{ width: 40px; display: inline-block;} .w100{width: 170px; display: inline-block;} .frr{ float: right;} .ccddd4{color:#444;} body #maddd .sss88{color: #969696; text-align: center; font-size: 12px; border-bottom: none; margin-top: 12px;} .c3{color:#333;} #ttoop{position: fixed; top: 0px; left: 0px; width: 100%; height: 60px; color: #444; font-size: 15px; /*font-weight: bolder;*/ background: #fff url(/Uploads/Picture/2017-06-16/5943571af1849.jpg); background-repeat: no-repeat; background-size: contain; text-align: right; line-height: 60px;} .ddiddd{ font-size: 12px; color: #7b7b7b; font-weight: normal;} </style> </head> <body> <table id="container"> <tbody> <tr> <td class="container" colspan="2"> <div id="shake"> <img src="/yaoyiyao/images/inner.png" class="inner"> <img src="/yaoyiyao/images/shake.png" class="shake_up" id="shakeup"> <img src="/yaoyiyao/images/shake.png" class="shake_down" id="shakedown"> </div> <div id="loading" class="loading"></div> </td> </tr> <!--<tr id="controlbar"> <td class="controlbar" onclick="javascript:shake();"> <img src="/yaoyiyao/images/sdy.png" width="40" height="53"><br>手动摇 </td> </tr>--> <tr id="cantshake" style="display:none"><td class="controlbar" colspan="2">对不起,您的手机无法支持摇一摇!</td></tr> </tbody> </table> <div id="maddd"> <p style="font-weight:bolder;"><span style="color:#c7348c;">{$nickname}</span> <span class="ddiddd">(ID:{$nummsss})</span></p> <p>累计摇一摇<span class="red">{$nummm}</span>次 <span class="frr">当前排名<span class="red">{$sssnumber}</span></span></p> <p style="margin: 12px;height:1px;background: #444;"></p> <div id="paiminnn"> <?php foreach($sssall as $k=>$v){ $k++; echo '<p class="ssjppp"><span class="sssfff w40">'.$k.'</span> <span class="w100 c3">'.$v['user'].'</span> <span class="f12 frr ccddd4"><span class="f12">'.$v['numm'].'</span>次</span></p>'; } ?> <p class="ssjppp sss88">没有了</p> </div> </div> <div id="ttoop"> <img src="/yaoyiyao/gift_box_64px_503984_easyicon.net.png" height="50%" style="vertical-align: middle;" />摇大奖 </div> <script> function puttt(n){ //console.log(n); var yaoyiyao_id='{$yaoyiyao_id}'; if(!n || !yaoyiyao_id) return false; $.ajax( { url:"/index.php?s=/addon/WeiSite/WeiSite/yaoyiyaoiner.html", type: "POST", data:"yaoyiyao_id="+yaoyiyao_id+"&nnumm="+n, //dataType: "json", //cache: false, //async: false, beforeSend: function(){ // Handle the beforeSend event }, success: function(data){ $('#maddd').html(data); } }); } </script> </body> </html>
//yaoyiyao function yaoyiyao(){ session('yaoyiyaotoken',null); $allinfo=getWeixinUserInfo(get_openid(),get_token()); //$allinfo=array('openid'=>'okKYm1QwHgKb_wGI222l262','nickname'=>'发大水法'); //dump($allinfo);exit; $mapw['oppid']=$allinfo['openid'];//get_openid(); //$sss=M('yaoyiyao')->where($mapw)->limit(1)->find(); $sssall=M('yaoyiyao')->order('numm desc')->select(); foreach($sssall as $sk=>$sv){ $sssnumbers++; if($sv['oppid']==$mapw['oppid']){ $sss[]=$sv; $sssnumber=$sssnumbers; } } $sss=$sss['0']; //dump($sss);exit; if(!$sss['id']){ $map['ctime']=time(); $map['user']=$allinfo['nickname'];; $map['numm']=0; $map['oppid']=$mapw['oppid']; $map['nummsss']=rand(10,99).date('is',time()).rand(100,999); $sss['id']=M('yaoyiyao')->where($mapw)->limit(1)->add($map); } if(!$sss['id']){ header('Location:/index.php?s=/addon/WeiSite/WeiSite/index.html'); exit; } session('yaoyiyaotoken', $value=$sss['id']); $this->assign('yaoyiyao_id',$sss['id']); $this->assign('sssall',$sssall); $nummsss=$map['nummsss']; if(!$map['nummsss']) $nummsss=$sss['nummsss']; $this->assign('nummsss',$nummsss); $this->assign('sssnumber',($sssnumber+0)); $this->assign('nickname',$allinfo['nickname']); $this->assign('nummm',($sss['numm']+0)); $configyaoyiyy=getAddonConfig('Yaoyiyao'); $this->assign('configyaoyiyy',$configyaoyiyy); //活动开始时间 $starttime=strtotime($configyaoyiyy['start']); //活动结束时间 $endndtime=strtotime($configyaoyiyy['end']); $timesss=time(); $yyhtmo='yaoyiyao'; //活动未开始 if($starttime>$timesss){ $yyhtmo='yaoyiyaonostart'; } //活动已经结束 if($endndtime<$timesss){ $yyhtmo='yaoyiyaonoend'; } if(!$configyaoyiyy['random']) $yyhtmo='yaoyiyaoclose'; //关闭 $this->display(ONETHINK_ADDON_PATH . 'WeiSite/View/default/TemplateIndex/' . $this->config ['template_index'] . '/'.$yyhtmo.'.html'); } //摇一摇录入 function yaoyiyaoiner(){ //session_start(); $mapw['id']=$_POST['yaoyiyao_id']; if(session('yaoyiyaotoken')!=$mapw['id']) exit(0);//验证是否摇一摇页面 //$map['ctime']=time(); //$mapw['user']='test'; $map['numm']=array('exp','numm+'.($_POST['nnumm']+0)); M('yaoyiyao')->where($mapw)->limit(1)->save($map); $sssall=M('yaoyiyao')->order('numm desc')->select(); foreach($sssall as $sk=>$sv){ $sssnumbers++; if($sv['id']==$mapw['id']){ $sss[]=$sv; $sssnumber=$sssnumbers; } } $sss=$sss['0']; $this->assign('sssnumber',($sssnumber+0)); $this->assign('nickname',$sss['user']); $this->assign('nummm',($sss['numm']+0)); $this->assign('nummsss',$sss['nummsss']); $this->assign('sssall',$sssall); $this->display(ONETHINK_ADDON_PATH . 'WeiSite/View/default/TemplateIndex/' . $this->config ['template_index'] . '/yaoyiyaosssall.html'); }
beforeSend: function(){ // Handle the beforeSend event }, success: function(data){ $('#maddd').html(data); }, error:function (data, status, e){ alert('服务器繁忙,请摇慢一点(-。-;)'); location.href = '/index.php?s=/addon/WeiSite/WeiSite/yaoyiyao.html'; }
//运动事件监听 if (window.DeviceMotionEvent) { window.addEventListener('devicemotion',deviceMotionHandler,false); } //获取加速度信息 //通过监听上一步获取到的x, y, z 值在一定时间范围内的变化率,进行设备是否有进行晃动的判断。 //而为了防止正常移动的误判,需要给该变化率设置一个合适的临界值。 var SHAKE_THRESHOLD = 4000; var last_update = 0; var x, y, z, last_x = 0, last_y = 0, last_z = 0; function deviceMotionHandler(eventData) { var acceleration =eventData.accelerationIncludingGravity; var curTime = new Date().getTime(); if ((curTime-last_update)> 10) { var diffTime = curTime -last_update; last_update = curTime; x = acceleration.x; y = acceleration.y; z = acceleration.z; var speed = Math.abs(x +y + z - last_x - last_y - last_z) / diffTime * 10000; if (speed > SHAKE_THRESHOLD) { alert("你中奖啦!"); // Do something } last_x = x; last_y = y; last_z = z; } }
if (window.DeviceMotionEvent) { window.addEventListener('devicemotion', deviceMotionHandler, false); } else { alert('本设备不支持devicemotion事件'); }
function yaoyiyao(){ session(null); //session('weiphp_home',null); //$_SESSION['weiphp_home']=null; //dump($_SESSION);exit; //session('yaoyiyaotoken',null);
ios 默认不能自动播放音频文件,需要监听一个事件 scroll 或 click 事件触发音频播放,音频格式并无关系。
howler.js这个插件
session(null);
//摇一摇部分 var SHAKE_THRESHOLD = 800;// 首先,定义一个摇动的阀值 var last_update = 0; var last_time = 0; var x; var y; var z; var last_x; var last_y; var last_z; var sound = new Howl({ urls: ['/yaoyiyao/sound/shake_sound.mp3'] }).load(); //var findsound = new Howl({ urls: ['/yaoyiyao/sound/shake_match.mp3'] }).load(); var curTime; var isShakeble = true; function init() { if (window.DeviceMotionEvent) { window.addEventListener('devicemotion', deviceMotionHandler, false); } else { //$("#cantshake").show(); alert('本设备不支持摇一摇!'); } } function deviceMotionHandler(eventData) { curTime = new Date().getTime(); var diffTime = curTime - last_update; if (diffTime > 100) { var acceleration = eventData.accelerationIncludingGravity; last_update = curTime; x = acceleration.x; y = acceleration.y; z = acceleration.z; var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000; if (speed > SHAKE_THRESHOLD && curTime - last_time > 500 && isShakeble) { // && $("#loading").attr('class') == "loading" window.clearTimeout(tmid); shake(); } last_x = x; last_y = y; last_z = z; } } var newnumm=0,tmid,ssfsdfsdf=0; function shake() { last_time = curTime; //$("#loading").attr('class','loading loading-show'); tmid=setTimeout(function(){ if(newnumm){ puttt(newnumm); newnumm=0; ssfsdfsdf++; $('#ssfsdfsdf').text(ssfsdfsdf); $("#shakeup").stop(true,true); $("#shakedown").stop(true,true); } //console.log(newnumm); },1600); newnumm++; $("#shakeup").animate({ top: "10%" }, 700, function () { $("#shakeup").animate({ top: "25%" }, 700, function () { //$("#loading").attr('class','loading'); //console.log(newnumm); //findsound.play(); /*myDialog.alert('恭喜你,中奖了');*/ }); }); sound.play(); $("#shakedown").animate({ top: "40%" }, 700, function () { $("#shakedown").animate({ top: "25%" }, 700, function () { }); }); } //各种初始化 $(document).ready(function () { Howler.iOSAutoEnable = false; //$('#container').trigger("click"); //document.getElementById("container").click(); //Howler.mobileAutoEnable = true; //FastClick.attach(document.body); init(); });
Document自带的方法: 循环执行:var timeid = window.setInterval(“方法名或方法”,“延时”);window.clearInterval(timeid); 定时执行:var tmid = window.setTimeout(“方法名或方法”, “延时”);window.clearTimeout(tmid);
1. 你是否尝试过对数组元素进行排序?
JavaScript默认使用字典序(alphanumeric)来排序。因此,[1,2,5,10].sort()的结果是[1, 10, 2, 5]。
如果你想正确的排序,应该这样做:
[1,2,5,10].sort((a, b) => a - b)
2. new Date() 十分好用
new Date()的使用方法有:
不接收任何参数:返回当前时间;
接收一个参数x: 返回1970年1月1日 + x毫秒的值。
new Date(1, 1, 1)返回1901年2月1号。
然而....,new Date(2016, 1, 1)不会在1900年的基础上加2016,而只是表示2016年。
3. 替换函数没有真的替换?
let s = "bob" const replaced = s.replace('b', 'l') replaced === "lob" // 只会替换掉第一个b s === "bob" // 并且s的值不会变
如果你想把所有的b都替换掉,要使用正则:
"bob".replace(/b/g, 'l') === 'lol'
4. 谨慎对待比较运算
// 这些可以 'abc' === 'abc' // true 1 === 1 // true // 然而这些不行 [1,2,3] === [1,2,3] // false {a: 1} === {a: 1} // false {} === {} // false
因为[1,2,3]和[1,2,3]是两个不同的数组,只是它们的元素碰巧相同。因此,不能简单的通过===来判断。
5. 数组不是基础类型
typeof {} === 'object' // true typeof 'a' === 'string' // true typeof 1 === number // true // 但是.... typeof [] === 'object' // true
如果要判断一个变量var是否是数组,你需要使用Array.isArray(var)。
6. 闭包
这是一个经典的JavaScript面试题:
const Greeters = [] for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) }) } Greeters[0]() // 10 Greeters[1]() // 10 Greeters[2]() // 10
虽然期望输出0,1,2,...,然而实际上却不会。知道如何Debug嘛?
有两种方法:
使用let而不是var。备注:可以参考Fundebug的另一篇博客ES6之"let"能替代"var"吗?
使用bind函数。备注:可以参考Fundebug的另一篇博客JavaScript初学者必看“this”
Greeters.push(console.log.bind(null, i))
当然,还有很多解法。这两种是我最喜欢的!
7. 关于bind
下面这段代码会输出什么结果?
class Foo { constructor (name) { this.name = name } greet () { console.log('hello, this is ', this.name) } someThingAsync () { return Promise.resolve() } asyncGreet () { this.someThingAsync() .then(this.greet) } } new Foo('dog').asyncGreet()
如果你说程序会崩溃,并且报错:Cannot read property 'name' of undefined。
因为第16行的geet没有在正确的环境下执行。当然,也有很多方法解决这个BUG!
我喜欢使用bind函数来解决问题:
asyncGreet () { this.someThingAsync() .then(this.greet.bind(this)) }
这样会确保greet会被Foo的实例调用,而不是局部的函数的this。
如果你想要greet永远不会绑定到错误的作用域,你可以在构造函数里面使用bind来绑 。
class Foo { constructor (name) { this.name = name this.greet = this.greet.bind(this) } }
你也可以使用箭头函数(=>)来防止作用域被修改。备注:可以参考Fundebug的另一篇博客JavaScript初学者必看“箭头函数”。
asyncGreet () { this.someThingAsync() .then(() => { this.greet() }) }
8. Math.min()比Math.max()大
Math.min() < Math.max() // false
因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。
原文: Who said javascript was easy ?
译者: Fundebug的全栈BUG监控
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0"> <title>摇一摇-蛙有道</title> <link rel="stylesheet" href="/yaoyiyao/css/shake.css"> <!--<link rel="stylesheet" href="/yaoyiyao/css/myDialog.css">--> <link rel="stylesheet" href="/yaoyiyao/font-awesome.css?1"> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.min.js"></script> <!-- <script type="text/javascript" src="/js/jquery.min.js"></script> --> <script type="text/javascript" src="/yaoyiyao/js/howler.min.js"></script> <!--<script type="text/javascript" src="/yaoyiyao/js/fastclick.js"></script>--> <script type="text/javascript" src="/yaoyiyao/js/shake.js?003"></script> <!--<script type="text/javascript" src="/yaoyiyao/js/myDialog.js"></script>--> <style> *{padding:0px;margin:0px;font-size: 14px;} #maddd{ color: green;position: fixed; background: #babcc1; width: 90%; z-index: 999; bottom: 5%; left: 5%; /* text-align: center; */ border-radius: 12px;padding:12px 0;} #maddd p{padding:0 12px;}.red{color:red;} .sssfff{ font-weight: bold; color: #444;} body #maddd .ssjppp{border-bottom: 1px solid #b1b1b1; margin: 0 12px; padding: 0px; margin-bottom: 6px; padding-bottom: 6px;} #paiminnn{height: 120px; overflow-y: scroll; overflow-x: hidden;margin-right: 5%;} #paiminnn::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(255,255,255,0); background-color: #babcc1; } #paiminnn::-webkit-scrollbar { width:1px; background-color: #444; } #paiminnn::-webkit-scrollbar-thumb { background-color: #444; } .f12{font-size: 12px;} .w40{ width: 40px; display: inline-block;} .w100{width: 170px; display: inline-block;} .frr{ float: right;} .ccddd4{color:#444;} body #maddd .sss88{color: #969696; text-align: center; font-size: 12px; border-bottom: none; margin-top: 12px;padding-bottom:0px;margin-bottom:0px;} .c3{color:#333;} #ttoop{position: fixed; top: 0px; left: 0px; width: 100%; height: 60px; color: #444; font-size: 15px; /*font-weight: bolder;*/ background: #fff url(/Uploads/Picture/2017-06-16/5943571af1849.jpg); background-repeat: no-repeat; background-size: contain; text-align: right; line-height: 60px;} .ddiddd{ font-size: 12px; color: #7b7b7b; font-weight: normal;} #loading{z-index: 9999;} </style> </head> <body> <table id="container"> <tbody> <tr> <td class="container" colspan="2"> <div id="shake"> <img src="/yaoyiyao/images/inner.png" class="inner"> <img src="/yaoyiyao/images/shake.png" class="shake_up" id="shakeup"> <img src="/yaoyiyao/images/shake.png" class="shake_down" id="shakedown"> </div> <div id="loading" class="loading"></div> </td> </tr> <!--<tr id="controlbar"> <td class="controlbar" onclick="javascript:shake();"> <img src="/yaoyiyao/images/sdy.png" width="40" height="53"><br>手动摇 </td> </tr> <tr id="cantshake" style="display:none"><td class="controlbar" colspan="2">对不起,您的手机无法支持摇一摇!</td></tr>--> </tbody> </table> <div id="maddd"> <p style="font-weight:bolder;"><i class="fa fa-weixin"></i> <span style="color:#c7348c;">{$nickname}</span> <span class="ddiddd">(ID:{$nummsss})</span></p> <p><i class="fa fa-bar-chart-o"></i> 累计摇一摇<span class="red">{$nummm}</span>次 <span class="frr"><i class="fa fa-clock-o"></i> 当前排名<span class="red">{$sssnumber}</span></span></p> <p style="margin: 12px;height:1px;background: #444;"></p> <div id="paiminnn"> <?php foreach($sssall as $k=>$v){ $k++; echo '<p class="ssjppp">'; if($k==1) echo '<i class="fa fa-flag"></i> '; if($k==2) echo '<i class="fa fa-flag-checkered"></i> '; if($k==3) echo '<i class="fa fa-flag-o"></i> '; if($k>3) echo '<i class="fa fa-comments-o ccddd4"></i> '; echo '<span class="sssfff w40">'.$k.'</span> <span class="w100 c3">'.$v['user'].'</span> <span class="f12 frr ccddd4"><span class="f12">'.$v['numm'].'</span>次</span></p>'; } ?> <p class="ssjppp sss88">没有了</p> </div> </div> <div id="ttoop"><span id="ssfsdfsdf"></span> <img src="/yaoyiyao/gift_box_64px_503984_easyicon.net.png" height="50%" style="vertical-align: middle;" />摇大奖 </div> <script> //alert('欢迎你:{$nickname},摇一摇次数最多者将赢得精美礼品!'); //shake(); if(!localStorage.lastnamenn) localStorage.lastnamenn=0; else puttt(localStorage.lastnamenn); function puttt(n){ //console.log(n); var yaoyiyao_id='{$yaoyiyao_id}'; if(!n || !yaoyiyao_id) return false; if(!localStorage.lastnamenn) localStorage.lastnamenn=Number(localStorage.lastnamenn)+Number(n); //alert(localStorage.lastnamenn); $.ajax( { url:"/index.php?s=/addon/WeiSite/WeiSite/yaoyiyaoiner.html", type: "POST", data:"yaoyiyao_id="+yaoyiyao_id+"&nnumm="+n, //dataType: "json", //cache: false, //async: false, beforeSend: function(){ $("#loading").attr('class','loading loading-show'); // Handle the beforeSend event /*$("#shakedown").animate({ top: "40%" }, 700, function () { $("#shakedown").animate({ top: "25%" }, 700, function () { }); });*/ }, success: function(data){ $('#maddd').html(data); $("#loading").attr('class','loading'); localStorage.lastnamenn=0; }, error:function (data, status, e){ //alert('服务器繁忙,请摇慢一点(-。-;)'); setTimeout(function(){ location.href = '/index.php?s=/addon/WeiSite/WeiSite/yaoyiyao.html'; },1290); } }); } </script> </body> </html>
//摇一摇部分 var SHAKE_THRESHOLD = 800;// 首先,定义一个摇动的阀值 var last_update = 0; var last_time = 0; var x; var y; var z; var last_x; var last_y; var last_z; var sound = new Howl({ urls: ['/yaoyiyao/sound/shake_sound.mp3'] }).load(); //var findsound = new Howl({ urls: ['/yaoyiyao/sound/shake_match.mp3'] }).load(); var curTime; var isShakeble = true; function init() { if (window.DeviceMotionEvent) { window.addEventListener('devicemotion', deviceMotionHandler, false); } else { //$("#cantshake").show(); alert('本设备不支持摇一摇!'); } } function deviceMotionHandler(eventData) { curTime = new Date().getTime(); var diffTime = curTime - last_update; if (diffTime > 100) { var acceleration = eventData.accelerationIncludingGravity; last_update = curTime; x = acceleration.x; y = acceleration.y; z = acceleration.z; var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000; if (speed > SHAKE_THRESHOLD && curTime - last_time > 500 && isShakeble) { // && $("#loading").attr('class') == "loading" //ssfsdfsdfnum++; window.clearTimeout(tmid); shake(); } last_x = x; last_y = y; last_z = z; } } var newnumm=0,tmid,ssfsdfsdf=0,ssfsdfsdfnum=0; function shake() { last_time = curTime; //$("#loading").attr('class','loading loading-show'); tmid=setTimeout(function(){ if(newnumm){ puttt(newnumm); ssfsdfsdfnum=ssfsdfsdfnum+newnumm; newnumm=0; ssfsdfsdf++; $('#ssfsdfsdf').text('+'+ssfsdfsdfnum);//ssfsdfsdf $("#shakeup").stop(true,true); $("#shakedown").stop(true,true); } //console.log(newnumm); },1800); newnumm++; $("#shakeup").animate({ top: "10%" }, 700, function () { $("#shakeup").animate({ top: "25%" }, 700, function () { //$("#loading").attr('class','loading'); //console.log(newnumm); //findsound.play(); /*myDialog.alert('恭喜你,中奖了');*/ }); }); sound.play(); $("#shakedown").animate({ top: "40%" }, 700, function () { $("#shakedown").animate({ top: "25%" }, 700, function () { }); }); } //各种初始化 $(document).ready(function () { Howler.iOSAutoEnable = false; //$('#container').trigger("click"); //document.getElementById("container").click(); //Howler.mobileAutoEnable = true; //FastClick.attach(document.body); init(); });
//yaoyiyao function yaoyiyao(){ session(null); //session('weiphp_home',null); //$_SESSION['weiphp_home']=null; //dump($_SESSION);exit; //session('yaoyiyaotoken',null); $allinfo=getWeixinUserInfo(get_openid(),get_token()); //$allinfo=array('openid'=>'okKYm1QwHgKb_wGI222l262','nickname'=>'发大水法'); //dump($allinfo);exit; $mapw['oppid']=$allinfo['openid'];//get_openid(); //$sss=M('yaoyiyao')->where($mapw)->limit(1)->find(); $sssall=M('yaoyiyao')->order('numm desc')->select(); foreach($sssall as $sk=>$sv){ $sssnumbers++; if($sv['oppid']==$mapw['oppid']){ $sss[]=$sv; $sssnumber=$sssnumbers; } } $sss=$sss['0']; //dump($sss);exit; if(!$sss['id']){ $map['ctime']=time(); $map['user']=$allinfo['nickname'];; $map['numm']=0; $map['oppid']=$mapw['oppid']; $map['nummsss']=rand(10,99).date('is',time()).rand(100,999); $sss['id']=M('yaoyiyao')->where($mapw)->limit(1)->add($map); } if(!$sss['id']){ header('Location:/index.php?s=/home/Index/leaflets/token/gh_41ee220e58f1.html'); exit; } session('yaoyiyaotoken', $value=$sss['id']); $this->assign('yaoyiyao_id',$sss['id']); $this->assign('sssall',$sssall); $nummsss=$map['nummsss']; if(!$map['nummsss']) $nummsss=$sss['nummsss']; $this->assign('nummsss',$nummsss); $this->assign('sssnumber',($sssnumber+0)); $this->assign('nickname',$allinfo['nickname']); $this->assign('nummm',($sss['numm']+0)); $configyaoyiyy=getAddonConfig('Yaoyiyao'); $this->assign('configyaoyiyy',$configyaoyiyy); //活动开始时间 $starttime=strtotime($configyaoyiyy['start']); //活动结束时间 $endndtime=strtotime($configyaoyiyy['end']); $timesss=time(); $yyhtmo='yaoyiyao'; //活动未开始 if($starttime>$timesss){ $yyhtmo='yaoyiyaonostart'; } //活动已经结束 if($endndtime<$timesss){ $yyhtmo='yaoyiyaonoend'; } if(!$configyaoyiyy['random']) $yyhtmo='yaoyiyaoclose'; //关闭 $this->display(ONETHINK_ADDON_PATH . 'WeiSite/View/default/TemplateIndex/' . $this->config ['template_index'] . '/'.$yyhtmo.'.html'); } //摇一摇录入 function yaoyiyaoiner(){ //session_start(); $mapw['id']=$_POST['yaoyiyao_id']; if(session('yaoyiyaotoken')!=$mapw['id']) exit(0);//验证是否摇一摇页面 //$map['ctime']=time(); //$mapw['user']='test'; $map['numm']=array('exp','numm+'.($_POST['nnumm']+0)); M('yaoyiyao')->where($mapw)->limit(1)->save($map); $sssall=M('yaoyiyao')->order('numm desc')->select(); foreach($sssall as $sk=>$sv){ $sssnumbers++; if($sv['id']==$mapw['id']){ $sss[]=$sv; $sssnumber=$sssnumbers; } } $sss=$sss['0']; $this->assign('sssnumber',($sssnumber+0)); $this->assign('nickname',$sss['user']); $this->assign('nummm',($sss['numm']+0)); $this->assign('nummsss',$sss['nummsss']); $this->assign('sssall',$sssall); $this->display(ONETHINK_ADDON_PATH . 'WeiSite/View/default/TemplateIndex/' . $this->config ['template_index'] . '/yaoyiyaosssall.html'); }
if(!localStorage.lastnamenn) localStorage.lastnamenn=Number(localStorage.lastnamenn)+Number(n);if(!localStorage.lastnamenn) localStorage.lastnamenn=Number(n);
不是套路!!!是TCP协议的拥塞控制机制导致的!
要理解TCP的拥塞控制机制,还得从古老的七层模型说起……
其中TCP协议应用于传输层,下载就是传输的一种,而TCP传输的速度基本是这样的
其中横坐标是传输次数,纵坐标是“拥塞窗口”数,就是要传输的报文需要先进入这个窗口才能发出去,简单的理解成传输速度就可以了a
假设我要在百度云上下载一个文件,以之为例解释一下这个过程。
(A→B段)
百度云:不知道当前网络环境怎么样,路上堵不堵……不管了发一个报文试试。
我:收到啦收到啦!
百度云:诶呦不错那再发两个试试~
……
百度云:行了行了差不多了可以慢点儿增加了
这一段,起点学名叫做慢开始,后面叫指数增大
(B→C段)
百度云:加一个
我:收到啦
百度云:再加一个
我:收到啦
百度云:再加一个
我:……
百度云:? 诶好像堵了= =
这一段,学名叫做,拥塞避免算法,即,加法增大
(C→D段)
百度云:算了从头开始
这一段叫做,乘法减小,开始新的慢开始,指数增大,但是,只增大到刚刚的一半,就进入拥塞避免阶段啦!(D→E段,E纵坐标是C的一半)
以上是TCP Tahoe版本的传输过程(也是主要考试的内容),然而实际上这个版本太基础了,已经废弃不用了,实际使用的是红线的版本,叫做TCP Reno(但是这个不考)
红色版本与蓝色版本的区别就是,红色版本的乘法减小并不是直接减到1然后重新慢开始,而是采用了效率高一些的“快恢复快重传”算法,也就是乘法减小至原来的一半(C→F段,F是C的一半)然后直接开始加法增大。这样可以看到比原来的蓝色版本稍微快了一点。
但下载还是很慢啊怎么办,关于这点老师的说法是,自己手动暂停一下,再重新开始下载,就又能享受一次第一次的指数增加加法增加的速度,不然后面一直减半减半减半就会越来越慢越慢越慢………………
以上都是与TCP协议有关的理论因素,其他因素还包括加速器啊下载器啊什么的
用echo输出的中文显示成乱码,
其实应该是各种服务器脚本都会遇到这个问题,
根本还是编码问题,
一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这时候要正常显示中文需要转化一下编码方式,比如
echo iconv("GB2312","UTF-8",'中文');就不会乱码了
还有其他方法,比如
在php的echo前面加入header("Content-Type:text/html;charset=gb2312");
当然简体中文页面也可以干脆地,
把<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />中的UTF-8改成gb2312
实际中遇见奇怪的现象,
在本机服务器上正常显示的页面,传上服务器就echo出来乱码,
没仔细琢磨过这个缘由,因为通过iconv函数GB2312、UTF-8换换位置重新编码下就正常了,
不过估计肯定是APACHE,更确切说是PHP服务端的设置不同造成的,
看看PHP.INI应该就能解决。
在php的echo前面加入
header("Content-Type:text/html;charset=UTF-8");
H5的storage(sessionstorage&localStorage)简单存储删除
众所周知,H5的storage有sessionstorage&localStorage,其中他们的共同特点是API相同
下面直接上代码,storage中的存储与删除:
存值取值删除
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>H5的storage</title> </head> <body> <input type='button' onclick='setItems()' value='存值' /> <input type='button' onclick='getItems()' value='取值' /> <input type='button' onclick='deleteItem()' value='删除' /> </body> <script src="js/jquery.min.js"></script> <script> //localStorage存值永久有效 function setItems(){ var user = {}; user.name = 'Adam Li'; user.age = 25; user.home = 'China'; localStorage.setItem('userinfo',JSON.stringify(user)); } //localStorage取值 function getItems(){ var data = JSON.parse(localStorage.getItem('userinfo')); console.log("name:"+data.name+'\r age:'+data.age+"\r home:"+data.home); } //localStorage删除指定键对应的值 function deleteItem(){ localStorage.removeItem('userinfo'); console.log(localStorage.getItem('userinfo')); } </script> </html>
经常有需要对某个数据表的计数字段进行加减操作,我们来看下在ThinkPHP中的具体使用办法。
最简单的,使用下面方法对score自动加1:
M('User')->where('id=5')->setInc('score');
当然,也可以加更多的积分:
M('User')->where('id=5')->setInc('score',5);
当然也可以减1操作
M('User')->where('id=5')->setDec('score');
setInc和setDec方法只能单独对一个字段进行操作,如果你的字段加减操作要和其他字段的更新一起的话,则需要采用表达式更新的方式了,例如:
$User = M('User'); $User->id = 5; $User->nickname = 'ThinkPHP'; $User->score = array('exp','score+5'); $User->save();
表示对id为5的用户数据进行昵称和积分修改操作。
$User->score = array('exp','score+5');
这段代码就称之为表达式更新。