存档

文章标签 ‘类’

短信验证码sendSms类使用说明

2020年12月11日 评论已被关闭
/*
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);
*/
分类: php学习 标签: , ,

用php写的一个常用分页效果类(含javascript版本)

2020年12月3日 评论已被关闭

来看看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};
	}
}

sendSms类使用说明文档

2020年12月3日 评论已被关闭
/*
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(使用阿里云发送,其他使用twilio),ca=+1,us=+1
	'phone'=>'15215699266',
	'action'=>'confirmCode',//发送类型,具体请看配置文件
	'sendParam'=>array('code'=>'123456'),//为模板变量,具体请看配置文件,必须是数组
));
//返回true或者false
var_dump($res);
*/
分类: php学习 标签: , , ,

sendEmail类使用说明文档

2020年12月3日 评论已被关闭
/*
require ROOT.'config/class/sendEmail.php';
require ROOT.'class/sendEmail.php';#用到了autoload就不用require了
$sendEmail=new sendEmail($emailConfig);
$res=$sendEmail->send(array(
	'toEmail'=>array('8346571@qq.com'),//接收人地址,支持多个,无论单个多个请用数组
	'title'=>'测试title',//邮件标题
	'content'=>'测试content',//邮件内容,支持html
	'site'=>'vpp',//支持的站点请看配置文件,自己的项目可以用SITE常量
	'sendapi'=>'aliyun',//发送的接口,支持的接口请阅读配置文件(一般情况下建议使用aliyun)
));
//返回true或者false
var_dump($res);
*/

分类: php学习 标签: , , ,

saveFile类使用说明文档

2020年12月3日 评论已被关闭

1,我们需要3个文件:test.html+testSave.php+savePic.ajax.php
test.html前端代码,有按钮可以上传图片(到savePic.ajax.php),有按钮可以保存结果(到testSave.php)

我们先看看test.html的代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
	<style type="text/css">
	    *{font-family:'microsoft yahei';color:#4A4A4A;}
		#upload{width:700px;padding:20px;border:1px dashed #ccc;margin:100px auto;border-radius:5px;}
		#uploadBox{width:100%;height:35px;position:relative;}
		#uploadBox input{width:200px;height:30px;background:red;position:absolute;top:2px;left:0;z-index:201;opacity:0;cursor:pointer;}
		#inputCover{width:200px;height:30px;position:absolute;top:2px;left:0;z-index:200;text-align:center;line-height:30px;font-size:14px;border:1px solid #009393;border-radius:5px;cursor:pointer;}
		button{width:100px;height:30px;border-radius:5px;border:1px solid #ccc;background:#F0F0F0;outline:none;cursor:pointer;}
		button:hover{background:#E0E0E0;}
		#ccc;background:#F0F0F0;outline:none;cursor:pointer;}
		#processBar{display:inline-block;width:0;height:7px;position:absolute;left:500px;top:14px;background:#009393;}
		#processNum{position:absolute;left:620px;color:#009393;font-size:12px;line-height:35px;}
		#show {text-align: center;line-height:28px;}
	</style>
</head>

<body>
	<div id="upload">
		<div id="uploadBox">
			<span id="inputCover">选择文件</span>
			<form enctype="">
				<input type="file" name="file" id="file" accept="image/jpeg,image/png,image/gif,audio/*,video/*" />
				<button type="button" id="submit" style="position:absolute;left:230px;top:2px;">上传</button>
			</form>
			<span id="processBar"></span>
			<span id="processNum">未选择文件</span>
		</div>
	</div>
	<div id="show"></div>
	<button type="button" id="confirmbtn" style="display:block;margin:0 auto;margin-top:30px;">保存</button>
	<script type="text/javascript" src="//static.vancdn.com/public/js/jquery/jquery-1.12.4.min.js"></script>
	<script type="text/ecmascript">
		$(document).ready(function(){
			var inputCover = $("#inputCover");
			var processNum = $("#processNum");
			var processBar = $("#processBar");

			//上传准备信息
			$("#file").change(function(){
				var file = document.getElementById('file');
				var fileName = file.files[0].name;
				var fileSize = file.files[0].size;
				
				processBar.css("width",0);
				if(fileSize > 1024*2*1024){
					inputCover.html("<font>文件过大,请重新选择</font>");
					processNum.html('未选择文件');
					$('#file').value = '';
					return false;
				}
				else{
					inputCover.html(fileName+' / '+parseInt(fileSize/1024)+'KB');
					processNum.html('等待上传');
				}
				//开始上传
				startUpload();
			})

			//创建ajax对象,发送上传请求
			function startUpload(){
				var file = document.getElementById('file').files[0];
				var formData = new FormData();
				formData.append('fileInputName',file);
				$.ajax({
					url: 'savePic.ajax.php',
					async: true,
					type: 'post',
					data: formData,
					dataType : 'json',
					processData: false,
					contentType: false,
					xhr:function(){                        
						myXhr = $.ajaxSettings.xhr();
						if(myXhr.upload){
							myXhr.upload.addEventListener('progress',function(e){                            
							var loaded = e.loaded;
							var total = e.total;
							var percent = Math.floor(100*loaded/total);
							processNum.text(percent+"%");       
							processBar.css("width",percent+"px");                                                                
							}, false);
						}
						return myXhr;
					},
					success: function(data){
						if(data.status=='ok'){
							if(typeof(pics)=="undefined"){
			        			pics=[];
			        		}
			        		var pic=data.res.path+data.res.name+data.res.ext;
			        		pics.push({pic:pic,moveKey:data.res.moveKey});
							$("#show").html('<span style="color:green;">文件上传成功</span>'+'<br />文件目录:'+data.res.path+'<br />文件名称:'+data.res.name+'<br />文件拓展名:'+data.res.ext+'<br />完整url://save.vancdn.com/'+(data.res.path+data.res.name+data.res.ext)+'<br />文件大小:'+data.res.size+'('+data.res.size+'/1024='+parseInt(data.res.size/1024)+'KB)<br />移动key:'+data.res.moveKey+'<br /><br />');
						}else{
							$("#show").html('<span style="color:red;">'+data.errorStr+'</span>');
						}
					}
				})
			}

			$(document).on("click","#confirmbtn",function(){
				if(typeof(pics)=="undefined"){
        			pics=[];
        		}
	        	$.post('testSave.php',{pics:JSON.stringify(pics)},function(data){console.log(data);
	        		if(data.status=='ok'){
	        			alert("操作成功");
	        		}
	        	},"json");
			});

		})
	</script>
</body>
</html>

在来看看savePic.ajax.php负责保存图片到服务器的代码:

<?php
	header('content-type:text/plain; charset=utf-8');
	//配置上传图片的参数
	$saveFileData=array(
		'allowExt'=>array('image/png','image/jpeg','image/gif'),
		'allowSize'=>5120000,
		'fileInput'=>'fileInputName',
		//缩略图路径说明(thumb数组中的waterImg也适用本说明)
		//1:参数为水印图片路径,比如:http://static.vancdn.com/public/img/water/watermark.pngwater.png,只需要传递:public/img/water/watermark.png
		//2:$config['waterImg']是指原图是否需要水印,,如果设置则最原始图片会被水印图覆盖(不保留原图,只会生成一个带水印的原图)
		//3:$config['thumb']数组中的waterImg为缩略图使用的水印图片地址(参数格式和说明1一致)
		'waterImg'=>'public/img/water/water.jpg',
		'waterPos'=>0,
		'thumb'=>array(
			//缩略图:多个请指定多个数组,缩略图宽度,缩略图名称前缀,缩略图是否需要增加水印(参数为水印图片路径)
			array('sizeWidth'=>750,'name'=>'_middle','waterImg'=>'public/img/water/water.middle.jpg','waterPos'=>-1),
			array('sizeWidth'=>450,'name'=>'_small','waterImg'=>'public/img/water/water.small.png','waterPos'=>-1),
		)
	);
	//实例化并保存图片
	require '../../../../config/class/saveFile.php';
	require '../../../../class/saveFile.php';
	$saveFile=new saveFile($saveFileData,$saveFileConfig);
	echo json_encode($saveFile->save());
?>

当图片保存成功后会返回结果到js,test.html再保存数据post到testSave.php
我们再看看testSave.php的代码

<?php
	header('content-type:text/plain; charset=utf-8');
	//开始处理图片,先pics并进行一些判断
	/*
	$_POST['pics']是ajax返回给js,js再通过:
	if(typeof(pics)=="undefined"){pics=[];}
	var pic=data.res.path+data.res.name+data.res.ext;
	pics.push({pic:pic,moveKey:data.res.moveKey});
	*/
	$pics=json_decode($_POST['pics'],true);
	if(!is_array($pics)){
		//进行自己的业务逻辑处理
		//exit(json_encode(array('status'=>'error','errorStr'=>'参数错误')));
	}
	//配置保存图片的参数
	$moveFileData=array(
		'moveSite'=>SITE,//需要操作的站点
		'moveTo'=>'c',//允许的移动至目录类型
		'moveToDeep'=>'hy',//移动到moveTo的子目录(比如hy)
		//要处理的图片:多个请指定多个数组,图片路径,图片移动的key 格式:array(array('pic'=>'202009/10/18/84c12c85071d81ec34g5hlBVM-.png','movekey'=>'62126eb7aae701f6968f13731f9b6e09'))
		'pics'=>$pics,
		'thumb'=>array('_middle','_small')//缩略图:多个请指定多个数组,缩略图名称前缀
	);
	//实例化并移动图片
	require '../../../../config/class/saveFile.php';
	require '../../../../class/saveFile.php';
	$saveFile=new saveFile($moveFileData,$saveFileConfig);
	echo json_encode($saveFile->move());
?>

逻辑大概就是先单独保存图片,成功后,再移动。
下面贴出注释和使用说明:

/*
save操作示例:
	header('content-type:text/plain; charset=utf-8');
	//配置上传图片的参数
	$saveFileData=array(
		'allowExt'=>array('image/png','image/jpeg','image/gif'),
		'allowSize'=>5120000,
		'fileInput'=>'fileInputName',
		//缩略图路径说明(thumb数组中的waterImg也适用本说明)
		//1:参数为水印图片路径,比如:http://static.vancdn.com/public/img/water/watermark.pngwater.png,只需要传递:public/img/water/watermark.png
		//2:$config['waterImg']是指原图是否需要水印,,如果设置则最原始图片会被水印图覆盖(不保留原图,只会生成一个带水印的原图)
		//3:$config['thumb']数组中的waterImg为缩略图使用的水印图片地址(参数格式和说明1一致)
		'waterImg'=>'public/img/water/water.jpg',
		'waterPos'=>0,
		'thumb'=>array(
			//缩略图:多个请指定多个数组,缩略图宽度,缩略图名称前缀,缩略图是否需要增加水印(参数为水印图片路径)
			array('sizeWidth'=>750,'name'=>'_middle','waterImg'=>'public/img/water/water.middle.jpg','waterPos'=>-1),
			array('sizeWidth'=>450,'name'=>'_small','waterImg'=>'public/img/water/water.small.png','waterPos'=>-1),
		)
	);
	//实例化并保存图片
	require '../../../../config/class/saveFile.php';
	require '../../../../class/saveFile.php';
	$saveFile=new saveFile($saveFileData,$saveFileConfig);
	echo json_encode($saveFile->save());
=======================
move操作示例:
	header('content-type:text/plain; charset=utf-8');
	//处理图片之前的一些逻辑和数据操作
	
	//开始处理图片,先pics并进行一些判断
	//$_POST['pics']是ajax返回给js,js再通过:
	//if(typeof(pics)=="undefined"){pics=[];}
	//var pic=data.res.path+data.res.name+data.res.ext;
	//pics.push({pic:pic,moveKey:data.res.moveKey});

	$pics=json_decode($_POST['pics'],true);
	if(!is_array($pics)){
		//进行自己的业务逻辑处理
		//exit(json_encode(array('status'=>'error','errorStr'=>'参数错误')));
	}
	//配置保存图片的参数
	$moveFileData=array(
		'moveSite'=>SITE,//需要操作的站点
		'moveTo'=>'c',//允许的移动至目录类型
		'moveToDeep'=>'hy',//移动到moveTo的子目录(比如hy)
		//要处理的图片:多个请指定多个数组,图片路径,图片移动的key 格式:array(array('pic'=>'202009/10/18/84c12c85071d81ec34g5hlBVM-.png','moveKey'=>'62126eb7aae701f6968f13731f9b6e09'))
		'pics'=>$pics,
		'thumb'=>array('_middle','_small')//缩略图:多个请指定多个数组,缩略图名称前缀
	);
	//实例化并移动图片
	require '../../../../config/class/saveFile.php';
	require '../../../../class/saveFile.php';
	$saveFile=new saveFile($moveFileData,$saveFileConfig);
	echo json_encode($saveFile->move());
*/
分类: php学习 标签: , , ,
css.php