Thinkphp5实战之留言板

本文通过Thinkphp5框架实现了一个简易留言板的功能,涵盖了目录布局、MVC运用、数据库操作和功能逻辑。主要内容包括:项目流程图与思维导图、数据库与Model创建、Controller操作以及View界面展示,并提供了项目测试与调试方法。通过这个实例,读者可以深入理解Thinkphp5的基础应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节主要通过Thinkphp5来实现简易留言板的基本功能。麻雀虽小,五脏俱全。从以下几个方面来进一步认识Thinkphp5,包括:目录布局、MCV的运用、对数据的增删改查、留言板功能逻辑等。打牢基础,才能做好升华,下面我们开始吧。

大神就是复杂的事情简单做,简单的事情重复做。

第一部分:留言板项目流程图及思维导图。

一、留言板项目流程图

二、留言板项目思维导图

包括项目需求,数据库设计、以及项目模块设计,思维导图一目了然。

留言板项目开发详解思维导图

 

第二部分:项目开发源代码

一、建立数据库及相应的model文件。

(一)、建立数据库。

建立数据库messages,在数据库messages中建立两个数据表users和message。

users:用于存放留言板注册的用户。

message:用于存放留言板中每个用户进行的留言内容。userId为留言用户。

(二)建立相应的model文件,与数据表对应。

1、在目录www/message(项目名称)/application(应用)/Home(模块)/model(模型)/新建Users.php。

注意:application/Home/model/Users.php=数据库表Users,必须一致。

代码如下:

<?php
  namespace app\Home\model;
  use think\Model;
  class Users extends Model{
    
  }

2、同理,在目录www/message(项目名称)/application(应用)/Home(模块)/model(模型)/新建Message.php。

代码如下:

<?php
  namespace app\Home\model;
  use think\Model;
  class Message extends Model{
   
  }

二、控制器controller的操作

(一)、在目录www/message(项目名称)/application(应用)/Home(模块)/controller/新建Login.php。

Login.php控制器里包括以下操作:

1、login(),用户登录验证功能。

判断是否接受到了post请求,如果判断登录成功,则跳转到留言板页面,否则重新回到登录页面。

2、messagelst(),留言板页面。

用于显示所登录的用户,全部留言内容。

3、register(),用户注册功能。

用于注册新用户,注册成功后可以进行用户登录。

4、loginout(),退出登录并注销。

代码如下:

<?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')//alias用于设置当前数据表的别名
            ->join('message message','user.userId = message.userId')
            /*paginate()方法是查询并分页,参数代表每页显示的留言条数*/
            ->paginate(3);
        $this->assign('list',$list);
        /*模板定位的一个方法,这里定位到了当前模块home下view文件夹下的messages文件夹的messages.html*/
        return $this->fetch('messages/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'));
        }
}

(二)、在目录www/message(项目名称)/application(应用)/Home(模块)/controller/新建Messages.php。

Messages控制器里包括以下操作:

1、 checklogin(),在留言页面中所有操作之前的登录验证,防止跳过登录,恶意操作。

2、do_save(),发表留言。

3、 delete(),删除留言。

代码如下:

<?php
namespace app\Home\controller;
use app\home\model\Message;
use think\Db;
use think\Controller;
use think\request;
class Messages extends Controller{
    /**
     * 判断用户是否登录,没有登录,即没有session('userId')的值,就返回登录页面。
     */
    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("删除失败");
        }
    }
}

三 、视图view部分

1、在目录www/message(项目名称)/application(应用)/Home(模块)/view/新建login文件夹(对应login控制器)/新建login.html和register.html。

2、在目录www/message(项目名称)/application(应用)/Home(模块)/view/新建messages文件夹(对应messages控制器)/新建messagelst.html。

留言板登录界面

留言板注册页面

留言板页面

代码如下:

1、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="登录">
               &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                <a href="register" >注册</a></td>
        </tr>
        </table>
    </form>
</body>
</html>

2、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>

3、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>

{volist name='list' id='infor'}
    <table align="center">
    <caption><h2>留言列表</h2></caption>
        <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>

第三部分、项目测试

一、开启调试模式。

根据报错提示进行修改代码,在application/config.php中开启:

  'app_debug'              => true,// 应用调试模式
    'show_error_msg'         => true, // 显示错误信息

二、项目访问

访问http://localhost/message/public(项目入口)/home(模块)/login(控制器)/login(方法)

附件为该留言板的源代码和对应数据库的压缩包,欢迎大家下载学习。

根据上传的源代码大家可以感受一下thinkphp5的魅力。

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值