一、项目目的
为了提高新手对mvc模式的认识、加深thinkphp5知识的掌握程度,本文通过留言板示例进行展示。
二、项目需求
用户注册、登录
发表留言
删除本人留言
查看留言
三、数据表设计
分析项目需求,一个用户可以有多条留言,发现需要用户表和留言表两张表即可,需求中包含了用户注册、登录,所以用户表需要有账号、密码字段。发表留言以及删除留言可以确定留言表需要留言内容、用户id字段。
用户表:
userId主键自增,createAt表示用户注册时间
留言表:
messageId主键自增,creatAt留言时间。
四、模块设计
本项目功能简单,所以只需要一个Home模块,控制器及其方法如下:
五、代码实现
5.1编写模型
创建Message模型,新建application\Home\model\Message.php,代码如下:
<?php
namespace app\Home\model;
use think\Model;
class Message extends Model
{
protected $table = 'message';
}
创建Users模型,新建application\Home\model\Users.php,代码如下:
<?php
namespace app\Home\model;
use think\Model;
use think\Db;
class Users extends Model {
protected $table = 'users';
}
5.2编写控制器
创建用户控制器,编辑application\Home\controller\Login.php,代码如下:
<?php
namespace app\Home\controller;
use think\Db;
use app\home\model\Users;
use think\Controller;
class Login extends Controller{
/**
* 用户登录验证
*/
public function login(){
/*request()->isPost()判断是否接受到了post请求,如果有就执行下面的代码 */
if (request()->isPost()) {
$date = input('post.');
$username = $date['username'];
$password = $date['password'];
$user = new Users;
$res = $user->where(['name'=>$username,'password'=>$password])->find();
if ($res) {
/* 验证成功,session保存登录信息。当我们跳转到其他页面时可以查询是否有登录信息
如果没有就需要登录再进行操作,这也是最简单的权限认证,否则只要在浏览器中输入
正确的地址任何人都可以操作*/
session('userId', $res['userId']);
session('username', $res['name']);
/*登录成功,跳转到当前模块,当前控制器的messagelst方法*/
$this->success('登录成功!', url('messagelst'));
} else {
/*登录失败,返回上一页*/
$this->error('账号或密码不正确!');
}
}
/*
当输入Home/login/login访问时并没有POST请求,所有直接就执行 return view(),跳转到了login.html,这时我们输入
账号密码点击登录,表单action="{:url('login')}" method="POST",我们将填写的数据又发送回来,这时才进行下面的代码。
*/
/*模板定位方法之一*/
return $this->fetch();
/*模板定位方法之二*/
/*return view();*/
/*方法二选一,不输入参数代表当前模块当前控制器名视图下的当前方法名.html*/
/*所有这里模板定位到了Home模块下View文件夹下的login文件夹下的login.html*/
/*所有建议在创建模板的时候一定要命名规范,而且存放在合理的位置*/
}
/**
* 显示留言
*/
public function messagelst() {
/*join方法关联user表和message表进行查询数据,这样两张表的字段都能被查询出来
具体请查看官方文档
*/
$list=Db::table('users')
->alias('user')
->join('message message','user.userId = message.userId')
/*paginate()方法是查询并分页,参数代表每页显示的留言条数*/
->paginate(3);
$this->assign('list',$list);
/*模板定位的一个方法,这里定位到了当前模块home下view文件夹下的messages文件夹的messages.html*/
return $this->fetch('message/messagelst');
}
/**
* 用户注册
*/
public function register(){
if(request()->isPost()) {
$username = input('post.username');
$password = input('post.password');
$repassword = input('post.repassword');
if ($password != $repassword) {
$this->error('两次输入的密码不一致');
}
$user = new Users;
$res = $user->where('name',$username)->find();
if ($res) {
$this->error('用户名已存在');
} else {
/*将新增用户数据保存到数据库*/
$user->data([
'name' => $username,
'password' => $password,
'createdAt' => time(), /*time()获取当前时间的时间戳*/
]);
$ret = $user->save();
if ($ret > 0) {
/*跳转到当面模块当前控制器下的login方法*/
$this->success('注册成功!', url('login'));
}
}
}
/*定位到当前模块下的view文件夹下的login文件下register.html*/
return view('login/register');
}
/**
* 退出登录并销毁登录上保存的用户信息
*/
public function loginout(){
session(null);
$this->success('退出系统成功',url('login'));
}
}
创建留言控制器,编辑application\Home\controller\Messages.php,代码如下:
<?php
namespace app\Home\controller;
use think\Db;
use app\home\model\Message;
use think\Controller;
use think\request;
class Messages extends Controller{
/**
* 判断用户是否登录,没有登录就返回登录页面
*/
public function checklogin() {
if(!session('userId')) {
$this->error('请登录后操作',url('Login/login'));
}
}
/**
* 保存用户留言
*/
public function do_save(){
/*调用checklogin方法检查是否登录,没有登录不允许留言*/
$this->checklogin();
$data = input('post.');
$content = $data['words'];
if(empty($content)){
$this->error('留言不能为空');
}
else if(mb_strlen($content,'utf-8') > 100){
$this->error('留言内容最多100字');
}
else{
/*获取当前登录用户的id号*/
$userId = session('userId');
$message =new Message;
$res = $message->save([
'userId'=>$userId,
'content'=>$content,
'creatAt'=>time(),
]);
if($res) {
$this->success('评论成功!',url('Login/messagelst'));
}else{
$this->error('评论失败');
}
}
}
/**
* 删除留言
*/
public function delete(){
$request=Request::instance();
$id=$request->param('messageId'); /*获取传递的参数messageid*/
$result=Db::table('message')->delete($id);
if( $result>0){
$this->success('删除成功!',url('login/messagelst'));
}
else{
$this->error("删除失败");
}
}
}
5.3前端页面
登录页面,创建application\Home\view\login\login.html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="{:url('login')}" method="POST">
<table cellpadding="10" cellspacing="0" border="1" width="500" align="center">
<tr>
<th colspan="2">用户登录</th>
</tr>
<tr>
<td>用户名</td>
<td><input type="text" name="username" required="required"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" required="required"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="login" value="登录">
<a href="register" >注册</a></td>
</tr>
</table>
</form>
</body>
</html>
注册页面,创建application\Home\view\login\register.html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="{:url('register')}" method="POST">
<table cellpadding="10" cellspacing="0" border="1" width="500" align="center">
<tr>
<th colspan="2">用户注册</th>
</tr>
<tr>
<td>用户名</td>
<td><input type="text" name="username" required="required"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" required="required"></td>
</tr>
<tr>
<td>确认密码</td>
<td><input type="password" name="repassword" required="required"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="zhuce" value="注册">
<a href="login" >返回</a></td>
</tr>
</table>
</form>
</body>
</html>
留言及显示页面,创建application\Home\view\message\messagelst.html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<body>
<form action="{:url('Home/Messages/do_save')}" method="post" >
<table cellpadding="10" cellspacing="0" border="1" width="500" align="center">
<tr>
<th colspan="2">留言板</th>
</tr>
<tr>
<td colspan="2"><textarea name="words" cols="50" rows="10"></textarea></td>
</tr>
<tr>
<td>
<input type="submit" name="send" value="发表">
</td>
<td> <input type="reset" value="重置"></td>
<td><a href="{:url('Login/loginout')}">退出登录</a></td>
</tr>
</table>
</form>
<h2>留言列表</h2>
{volist name='list' id='infor'}
<table>
<tr>
<td>留言者:</td>
<td>
{$infor.name}
{eq name="Think.session.userId" value="$infor.userId"}
<a href="{:url('Home/Messages/delete',array('messageId'=>$infor['messageId']))}">删除</a>
{/eq}
</td>
</tr>
<tr>
<td>留言内容:</td>
<td>{$infor.content}</td>
</tr>
<tr>
<td>留言时间:</td>
<td>{$infor.creatAt|date='Y-m-d H:i:s',###}</td>
</tr>
</table>
{/volist}
</body>
{$list->render()}
</html>
六、运行效果
6.1登录界面
6.2注册界面
6.3留言界面
七、项目总结
至此,我们简易的留言板项目就完成了。留言板项目麻雀虽小,五脏俱全,是典型的入门级案列。学习完本次项目相信你对tp5有了进一步的了解,对mvc模式也有初步的体验,希望读者好好掌握。