ThinkPHP3.2.3 零起步3 – 入门实例

写一个简单的入门实例加说明,方便学习:

前台一个简单的页面显示数据

后台管理数据

1、简单的登录页面

2、文章管理界面

3、文章添加、修改界面

================================================================

ThinkPHP3.2.3是按MVC结构组织文件的

观察  /Application/Home 目录,有清晰的Model/View/Controller结构(文件夹名),实际上页面也是按MVC流程来显示的:

Model            提供数据

Controller    负责页面的显示,数据的显示,页面按钮事件的处理等 >> 网页的入口

View              提供html页面,内部动态的数据由变量代替,其值由Controller提供  >> Controller调用

1、自动生成Admin目录(网站在根目录下)

在/index.php中添加

define('BIND_MODULE', 'Admin');

打开浏览器,输入http://localhost/admin即可自动生成/Application/Admin目录,结构和Home一样

2、首先来分析文章管理页的实现

Model文件:无

Controller文件:/Application/Admin/Controller/IndexController.class.php

View文件:/Application/Admin/View/Index/index.html

 

ThinkPHP规定Controller文件默认的格式为:[View中文件夹名称]Controller.class.php

View中需要先建立Index文件夹,再添加index.html文件

index.html文件中的样式和图片,默认保存在/Public下,index.html中按如下方式调用:

其中__PUBLIC__默认值为/Public

数据库连接信息 默认位置: /Application/Common/Conf/config.php

在此文件中添加数据库连接信息,如:

'配置值'
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '127.0.0.1',// 服务器地址
'DB_NAME' => 'test', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123456', // 密码
'DB_PREFIX' => 'think_', // 数据库表前缀
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
);

IndexController.class.php文件内容分析:

//CommonController是继承自Controller的二级类
//extends CommonCotroller 作用是先执行CommonController中的方法,判断用户是否登录
//如果没有登录则跳转到登录页面
class IndexController extends CommonController {
 /**
  * @函数 index :对应 View/Index/index.html文件
  * @功能 显示后台管理主页面
  */
 public function index(){
  //设置页面内容是html编码格式是utf-8
  header("Content-Type:text/html; charset=utf-8");
  
  //设置index.html中变量username的值为session('username')
    //在index.html中对应变量为:{$username}
  $this->assign('username',session('username'));

  //实例化文章模型
    //M操作是thinkphp实例化操作,将数据表think_article实例化成对象,以调用thinkphp中封装好的各种数据操作方法
    //ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法用于高效实例化一个基础模型类,D方法用于实例化一个用户定义模型类。
    //对数据表进行简单的CRUD操作而无复杂的业务逻辑时,使用M方法;业务逻辑比较复杂,且涉及的表众多,需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等,使用D方法
    //think_:表前缀
  $news=M('article');
  $count=$news->count();//调用thinkphp的方法,返回表记录的数量

  //调用thinkphp的分页类page实现分页显示效果
    //分页显示文章列表,每页2篇文章
  //import('ORG.Util.Page');
  $page=new \Think\Page($count,2);//后台管理页面默认一页显示2条文章记录
  $page->setConfig('prev', "上一页");  //上一页
  $page->setConfig('next', '下一页'); //下一页
  $page->setConfig('first', '首页'); //第一页
  $page->setConfig('last', '末页'); //最后一页
  $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
  //设置分页回调方法
  $show=$page->show();

    //查询并筛选数据
    //使用thinkphp内置的方法,执行sql语句
    //下面的句子相当于:select id,subject,author,createtime from think_article order by id desc
  $news_list=$news->field(array('id','subject','author','createtime'))->order('id desc')->limit($page->firstRow.','.$page->listRows)->select();
   
  //对原始信息过滤
  $this->filter($news_list);
  
    //设置index.html中对应变量的值 
  $this->assign('news_count',$count);
  $this->assign('title','后台管理系统');
  $this->assign('news_list',$news_list);//文章数据
  $this->assign('page_method',$show);//分页数据

  $this->display();//显示index.html 
 } 

 /**
  * @函数 quit
  * @功能 登出账户,跳转至登录页面。并清除Session
  */
 public function quit(){
  session(null);//清空所有session信息

    //U方法用于完成对URL地址的组装,可以自动根据当前的URL模式和设置生成对应的URL地址; 自动跳转到 View/Login/index(注意:会先执行 LoginController.class.php)      redirect(U('Login/index'), 0, '重新登录');
 }

 /**
  * @函数 article
  * @功能 编辑新的文章
  */
 public function article(){
  //跳转到Article控制器的index方法  
  redirect(U('Article/index'), 0, '写新文章');
 }
 /**
  * @函数 delete
  * @功能 删除文章
  */
 public function delete(){
   
  //跳转至Article控制器来实现
  if($_GET['id']){
      //跳转到 Admin/Contrlloer/ArticleController.class.php,执行其中的delete方法,并传参 id=_Get['id']
   redirect(U('Admin/Article/delete/id/'.$_GET['id']), 0, '删除文章');
  }
  else{
   $this->error('参数错误!');
  }
 }

 /**
  * @函数 edit
  * @功能 编辑文章
  */
 public function edit(){
  
  if($_GET['id']){
   redirect(U('Admin/Article/index/id/'.$_GET['id']), 0, '写新文章');
  }
  else{
   $this->error('参数错误!');
  }
 }

 /*-----------------------内部方法------------------------*/
 /**
  * @函数 filter
  * @功能 对数据库中的信息进行裁剪和过滤
  */
 private function filter(&$list){  
  foreach($list as $key=>$value){
   //设置显示的创建时间
   $list[$key]['createtime']=date("Y-m-d H:i:s",$value['createtime']);

   //设置显示的最后修改时间
   if(!$value['lastmodifytime']){
    $list[$key]['lastmodifytime']="无";
   }else{
    $list[$key]['lastmodifytime']=date("Y-m-d H:i:s",$value['lastmodifytime']);
   }
    
   //文章标题过长时裁剪
   if(strlen($list[$key]['subject'])>80){
    $list[$key]['subject']=$this->cutString($list[$key]['subject'],0,20).'...';
   }
  }
 }

 /**
  * @函数 cutString
  * @功能 字符串裁剪(仅适用于UTF-8)
  */
 private function cutString($str, $from, $len)
 {
  return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
    '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
    '$1',$str);
 }
}

Index/index.html文件重要内容分析:


{$username} 



 
文章标题 作者 添加时间 最后修改 选项
{$vo['subject']} {$vo['author']} {$vo['createtime']} {$vo['lastmodifytime']} 编辑 删除

ArticleController.class.php文件内容分析

assign('title','添加/修改文章');
  if($id=(int)$_GET['id']){
   $article=M('article');
   $article_item=$article->where("id=$id")->find();
   $this->assign('article_item',$article_item);
   $this->assign('btn_ok_text','完成修改');
   $this->assign('btn_ok_act','update');
  }else{
   $this->assign('btn_ok_act','add');
   $this->assign('btn_ok_text','添加文章');
  }
  $this->display();
 }
 
 /**
  * @函数 add
  * @功能 文章添加完成,写入数据库
  */
 public function add(){
  header("Content-Type:text/html; charset=utf-8");
   //调用D方法实例化表对象
  $article=D('Article');

    //create():创建数据对象,最大的作用是自动获取表单数据并完成一系列的操作和过滤(通过自动验证、自动完成、令牌证等等)。创建好的数据对象可以用于写入数据库等操作
    //一般与D('XXX')一起用
  if($article->create()){
   
      //设置表内字段值 
   $article->message = $_POST['editorValue'];
   $article->author = session('username');
    
   //将文章写入数据库
      
      //success方法与error方法用于实现带提示信息的页面跳转功能,可实现添加数据后显示提示信息并跳转的效果
   if($article->add()){  //add():添加数据
    $this->success('文章添加成功,返回上级页面',U('Index/index'));
   }else{
    $this->error('文章添加失败,返回上级页面');
   }
    
  }else{
   $this->error($article->getError());
  }
 }
 
 /**
  * @函数 delete
  * @功能 删除文章
  */
 public function delete(){
  $article=M('article');
  if($article->delete($_GET['id'])){
   $this->success('文章删除成功');
 }else{
  $this->error($article->getLastSql());
 }
} 
 
/**
 * @函数 update
 * @功能 更新修改后的文章到数据库
 */
public function update(){ 
header("Content-Type:text/html; charset=utf-8");
$article=M('Article');

$data = array('subject'=>$_POST['subject'],'message'=>$_POST['editorValue'],'lastmodifytime'=>time());
$id=$_POST['id'];

$article->where('id='.$id)->setField($data); // 根据条件保存修改的数据
$this->success('文章更新成功');
}

/**
 * @函数 quit
 * @功能 登出账户,跳转至登录页面。并清除Session
 */
public function quit(){
session(null);//清空所有session信息
redirect(U('Login/index'), 0, '重新登录');
}
}

Model/ArticleModel.class.php 文件分析

执行 create()方法时会进行自动验证与自动填充,即执行:_validate 和 _auto
//标题自动验证
protected $_validate=array(
  array('subject','require','文章标题必须非空'),//默认情况下用正则验证
  array('subject','callback_checklen','标题内容过长',0,'callback'),
  array('message','require','文章内容必须非空'),
);

//字段长度验证回调函数(ThinkPHP会自动帮我们传递参数)
function callback_checklen($data){
  if(strlen($data)>200){
   return false;
  }
  return true;
}

//自动完成,在create时自动执行
//array('填充字段','填充内容','填充条件','附加规则');
//填充字段
protected $_auto=array(
 array('createtime','time',1,'function'),//对createtime字段自动写入当前时间戳
  );
}

附件:
项目文件
数据库-sql文件和Navicat备份文件