主要:
整理框架
建庫建表
配置文件類
錯誤日志記錄
--------------本篇后文件結構:--------------------------------------├─App│ ├─Model 模型目錄│ ├─View 視圖目錄│ │ ├─Admin后臺目錄│ │ └─Home前臺目錄│ ├─Common 配置目錄│ │ └─config.php 配置文件│ ├─Log 日志目錄│ │ └─log.txt 日志文件│ ├─Controller 控制器│ │ ├─Admin后臺│ │ │ └─DemoController.html' target='_blank'>class.php 測試控制器│ │ └─Home前臺├─Public 靜態(tài)公共文件(js,css,images)│ ├─Plugins 插件│ ├─Back后臺│ └─Home前臺├─Frame 公共使用的類│ ├─BaseModel.class.php 數據庫連接類│ ├─BaseController.class.php 控制器公共操作(設置編碼,信息跳轉)│ ├─FactoryModel.class.php 模型工廠類│ ├─Log.class.php 日志廠類│ ├─Config.class.php 配置文件讀取類│ ├─Init.class.php 初始化應用類│ └─MySQLDB.class.php 數據庫操作工具類└─index.php 入口文件-----------------------------------------------------------------------------------------------------
利用上篇中搭建好的mvc框架結構,正式開始開發(fā)博客項目。首先建立數據表,然后開始搭建后臺,數據前臺展示,完成博客主要模塊展示。
下載查看該項目源碼: http://gitee.com/NewbiesYang/young_blog
整理框架 清理測試頁面1)前面構建框架結構,使用了用戶登錄測試頁面以及后臺首頁頁面。在此全部去掉,從新開始構建前臺和后臺頁面。類似于我們下載了一個ThinkPHP或Laravel或其他的框架。 現(xiàn)在開始在這個微型框架上來構建我們的項目
2) 實際開發(fā),會用前端人員做好的靜態(tài)頁面來進行開發(fā)。所以也可以在 【模板之家】或其他網站 下載 后臺模板和前臺博客靜態(tài)頁面。然后專注于后端開發(fā),可以加快速度。本項目供學習研究使用,也就不那么著急了。
原本是準備全部利用別人寫好的前端頁面(包括前端顯示和后臺頁面),專注于后端邏輯的開發(fā)。而且已經把分類頁面列表都做好了。還提交傳送了。 此刻,仔細想想,要是這樣玩,那我直接用框架更好了。既然做后端開發(fā),自己寫個后端頁面+程序處理,沒什么問題吧..., 置于前端顯示頁面,那再用前輩寫的前端頁面倒是可以的 于是乎,卷起柚子,說干就干,先來整理框架,開始搭建博客。。。。。框架結構:
--------------清理后MVC框架文件結構:--------------------------------------├─App│ ├─Model 模型目錄│ ├─View 視圖目錄│ │ ├─Back后臺│ │ └─Home前臺│ ├─Controller 控制器目錄│ │ ├─Back后臺│ │ └─Home前臺├─Public 靜態(tài)公共文件(js,css,images)│ ├─Plugins 插件│ ├─Back后臺│ └─Home前臺 ├─Frame 公共使用的類│ ├─BaseModel.class.php 數據庫連接類│ ├─BaseController.class.php 控制器公共操作(設置編碼,信息跳轉)│ ├─FactoryModel.class.php 模型工廠類│ ├─Init.class.php 初始化應用類│ └─MySQLDB.class.php 數據庫操作工具類└─index.php 入口文件-----------------------------------------------------------------
后續(xù)的開發(fā)只需要復制該目錄結構文件, 就可以在此基礎上進行開發(fā)了。
提交傳送代碼
git add -Agit commit -m 清理MVC結構 git push origin master插件準備
1) layui插件: 搭建后臺程序,準備使用layui前端框架,這個框架個人認為做后臺界面還是不錯的。它還包含一些比較使用模塊。
用bootstrap也可以,我更加傾向于用它來做前臺頁面。
下載網址: http://www.layui.com/
2) jQuery庫: 更方便操作DOM, 尤其是經常使用ajax請求。
3) 其他插件: 如Ueditor編輯器等 需要使用時再下載吧。一般插件都會有demo示例, 按照示例和手冊,懂web開發(fā)基本能使用。
上述插件暫時不熟悉沒有關系,網址上有手冊,需要什么模塊,便查手冊便使用,就像搭積木,如果要做得更好,當然要花更多的時間多練習。我本著后臺給程序管理員使用,也不一定要非常漂亮,實用就好。
建庫建表準備: 創(chuàng)建分支
$ git checkout master$ git checkout -b start-admin-module建表思路:
根據博客模板,從首頁開始分析, 分析哪些需要動態(tài)數據,以便建立對應數據表。
用戶: 登錄, 注冊, 修改, 刪除
文章: 分類管理, 博文管理, 評論管理
角色管理: 管理員,普通用戶
菜單管理: 不同權限人員,對應菜單欄也有區(qū)別
建表工具可以任意選擇。初期手工寫建表語句,熟悉后直接使用工具。 本項目中使用 Navicat 建立數據庫和表
數據庫,表1) 創(chuàng)建數據庫:php_blog
create database php_blog charset utf8
2) 用戶表: y_users
CREATE TABLE `y_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 用戶主鍵 , `username` varchar(20) NOT NULL COMMENT 用戶名 , `password` char(32) NOT NULL COMMENT 密碼 , `email` varchar(50) NOT NULL DEFAULT COMMENT 注冊郵箱 , `token_email` varchar(32) NOT NULL DEFAULT COMMENT 郵箱驗證 , `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 狀態(tài), 0-正常,1-禁用 , `gid` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 角色id,1-管理員,2-普通用戶,0-無效 , `login_ip` varchar(20) NOT NULL DEFAULT COMMENT 最后登錄的ip地址 , `login_times` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT 登錄次數 , `created_at` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 注冊時間 , `updated_at` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 最后一次登錄時間 , PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT= 用戶表
用戶表SQL
3)角色表: y_user_group
CREATE TABLE `y_user_group` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 角色id , `name` varchar(20) NOT NULL DEFAULT COMMENT 角色名稱 , `auths` varchar(255) NOT NULL DEFAULT COMMENT 角色權限 , PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT= 角色表
角色表SQL
4) 菜單表: y_menus
CREATE TABLE `y_menus` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 菜單id , `title` varchar(20) DEFAULT COMMENT 菜單名稱 , `controller` varchar(30) DEFAULT COMMENT 控制器名稱 , `action` varchar(30) DEFAULT COMMENT 操作名稱 , `status` tinyint(1) unsigned DEFAULT 1 COMMENT 狀態(tài),1-正常,0-禁用 , `is_hidden` tinyint(1) unsigned DEFAULT 0 COMMENT 是否隱藏,0-正常顯示,1-隱藏 , `sort` int(10) unsigned DEFAULT 0 COMMENT 排序 , `pid` int(10) unsigned DEFAULT 0 COMMENT 上一級菜單 , PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT= 菜單表
菜單表SQL
5) 文章表 y_article
CREATE TABLE `y_article` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 文章id , `title` varchar(60) NOT NULL DEFAULT COMMENT 標題 , `description` varchar(200) NOT NULL DEFAULT COMMENT 文章簡介 , `content` text NOT NULL COMMENT 內容 , `cid` int(10) unsigned NOT NULL COMMENT 文章類別 , `pic` varchar(150) NOT NULL DEFAULT COMMENT 文章封面圖 , `pic_watermark` varchar(150) NOT NULL DEFAULT COMMENT 水印圖 , `pic_thumb` varchar(150) NOT NULL DEFAULT COMMENT 縮略圖 , `uid` int(10) unsigned NOT NULL COMMENT 作者 , `clicks` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 閱讀數(點擊數) , `updated_at` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 更新時間 , `created_at` int(11) NOT NULL DEFAULT 0 COMMENT 發(fā)布時間 , PRIMARY KEY (`id`), KEY `title` (`title`), KEY `uid` (`uid`), KEY `clicks` (`clicks`), KEY `cid` (`cid`) USING BTREE) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT= 文章表
文章表SQL
6) 文章類別表 y_category
CREATE TABLE `y_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 分類id , `catename` varchar(15) NOT NULL COMMENT 分類名 , `description` varchar(255) NOT NULL DEFAULT COMMENT 簡介 , PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT= 文章類別表
文章類別表SQL
7) 評論(回復)表 y_comment
CREATE TABLE `y_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 評論id , `uid` int(10) unsigned NOT NULL COMMENT 評論者 , `created_at` int(11) DEFAULT NULL COMMENT 評論時間 , `content` varchar(255) NOT NULL DEFAULT COMMENT 評論內容 , `aid` int(10) unsigned NOT NULL COMMENT 被評論的文章 , PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT= 評論(回復)表
評論(回復)表SQL
8) session數據表 y_session (其實可以不用這個,目的是為了操作 將session寫入數據庫 )
CREATE TABLE `y_session` ( `sess_id` varchar(50) NOT NULL DEFAULT COMMENT session id , `data` text NOT NULL COMMENT session數據 , `created_at` int(11) NOT NULL COMMENT session創(chuàng)建時間 , PRIMARY KEY (`sess_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT= session數據表
session數據表SQL
為了避免弄的太復雜, 暫時建立這些數據表,字段后續(xù)可以進行調整。如果需要加入模塊功能,可以相應增加相應數據表。
連接數據庫在badeModel中修改數據連接的數組信息 【Frame/BaseModel.class.php】 (如果使用配置文件類,此處就可以省略了)
1 class BaseModel { 2 。。。 3 。。。 4 。。。 5 function __construct(array $config=null) 6 { 7 $conf = array( 8 host = localhost , 9 user = root , 10 pwd = root , 11 port = 3306 , 12 charset = utf8 , 13 dbname = php_blog , 14 ); 15 $conf = empty($config)? $conf : array_merge($conf,$config); 16 $this- db = Db::getDb($conf); 17 } 18 }
設置連接數據庫信息
配置文件類 需求分析:為了框架便于數據庫連接以及方便讀取配置文件。如 希望在 App/Common/config.php 做一些配置項,要求能讀取這些配置并應用到項目
思路:step 1: 創(chuàng)建文件 App/Common/config.php 并將數據庫連接信息寫入該配置文件step 2: 在Frame/目錄下創(chuàng)建讀取配置文件類 Config.class.phpstep 3: 設置自動加載 讀取配置類step 4: 基礎模型類實例化 讀取配置類。 操作數據庫必須要經過基礎模型類step 5: 調整數據庫工具類獲取配置信息,既 其構造方法中通過傳遞進來的數據配置信息對象獲取step 6: 測試連接數據結果,驗證獲取配置
實現(xiàn)連接數據庫-讀取數據庫配置信息思路
代碼實現(xiàn)1) 創(chuàng)建配置文件config.php 【App/Common/Config.php】
?php/** * 配置文件 * User: young */return [ //數據庫連接配置 host = localhost , user = root , pwd = root , port = 3306 , charset = utf8 , dbname = php_blog
配置文件-數據庫配置信息
2) 創(chuàng)建讀取配置文件類 【Frame/Config.class.php】
1 ?php 2 /** 3 * 配置文件讀取類 4 * User: young 5 */ 7 class Config 8 { 9 protected static $ins = null; //本類實例 10 protected $cfg = array(); //存儲配置項 12 /** 13 * 獲取本類實例 14 * @access public 15 * @return object 本類的單例對象 16 */ 17 public static function getIns() { 18 if(false === (self::$ins instanceof self)){ 19 self::$ins = new self(); 20 } 21 return self::$ins; 22 } 24 /** 25 * 構造方法: 讀取配置項 26 * @access public 27 * @return void 28 */ 29 final protected function __construct() { 30 require APP. Common .DS. config.php //讀取配置項 31 $this- cfg = $cfg; 32 } 34 /** 35 * 根據指定的配置項,返回該配置項的值 36 * @param string $k 配置項 37 * @return mixed|null 返回配置項的數據 38 */ 39 public function __get($k) { 40 if(!isset($this- cfg[$k])) { 41 return null; 42 } 43 return $this- cfg[$k]; 44 } 47 /** 48 * 根據指定的配置項,返回配置項的值 49 * @param string $k 配置項名稱 50 * @param string $v 配置項對應的值 51 */ 52 public function __set($k,$v) { 53 $this- cfg[$k] = $v; 54 } 55 }
3) 自動加載配置類
需要自動加載該類, 該類在Frame目錄下, 所以可以寫入到 Init.class.php 類中的屬性數組中 【Frame/Init.class.php】
?php * 初始化應用類 * User: youngclass Init protected static $frame = array( BaseController , BaseModel , Db , FactoryModel , Config 自動加載配置類
4)基礎模型類實例化配置類【Frame/BaseModel.class.php】
?php * BaseModel.class.php 基礎模型類 * 連接數據庫 * @author youngclass BaseModel protected $db = null; * 構造方法: 實例化數據庫類 * @access public function __construct() $conf = Config::getIns(); //讀取配置項實例 $this- db = Db::getDb($conf);}
5)數據庫讀取配置項信息 【Frame/Db.class.php】
?php * Db.class.php 數據庫操作工具類 * @author youngclass Db { * 構造方法: 保存數據庫連接信息,連接數據庫 * @access private * @param array $conf 數據庫連接信息 private function __construct($conf) $this- host = $conf- host; $this- user = $conf- user; $this- pwd = $conf- $this- port = $conf- port; $this- charset = $conf- charset; $this- dbname = $conf- dbname; $this- connect();數據庫工具類獲取配置信息
6) 測試 在App/Controller/Home/DemoController.class.php 用于測試數據庫連接情況
?php * 測試控制器類 * User: youngclass DemoController extends BaseController public function test() $db = new BaseModel(); $data = $db- db- getAllRows( select * from y_user var_dump($data);}
測試控制器類測試連接數據庫
注: 前提,需要將BaseModel.class.php中的$db屬性先臨時修改為public公開,才能測試成功 (原因:在Demo控制器中實例化的基礎模型類,數據庫操作實例是放在類的屬性db中,外部不能訪問protected屬性), 本節(jié)所有測試,可以臨時將db設置為公開的。
還可以使用配置如: 上傳目錄,網站配置信息等,根據需求自定義配置需求,再通過讀取配置類讀取配置的數據
提交代碼
git add -Agit commit -m 完成讀取配置文件類錯誤日志記錄
除了開發(fā)階段調試錯誤, 項目上線一般會將錯誤信息寫入指定文件中。安全性更好。
需求分析:將錯誤寫入日志文件中,這里暫時主要記錄數據庫操作的錯誤。 如:默認將錯誤記錄在App/log/logError.txt。 如果在配置文件中進行了配置,則將日志信息寫入到配置項log指定的目錄中
思路:step 1: 制作日志類Frame/Log.class.php, 用于將錯誤信息寫入到指定文件中。 (設置日志文件位置,正好可以利用上面寫的配置項,通過讀取配置來實現(xiàn))step 2: 在基礎模型類BaseModel中,讀取配置項后, 可以將日志目錄路徑寫入常量。 使用try..catch 捕捉異常,將錯誤寫入日志step 3: 實現(xiàn)日志類自動加載。Log類在Frame目錄中,所以只要在初始化應用類Init中的屬性$frame數組中加入 “Log”step 4: 記錄錯誤。 數據庫連接可能失敗, sql語句可能執(zhí)行失敗step 5: 測試錯誤日志記錄功
實現(xiàn)錯誤日志記錄過程思路
代碼實現(xiàn)
1) 制作錯誤日志類 【Frame/Log.class.php】
?php * Db.class.php 數據庫操作工具類 * @author youngclass Db { * 構造方法: 保存數據庫連接信息,連接數據庫 * @access private * @param array $conf 數據庫連接信息 private function __construct($conf) $this- host = $conf- host; $this- user = $conf- user; $this- pwd = $conf- $this- port = $conf- port; $this- charset = $conf- charset; $this- dbname = $conf- dbname; $this- connect();數據庫工具類獲取配置信息
2) 讀取日志位置,捕捉錯誤 【Frame/BaseModel.class.php】
發(fā)生錯誤記錄后,這里只是簡單使用exit(..)退出, 可以自定error錯誤頁面會更好
?php * BaseModel.class.php 基礎模型類 * 連接數據庫,捕捉記錄錯誤 * @author youngclass BaseModel Public $db = null; * 構造方法: 實例化數據庫類 * @access public function __construct() $conf = Config::getIns(); //讀取配置項實例 //讀取日志配置項目 并寫成常量 $logPath = $conf- $logPath = !isset($logPath) ? APP. log .DS : $logPath; define( LOG ,$logPath); //監(jiān)控數據庫操作 try { $this- db = Db::getDb($conf); }catch(Exception $e) { $err = $err .= 錯誤代碼: . $e- getCode() . /r/n $err .= 錯誤信息: . $e- getMessage() . /r/n $err .= 文件: . $e- getFile() . /r/n $err .= 行號: . $e- getLine() . /r/n/r/n Log::write($err); exit( h2 客官!頁面暫時無法響應,請稍后訪問 /h2 點擊查看【基礎模型類中監(jiān)測并記錄錯誤】
3)自動加載日志記錄類 【Frame/Init.class.php】
?php * 初始化應用類 * User: youngclass Init protected static $frame = array( BaseController , BaseModel , Db , FactoryModel , Config , Log 點擊查看【自動加載日志類】
4) 記錄錯誤 【Frame/Db.class.php】
數據庫連接可能發(fā)生錯誤處理
class Db * 連接數據庫,設置編碼,選庫 * @access private private function connect() $this- link = @ mysql_connect( {$this- host}:{$this- port} , $this- user , $this- pwd ) ; if(!$this - link) { $error = new Exception( 數據庫連接不上 ,10000); throw $error; $this- setCharset($this- charset); $this- useDb($this- dbname);點擊查看【數據庫連接錯誤拋出】
sql語句發(fā)生錯誤處理
class Db * 執(zhí)行sql語句 * @param string $sql sql語句 * @return mixed private function query($sql) $result = mysql_query($sql, $this- link);// if(false === $result) {// echo p sql執(zhí)行失敗! br // echo br 失敗語句: .$sql;// echo br 錯誤代號 .mysql_errno();// echo br 錯誤提示: .mysql_error(). /p // exit(); if(false === $result) { $err = sql執(zhí)行失敗!/r/n失敗語句: .$sql. /r/n錯誤代號: .mysql_errno(). /r/n錯誤提示: .mysql_error(). /r/n/r/n Log::write($err); exit( h2 查詢出錯,請稍后訪問 /h2 return $result;點擊查看【執(zhí)行SQL錯誤處理】測試
可以在【App/Common/config.php】中配置日志文件目錄。 如果不進行配置, 默認記錄在App/log/目錄中
?php * 配置文件 * User: youngreturn [ //數據庫連接配置、 。。。 //日志文件位置配置 log = APP,點擊查看【日志文件配置】
以下測試可以 開啟配置項中的配置log 和關閉后分別測試。 注意: 如果沒有做配置log, 則要首先在App目錄下建立一個log目錄
1. 在配置文件中故意寫錯數據庫連接信息,如密碼寫錯
2. 執(zhí)行sql錯誤
最后說明: 配置目錄,日志目錄都是不希望瀏覽器直接訪問的,所以需要將.htaccess文件放入目錄中 (由于App目錄中已經存在,故也可以省略)
提交傳送代碼
git add -Agit commit -m 完成日志類 git checkout mastergit merge start-admin-modulegit push origin master
小結: 本篇主要實現(xiàn)了 框架清理,博客數據庫表搭建,創(chuàng)建配置讀取類,日志記錄類。
實際上,到此仍然只是更加完善了一下框架結構,增加了2個功能。正如前篇所提,還有很多是可以改進的。這里就暫時不再繼續(xù)增加功能了。
提出問題:1. 如何使用該自制框架搭建項目 == 用戶操作+mvc實現(xiàn)
2. 如何著手使用ajax實現(xiàn)后臺登錄功能 == ajax應用
3. 如何著手實現(xiàn)分類模塊功能,它有哪些操作 == 增刪改查
下一步: 后臺模板視圖制作,后臺登錄,文章分類模塊功能。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
php源碼之實現(xiàn)MVC結構微型框架
PHP7.2 Data Structures的使用
以上就是php源碼建庫建表-配置文件-錯誤日志的方法的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答