vpp app更新版本需要修改的php配置文件
1:/老/app/static/html/forceUrl/android5.4UpdateTips.html
2:/老/app/static/php/update/updateConfig.php
3:/新/config/api/app/update.php
1:/老/app/static/html/forceUrl/android5.4UpdateTips.html
2:/老/app/static/php/update/updateConfig.php
3:/新/config/api/app/update.php
/*
require ROOT.'config/class/sendSms.php';
require ROOT.'class/sendSms.php';#用到了autoload就不用require了
$sendSms=new sendSms($smsConfig);
$res=$sendSms->send(array(
'language'=>'cn',//cn or en
'site'=>'vpp',//支持的站点请看配置文件,自己的项目可以用SITE常量
'countryCode'=>'+86',//cn=+86(使用阿里云或者163发送,其他使用twilio),ca=+1,us=+1
'phone'=>'手机号',
'action'=>'confirmCode',//发送类型,具体请看配置文件
'sendParam'=>array('code'=>'123456'),//为模板变量,具体请看配置文件,必须是数组
));
//成功返回true,失败返回数组[code,msg]
var_dump($res);
*/
我们需要如下:demo.html+ajax/doConfirmCode.php+demoSave.php+confirmCode.php(php类,不提供)+confirmCode.js(js类,不提供)
我们先看看demo.html的代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>验证码Demo</title>
<style>
* {box-sizing:border-box;}
#code{border:#ababab solid 1px;width:100px;height:30px;line-height:30px;vertical-align:middle;border-radius:6px;}
#img{border:1px solid red;cursor:pointer;vertical-align:middle;border-radius:6px;width:100px; height:30px; display: inline-block;}
#button{cursor:pointer;vertical-align:middle;width:100px;height:30px;line-height:30px;background:#000;color:#fff;display:inline-block;text-align:center;border-radius:6px;border:none;margin-left:30px;}
#box{width:90%;margin:0 auto;margin-top:100px;}
</style>
</head>
<body>
<div id="box">
<input type="text" id="code" value="" />
<img id="img" />
<input id="button" type="button" value="保存提交" />
</div>
<script type="text/ecmascript" src="static/jquery-1.12.4.min.js"></script>
<script type="text/ecmascript" src="static/confirmCode.js"></script>
<script type="text/ecmascript">
$(function(){
var yzm = new confirmCode({
//基本配置
input:'#code',//必填,验证码输入框id或css选择器,比如: '#code'或者'.input_captcha'
input_maxlength:4,//可以不填,验证码长度, 默认是4(js会自动将控件的maxlength改为input_maxlength,并且input_onblur_check的参数也会先判断长度然后来处理)
input_first_auto_focus:false,//可以不填,验证码输入框第一次加载是否自动获取焦点并清空值,默认false
img:'#img',//必填,显示验证码的容器id或css选择器,比如: '#imgcode'或者'.img_captcha'
img_loading:{
first_unautoload_default_img:'',//可以不填,填写了代表验证码第一次默认不自动加载所设置的默认图片,可以用远程地址:https://static.vancdn.com/public/img/yzm/click2load.png
first_load_delay:2000,//第一次延迟加载的毫秒,默认0(如果first_unautoload_default_img设置为非空,则无效)
loading_img:'static/loading.png',//可以不填,加载验证码过程中的默认图片,可以用远程地址:https://static.vancdn.com/public/img/yzm/loading.png
loading_fail_img:'static/error.png',//可以不填,加载验证码失败的图片,可以用远程地址:https://static.vancdn.com/public/img/yzm/error.png
loading_fail_func:function(msg){//验证加载失败的回调函数,如果不操作请申明空function
alert('验证码加载失败:'+msg+';在此进行相关书写');
}
},
get_url:'ajax/doConfirmCode.php',//必填,获取验证码的url
//第一种情况:在提交保存数据的js代码中验证验证码的合法性(验证长度之后,是否进行js的md5验证)
//第二种情况:如果开启了input_onblur.open,则先走js的md5验证再走input_onblur.server_check_url(如果设置了的话)
verify_by_js_md5:true,//可以不填,默认false
//input控件onblur的监控处理
input_onblur:{
open:true,//是否在input的onblur时交互检查,总开关(当设置为true的时候,如果verify_by_js_md5==true,那么先走js的md5验证,再走服务端验证)
server_check_url:'ajax/doConfirmCode.php',//启用服务器端验证时请求的url(如果没设置,则不走服务端验证)
success:function(){//验证成功的回调函数,如果不操作请申明空function
alert('onblur验证成功;在此进行相关书写');
},
fail:function(msg){//验证失败的回调函数,如果不操作请申明空function
alert('onblur验证失败:'+msg+';在此进行相关书写');
}
},
console_test:true,//是否调试console日志,默认false
});
//适合保存的时候检查验证码是否有效,根据yzm.verify_save()返回值进行相关操作
$("#button").on('click',function(){
//这里仅仅只做验证码的逻辑处理,自己其他业务自己处理
if(yzm.verify_save()==true){
//在这里获取到输入框的值和key
var yzmValue=yzm.getYzm();
alert("yzmkey:"+yzmValue.yzmkey+",yzmvalue:"+yzmValue.yzmkey);
alert('验证码验证成功,书写自己需要的代码,比如请求ajax...');
}
else {
alert('验证码验证失败,书写自己需要的代码,比如return false');
}
});
});
</script>
</body>
</html>
再看看ajax/doConfirmCode.php
<?php
header('content-type:text/plain; charset=utf-8');
//本代码基本可以不用重写,除非遇到参数不一致
switch($_POST['action']){
case 'get':
echo json_encode(Myzm()->get(
array(
'width'=>100,//图片宽度px,默认100
'height'=>30,//图片高度px,默认30
'textNum'=>4,//验证码(字母+数字)数量,默认4
'timeout'=>600,//验证码有效期秒,默认600
)
));
break;
case 'onblurcheck':
echo json_encode(Myzm()->check(
array(
'yzmcode'=>$_POST['yzmcode'],//用户输入的code
'yzmkey'=>$_POST['yzmkey'],//验证码的key
'textNum'=>4,//验证码长度,默认为4
'delyzmkey'=>false,//是否删除key,默认为true,特别注意:ajax执行check时不删除key, 待form提交后再删除
)
));
break;
default:break;
}
在看看demoSave.php
<?php
header('content-type:text/plain; charset=utf-8');
/***示例检查验证码的代码-开始***/
$yzmCheck=Myzm()->check(
array(
'yzmcode'=>$_POST['yzmcode'],//用户输入的code
'yzmkey'=>$_POST['yzmkey'],//验证码的key
'textNum'=>4,//验证码长度,默认为4
'delyzmkey'=>true,//是否删除key,默认为true,特别注意:ajax执行check时不删除key, 待form提交后再删除
)
);
if($yzmCheck['status']=='error'){
echo $yzmCheck['errorStr'];//通过$yzmCheck['errorStr']进行自己的相关操作
}
/***示例检查验证码的代码-结束***/
IOS打开webview全面屏幕底部黑条兼容解决方案:
第一种是在不知道是否是全面屏的情况下:
需要在meta中增加:增加viewport-fit=cover
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
env() 和 constant():
iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:
safe-area-inset-left:安全区域距离左边边界距离
safe-area-inset-right:安全区域距离右边边界距离
safe-area-inset-top:安全区域距离顶部边界距离
safe-area-inset-bottom:安全区域距离底部边界距离
padding-bottom: constant( safe-area-inset-bottom); /* 兼容 iOS < 11.2 / padding-bottom: env( safe-area-inset-bottom); / 兼容 iOS >= 11.2 */
env() 跟 constant() 需要同时存在,而且顺序不能换。
第二种是webview知道是全面屏,直接给底部增加像素即可(一般是客户端通过url传递参数,比如:fullscreen=yes)
效果如下:
来看看php版本
<?php
//使用说明:http://www.zhanghongliang.com/article/1509
class myPage{
private $url='';
private $urlPre='';
private $urlExt='';
private $language=array('first'=>'首页','pre'=>'上一页','next'=>'下一页','dijiye'=>'第<page>页','last'=>'尾页');
private $languagePre='';
private $languageExt='';
function get($v){
$rowCount=$v['rowCount'];
$pageSize=$v['pageSize'];
$nowPage=$v['nowPage'];
$pageCountShow=$v['pageCountShow'];
if(!isset($pageCountShow)){
$pageCountShow=true;
}
$html='';
$limit='';
$pageCount=intval(ceil($rowCount/$pageSize));
if($pageCount==1){//总页只有1页
$limit='0,'.$pageSize;
}
else {
//当前页小于等于总页,再处理
if($nowPage<=$pageCount){
$this->url=$v['url'];
if(is_array($v['language'])){
foreach($v['language'] as $languageK=>$languageV){
$this->language[$languageK]=$languageV;
}
}
$limit=($pageSize*($nowPage-1)).','.$pageSize;
//计算分页html
if($nowPage>5) {
if($nowPage>=$pageCount){
if($pageCount<9){$starti=1;}
else {$starti=$pageCount-9;}
$endi=$pageCount;$page=$pageCount;
}
else{
if($pageCount-$nowPage<=4){
$starti=$pageCount-9;$endi=$pageCount;
}
else{
$starti=$nowPage-4;$endi=$nowPage+4;
}
}
}
else {
$starti=1;
if($pageCount>10){$endi=10;}
else{$endi=$pageCount;}
if(!$nowPage){$nowPage=1;}
}
$html='<div id="'.$v['divId'].'">';
if($nowPage!=1){
if($nowPage>1){
$html.='<a title="'.$this->language['first'].'" href="'.$this->pageUrl(1).'">'.$this->language['first'].'</a>';
}
$html.='<a title="'.$this->language['pre'].'" href="'.$this->pageUrl($nowPage-1).'">'.$this->language['pre'].'</a>';
}
for($pi=$starti;$pi<=$endi;$pi++){
$html.='<a title="'.$this->dijiYe($pi).'" href="'.((($pi==1 && $nowPage==1) || ($pi==$pageCount && $nowPage==$pageCount))?'###':$this->pageUrl($pi)).'"'.($pi==$nowPage?" class='".$v['onPageClassName']."'":'').'>'.$pi.'</a>';
}
if($nowPage!=$pageCount && $nowPage<$pageCount){
$html.='<a title="'.$this->language['next'].'" href="'.$this->pageUrl($nowPage+1).'">'.$this->language['next'].'</a>';
}
if($pageCount!=$nowPage){
$html.='<a title="'.$this->language['last'].'" href="'.$this->pageUrl($pageCount).'">'.$this->language['last'].($pageCountShow?'('.$pageCount.')':'').'</a>';
}
$html.='</div>';
}
}
return array('limit'=>$limit,'html'=>$html,'pageCount'=>$pageCount);
}
function pageUrl($page){
if($this->urlPre==''){
$pos=strpos($this->url,'<page>');
$this->urlPre=substr($this->url,0,$pos);
$this->urlExt=str_replace('<page>','',substr($this->url,$pos));
}
return $this->urlPre.$page.$this->urlExt;
}
function dijiYe($page){
if($this->languagePre==''){
$pos=strpos($this->language['dijiye'],'<page>');
$this->languagePre=substr($this->language['dijiye'],0,$pos);
$this->languageExt=str_replace('<page>','',substr($this->language['dijiye'],$pos));
}
return $this->languagePre.$page.$this->languageExt;
}
}
再来看看JavaScript版本
/**
* 分页调取方法
* var pagehtml = pageHtml(obj.data.totalcount,15,1,'/list/<page>.html',true,'on','onPageClassName',{'first':'Home','pre':'Prev','next':'Next','dijiye':'No. <page>','last':'Last'});
* 返回结果:{limit: "0,15", html: "<div id="pageList"><a title="第1页" href="###" class="on">1</a>...<a title="尾页" href="/list-42/17658.html">尾页(17658)</a></div>", pageCount: 2491}
* 输出html方法:if(pagehtml){$('#pages').html(pagehtml.html);}
* @param rowCount 必填,总记录条数
* @param pageSize 必填,每页多少条数据
* @param nowPage 必填,当前页,默认为1
* @param url 必填,url参数会替换<page> 例如:/list-5/<page>.html
* @param addUrlGetParam 选填,url是否最后追加url参数,默认为false,不追加
* @param onPageClassName, 必填,当前页的a链接样式名称,会输出<a class="参数值"></a>,默认为on
* @param divId 必填,用于控制css,会输出<div id="参数值"></div>,默认为pageList
* @param language 选填,语言包(支持只指定个别) 默认为{'first':'首页','pre':'上一页','next':'下一页','dijiye':'第<page>页','last':'尾页'}
* @param pageCountShow 选填,是否显示总页数,默认为true
*/
function pageHtml(rowCount,pageSize=15,nowPage=1,url='',addUrlGetParam=false,divId='',onPageClassName='',language='',pageCountShow=true){
rowCount = isNaN(parseInt(rowCount)) ? 0 : parseInt(rowCount);
pageSize = isNaN(parseInt(pageSize)) ? 0 : parseInt(pageSize);
nowPage = isNaN(parseInt(nowPage)) ? 0 : parseInt(nowPage);
if(rowCount==0 || pageSize==0 || nowPage==0 || url=='' || url==undefined){
return;
}
var pageCount = parseInt(Math.ceil(rowCount / pageSize));
var htmlStr = '';
var limit = '';
if(pageCount <= 1){//总页只有1页
limit='0,1';
return {'limit':limit,'html':htmlStr,'pageCount':pageCount};
}else{
var lang = {
'first':'首页',
'pre':'上一页',
'next':'下一页',
'dijiye':'第<page>页',
'last':'尾页'
};
if(language!='' || language!=undefined){
for (let key in language){
lang[key] = language[key];
}
}
var endi=pageCount;
var starti=1;
var thisParam = window.location.href.split('?')[1];
var paramStr = (thisParam=='' || thisParam==undefined) ? '' : '?' + (addUrlGetParam ? thisParam : '');
url = url + paramStr;
if(onPageClassName=='' || onPageClassName==undefined){
onPageClassName = 'on';
}
if(divId=='' || divId==undefined){
divId = 'pageList';
}
//当前页小于等于总页,再处理
if(nowPage<=pageCount){
limit = (pageSize*(nowPage-1))+','+pageSize;
//计算分页html
if(nowPage>5) {
if(nowPage>=pageCount){
if(pageCount<9){
starti=1;
}else{
starti=pageCount-9;
}
endi=pageCount;
}
else{
if(pageCount-nowPage<=4){
starti=pageCount-9;endi=pageCount;
}else{
starti=nowPage-4;endi=nowPage+4;
}
}
}else{
starti=1;
if(pageCount>10){
endi=10;
}else{
endi=pageCount;
}
if(!nowPage){
nowPage=1;
}
}
htmlStr='<div id="'+divId+'">';
if(nowPage!=1){
if(nowPage>1){
htmlStr+='<a title="'+lang['first']+'" href="'+url.replace('<page>',1)+'">'+lang['first']+'</a>';
}
htmlStr+='<a title="'+lang['pre']+'" href="'+url.replace('<page>',nowPage-1)+'">'+lang['pre']+'</a>';
}
for(pi=starti;pi<=endi;pi++){
htmlStr+='<a title="'+lang['dijiye'].replace('<page>',pi)+'" href="'+(((pi==1 && nowPage==1) || (pi==pageCount && nowPage==pageCount))?'###':url.replace('<page>',pi))+'"'+(pi==nowPage?" class='"+onPageClassName+"'":'')+'>'+pi+'</a>';
}
if(nowPage!=pageCount && nowPage<pageCount){
htmlStr+='<a title="'+lang['next']+'" href="'+url.replace('<page>',nowPage+1)+'">'+lang['next']+'</a>';
}
var showPageCount = pageCountShow ? '('+pageCount+')' : '';
if(pageCount!=nowPage){
htmlStr+='<a title="'+lang['last']+'" href="'+url.replace('<page>',pageCount)+'">'+lang['last']+showPageCount+'</a>';
}
htmlStr+='</div>';
}
return {'limit':limit,'html':htmlStr,'pageCount':pageCount};
}
}
近期评论