在前一篇文章我們已經導入使用THinkphp并且測試了一個登錄接口,那么這篇文章醇蝴,我們就來正兒八經的寫注冊和登錄接口啦宣肚。
1.注冊(LoginController.class.php)
我們用LoginController作為用戶管理類,所以注冊接口也寫在其中
那么我們習慣在寫接口的時候悠栓,把相關信息寫在注釋里
/* -------------------------------------------------------------
* 用戶注冊接口
* URL地址:Home/Login/register
* 方法:POST
* 參數1:name(用戶名)(String)(必填字段)(示例:admin)
* 參數2:pass(密碼)(String)(必填字段)(示例:admin)
* 參數3:sign(個性簽名)(String)(必填字段)(示例:這個人太懶霉涨,沒有個簽)
* 參數4:face(頭像)(File,jpg惭适,png笙瑟,ipeg)(必填字段)(示例:jpg,png癞志,ipeg)
* 返回:json{jcode,jmsg.jdata.jmore}
* 字段說明:200注冊成功往枷,400注冊失敗
* --------------------------------------------------------------
* */
public function register(){
//默認數據
$res = normal_json();
//接收post數據,判斷正確后凄杯,并且創(chuàng)建數組
$data['name'] = I('post.name');
$data['pass'] = I('post.pass');
$data['sign'] = I('post.sign');
if($data['name'] && $data['pass']&&$data['sign']){
//上傳頭像
$up = new Upload(); //對象
$up->maxSize = 315728; //大小
$up->exts = array('jpg','png','jpeg'); //種類
$up->savePath = '/Image/Head/'; //path
$info = $up->upload();
if(!$info){
$res['jcode'] = 400;
$res['jmsg'] = 'head upload error'.$up->getError();
}else{
foreach ($info as $file){
//加載照片地址
$data['face'] = $file['savepath'].$file['savename'];
}
//在model類里處理數據
$res = M('\Home\Model\LoginModel:'.self::Customer_Table)->Register($data);
}
}else{
$res['jcode'] = 400;
$res['jmsg'] = "There is some empty field";
}
e_json($res);
}
看起來很簡單的樣子错洁,其實就是接受一些數據,字符串的話直接交給LoginModel處理(注意這里的用戶表就要換上了self::Customer_Table戒突,我在這里定義了一個常量)屯碴,頭像的話,直接交給upload類來管理膊存,處理完成返回圖像儲存地址导而,我們在LoginModel里定義了同名方法,用于操作數據庫
/*注冊*/
public function Register($data) {
//默認json數據
$res = normal_json();
//查詢用戶;
$dlist = $this ->where("name='%s'",$data['name']) ->find();
//如果找到膝舅,說明已經有重名用戶
if($dlist){
//用戶存在
$r['jcode'] = 404;
$r['jmsg'] = 'User name already exists';
}else {
//密碼加密
$data['pass'] = md6($data['pass']);
//添加日期
$data['crtime'] = date('Y-m-d H:i:s');
//默認更新日期0000
$data['uptime'] = '0000';
//開始添加
if ($this->add($data)){
$r['jcode'] = 200;
$r['jmsg'] = 'register was success';
}else{
$r['jcode'] = 404;
$r['jmsg'] = 'Operation database failed';
}
}
//返回$r
return $r;
}
這里主要用到了thinkphp的CURD操作中的add方法嗡载,用于添加新用戶數據,然后根據具體的操作情況來返回值仍稀,最后在controller 里面返回json
根據我們的文檔填寫必須要的參數洼滚,和正確的接口地址,發(fā)送之后可以得到json串和提示信息技潘,當然你可以根據能接受的錯誤來進行測試遥巴,比如說少個參數,file格式不對等享幽,全方面的檢查系統的容錯能力铲掐,這里我就不演示了,我們可以看一下數據庫
Ok已經有了本條數據了值桩。那么我們的注冊邏輯也算到這摆霉。
2.登錄(LoginController.class.php)
登錄在上一篇文章寫過,但是這次的登錄做了一些修改,所以還是貼代碼携栋。
/* -------------------------------------------------------------
* 用戶登錄接口
* URL地址:Home/Login/login
* 方法:POST
* 參數1:name(用戶名)(String)(必填字段)(示例:admin)
* 參數2:pass(密碼)(String)(必填字段)(示例:admin)
* 返回:json
* --------------------------------------------------------------
* */
public function login(){
//接受I方法的post數據搭盾,執(zhí)行customer的login方法,返回json數據
e_json(M('\Home\Model\LoginModel:'.self::Customer_Table)->Login(I('post.name'), I('post.pass')));
}
那么在LoginModel里coding我們的同名方法
/*登錄*/
public function Login($name, $pass) {
//默認json數據
$res = normal_json();
//查詢用戶
$map['name'] = $name;
//找到的信息
$dlist = $this ->where( $map) ->find();
//如果找到婉支,進行加密比較
if( $dlist){
if( $dlist['pass'] == md6($pass)) {
$r['jcode'] = 200;
$r['jmsg'] = 'Login verification through';
}else {
//密碼錯誤
$r['jcode'] = 400;
$r['jmsg'] = 'User name or password entered error';
}
}else {
//未注冊
$r['jcode'] = 404;
$r['jmsg'] = 'User name not registered';
}
//返回$r
return $r;
}
這里主要是CURD的查找操作鸯隅,使用where( $map) ->find()查詢數據,很常見向挖,那么剩下的就是if else的一些提示信息了蝌以。
那么我們用小白用戶來測試一下
可以看到200的狀態(tài)。
當我們修改錯誤密碼的時候何之,可以看到400的狀態(tài)
3.修改用戶信息(除用戶名及頭像)(LoginController.class.php)
這里單獨分離一個方法用于修改用戶信息跟畅,但是我們規(guī)定用戶名不能隨便改,其實不太現實帝美,但是可以改的話也并沒有什么難度碍彭,這里只是想以用戶名作為用戶唯一標志晤硕,實際情況中悼潭,可以以手機號作為唯一標識等。
那么看一下這個方法
/* -------------------------------------------------------------
* 更新用戶信息接口(除頭像)
* URL地址:Home/Login/updateCustomerInfo
* 方法:POST
* 參數1:name(用戶名)(String)(必填舞箍,用于匹配用戶)(示例:admin)
* 參數2:pass(原密碼)(String)(選填)(示例:admin)
* 參數2:new_pass(新密碼)(String)(原密碼填寫時本項必填)(示例:admin)
* 參數3:sign(個性簽名)(String)(選填)(示例:這個人太懶舰褪,沒有個簽)
* 返回:json{jcode,jmsg.jdata.jmore}
* 字段說明:200更新成功,400更新失敗
* --------------------------------------------------------------
* */
public function updateCustomerInfo(){
//默認數據
$res = normal_json();
//接收post數據疏橄,判斷正確后占拍,并且創(chuàng)建數組
$data['pass'] = I('post.pass');
$data['new_pass'] = I('post.new_pass');
$data['sign'] = I('post.sign');
$data['name'] = I('post.name');
$res = M('\Home\Model\LoginModel:'.self::Customer_Table)->UpdateCustomerInfo($data,$data['name']);
e_json($res);
}
將數據封裝在數組里傳遞給loginmodel,同樣我們看一下loginmodel的同名方法
/*更新用戶信息(除頭像)*/
public function UpdateCustomerInfo($data,$name){
$r = normal_json();
$data['name'] = $name;
if($data['pass']&&$data['new_pass']){
//更新密碼
//檢驗舊密碼是否合法
if($data['pass'] == $data['new_pass']){
$r['jcode'] = 400;
$r['jmsg'] = 'The two password value is equal';
}else{
//建立查詢條件
$map['name'] = $data['name'];
$map['pass'] = md6($data['pass']);
//加密密碼
$data['pass'] = md6($data['new_pass']);
$dlist = $this ->where($map) ->save($data);
if($dlist){
$r['jcode'] = 200;
$r['jmsg'] = 'pass update success';
}else{
$r['jcode'] = 400;
$r['jmsg'] = 'pass update failed';
}
}
}
if($data['sign']){
//更新簽名
$dlist = $this ->where("name='%s'",$name) ->save($data);
if($dlist){
$r['jcode'] = 200;
$r['jmsg'] = 'sign update success';
}else{
$r['jcode'] = 400;
$r['jmsg'] = 'sign update failed';
}
}
return $r;
}
那么這里用到的是$this ->where("name='%s'",$name) ->save($data)這樣的語句來更新數據庫捎迫,同樣的也是根據各種情況返回狀態(tài)晃酒,我們可以看一下演示。
可以看到我們修改操作也是很順利窄绒,那么數據庫也會更新贝次。
可以看到不僅簽名修改了,更新時間也會跟著修改彰导,那么后來我又添加了一個注冊時間蛔翅,這個時間是不能變化的。
4.修改頭像信息(LoginController.class.php)
那么由于頭像是個文件位谋,那么我們這里單獨寫了一個方法山析,修改頭像要考慮的事情還是很多的,其實在注冊的時候可以省略添加頭像的那部分掏父,但是怎么寫都一樣笋轨,我們暫時不考慮效率問題,
/* -------------------------------------------------------------
* 更新用戶頭像接口
* URL地址:Home/Login/updateHead
* 方法:POST
* 參數1:face(頭像)(File,jpg爵政,png鸟款,ipeg)(必填字段)(示例:jpg,png茂卦,ipeg)
* 參數2:name(用戶名)(String)(必填字段)(示例:admin)
* 返回:json{jcode,jmsg.jdata.jmore}
* 字段說明:200更新成功何什,400更新失敗
* --------------------------------------------------------------
* */
public function updateHead()
{
//默認數據
$res = normal_json();
$data['name'] = I('post.name');
//上傳頭像
$up = new Upload(); //對象
$up->maxSize = 315728; //大小
$up->exts = array('jpg', 'png', 'jpeg'); //種類
$up->savePath = '/Image/Head/'; //path
$info = $up->upload();
if (!$info) {
$res['jcode'] = 400;
$res['jmsg'] = 'head upload error' . $up->getError();
} else {
foreach ($info as $file) {
//加載照片地址
$data['face'] = $file['savepath'] . $file['savename'];
}
//在model類里處理數據
$res = M('\Home\Model\LoginModel:'.self::Customer_Table)->UpdateHead($data);
}
e_json($res);
}
這里不必多說,就是使用upload類來管理上傳等龙,最后獲取上傳后的信息处渣,那么我們來看一下loginmodel里的同名方法,
可以看到我們不僅寫了一個UpdateHead方法,還有一個GetHead方法用于獲取原來的頭像url蛛砰,當我們新頭像url保存成功之后罐栈,我們會使用unlink方法把舊頭像刪除掉,注意參數(('./Uploads'.$url)最好寫成相對路徑泥畅,因為我們開發(fā)環(huán)境是windows荠诬,運行環(huán)境是linux,采用相對路徑會避免一些錯誤
/*更新頭像*/
public function UpdateHead($data){
$r = normal_json();
//獲取頭像鏈接
$url = $this->GetHead($data);
//查詢
$dlist = $this ->where("name='%s'",$data['name'])->save($data);
if($dlist){
//刪除舊頭像
unlink('./Uploads'.$url);
$r['jcode'] = 200;
$r['jmsg'] = 'head update success';
}else{
$r['jcode'] = 400;
$r['jmsg'] = 'head update failed';
}
return $r;
}
/*內部方法
* 獲取頭像地址
*/
public function GetHead($data){
//獲取用戶
$dlist = $this ->where("name='%s'",$data['name']) ->find();
if($dlist){
return $dlist['face'];
}else{
return null;
}
}
那么這個我就不演示了位仁,當我們post此接口時柑贞,傳遞face照片過去,服務器端的舊照片就會被刪掉聂抢,同時數據庫的url也會得到更新钧嘶。
5.文檔
我們可以根據每個方法上面的注釋文字,整合成API文檔供前端調用琳疏。
6.Tips
小貼士:當你測試時候不好觀察結果時可以使用Log::record方法記錄日志有决,通過Weibo\Runtime\Logs\Home路徑查看日志文件