title: "从零开始打造自己的PHP框架——第6章"
toc: true
date: 2017-09-16 14:00:00
tags:
- php
- 框架
categories: - [专业,后端,php]
前言
第0到5章,我们完成了一个属于自己的php框架,麻雀虽小五脏俱全。接下来,我们使用vkphp框架开发一个迷你项目——书签收藏。在开发过程中,也许会遇到很多问题,这时候我们就可以对框架进行调整,使之更加完善。
系统描述:
用户登录系统,能够看到自己收藏的书签,并且可以对书签进行增删改查。
系统功能:
1、注册登录。
2、书签展示。
3、增删查改。
项目结构
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两个目录。
注册登录
表结构
修改vk_user表结构为:
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类。
<?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');
}
}
前端
如果需要详细代码,请到源码中查看,下面只描述思路。
1、实现静态页面的最终效果,包括html、css和js。
2、把静态页面改写为smarty页面。
3、使用postman测试写好的注册登录接口。
4、打通前后端。
访问地址: http://vkphp.dev/bookmark/user/to_login ,即可看到注册登录页面。
源码分享
https://github.com/voidking/vkphp/releases/tag/v1.6.0
网友评论