(二)ThinkPHP实践之留言板后台-TTLSA

1、后台需求
(1)管理员登录:帐号密码验证,验证码验证
(2)管理留言:单条删除,单条修改,批量删除
(3)管理员退出:退出后台

2、建库
知识点:
1、IP记录类型
2、用户锁定标识符类型

数据库需求
需要提交留言板内容
id(留言用户id) 类型为int,最大长度10位
username(管理员用户名) 类型为char,最大长度20位,不能为空,默认值为“匿名用户”
password(管理员密码) 类型为varchar,最大长度32位,不能为空
logintime(登录时间) 类型为timestamp,默认值为“当前时间”
loginip(登录IP) 类型为varchar,最大长度为30位
lock(用户锁定标识) 类型为tinyint,最大长度为1,默认为不锁定

转化为数据库类型为
表名tb_broad
id int类型(10位长度),非负,非空,自增
username char类型(20位长度),非空,默认为空
password varchar类型(32位长度),非空,默认为空
logintime timestamp类型,非空,默认是当前时间戳
loginip varchar类型,非空
lock tinyint类型,非负,非空,默认为0(即非锁定)

以下是建表的SQL

; html-script: false ] CREATE TABLE IF NOT EXISTS `tb_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT `username` char(20) NOT NULL DEFAULT '' `password` char(32) NOT NULL DEFAULT '' `logintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '留言时间' `loginip` varchar(30) NOT NULL `lock` tinyint(1) unsigned NOT NULL DEFAULT '0' PRIMARY KEY (`id`) UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 1234567891011 ; html-script: false ]CREATE TABLE IF NOT EXISTS `tb_user` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT  `username` char(20) NOT NULL DEFAULT ''  `password` char(32) NOT NULL DEFAULT ''  `logintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '留言时间'  `loginip` varchar(30) NOT NULL  `lock` tinyint(1) unsigned NOT NULL DEFAULT '0'  PRIMARY KEY (`id`)  UNIQUE KEY `username` (`username`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

为了方便测试我们建立一条测试数据

; html-script: false ]INSERT INTO `board`.`tb_user` (`id` `username` `password` `logintime` `loginip` `lock`) VALUES (NULL 'admin' MD5( 'admin' ) CURRENT_TIMESTAMP '127.0.0.1' '0'); 1 ; html-script: false ]INSERT INTO `board`.`tb_user` (`id` `username` `password` `logintime` `loginip` `lock`) VALUES (NULL 'admin' MD5( 'admin' ) CURRENT_TIMESTAMP '127.0.0.1' '0');

3、修改相关配置
知识点:
1、thinkphp单入口文件操作
2、admin.php入口文件,App配置,调试模式,引用框架

数据库配置好后,可在项目目录新建后台入口文件并定义项目名称,文件创建位置在网站根目录下(我的本地环境中为C:/wamp/www/)message(自建项目目录)/admin.php
接下来就要在admin.php入口文件中定义相关项目,具体内容如下:

; html-script: false ]<?php define('APP_NAME' 'admin'); //项目名,可自定义 define('APP_PATH' './admin/'); //项目路径,访问入口文件,即可自动生成,无需手动创建,注意最后的'/',如果不加,会将项目文件散落在message根目录下 define('APP_DEBUG' TRUE); //调试模式,如果在开发阶段,建议在开发阶段开启 require './ThinkPHP/ThinkPHP.php'; //重点*,加了这条,框架才能生效 ?> 12345678 ; html-script: false ]<?php   define('APP_NAME' 'admin'); //项目名,可自定义 define('APP_PATH' './admin/'); //项目路径,访问入口文件,即可自动生成,无需手动创建,注意最后的'/',如果不加,会将项目文件散落在message根目录下 define('APP_DEBUG' TRUE); //调试模式,如果在开发阶段,建议在开发阶段开启 require './ThinkPHP/ThinkPHP.php'; //重点*,加了这条,框架才能生效 ?>

老规矩,配置完这条,访问http://localhost/message/admin.php看见笑脸,就说明你配置框架成功了。同时可在message目录下,生成了admin目录。

接下来我们需要完成相关的数据库配置
文件路径为message/admin/Conf/config.php
添加内容如下:

; html-script: false ]<?php return array( //数据库相关配置 'DB_TYPE' => 'mysql' //数据库类型 'DB_NAME' => 'board' //数据库名 'DB_USER' => 'root' //连接数据库帐号 'DB_PWD' => '' //连接数据库密码 'DB_PREFIX' => 'tb_' //数据库表前缀,这样在后面实例化的时候就不需要再填写同样的表前缀了 ); ?> 1234567891011 ; html-script: false ]<?phpreturn array(  //数据库相关配置 'DB_TYPE' => 'mysql' //数据库类型 'DB_NAME' => 'board' //数据库名 'DB_USER' => 'root' //连接数据库帐号 'DB_PWD' => '' //连接数据库密码 'DB_PREFIX' => 'tb_' //数据库表前缀,这样在后面实例化的时候就不需要再填写同样的表前缀了);?>

4、建立控制器 Controller
知识点:
1、用户登录状态检查
2、用户登录验证
3、留言板信息显示、删除
4、验证码调用及使用方法

(1)配置全部完成,接下来就是我们开始写控制器的时候了,入口文件进来,都会找默认控制器,路径为message/admin/Lib/action/IndexAction.class.php
将原有内容删除,拷贝以下内容替代:

; html-script: false ]<?php //留言板后台控制器 class IndexAction extends CommonAction { //注意这里的CommonAction,这是自定义的类,主要用于一些初始化操作,如用户登录状态检查等,具体内容将在下面进行讲解 public function index(){ $this->display(); } } 12345678 ; html-script: false ]<?php//留言板后台控制器class IndexAction extends CommonAction {//注意这里的CommonAction,这是自定义的类,主要用于一些初始化操作,如用户登录状态检查等,具体内容将在下面进行讲解     public function index(){ $this->display();    }}

(2)接下来就来讲解下CommonAction,文件位置与IndexAction.class.php同级,命名为CommonAction.class.php
代码如下:

; html-script: false ]<?php //通用类,这里主要是为了做登录验证,之后如果需要登录验证的页面,只要继承这个类,即可判断用户是否登录,如果未登录,即跳回登录页面 Class CommonAction extends Action { Public function _initialize () { //_initialize是一个初始化方法,也就是程序自动执行的一个方法 if (!isset($_SESSION['uid']) || !isset($_SESSION['username'])) { //判断是否定义$_SESSION['uid']或者$_SESSION['username'] $this->redirect('admin.php/Login/index'); //如果未定义,就跳转回login页面admin.php/Login/index } } } 123456789101112 ; html-script: false ]<?php//通用类,这里主要是为了做登录验证,之后如果需要登录验证的页面,只要继承这个类,即可判断用户是否登录,如果未登录,即跳回登录页面Class CommonAction extends Action { Public function _initialize () { //_initialize是一个初始化方法,也就是程序自动执行的一个方法 if (!isset($_SESSION['uid']) || !isset($_SESSION['username'])) { //判断是否定义$_SESSION['uid']或者$_SESSION['username'] $this->redirect('admin.php/Login/index'); //如果未定义,就跳转回login页面admin.php/Login/index } }}

(3)同级目录下,建立LoginAction.class.php,作为登录验证控制器
代码如下:

; html-script: false ]<?php //登录验证控制器 Class LoginAction extends Action { public function index() { $this->display(); //调用Tpl/Login目录index.html显示登录页面 } public function login() { if (!IS_POST) halt('页面不存在'); //判断表单提交 $username = I('username'); $password = I('password''''md5'); //获取用户名密码 $user = M('user')->where(array('username' => $username))->find(); //where是做条件筛选的函数,等于where username='$username' if(!$user || $user['password'] != $password){ $this->error('账号或密码错误'); } //判断帐号或者密码 if ($user['lock']) $this->error('用户被锁定'); $data = array( 'id' => $user['id'] 'logintime' => time() 'loginip' => get_client_ip() ); //获取用户登录时间,以及用户登录IP M('user')->save($data); //插入数据库中 session('uid' $user['id']); session('username' $user['username']); session('logintime' date('Y-m-d H:i:s' $data['logintime'])); session('loginip' $user['loginip']); //将相关信息插入session,这样下次登录的时候,就会直接登录了 $this->redirect('admin.php/Index/index'); //登录成功,跳转回首页 } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 ; html-script: false ]<?php//登录验证控制器Class LoginAction extends Action { public function index() { $this->display(); //调用Tpl/Login目录index.html显示登录页面 } public function login() { if (!IS_POST) halt('页面不存在'); //判断表单提交 $username = I('username'); $password = I('password''''md5'); //获取用户名密码 $user = M('user')->where(array('username' => $username))->find(); //where是做条件筛选的函数,等于where username='$username' if(!$user || $user['password'] != $password){ $this->error('账号或密码错误'); } //判断帐号或者密码 if ($user['lock']) $this->error('用户被锁定'); $data = array( 'id' => $user['id'] 'logintime' => time() 'loginip' => get_client_ip() ); //获取用户登录时间,以及用户登录IP M('user')->save($data); //插入数据库中 session('uid' $user['id']); session('username' $user['username']); session('logintime' date('Y-m-d H:i:s' $data['logintime'])); session('loginip' $user['loginip']); //将相关信息插入session,这样下次登录的时候,就会直接登录了 $this->redirect('admin.php/Index/index'); //登录成功,跳转回首页 }}

(4)同级目录下,建立LogoutAction.class.php,(登出操作)
代码如下:

; html-script: false ]<?php class LogoutAction extends CommonAction { public function index(){ session_unset(); session_destroy(); //session注销 $this->redirect('admin.php/Login/index'); //登出后,跳转回首页 } } 1234567891011 ; html-script: false ]<?php class LogoutAction extends CommonAction {    public function index(){ session_unset(); session_destroy(); //session注销 $this->redirect('admin.php/Login/index'); //登出后,跳转回首页    }}

(5)同级目录下,建立MsgManageAction.class.php(管理留言操作)
由于是搭建一个简易版的留言板后台,所以这里只有显示和删除操作
代码如下:

; html-script: false ]<?php class MsgManageAction extends CommonAction { public function index(){ $board = M('board')->order('time DESC')->select(); $this->board = $board; $this->display(); } Public function delete(){ $id = I('id''''intval'); //获取ID并强制转换成整形 if(M('board')->delete($id)){ $this->success('删除成功'U('index')); }else{ $this->error('删除失败'); } //删除对应ID的记录,如果删除成功跳回首页,删除失败,返回(‘删除失败’) } } 123456789101112131415161718192021 ; html-script: false ]<?php class MsgManageAction extends CommonAction {    public function index(){ $board = M('board')->order('time DESC')->select(); $this->board = $board; $this->display();    }     Public function delete(){ $id = I('id''''intval'); //获取ID并强制转换成整形  if(M('board')->delete($id)){ $this->success('删除成功'U('index')); }else{ $this->error('删除失败'); } //删除对应ID的记录,如果删除成功跳回首页,删除失败,返回(‘删除失败’) }}

5、建立模板表单 Viewer
知识点:
1、模板中调用thinkphp函数U
2、foreach标签用法(非html标签),循环输出变量中的各字段

后台需要建立3个页面,分别是登录首页Login,管理首页MsgManage和控制首页Index(如果加入js技术,可将管理首页和控制首页合并为一个)
控制器建立完毕,接下来就要基于控制器指定的路径建立模板文件
Index目录下建立index.html模板文件,路径为admin/Tpl/Index/index.html
Login目录下建立index.html模板文件,路径为admin/Tpl/Login/index.html
MsgManage目录下建立index.html模板文件,路径为admin/Tpl/Login/index.html

Index模板文件代码如下:

; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Message Board BackGround</title> </head> <body> <h2>简易后台登录系统</h2> <a href="{:U('admin.php/Logout/index')}" target="_self">退出</a> <a href="{:U('admin.php/MsgManage/index')}" target="_self">显示留言</a> <!-- U函数主要用于跳转 --> </body> </html> 12345678910111213141516 ; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Message Board BackGround</title></head><body>  <h2>简易后台登录系统</h2><a href="{:U('admin.php/Logout/index')}" target="_self">退出</a><a href="{:U('admin.php/MsgManage/index')}" target="_self">显示留言</a> <!-- U函数主要用于跳转 --></body></html>

Login模板文件代码如下:

; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Message Board BackGround</title> </head> <body> <form action="{:U('admin.php/Login/login')}" method="post" name="back_login" > <h2>简易后台登录系统</h2> 用户名:<input type='username' name='username' id='username' /> <br /> 密码:<input type='password' name='password' id='password' /> <br /> <input type="submit" value="登录"/> </form> </body> </html> 12345678910111213141516171819 ; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Message Board BackGround</title></head><body>  <form action="{:U('admin.php/Login/login')}" method="post" name="back_login" > <h2>简易后台登录系统</h2> 用户名:<input type='username' name='username' id='username' /> <br /> 密码:<input type='password' name='password' id='password' /> <br /> <input type="submit"  value="登录"/> </form> </body></html>

MsgManage模板文件代码如下:

; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Message Board BackGround</title> </head> <body> <table class="table" border="1"> <tr> <th>ID</th> <th>发布者</th> <th>内容</th> <th>发布时间</th> <th>操作</th> </tr> <foreach name='board' item='b'> <tr> <td>{$b.id}</td> <td>{$b.username}</td> <td>{$b.content}</td> <td>{$b.time|date='y-m-d H:i'###}</td> <td><a href="{:U('admin.php/MsgManage/delete'array('id' => $b['id']))''}">删除</a></td> </tr> </foreach> //foreach内,大部分跟留言板首页一样,只是在这里加入了一个删除操作,第2个参数就是从控制器中提出的对应id </table> </body> </html> 1234567891011121314151617181920212223242526272829 ; html-script: false ]<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Message Board BackGround</title></head><body> <table class="table" border="1"> <tr> <th>ID</th> <th>发布者</th> <th>内容</th> <th>发布时间</th> <th>操作</th> </tr>  <foreach name='board' item='b'> <tr> <td>{$b.id}</td> <td>{$b.username}</td> <td>{$b.content}</td> <td>{$b.time|date='y-m-d H:i'###}</td> <td><a href="{:U('admin.php/MsgManage/delete'array('id' => $b['id']))''}">删除</a></td> </tr> </foreach> //foreach内,大部分跟留言板首页一样,只是在这里加入了一个删除操作,第2个参数就是从控制器中提出的对应id </table></body></html>

收 藏
分享这篇文章:
收藏+0