11-16 thinkcmf
核心文件结构:simplewind--model--lite--model.class.php /controller.class.php
Mobile---controller:
获取错误信息:$this->apiError()$this->apiSuccess()
获取用户IP:get_client_ip()---model.class.php
统计条数: $count = M('Order')->where($where_s)->count();
条件判断:$where_s['id'] = array('in',$ids);
分页: $page = $this->page($count,10);
查找: $info = M('Order')->where($where_s)->order('vip desc,createtime desc')->limit($page->firstRow.','.$page->listRows)->select();
if ( $_GET['p']>ceil($count/10) )
{
$this->apiError( 'over' );
}else{
$this->apiSuccess( '获取成功',array('info'=>$info) );
}
查找:$data = array( 'uid'=>$this->user['id'],'orderid'=>$_POST['id'] );
$info = M('grab_order')->where($data)->find();
$vo['grab_user_nicename'] =M('users')->where(array('id'=>$grab['uid']))->field('user_nicename')->find();
查找: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');
添加: $data['time'] = NOW_TIME; $res = M('grab_order')->add($data);
保存: $rel = M('order')->where($where)->save($data);
更改设置: M('order')->where(array('id'=>$_POST['id']))->setField('status',1);
图片地址: $vo['avatar'] = "http://".C('SERVER_NAME').C('GRAB_SET_PATH').$user['avatar'];
推送消息: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');
$mes = array( 'orderid'=>$_POST['id'],'msg'=>'您派发的订单已被抢,快去看看吧','type'=>2); if( (int)$this->pushcontent_test($user_login) ){
$re = pushcontent( 0,$user_login,$mes,array(),2 );}
写入数据过滤:filter() $this->data($data)->filter('strip_tags')->add();
I方法:I('变量类型.变量名',['默认值'],['过滤方法'])变量类型是指请求方式或者输入类型,
意为{input}是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是
Htmlspecialchars strip_tags interval
get 获取GET参数 post 获取POST参数
request 获取REQUEST 参数 put 获取PUT 参数
session 获取 $_SESSION 参数 cookie 获取 $_COOKIE 参数
server 获取 $_SERVER 参数 globals 获取 $GLOBALS参数
param 自动判断请求类型获取GET、POST或者PUT参数 param类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效)
注意:变量类型不区分大小写。变量名严格区分大小写。默认值和过滤方法均属于可选参数。
echo I('get.name');// 相当于 $_GET['name']
I('session.user_id',0);// 获取$_SESSION['user_id'] 如果不存在则默认为0
echo I('get.name','','htmlspecialchars');// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
http://serverName/index.php/New/2013/06/01
echo I('param.1');// 输出2013
param变量类型的写法可简化:I('id');// 同I('param.id')I('name');// I('param.name')
Thinkphp3.2添加了一个I方法,取义Input,用来获取前台提交过来的数据。
I方法是放在了/ThinkPHP/Common/function.php之中
C()方法:C方法是ThinkPHP用于设置、获取,以及保存配置参数的方法,使用频率较高。
设置参数
C('DB_NAME','thinkphp');
表示设置DB_NAME配置参数的值为thinkphp,由于配置参数不区分大小写
$config['user_id'] = 1; $config['user_type'] = 1; C($config);
如果C方法的第一个参数传入数组,就表示批量赋值,上面的赋值相当于:
C('USER_ID',1); C('USER_TYPE',1);
获取参数 要获取设置的参数,可以用:
$userId = C('USER_ID'); $userType = C('USER_TYPE');
如USER_ID参数尚未定义过,则返回NULL。如传入的配置参数为空,表示获取全部的参数:
$config = C();
保存设置
3.1版本增加了一个永久保存设置参数的功能,仅针对批量赋值的情况,例如:
$config['user_id'] = 1; $config['user_type'] = 1; C($config,'name');
在批量设置了config参数后,会连同当前所有的配置参数保存到缓存文件(或者其他配置的缓存方式)。保存之后,如果要取回保存的参数,可以用
$config = C('','name');
其中name就是前面保存参数时用的缓存的标识,必须一致才能正确取回保存的参数。取回的参数会和当前的配置参数合并,无需手动合并
惯例配置文件:simplewind--core---conf---convention。Php
require SPAPP_PATH.'Core/ThinkPHP.php';//载入框架核心文件
R()方法在其他控制器里面调用这个操作方法(一般R方法用于跨模块调用是A()升级)
R('[项目://][分组/]模块/操作','参数','控制器层名称')
R('Admin/User/detail',array('5'));
表示调用Admin分组下面的User控制器的detail方法。
R('Admin://User/detail',array('5'));
表示调用Admin项目下面的User控制器的detail方法。
官方建议不要在同一层多太多调用,会引起逻辑的混乱,被公共调用的部分应该封装成单独的接口,可以借助3.1的新特性多层控制器,单独添加一个控制器层用于接口调用,例如,我们增加一个Api控制器层,
class UserApi extends Action { public function detail($id){ return M('User')->find($id); } }
然后,使用R方法调用。也就是说,R方法的第三个参数支持指定调用的控制器层。
$data = R('User/detail',array('5'),'Api');
别名定义:application-common-conf-alias.php "Dir" => SPAPP_PATH.'Lib/Util/Dir.class.php',
文件加载:导入文件,一般来说lib目录下的文件可以实现自动加载,
方法一:impor (‘ page ’) ; $obj = new page();
方法二:import("ORG.ThinkSDK.ThinkOauth");$qq = ThinkOauth::getInstance('qq', $token);也可以直接实例化:$htt = new OrgNetHttp();
方法三: import("Org.Net.Http",dirname(__FILE__),".class.php");
$htt = new Http(); //反斜线代表跳出当前命名空间
$htt::download($file_path,$file_name);
registerController.class.php:
获取验证码: getMsgcode()
$map['time'] = array( 'lt',$time - 300 );
M('msgcode')->where($map)->delete();
$where['tel'] = $_POST['tel'];
$info = M('msgcode')->where($where)->find();
注册:doregister()
$data['user_login'] = $_POST['tel'];
$data['create_time'] = date( 'Y-m-d H:i:s',$time );
$data['user_status'] = 1;
$data['user_type'] = 2;
$res = M('users')->add($data);
问题:注册验证码没变?
登陆:login()登陆--版本升级--session--广告--发布内容--头像证件等地址--会员级别--
$where['user_login'] = $_POST['user_login'];
$info = M('Users')->where($where)->find();
//判断手机端的版本号和服务端最大的版本号是否相等
if( isset($_REQUEST['version']) && $_REQUEST['version'] != $version['id'])
{
//返回版本文件路径
$info['ver_file'] = "http://".C('SERVER_NAME').C('USER_APP_PATH').$version['filename'].".apk";
$info['force_update'] = $version['is_force_update'];
}
//登陆查找数据
$_SESSION['user'] = $info['id'];
$data = array( 'last_login_ip'=>get_client_ip(),'last_login_time'=>date( 'Y-m-d H:i:s') );
$adminappad = M('appad')->where(array('type'=>1))->field('content,pic')->find();
//广告
$sp_slide=M('slide');
$data=$sp_slide->select();
if($adminappad['pic']){
$ads = explode(';',$adminappad['pic']);
$appad['pic1'] = "http://".C('SERVER_NAME').$data[0]['slide_pic'];
$appad['adrr1']= $data[0]['slide_url'];}
/*Begin Edit for[增加显示广告的内容和链接] At[2015-10-17]*/
$content_ad=M('ad')->field('ad_name,ad_content')->find();
$appad['content']=$content_ad['ad_name'];
$appad['ad_url']=$content_ad['ad_content'];
广告表单 Sp_appad:type 1超级管理员 2 代理商 name 、content 广告内容 time、pic图片多张
广告 Sp_slide:slide_name、slide_cid、slide_pic、slide_url、slide_content
广告内容:ad_name 、ad_content、ad_status
发布内容 sp_classify :name 内容、uid 添加者id、time添加时间
问题:手机版本号怎么判断?
getCityId()在哪?
获取图片和地址为什么是二维数组?
为什么添加那么多表单?
版本检测:appversion()
orderController.class.php:订单控制页
推送列表:index() 过期时间-发单分页- 遍历每条消息-推送时间
//发单分页
$count = M('Order')->where($where)->count();
$page = $this->page($count,10);
$info=M('Order')->where($where)->order('createtime')->limit($page->firstRow.','.$page->listRows)->select();
问题:分页limit后的数据怎么回事?
11-17 thinkcmf
MVC:v层引用m层通过require-once包含文件,实例化model,调用类的方法,
实现v层,通过Smarty,采用标签形式实现v的展示。
模型(M):模型的定义由Model类来完成。
控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。
视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。
但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。
总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。
OrderController.class.php 订单控制页
推送列表:index() 过期时间-发单分页- 遍历每条消息-推送时间
pushcontent_test($people):判断推送人推送时间是否过期
$where_content['user_login']=$people;
$condition_content=M('users')->where($where_content)->find();
$condition_stime=strtotime( $condition_content['pushstime']);
推送时间判断:pushstime推送开始时间<time<pushetime推送结束时间
Push:是否接受推送
grab_list() :抢单列表 显示抢单分页列表--单条抢单信息--多余的显示到历史
$where['uid'] = $this->user['id']; //推送用户
if ( $user['avatar'] ){ //用户头像路径
$vo['avatar'] = "http://".C('SERVER_NAME').C('GRAB_SET_PATH').$user['avatar'];}
Add():派单推送消息 判断content 内容time任务时间不为空--VIP用户判断--添加到 sp_order表--添加后根据要求查询推送用户---推送信息到用户
$where['lng'] = array( array( 'gt',$lng - 0.5 ),array( 'lt',$lng + 0.5 ),'and' );
$where['lat'] = array( array( 'gt',$lat - 0.5 ),array( 'lt',$lat + 0.5 ) );
$order = 'ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((lat * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((lat * 3.1415) / 180 ) *COS(('.$lng.'* 3.1415) / 180 - (lng * 3.1415) / 180 ) ) * 6380 asc';
$info = M('Users')->where($where)->field('id,user_login')->order($order)->select();
查询条件中有比较采用数组$where['id'] = array( 'neq',$this->user['id'] );
$mes = array( 'orderid'=>$res,'msg'=>'有新的订单了' );
foreach ( $info as $vo ) { if( (int)$this->pushcontent_test($vo['user_login']) ){
推送消息 pushcontent( 0,$vo['user_login'],$mes,array(),2 ); }}
sendone() :推送给指定人员
if(empty($_POST['user_login'])){ $this->apiError('非法操作'); }
$mes = array( 'orderid'=>$_POST['orderid'],'msg'=>'有新的订单指定发给你了','type'=>2);
$res = pushcontent( 0,$_POST['user_login'],$mes,array(),2 );
switchState():派单和抢单状态切换 --statue1接单切换到0---0到1
isset($_post[‘statue’])
$res = M('Users')->where(array('id'=>$this->user['id']))->setField( 'state',$state );
$this->apiSuccess( array('state'=>$state) );
grab_set() :抢单设置 --接收图片--名字、证件照、验证,保存至user表
$filetype = pathinfo( $_FILES['pic']['name'] );
加载文件 import ( 'UploadFile' );
$upload = new UploadFile(); // 实例化上传类
$upload->maxSize = 8388608; // 最大上传文件为8M
$upload->allowExts = array('jpg', 'png', 'jpeg'); //上传类型只能为".apk"格式的文件
$upload->savePath = SITE_PATH.C('GRAB_SET_PATH');
$upload->saveRule = $name;
$info = $upload->upload();
11-18 thinkcmf
OrderController.class.php 订单控制页
grab_index() :抢单列表--判断验证审核、抢单设置--根据条件查找推送用户(半径确定派单用户)--将派单用户显示并显示用户详情 $juli=round(6378.138*2*asin(sqrt(pow(sin(($lat1*pi()/180-$v['lat']*pi()/180)/2),2)+cos($lat1*pi()/180)*cos($v['lat']*pi()/180)* pow(sin( ($lng1*pi()/180-$v['lng']*pi()/180)/2),2)))*1000)
//不能看到自己抢过的订单
$where_grab['orderid'] = $v['id']; 订单id
$where_grab['uid'] = $this->user['id']; 用户id
$grab_list = M('grab_order')->where($where_grab)->find();
//5个人抢过的订单不显示,根据orderid查找grab_order中的人数
$where_gr['orderid'] = $v['id'];
$total = M('grab_order')->where($where_gr)->count();
//搜索一点距离以内的所有订单
if(($juli<$r) && (empty($grab_list)) && $total<5){
$ids[]=$v['id'];}
grab_add() :立即抢单--判断权限、订单存在、判断是否已抢单--添加抢单人信息至 grab_order表,同时更改order表的status=1--推送消息给派单人
推送消息: $user_login = M('users')->where("id=".$order['userid'])->getField('user_login');
$mes = array( 'orderid'=>$_POST['id'],'msg'=>'您派发的订单已被抢,快去看看吧','type'=>2);
if( (int)$this->pushcontent_test($user_login) ){
$re = pushcontent( 0,$user_login,$mes,array(),2 );
order_his():历史发单列表---分页历史发单信息---遍历抢单信息
$where['status'] = array('neq',0);
$where['userid'] = $this->user['id'];。。。。。。
$vo['grabnum'] = count( $grabInfo );
foreach ( $grabInfo as $grab ){ $vo['grab_user_nicename'] = M('users')->where(array('id'=>$grab['uid']))->field('user_nicename')->find(); }
$info[$k]['grab'] = $vo;
grab_order_his() :历史抢单列表--分页抢单信息---遍历显示发单信息
$order_hisInfo=M('order_his')->where(array('orderid'=>$v['orderid']))->field('userid,ordernum,content,status')->find();
$info[$k]['ordernum'] = $order_hisInfo['ordernum'];
$info[$k]['content'] = $order_hisInfo['content'];
$info[$k]['user_nicename'] = M('users')->where(array('id'=>$order_hisInfo['userid']))->getField('user_nicename');
$info[$k]['status'] = $order_hisInfo['status'];
del_orderHis():历史发单列表删除--查找order_his,将status=0删除
$where['id'] = I( 'post.id' ); //等同$_post[‘id’]
del_grabHis():历史发单列表删除--查找del_grabHis,将status=0删除
show_lnglat() :获取用户附近派单信息----根据条件查找sp_user派单用户---计算半径--将范围内的用户发出去
$surplus_time = ($createtime+($limit_time*24*3600))-time();
$where_time['_string']="id!=$userid AND grab_status=3 AND push=1 AND user_status=1 AND user_type!=1 AND state=1 AND cityid=$cityid AND find_in_set('$classid',classid)";
$usersInfo = M('users')->where($where_time ->field('id,user_login,user_nicename,lng,lat,sex,grab_grade,classid')->select();
问题:不是时间戳也可以相减吗?
多个条件还可以用$arr[_string]=’...and...and’ ?
order_del():取消派单或者取消接单 ---取消派单---取消接单
if($info['userid']==$_SESSION['user']){ //判断是取消派单
$id = I('post.id');
$info = M('order')->where("id=$id")->find();
if(empty($info)){ $this->apiError( '订单不存在' ); }
unset($info['id']); $info['orderid'] = $id;}
注销id是因为$info包含了order的信息,查询order_grab orderID=$info【id】
问题:$info['userid']在哪查找?
order_complaint():派单人投诉-----添加投诉信息
$res = M('order_his')->add($info);
问题:应该用setfield 更新投诉,为什么用add()?? 因为没有判断历史里面有没有
grab_grade():派单人评价订单----将评价的订单添加到历史中更改状态同时删除order中数据----将grab_order中的添加到历史,更改状态,同时删除
$data['grab_grade'] = round(($user['grab_grade']+$_POST['grab_grade'])/2,1);
$data['grab_assess'] = $_POST['grab_assess'];
M('users')->where('id='.$user['id'])->save($data);。。。。。。
$order['orderid'] = $order['id'];
unset($order['id']);
$order['status'] = 6;//订单结束(任务完成,已经评价完)
$res = M('order_his')->add($order);
问题:为什么可以直接保存或者添加数据,会不会覆盖原来数据???
add_errorlog():对抢单人评价 不用了
11-19 thinkcmf
user_gettoken():融云聊天---判断gettoken存在发起的联系人获取通讯录---不存在创建(添加好友至通讯录,更新maillist表,反向添加好友)
$uidsarr = explode(',',$uids);
foreach($uidsarr as $v){ $user = M('users')->where('id='.$v)->field('user_nicename,gettoken,user_login')->find();$list[] = $user;
$this->apiSuccess('获取成功',array('token'=>$res['gettoken'],'list'=>$list));
confirm_grabuser():确定抢单人,并推送消息 ---确定抢单人后加钱并发送消息,-- 修改grab_order的status=10请派单人验收任务-----遍历其他抢单人信息添加到历史抢单信息中,删除grab_order中信息
$v['status'] = 0;
$res = M('grab_order_his')->add($v);
if($res){ M('grab_order')->where('id='.$id)->delete() }
confirm_check():派单人验收工作 ---- 判断是确认还是评价---验收完成结算钱发消息---等待验收
//flag=0确认工作完成,派单人要验收工作
//flag=1派单人点击验收按键提交,推送给抢单人
if($_POST['flag']==1){
if(!$res || $res['status']!=4){ $this->apiError('非法操作');}
$data['status'] = 5;//等待评价(派单人去评价抢单人完成任务的状况)
}else{ if(!$res || $res['status']!=2){ $this->apiError('非法操作');}
$data['status'] = 4;//等待您验收任务(抢单人已经完成任务,等待派单人验收) }
CenterController.class.php 个人中心页
setInfo(): 接收图片---修改密码
if ( isset( $_FILES['pic'] ) )
{
if ( empty( $_FILES['pic']['tmp_name'] ) )
{
$this->apiError( '图片不能为空' );
}
$filetype = pathinfo( $_FILES['pic']['name'] );
$name = $this->user['user_login'].'_'.NOW_TIME;
import ( 'UploadFile' );
$upload = new UploadFile(); // 实例化上传类
$upload->maxSize = 8388608; // 最大上传文件为8M
$upload->allowExts = array('jpg', 'png', 'jpeg'); //上传类型只能为".apk"格式的文件
$upload->savePath = SITE_PATH.C('GRAB_SET_PATH');
$upload->saveRule = $name;
$info = $upload->upload();
if ( !$info )
{ // 上传错误提示错误信息
$this->apiError( $upload->getErrorMsg() );
}
$avatar = $name.'.'.$filetype['extension'];
$res = M('users')->where(array('id'=>$this->user['id']))->setField('avatar',$avatar );
if ( $res )
{
$url = "http://".$_SERVER['HTTP_HOST'].sp_get_user_avatar_url($avatar);
$this->apiSuccess( '头像保存成功',array('avatar'=>$url));
}
else
{
$this->apiError( '头像保存失败' );
} }。。。。
$key = array_keys( $_POST );
$res = M('Users')->where( array( 'id'=>$this->user['id'] ) )->setField( $key[0],$_POST[$key[0]] );
问题:最后不知道修改的什么????
set_grab():添加抢单设置----修改抢单状态
$res = M('users')->where($where)->save($_POST);
get_ErrorMsg():得到系统错误信息
$filename =$person['user_login'].'_'.date('Ymd_His').'.txt';
$full_path =C('CRASH_FILE').$filename;
$fp = fopen( $full_path,'w' );
fwrite( $fp, $_POST['stack'] );
fclose($fp);