從零開始打造本身的PHP框架——第6章

前言

第0到5章,咱們完成了一個屬於本身的php框架,麻雀雖小五臟俱全。接下來,咱們使用vkphp框架開發一個迷你項目——書籤收藏。在開發過程當中,也許會遇到不少問題,這時候咱們就能夠對框架進行調整,使之更加完善。php

系統描述:
用戶登陸系統,可以看到本身收藏的書籤,而且能夠對書籤進行增刪改查。css

系統功能:
一、註冊登陸。
二、書籤展現。
三、增刪查改。html

原文連接:http://www.voidking.com/2017/...前端

項目結構

vkphp
├─app
│  ├─ctrl
│  │  └─bookmark
│  ├─model
│  └─smarty
│     ├─templates
│     │  └─bookmark
│     └─templates_c 
├─assets
├─config
├─core
├─log
└─vendor
  • app內包含控制器、model、smarty模板。
  • config內包含全局配置文件。
  • core內包含框架的核心文件。
  • log內存放日誌文件。
  • assets包含靜態資源文件。
  • vendor內包含第三方庫。

咱們編寫業務代碼的位置,主要在app、assets兩個目錄。git

註冊登陸

表結構

修改vk_user表結構爲:github

DROP TABLE IF EXISTS `vk_user`;
CREATE TABLE `vk_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(32) NOT NULL COMMENT 'md5加密',
  `salt` varchar(16) NOT NULL,
  `screen_name` varchar(20) DEFAULT '低調的用戶',
  `email` tinytext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

model

app/model目錄下,已經有了user.php這個model類。json

<?php
namespace app\model;
class user extends \core\model{
    public function __construct(){
        parent::__construct(__CLASS__);
    }
}

控制器

app/ctrl/bookmark目錄下,新建user_ctrl.php。後端

<?php
namespace app\ctrl\bookmark;

class user_ctrl extends \core\render{

    public function index(){
        echo 'user ctrl';
    }

    public function captcha(){
        $captcha = new \core\util\captcha();
        $captcha->create(300,80,40);
    }

    public function check(){
        if(!(isset($_REQUEST['code']) && $_REQUEST['code'] !== '')){
            $result = array(
                'code'=>'-4',
                'ext'=>'驗證碼不能爲空'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }
        $code = $_REQUEST['code'];
        $captcha = new \core\util\captcha();
        $ret = $captcha->check($code);
        if($ret == 0){
            $result = array(
                'code'=>'0',
                'ext'=>'驗證成功'
            );
        }else if($ret == -1){
            $result = array(
                'code'=>'-1',
                'ext'=>'請先獲取驗證碼'
            );
        }else if($ret == -2){
            $result = array(
                'code'=>'-2',
                'ext'=>'驗證碼超時'
            );
        }else if($ret == -3){
            $result = array(
                'code'=>'-3',
                'ext'=>'驗證碼錯誤'
            );
        }

        echo json_encode($result,JSON_UNESCAPED_UNICODE);
    }

    public function reg(){
        if(!(isset($_POST['username']) 
            && isset($_POST['password']) 
            && isset($_POST['password2'])
            && $_POST['username'] !== ''
            && $_POST['password'] !== ''
            && $_POST['password2'] !== '')
        ){
            $result = array(
                'code'=>'-1',
                'ext'=>'參數不能爲空'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }

        $username = $_POST['username'];
        $password = $_POST['password'];
        $password2 = $_POST['password2'];

        if($password !== $password2){
            $result = array(
                'code'=>'-2',
                'ext'=>'兩次密碼不一樣'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }

        $salt = \core\util\random::get_random_string(16);
        $password = md5($password.$salt);
        $data = array(
            'username'=>$username,
            'password'=>$password,
            'salt'=>$salt
        );
        $user = new \app\model\user();
        $ret = $user->find_by_condition(['username'=>$username]);
        if($ret){
            $result = array(
                'code'=>'-2',
                'ext'=>'用戶名已存在'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }
        $user_id = $user->add($data);
        if($ret >= 1){
            $result = array(
                'code'=>'0',
                'user_id'=>$user_id,
                'ext'=>'註冊成功'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
        }
    }

    public function login(){
        if(!(isset($_POST['username']) 
            && isset($_POST['password'])
            && $_POST['username'] !== ''
            && $_POST['password'] !== '')
        ){
            $result = array(
                'code'=>'-1',
                'ext'=>'參數不能爲空'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
            return;
        }

        $username = $_POST['username'];
        $password = $_POST['password'];

        $user = new \app\model\user();
        $ret = $user->find_by_condition(['username'=>$username]);
        if($ret){
            $salt = $ret['salt'];
            $req_password = md5($password.$salt);
            $real_password = $ret['password'];
            if($req_password == $real_password){
                session_start();
                $_SESSION['user_id'] = $ret['id'];
                $result = array(
                    'code'=>'0',
                    'ext'=>'登陸成功'
                );
                echo json_encode($result,JSON_UNESCAPED_UNICODE);
            }
        }else{
            $result = array(
                'code'=>'-2',
                'ext'=>'用戶不存在'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
        }
    }

    public function logout(){
        session_start();
        if(isset($_SESSION['user_id'])){
            unset($_SESSION['user_id']);
            $result = array(
                'code'=>'0',
                'ext'=>'下線成功'
            );
            echo json_encode($result,JSON_UNESCAPED_UNICODE);
        }    
        
    }

    public function to_login(){
        $this->smarty->assign('basepath',$this->basepath);
        $this->smarty->assign('assets',$this->assets);
        $this->smarty->display('bookmark/user/login.html');
    }
}

前端

若是須要詳細代碼,請到源碼中查看,下面只描述思路。
一、實現靜態頁面的最終效果,包括html、css和js。
二、把靜態頁面改寫爲smarty頁面。
三、使用postman測試寫好的註冊登陸接口。
四、打通先後端。php框架

訪問地址: http://vkphp.dev/bookmark/use... ,便可看到註冊登陸頁面。session

源碼分享

https://github.com/voidking/v...

書籤

從零開始打造本身的PHP框架

session與PHP之session_start()

PHP session詳解

相關文章
相關標籤/搜索