核心文件結構:simplewind--model--lite--model.class.php /controller.class.phpphp
Mobile---controller:html
獲取錯誤信息:$this->apiError()$this->apiSuccess()thinkphp
獲取用戶IP:get_client_ip()---model.class.php api
統計條數: $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();cookie
if ( $_GET['p']>ceil($count/10) )session
{併發
$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 Org\Net\Http();
方法三: 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);