thinkphp5完整实现用户的注册、登录、验证(含代码和数据库)
时间: 2023-11-22 07:55:22 浏览: 39
以下是使用ThinkPHP5实现用户注册、登录、验证的完整代码和数据库设计。
## 数据库设计
```sql
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`password` varchar(50) DEFAULT NULL COMMENT '密码',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号码',
`create_time` int(11) DEFAULT NULL COMMENT '创建时间',
`update_time` int(11) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
```
## 注册功能
### 控制器代码
```php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Register extends Controller
{
public function index()
{
if (request()->isPost()) {
// 获取表单数据
$data = input('post.');
// 验证用户名
if (empty($data['username'])) {
$this->error('用户名不能为空');
}
if (Db::name('user')->where('username', $data['username'])->find()) {
$this->error('用户名已存在');
}
// 验证密码
if (empty($data['password'])) {
$this->error('密码不能为空');
}
if ($data['password'] != $data['confirm_password']) {
$this->error('两次密码输入不一致');
}
// 验证邮箱
if (empty($data['email'])) {
$this->error('邮箱不能为空');
}
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$this->error('邮箱格式不正确');
}
if (Db::name('user')->where('email', $data['email'])->find()) {
$this->error('邮箱已存在');
}
// 验证手机号码
if (empty($data['phone'])) {
$this->error('手机号码不能为空');
}
if (!preg_match('/^1[3456789]\d{9}$/', $data['phone'])) {
$this->error('手机号码格式不正确');
}
if (Db::name('user')->where('phone', $data['phone'])->find()) {
$this->error('手机号码已存在');
}
// 添加用户
$user = [
'username' => $data['username'],
'password' => md5($data['password']),
'email' => $data['email'],
'phone' => $data['phone'],
'create_time' => time(),
'update_time' => time(),
];
if (Db::name('user')->insert($user)) {
$this->success('注册成功', 'login/index');
} else {
$this->error('注册失败');
}
}
return $this->fetch();
}
}
```
### 视图代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form method="post">
<div>
<label for="username">用户名:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" id="password">
</div>
<div>
<label for="confirm_password">确认密码:</label>
<input type="password" name="confirm_password" id="confirm_password">
</div>
<div>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email">
</div>
<div>
<label for="phone">手机号码:</label>
<input type="text" name="phone" id="phone">
</div>
<div>
<button type="submit">注册</button>
</div>
</form>
</body>
</html>
```
## 登录功能
### 控制器代码
```php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Login extends Controller
{
public function index()
{
if (request()->isPost()) {
// 获取表单数据
$data = input('post.');
// 验证用户名和密码
$user = Db::name('user')->where('username', $data['username'])->find();
if (!$user) {
$this->error('用户名不存在');
}
if (md5($data['password']) != $user['password']) {
$this->error('密码不正确');
}
// 记录登录状态
session('user', $user);
$this->success('登录成功', 'index/index');
}
return $this->fetch();
}
public function logout()
{
// 销毁登录状态
session('user', null);
$this->success('退出成功', 'login/index');
}
}
```
### 视图代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form method="post">
<div>
<label for="username">用户名:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" id="password">
</div>
<div>
<button type="submit">登录</button>
</div>
</form>
</body>
</html>
```
## 验证功能
### 控制器代码
```php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Verify extends Controller
{
public function username()
{
$username = input('get.username');
if (Db::name('user')->where('username', $username)->find()) {
return 'false';
} else {
return 'true';
}
}
public function email()
{
$email = input('get.email');
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || Db::name('user')->where('email', $email)->find()) {
return 'false';
} else {
return 'true';
}
}
public function phone()
{
$phone = input('get.phone');
if (!preg_match('/^1[3456789]\d{9}$/', $phone) || Db::name('user')->where('phone', $phone)->find()) {
return 'false';
} else {
return 'true';
}
}
}
```
### 视图代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证</title>
</head>
<body>
<script src="/static/js/jquery.min.js"></script>
<script>
$(function () {
$('#username').blur(function () {
$.get('/index/verify/username', {username: $(this).val()}, function (data) {
if (data == 'true') {
$('#username_error').html('');
} else {
$('#username_error').html('用户名已存在');
}
});
});
$('#email').blur(function () {
$.get('/index/verify/email', {email: $(this).val()}, function (data) {
if (data == 'true') {
$('#email_error').html('');
} else {
$('#email_error').html('邮箱已存在或格式不正确');
}
});
});
$('#phone').blur(function () {
$.get('/index/verify/phone', {phone: $(this).val()}, function (data) {
if (data == 'true') {
$('#phone_error').html('');
} else {
$('#phone_error').html('手机号码已存在或格式不正确');
}
});
});
});
</script>
<form>
<div>
<label for="username">用户名:</label>
<input type="text" name="username" id="username">
<span id="username_error"></span>
</div>
<div>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email">
<span id="email_error"></span>
</div>
<div>
<label for="phone">手机号码:</label>
<input type="text" name="phone" id="phone">
<span id="phone_error"></span>
</div>
</form>
</body>
</html>
```