控制器调用/***[delimg删除单张图片]*@return[type][description]*/publicfunctiondelimg(){if(request()->isPost()){$pic=input('request.pic');//$pic为文件路径returndelimg($pic);}}公共方法/***[delimg删除文件]*@param[type]$pic[description]*@return[type][description]*/functiondelimg($pic){$path=__FILE__;$paths=substr($path,0,strpos($path,'application'));$pic1=$paths."public".DS.$pic;if(file_exists($pic1)){@unlink($pic1);returntrue;}returnfalse;}
1.解决思路首先先定一张分类表。包含如下几个字段(自增id,类目名称,父类id,子类id)写2个类,1个类查询总数据,另一个类写方法(利用foreach循环遍历)2.贴代码classTreeextendsModel{//输出所有内容publicfunctiontree(){$obj=newTree();$tree_list=$obj->select();return$this->sorts($tree_list);}//创建方法$data参数是数据库所有数据$pid参数是数据库pid$le参数是为了区分显示级别的publicfunctionsorts($data,$pid=0,$level=0){//创建一个静态数组保存数据static$arr=array();//循环出所有的有关数据保存进数组foreach($dataas$k=>$v){//当第一循环是pid==0因为上面已经设置pid==0if($v['pid']==$pid){//这里是为了区分级别$v['level']=$level;//将有关数据保存如数据$arr[]=$v;//为了将有关数据保存数据,这里使用递归$this->sorts($data,$v['id'],$level+1);}}//将最后的内容输出返回return$arr;}}
/***成功返回信息*status:状态码*msg:提示信息*data:返回数据*/functionsucessMsg($status=200,$msg='获取成功!',$data=[]){returnjson(['code'=>$status,'msg'=>$msg,'data'=>$data],200);}/***失败返回信息*status:状态码*msg:错误信息*data:返回数据*/functionerrMsg($status=500,$msg='获取失败!',$data=[]){returnjson(['code'=>$status,'msg'=>$msg,'data'=>$data],200);}将方法封装在common.php里边直接调用即可
/***通用化接口封装*@param$status*@param$message*@param$data*@param$httpCode*@returnarray*/functionshow($status,$message,$data,$httpCode){$data=['status'=>$status,'message'=>$message,'data'=>$data,];returnjson($data,$httpCode);}
控制器调用publicfunctionjson(){if(request()->isPost()){returnjsonData(1,'转换成功',数据(可不填)); } }公共方法/**返回统一格式*/functionjsonData($code=1,$msg='',$data=[]){//code0代表错误,1代表成功$codeV=['error','success'];returnjson_encode(['code'=>$codeV[$code],'msg'=>$msg,'data'=>$data],JSON_UNESCAPED_UNICODE);}
1.HTML代码:<!doctypehtml><html><head><metacharset="UTF-8"><title>文件上传</title></head><body><h2>文件上传</h2><formmethod="post"enctype="multipart/form-data"class="form"action="">选择文件:<inputtype="file"class="files"name="files"><br/><inputtype="submit"class="btn"value="提交"></form></body></html>2.PHP代码$pic=upload('files')3.公共方法代码/**图片上传方法,并且带有水印*/functionupload($images){$isWater=1;//开启水印$wordOrWater=1;//图片或者文字水印//获取表单上传文件$file=request()->file($images);if($file){//移动到框架应用根目录/public/uploads/目录下$info=$file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH.'public'.DS.'uploads');if($info){if($isWater==1){//判断是否开启水印//生成水印$water_path='waters/'.$info->getFilename();//打开图片$image=\think\Image::open($info);if($wordOrWater==2){//图片水印$image->water('../logo.png',\think\Image::THUMB_CENTER)->save($water_path);}elseif($wordOrWater==1){//文字水印$image->text('你好','../simkai.ttf','20','#00000',\think\Image::THUMB_CENTER)->save($water_path);}return$water_path;}else{return$info->getFilename();//f7fc0885f2382c4dc6fbc37a012c1214.jpgreturn$info->getSavename();//20200212\b7ff4517d038e3d7931958824c4dc2a6.jpgreturn$info->getPathname();//uploads\20200212\0a2fe6509f555a49bf06d25cf0916198.jpg}}else{//上传失败获取错误信息return$file->getError();}}}
控制器调用/***视频上传*/publicfunctionvideo_add(){if(request()->isPost()){$video=$_FILES['video'];$res=upload_file($video);return$res;}}公共方法/***视频上传*@param$files*@paramstring$path*@paramarray$imagesExt*@returnstring*/functionupload_file($files,$path="./upload/video",$imagesExt=['mp4']){//判断错误号if($files['error']==00){$ext=strtolower(pathinfo($files['name'],PATHINFO_EXTENSION));//判断文件类型if(!in_array($ext,$imagesExt)){return1000;//非法文件类型}//判断是否存在上传到的目录if(!is_dir($path)){mkdir($path,0777,true);}//生成唯一的文件名$fileName=md5(uniqid(microtime(true),true)).'.'.$ext;//将文件名拼接到指定的目录下$destName=$path."/".$fileName;//进行文件移动if(!move_uploaded_file($files['tmp_name'],$destName)){return1001;//文件上传失败}return$destName;//上传成功,返回上传路径}else{//根据错误号返回提示信息switch($files['error']){case1:echo2000;//上传的文件超过了php.ini中upload_max_filesize选项限制的值break;case2:echo2001;//上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值break;case3:echo2002;//文件只有部分被上传break;case4:echo2003;//没有文件被上传break;case6:echo2004;//找不到临时文件夹break;case7:echo2005;//文件写入错误break;}}}
在项目中,经常会遇到需要进行图片,或者文件上传的功能,这个时候如果用原生php开发,不仅代码繁琐,开发效率低,而且代码可读性较差,不利于后期代码修改,所以这个时候我们不如使用tp5框架封装的文件上传函数来开发。经过一番对tp5手册提供的文件上传代码的研究,我将图片上传再一次做了封装,并将其定义在公共文件common.php中。先在文件头部使用命名空间think\File封装单图片上传和多图片上传方法usethink\File;/***上传单张图片,返回值为保存路径或false*@param$file*@returnbool*/functionaddImg(File$file){//移动至public/uploads$info=$file->validate(['ext'=>'jpg,jpeg,png,gif'])->move(ROOT_PATH.'public'.DS.'uploads');if($info){return$info->getSaveName();}returnfalse;}/***上传多张图片,返回值为保存路径数组,若有'error'则上传不成功*@paramFile$files*/functionaddImgs($files){$arr=[];foreach($filesas$file){$path=addImg($file);if($path){$arr[]=$path;}else{$arr[]='error';}}return$arr;}定义完成,在控制器中进行调用,代码如下,多余业务代码无需在意 单图上传://修改商城海报publicfunctionupdateshopbanner(){$where=['name'=>'shopbanner'];if(Request::instance()->isPost()){$file=request()->file('file');//单个图片上传$re=addImg($file);$re=$this->configModel->db->where($where)->setField('content',$re);if($re){$this->success('修改成功','','',1);}else{$this->error('修改失败');}}$rs=$this->configModel->db->where($where)->find();$this->assign('rs',$rs);returnview();}多图上传://添加维修单publicfunctionadd(){if($this->request->isPost()){$post=input('post.');$files=request()->file('image');//接收多个图片unset($post['image']);Db::startTrans();$post['addtime']=date('Y-m-dH:i:s');$result=$this->repairModel->db->insertGetId($post);if(!empty($files)){$repairpic=addImgs($files);//调用多个图片上传上传if(in_array('error',$repairpic)){Db::rollback();die(json_encode(['status'=>2,'msg'=>'图片上传失败,请稍后再试!']));}$repair=[];foreach($repairpicas$v){$arr=['url'=>$v,'repair_id'=>$result,];$re=$this->repairpicModel->db->insert($arr);if(!$re){$repair[]='error';}}if(in_array('error',$repair)){Db::rollback();die(json_encode(['status'=>2,'msg'=>'报修失败']));}}if($result){Db::commit();die(json_encode(['status'=>1,'msg'=>'报修成功!']));}else{Db::rollback();die(json_encode(['status'=>2,'msg'=>'报修失败!']));}}$uid=session('exist')['id'];$repair=$this->repairModel->db->where('uid',$uid)->order('addtimedesc')->limit(1)->find();returnview('',['uid'=>$uid,'repair'=>$repair]);}
注:关联统计仅针对一对多或者多对多的关联关系例如:category模型中关联article模型 //分类关联文章一对多publicfunctionarticle(){return$this->hasMany('Article','categoryid','categoryid')->field('id,title_name,status');}获取各分类下的文章数量,此时可以用withCount方法进行关联统计1,使用默认统计属性名a/不加过滤条件$rslist=Category::withCount('article')->select([1,3,6]);foreach($rslistas$row){echo'<pre>';print_r($row->article_count);//默认统计名以“关联方法名+_count”为名}/*结果:532*/b/加过滤条件$rslist=Category::withCount(['article'=>function($query){$query->where('status',0);}])->select([1,3,6]);foreach($rslistas$row){echo'<pre>';print_r($row->article_count);}2,使用自定义统计属性名//自定义属性名art_count$rslist=Category::withCount(['article'=>'art_count'])->select([1,3,6]);foreach($rslistas$row){echo'<pre>';print_r($row->art_count);}
获取用户数:Db::table('think_user')->count();//助手函数db('user')->count();或者根据字段统计:Db::table('think_user')->count('id');//助手函数db('user')->count('id');获取用户的最大积分:Db::table('think_user')->max('score');//助手函数db('user')->max('score');获取积分大于0的用户的最小积分:Db::table('think_user')->where('score>0')->min('score');//助手函数db('user')->where('score>0')->min('score');获取用户的平均积分:Db::table('think_user')->avg('score');//助手函数db('user')->avg('score');统计用户的总成绩:Db::table('think_user')->sum('score');//助手函数db('user')->sum('score');