从零开始打造自己的PHP框架——第6章

前言

第0到5章,我们完成了一个属于自己的php框架,麻雀虽小五脏俱全。接下来,我们使用vkphp框架开发一个迷你项目——书签收藏。在开发过程中,也许会遇到很多问题,这时候我们就可以对框架进行调整,使之更加完善。

系统描述:
用户登录系统,能够看到自己收藏的书签,并且可以对书签进行增删改查。

系统功能:
1、注册登录。
2、书签展示。
3、增删查改。

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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表结构为:

1
2
3
4
5
6
7
8
9
10
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类。

1
2
3
4
5
6
7
<?php
namespace app\model;
class user extends \core\model{
public function __construct(){
parent::__construct(__CLASS__);
}
}

控制器

app/ctrl/bookmark目录下,新建user_ctrl.php。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?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

书签

从零开始打造自己的PHP框架

session与PHP之session_start()

PHP session详解

0%