屬于你自己的Qzone (3)---- 注冊登錄趣席,修改信息

在前一篇文章我們已經導入使用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

測試.PNG

根據我們的文檔填寫必須要的參數洼滚,和正確的接口地址,發(fā)送之后可以得到json串和提示信息技潘,當然你可以根據能接受的錯誤來進行測試遥巴,比如說少個參數,file格式不對等享幽,全方面的檢查系統的容錯能力铲掐,這里我就不演示了,我們可以看一下數據庫

數據庫.PNG

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的一些提示信息了蝌以。

那么我們用小白用戶來測試一下

測試.PNG

可以看到200的狀態(tài)。

錯誤測試.PNG

當我們修改錯誤密碼的時候何之,可以看到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)晃酒,我們可以看一下演示。

測試.PNG

可以看到我們修改操作也是很順利窄绒,那么數據庫也會更新贝次。

測試

可以看到不僅簽名修改了,更新時間也會跟著修改彰导,那么后來我又添加了一個注冊時間蛔翅,這個時間是不能變化的。

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路徑查看日志文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市空盼,隨后出現的幾起案子书幕,更是在濱河造成了極大的恐慌,老刑警劉巖揽趾,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台汇,死亡現場離奇詭異,居然都是意外死亡但骨,警方通過查閱死者的電腦和手機励七,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奔缠,“玉大人掠抬,你說我怎么就攤上這事⌒0ィ” “怎么了两波?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵瞳步,是天一觀的道長。 經常有香客問我腰奋,道長单起,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任劣坊,我火速辦了婚禮嘀倒,結果婚禮上,老公的妹妹穿的比我還像新娘局冰。我一直安慰自己测蘑,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布康二。 她就那樣靜靜地躺著碳胳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沫勿。 梳的紋絲不亂的頭發(fā)上挨约,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音产雹,去河邊找鬼诫惭。 笑死,一個胖子當著我的面吹牛洽故,可吹牛的內容都是我干的贝攒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼时甚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哈踱?” 一聲冷哼從身側響起荒适,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎开镣,沒想到半個月后刀诬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡邪财,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年陕壹,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片树埠。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糠馆,死狀恐怖,靈堂內的尸體忽然破棺而出怎憋,到底是詐尸還是另有隱情又碌,我是刑警寧澤九昧,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站毕匀,受9級特大地震影響铸鹰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜皂岔,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一蹋笼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躁垛,春花似錦姓建、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至活玲,卻和暖如春涣狗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舒憾。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工镀钓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镀迂。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓丁溅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親探遵。 傳聞我的和親對象是個殘疾皇子窟赏,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容