title: "從零開始打造自己的PHP框架——第6章"
toc: true
date: 2017-09-16 14:00:00
tags:
- php
- 框架
categories: - [專業(yè),后端,php]
前言
第0到5章勋桶,我們完成了一個(gè)屬于自己的php框架,麻雀雖小五臟俱全访娶。接下來剃诅,我們使用vkphp框架開發(fā)一個(gè)迷你項(xiàng)目——書簽收藏适掰。在開發(fā)過程中,也許會(huì)遇到很多問題皇忿,這時(shí)候我們就可以對(duì)框架進(jìn)行調(diào)整了袁,使之更加完善最筒。
系統(tǒng)描述:
用戶登錄系統(tǒng)贺氓,能夠看到自己收藏的書簽,并且可以對(duì)書簽進(jìn)行增刪改查床蜘。
系統(tǒng)功能:
1辙培、注冊(cè)登錄。
2邢锯、書簽展示扬蕊。
3、增刪查改丹擎。
項(xiàng)目結(jié)構(gòu)
vkphp
├─app
│ ├─ctrl
│ │ └─bookmark
│ ├─model
│ └─smarty
│ ├─templates
│ │ └─bookmark
│ └─templates_c
├─assets
├─config
├─core
├─log
└─vendor
- app內(nèi)包含控制器尾抑、model、smarty模板蒂培。
- config內(nèi)包含全局配置文件再愈。
- core內(nèi)包含框架的核心文件。
- log內(nèi)存放日志文件护戳。
- assets包含靜態(tài)資源文件翎冲。
- vendor內(nèi)包含第三方庫。
我們編寫業(yè)務(wù)代碼的位置媳荒,主要在app抗悍、assets兩個(gè)目錄。
注冊(cè)登錄
表結(jié)構(gòu)
修改vk_user表結(jié)構(gòu)為:
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 '低調(diào)的用戶',
`email` tinytext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
model
app/model目錄下钳枕,已經(jīng)有了user.php這個(gè)model類缴渊。
<?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'=>'驗(yàn)證碼不能為空'
);
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'=>'驗(yàn)證成功'
);
}else if($ret == -1){
$result = array(
'code'=>'-1',
'ext'=>'請(qǐng)先獲取驗(yàn)證碼'
);
}else if($ret == -2){
$result = array(
'code'=>'-2',
'ext'=>'驗(yàn)證碼超時(shí)'
);
}else if($ret == -3){
$result = array(
'code'=>'-3',
'ext'=>'驗(yàn)證碼錯(cuò)誤'
);
}
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'=>'參數(shù)不能為空'
);
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'=>'注冊(cè)成功'
);
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'=>'參數(shù)不能為空'
);
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');
}
}
前端
如果需要詳細(xì)代碼衔沼,請(qǐng)到源碼中查看,下面只描述思路。
1俐巴、實(shí)現(xiàn)靜態(tài)頁面的最終效果骨望,包括html、css和js欣舵。
2擎鸠、把靜態(tài)頁面改寫為smarty頁面。
3缘圈、使用postman測(cè)試寫好的注冊(cè)登錄接口劣光。
4、打通前后端糟把。
訪問地址: http://vkphp.dev/bookmark/user/to_login 绢涡,即可看到注冊(cè)登錄頁面。
源碼分享
https://github.com/voidking/vkphp/releases/tag/v1.6.0