亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

注冊和登錄

1.前言

由于 HTTP 請求是一種無狀態的請求,所以服務器不知道是誰在操作,所以服務器為用戶創建了指定的 SESSION,主要作用是用來標識并且跟蹤用戶的,當某個用戶向服務器發起請求時,服務器會首先檢查這個用戶的請求里是否已包含了一個 SESSION 標識(SESSION ID),如果已包含則說明以前已經為此客戶端創建過 SESSION,服務器就按照 SESSION ID 把這個 SESSION 檢索出來使用,如果用戶的請求不包含 SESSION ID,就會為該用戶創建一個 SESSION,并且生成一個與該 SESSION 關聯的 SESSION IDCOOKIE 是服務器在用戶本地機器上存儲的小段文本并隨每一個請求發送至同一個服務器,COOKIE 也可以用來保存用戶信息,和 SESSION 相比,COOKIE 是保存在用戶端的(如瀏覽器),下面通過登錄注冊的例子來說明 SESSIONCOOKIE 的作用。

2.新建登錄注冊表

2.1 確定字段

字段名稱 含義
id 自增主鍵
sex 性別,0-保密,1-男,2-女
birthday 生日
last_login_time 最后登錄時間
create_time 注冊時間
user_status 用戶狀態,0-禁用,1-正常,2-未驗證
username 用戶名
password 密碼
nickname 昵稱
last_login_ip 最后登錄ip

2.2 選擇字段的數據類型

字段名稱 數據類型
id BIGINT(20)
sex TINYINT(2)
birthday INT(11)
last_login_time INT(11)
create_time INT(11)
user_status TINYINT(2)
username VARCHAR(60)
password VARCHAR(64)
nickname VARCHAR(50)
last_login_ip VARCHAR(15)

2.3 新建數據表

CREATE TABLE `login` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sex` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '性別,0-保密,1-男,2-女',
  `birthday` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '生日',
  `last_login_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后登錄時間',
  `create_time` int(11) NOT NULL COMMENT '注冊時間',
  `user_status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '用戶狀態,0-禁用,1-正常',
  `username` varchar(60) NOT NULL DEFAULT '' COMMENT '用戶名',
  `password` varchar(64) NOT NULL DEFAULT '' COMMENT '密碼',
  `nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '昵稱',
  `last_login_ip` varchar(15) NOT NULL DEFAULT '' COMMENT '最后登錄ip',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3.注冊

3.1 新建注冊路由

//注冊界面
Route::get('register','login/register');

如下圖所示:
圖片描述

3.2 新建控制器和注冊界面方法

    /**
     * 用戶注冊界面
     * @return string
     */
    public function register(){
        return View::fetch('login/register');
    }

如下圖所示:
圖片描述

Tips: 其中 View::fetch 表示調用模板引擎。

3.3 新建 html 模板

如下圖所示,在 view\login 目錄中新建 register.html 模板文件:
圖片描述

Tips: 模板文件可根據自己需求定義,css、js 文件可以按照圖中格式引入,從圖中可以看到注冊信息提交至 login/do_register中。

3.4 定義信息注冊數據處理方法

    /**
     * 用戶注冊信息校驗入庫
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function do_register(){
        $captcha = $this->request->param('captcha'); //驗證碼
        $password = $this->request->param('password'); //密碼
        $re_password = $this->request->param('re_password'); //重復密碼
        $username = $this->request->param('username'); //用戶名
        if(empty($captcha) ||empty($password) || empty($re_password) || empty($username)){
            throw new HttpException(400,"必要參數不能為空");
        }
//        //校驗驗證碼是否正確
//        if(!captcha_check($captcha)){
//            throw new HttpException(400,"驗證碼不正確");
//        };
        //校驗兩次密碼書否輸入一致
        if($password != $re_password){
            throw new HttpException(400,"兩次輸入密碼不一致");
        }
        //檢查用戶名是否已經被注冊過
        if(!empty(LoginModel::where('username',$username)->find())){
            throw new HttpException(400,"用戶名已經存在");
        }

        try {
            $login = new LoginModel();
            $login->sex = $this->request->param('sex',0);//性別賦值,默認值保密
            $login->birthday = strtotime($this->request->param('birthday'));//生日轉化為時間戳賦值
            $login->create_time = time();//注冊時間為當前時間
            $login->user_status = 1;//用戶狀態 0-禁用  1-正常
            $login->username = $username;
            $login->password = md5($password."test");//密碼加密
            $login->nickname = $this->request->param('nickname');//用戶昵稱
            $login->save();//保存
        }catch(\Exception $exception){
            throw new HttpException(400,"注冊失敗");
        }

        return json("請求成功");
    }

用戶注冊界面如下:
圖片描述

3.5 視頻演示

4.用戶登錄

4.1 開啟 SESSION

打開 app\middleware.php 文件,將 \think\middleware\SessionInit::class 注釋去掉,如下圖所示:
圖片描述

4.2 新建注冊路由

//用戶登錄界面
Route::get('login','login/login');

//獲取用戶登錄信息
Route::get('userinfo','login/userinfo');

如下圖所示:
圖片描述

4.3 新建控制器和注冊界面方法

    /**
     * 用戶登錄界面
     * @return string
     */
    public function login(){
        //若存在seesion信息則直接跳過
        if(session('user_info')){
            return json("登錄成功");
        }
        //若存在cookie信息則直接跳過
        if(cookie("user_info")){
            return json("登錄成功");
        }
        return View::fetch('login/login');
    }

如下圖所示:
圖片描述

Tips: 其中 View::fetch 表示調用模板引擎。

4.4 新建 html 模板

如下圖所示,在 view\login 目錄中新建 login.html 模板文件:
圖片描述

Tips: 模板文件可根據自己需求定義,css、js 文件可以按照圖中格式引入,從圖中可以看到登錄信息提交至 login/do_login中。

4.5 定義用戶登錄邏輯方法

    /**
     * 用戶登錄邏輯
     * @return \think\response\Redirect
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function do_login(){
        $password = $this->request->param('password'); //密碼
        $username = $this->request->param('username'); //用戶名

        //根據用戶名獲取用戶信息
        $user = LoginModel::where('username',$username)->where('user_status',1)->find();
        if(empty($user)){
            throw new HttpException(400,"用戶信息不存在");
        }
        //校驗密碼是否正確
        if(md5($password."test") != $user->password){
            throw new HttpException(400,"密碼不正確");
        }

        //登錄成功之后向 SESSION 保存用戶信息
        session("user_info",$user);//瀏覽器關閉斷開失效

        //登錄成功之后向 COOKIE 保存用戶信息
//        cookie("user_info_",$user,7*24*3600);//7天之后過期

        return redirect('/userinfo');
    }

4.6 獲取用戶信息方法

    /**
     * 獲取用戶 SESSION 和 COOKIE 信息
     */
    public function userinfo(){
        halt(["cookie"=>cookie("user_info"),"session"=>session("user_info")]);
    }

登錄界面如下圖所示
圖片描述
用戶信息如下圖所示:
圖片描述

4.7 視頻演示

5.小結

本小節主要介紹登錄注冊的邏輯,使用的是 ThinkPHP 框架支持的模板引擎,SESSION 信息時保存在服務器端的,每次瀏覽器關閉(或服務器端設置了 SESSION 過期時間)之后失效,而 COOKIE 則是保存在用戶端瀏覽器中的,瀏覽器關閉之后在有效期內,信息依然存在,它的缺點是 COOKIE 泄漏會造成盜號現象,需要注意的是現在大多數 api 接口登錄不使用 SESSION 了,而是在每次的請求頭部帶上 token 信息。

Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6