ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
一、項(xiàng)目分組
下載解壓 ThinkPHP 3.2.3,在默認(rèn)的應(yīng)用 Application(./Application) 中,包含一個(gè)默認(rèn)的模塊 Home(./Application/Home)。
需要在該默認(rèn)應(yīng)用中創(chuàng)建一個(gè)用于后臺(tái)管理的 Admin 模塊,可以通過(guò)在應(yīng)用入口文件(./index.php)中綁定 Admin 模塊來(lái)?自動(dòng)生成?Admin 模塊:
define('BIND_MODULE','Admin');此時(shí)訪問(wèn) http://serverName/index.php 便會(huì)自動(dòng)在 ./Application 下創(chuàng)建 Admin 目錄(要記得把上面的定義?刪掉,否則通過(guò)入口文件訪問(wèn)網(wǎng)站首頁(yè)就會(huì)默認(rèn)訪問(wèn) Admin 模塊)。
不需要修改入口文件。
此時(shí)訪問(wèn) http://serverName/index.php/Admin 就可以訪問(wèn)后臺(tái)的 Index 控制器的 index 方法了。
目錄結(jié)構(gòu)如下:
二、應(yīng)用配置和模塊配置
應(yīng)用配置(公共配置文件)位于 ./Application/Common/Conf/config.php ,在 ThinkPHP 調(diào)用所有的模塊之前加載。
在這里沒(méi)有做特別的配置,只開(kāi)啟了 Trace?追蹤信息:
<?php return array(//'配置項(xiàng)'=>'配置值'//顯示頁(yè)面 Trace 信息'SHOW_PAGE_TRACE' => true, );Admin 模塊的模塊配置位于 ./Application/Admin/Common/Conf/config.php
該項(xiàng)目開(kāi)啟的配置包括:
① 數(shù)據(jù)庫(kù)
//數(shù)據(jù)庫(kù)配置信息'DB_TYPE' => 'mysql', // 數(shù)據(jù)庫(kù)類型'DB_HOST' => '127.0.0.1', // 服務(wù)器地址'DB_NAME' => 'tptest', // 數(shù)據(jù)庫(kù)名'DB_USER' => 'root', // 用戶名'DB_PWD' => '', // 密碼'DB_PORT' => 3306, // 端口'DB_PARAMS' => array(), // 數(shù)據(jù)庫(kù)連接參數(shù)'DB_PREFIX' => 'crm_', // 數(shù)據(jù)庫(kù)表前綴 'DB_CHARSET'=> 'utf8', // 字符集'DB_DEBUG' => TRUE, // 數(shù)據(jù)庫(kù)調(diào)試模式 開(kāi)啟后可以記錄SQL日志② ?配置后臺(tái)公共文件
由于該項(xiàng)目同時(shí)包含 Home、Admin ?模塊,所以公共文件必須分開(kāi),因此可以把 Admin 模塊的公共文件放在 ./Application/Public/Admin 下,在 Admin 的模塊配置文件中配置:
//后臺(tái)公共文件路徑'TMPL_PARSE_STRING' => array('__PUBLIC__' => __ROOT__.'/Public/Admin'),③ 定義異常頁(yè)面
//異常頁(yè)面'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',異常頁(yè)面 error.html 中錯(cuò)誤信息可以用 $e['message'] 表示
如果需要有倒計(jì)時(shí)跳轉(zhuǎn)的功能,可以參考 ./ThinkPHP/Tpl/dispatch_jump.tpl 文件
error.html:
<!DOCTYPE html> <html><head><title>error</title><meta charset="UTF-8"></head><body><?php echo $e['message'];?><br /><b id="wait">5</b>秒后跳轉(zhuǎn)回首頁(yè) 或 點(diǎn)擊<a id="href" href="/Admin/Index/index">返回首頁(yè)</a><script>(function(){var wait = document.getElementById('wait'),href = document.getElementById('href').href;var interval = setInterval(function(){var time = --wait.innerHTML;if(time <= 0) {location.href = href;clearInterval(interval);};}, 1000);})();</script></body> </html>例如訪問(wèn)了不存在的方法,頁(yè)面會(huì)輸出:
無(wú)法加載控制器:Login2 3秒后跳轉(zhuǎn)回首頁(yè) 或 點(diǎn)擊返回首頁(yè)?然后跳轉(zhuǎn)回后臺(tái)主頁(yè)。
注:該頁(yè)面中不能使用 ThinkPHP 的標(biāo)簽,只能使用原生的 PHP 語(yǔ)句。
三、管理員登陸
用于登陸的文件是 Admin 模塊下的 LoginController.class.php
<?php namespace Admin\Controller; use Think\Controller;class LoginController extends Controller{public function index() {$this->display();}//驗(yàn)證碼public function verify() {$conf = array(//'useZh'=>true,//使用中文'fontSize'=>20,'length'=>1,'imageW'=>100,//驗(yàn)證碼寬度);$Verify = new \Think\Verify($conf);$Verify->entry();} public function login() {if(!IS_POST) {e('非法登陸');}//檢驗(yàn)驗(yàn)證碼if(!check_verify(I('post.code'))) {$this->error('驗(yàn)證碼錯(cuò)誤');}$username = I('post.username', '');$user = M('user')->where(array('username'=>$username))->find();if(!$user || md5(I('post.password')) != $user['password']) {$this->error('用戶名或密碼錯(cuò)誤');} if($user['lock']) $this->error('用戶被鎖定');//更新用戶表$data = array('id'=>$user['id'],'logintime'=>time(),'loginip'=> get_client_ip());M('user')->save($data);//保存sessionsession("user.uid", $user['id']);session("user.username", $user['username']);session("user.logintime", date('Y-m-d H:i:s', $user['logintime']));session("user.loginip", $user['loginip']);//成功跳轉(zhuǎn)$this->redirect('Admin/Index/index');} }幾點(diǎn)說(shuō)明:
① IS_POST
位于 ./ThinkPHP/Library/Think/App.class.php(ThinkPHP 應(yīng)用程序類 執(zhí)行應(yīng)用程序管理) 的?static public function init() 方法(應(yīng)用程序初始化)內(nèi)
定義當(dāng)前請(qǐng)求的系統(tǒng)常量,源碼:
define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);define('IS_POST', REQUEST_METHOD =='POST' ? true : false);② e 方法
位于 ThinkPHP/Common/functions.php (Think 系統(tǒng)函數(shù)庫(kù))
/*** 拋出異常處理* @param string $msg 異常消息* @param integer $code 異常代碼 默認(rèn)為0* @throws Think\Exception* @return void*/ function E($msg, $code=0) {throw new Think\Exception($msg, $code); }③ 模板路徑
默認(rèn)情況下,Admin 模塊 Login 控制器的 index 方法對(duì)應(yīng)的模板文件應(yīng)該是 ./Application/Admin/View/Login/index.html
如果不希望目錄層級(jí)太多的話,可以將該方法對(duì)應(yīng)的模板文件設(shè)置為 ./Application/Admin/View/Login_index.html,減少了一層目錄,在 Admin 模塊的模塊配置 config.php 中添加:
//模版路徑'TMPL_FILE_DEPR' => '_',登陸以后進(jìn)入后臺(tái)首頁(yè) http://serverName/Admin/Index/index
Admin 模塊的 Index 控制器 ./Application/Admin/Controller/IndexController.class.php:
<?php namespace Admin\Controller;class IndexController extends CommonController {public function index(){$this->display();}//推出登陸public function loginout() {session_unset();session_destroy();$this->redirect('Admin/Login/index');} }注:要進(jìn)入后臺(tái)首頁(yè),必須經(jīng)過(guò)登陸,因此在加載該控制器之前應(yīng)該先檢查用戶是否登陸,檢查的方法可以寫在 Admin 模塊的 Common 控制器中,然后 Index 控制器繼承 Common 控制。Common 控制器位于 ./Application/Admin/Controller/CommonController.class.php:
<?php namespace Admin\Controller; use Think\Controller;class CommonController extends Controller{public function _initialize() {if(!isset($_SESSION['user']['uid']) || !isset($_SESSION['user']['username'])) {$this->redirect('Admin/Login/index');}} }注:在 ./ThinkPHP/Library/Think/Controller.class.php (ThinkPHP 控制器基類)定義了
/*** 架構(gòu)函數(shù) 取得模板對(duì)象實(shí)例* @access public*/public function __construct() {Hook::listen('action_begin',$this->config);//實(shí)例化視圖類$this->view = Think::instance('Think\View');//控制器初始化if(method_exists($this,'_initialize'))$this->_initialize();}登陸模塊的視圖文件位于 ./Application/Admin/View/Login_index.html:
<!DOCTYPE html> <html><head><link rel="stylesheet" href="__PUBLIC__/Css/login.css" /><meta charset="utf-8"><script src="__PUBLIC__/Js/jquery-1.7.2.min.js"></script><script src="__PUBLIC__/Js/login.js"></script></head><body><div id="top"></div><div class="login"> <form action="{:U('Admin/Login/login')}" method="post" id="login"><div class="title">登錄后臺(tái)</div><table border="1" width="100%"><tr><th>管理員帳號(hào):</th><td><input type="username" name="username" class="len250"/></td></tr><tr><th>密碼:</th><td><input type="password" class="len250" name="password"/></td></tr><tr><th>驗(yàn)證碼:</th><td><input type="code" class="len250" name="code"/> <img src="{:U('Admin/Login/verify','','')}" id="code"/> <a href="javascript:void(change_code(this));">看不清</a></td></tr><tr><td colspan="2" style="padding-left:160px;"> <input type="submit" class="submit" value="登錄"/></td></tr></table></form></div></body> </html>注:
①?U 方法
在控制器使用 U 方法的格式是?U(模塊/控制器/方法, array('參數(shù)1'=>'參數(shù)1的值','參數(shù)2'=>'參數(shù)2的值', '偽靜態(tài)后綴'))
在模板中使用 U 方法的格式是 {:U(模塊/控制器/方法, array('參數(shù)1'=>'參數(shù)1的值','參數(shù)2'=>'參數(shù)2的值', '偽靜態(tài)后綴'))}
② 偽靜態(tài)后綴
可以在模塊配置文件 config.php 中配置偽靜態(tài)后綴,默認(rèn)為 .html,即 URL 可能是 http://serverName/Admin/Index/index.html。可以設(shè)置為空,即 URL 可能為 http://serverName/Admin/Index/index
//偽靜態(tài)后綴'URL_HTML_SUFFIX'=>'',Admin 模塊的文件目錄:
crm_user 表:
CREATE TABLE `crm_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` char(20) NOT NULL DEFAULT '', `password` char(32) NOT NULL DEFAULT '', `logintime` int(10) unsigned NOT NULL, `loginip` varchar(30) NOT NULL, `lock` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8四、自定義 Session 存儲(chǔ)?
① 把 Session 存儲(chǔ)在 MySQL 數(shù)據(jù)庫(kù)中
ThinkPHP 3.2.3 自帶了 Db 類型的 Session 驅(qū)動(dòng),Db 類位于 ./ThinkPHP/Library/Think/Session/Driver/Db.class.php
框架已經(jīng)準(zhǔn)備好了 session 表:
CREATE TABLE think_session (session_id varchar(255) NOT NULL,session_expire int(11) NOT NULL,session_data blob,UNIQUE KEY `session_id` (`session_id`));修改模塊配置 ./Application/Admin/Common/Conf/config.php,增加以下配置即可:
'SESSION_TYPE'=>'Db',② 把 Session 存儲(chǔ)在 Redeis 中
ThinkPHP 3.2.3 自帶了 Memcache ?驅(qū)動(dòng),可以參考該驅(qū)動(dòng)來(lái)開(kāi)發(fā) Redis 驅(qū)動(dòng),新建 Redis.class.php,放在 ./ThinkPHP/Library/Think/Session/Driver 下:
<?php // +--------------------------------------------------------------------- // | Date:2016/01/09 // +---------------------------------------------------------------------- namespace Think\Session\Driver;class Redis {//保存Redis連接對(duì)象protected $redis;//Session有效時(shí)間private $expire;/*** 打開(kāi)Session * @access public * @param string $savePath * @param mixed $sessName */public function open($savePath, $sessName) {$this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxlifetime');$this->redis = new Redis();return $this->redis->connect(C('REDIS_HOST'), C('REDIS_PORT'));}/*** 關(guān)閉Session * @access public */public function close() {return $this->redis->close();}/*** 讀取Session * @access public * @param string $sessID */public function read($sessID) {$sessID = C('SESSION_PREFIX').$sessID;$sessData = $this->redis->get($sessID);return $sessID ? $sessID : '';}/*** 寫入Session * @access public * @param string $sessID * @param String $sessData */public function write($sessID, $sessData) {$sessID = C('SESSION_PREFIX').$sessID;return $this->redis->set($sessID, $sessData, $this->expire);}/*** 刪除Session * @access public * @param string $sessID */public function destroy($sessID) {$sessID = C('SESSION_PREFIX').$sessID;return $this->redis->delete($sessID);}/*** Session 垃圾回收* @access public * @param string $sessMaxLifeTime */public function gc($sessMaxLifeTime) {return true;} }然后修改模塊配置文件 config.php:
'SESSION_TYPE'=>'Redis',//Redeis服務(wù)器地址'REDIS_HOST'=>'127.0.0.1',//Redis端口號(hào)'REDIS_PORT'=>'6379',//Session前綴'SESSION_PREFIX'=>'session_',//Session有效時(shí)間'SESSION_EXPIRE'=>3600五、文章管理
文章管理的控制器 ArticleManageController.class.php:
<?php /** 文章管理類* date:2016/01/10*/ namespace Admin\Controller; use Think\Page;class ArticleManageController extends CommonController{public function index() {$count = M('article')->count();$page = new Page($count, 3);$limit = $page->firstRow.','.$page->listRows;$show = $page->show();$list = M('article')->limit($limit)->select();$this->assign('list', $list);$this->assign('show', $show);$this->display();} }?注:ThinkPHP 3.2.3 的分頁(yè)類位于 ./ThinkPHP/Library/Think/Page.class.php,因此除了使用 use 關(guān)鍵字引入命名空間為 Think 的 Page類,然后直接實(shí)例化 Page類外,還可以在需要實(shí)例化 Page 類的時(shí)候 new \Think\Page(); Think 前面的 \ 代表根命名空間。
在使用分頁(yè)類的時(shí)候只需要把總條數(shù)和每頁(yè)分配的條數(shù)作為參數(shù)傳給 Page 類以獲取 limit 參數(shù)。
文章管理的視圖文件位于 ./Application/Admin/View/ArticleManage_index.html:
<!DOCTYPE html> <html><head><title>TODO supply a title</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><css file='__PUBLIC__/Css/public.css'/></head><body><table class='table'><tr><th>序號(hào)</th><th>標(biāo)題</th><th>發(fā)布人</th><th>內(nèi)容概述</th><th>發(fā)布時(shí)間</th><th>操作</th></tr><volist name='list' id='vo'><tr><td>{$vo.id}</td><td>{$vo.title}</td><td>{$vo.creat_id}</td><td>{$vo.content}</td><td>{$vo.addtime|date="Y-m-d H:i", ###}</td><td><a href="#">刪除</a></td></tr></volist><tr><td colspan="6" align="center">{$show}</td></tr></table></body> </html>注:模板中使用了點(diǎn)語(yǔ)法解析數(shù)組,點(diǎn)語(yǔ)法在模板中除了解析數(shù)組外,還可以解析對(duì)象。可以在模塊配置中設(shè)置點(diǎn)語(yǔ)法只解析數(shù)組,可以使模板解析速度更快:
//點(diǎn)語(yǔ)法默認(rèn)解析'TMPL_VAR_IDENTIFY' => 'array',轉(zhuǎn):
http://www.cnblogs.com/dee0912/p/5116695.html 與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的ThinkPHP 3.2.3 简单后台模块开发(一)常用配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: G36南京长江大桥能走大车吗?
- 下一篇: ThinkPHP 学习笔记 ( 一 )