主要:javascript
--------------文件結構:-------------------------------------- blog
├─App
│ ├─Model 模型
│ │ └─UserModel.class.php 用戶模型類
│ ├─View 視圖
│ │ ├─Back後臺
│ │ │ └─Index
│ │ │ └─index.html 後臺首頁面
│ │ └─Home前臺
│ │ └─User 用戶視圖目錄
│ │ └─login.html 登陸表單頁面
│ ├─Controller 控制器
│ │ ├─Back後臺
│ │ │ └─IndexController.class.php 後臺首頁控制器
│ │ └─Home前臺
│ │ └─UserController.class.php 用戶控制器
├─Public 靜態公共文件(js,css,images)
│ ├─Plugins 插件
│ │ └─layui 前端框架插件
│ ├─Back後臺
│ │ ├─js/ js文件
│ │ ├─css/ css樣式文件
│ │ └─image img圖片
│ └─Home前臺
│ ├─js/ js文件
│ ├─css/ css樣式文件
│ └─image img圖片
├─Frame 公共使用的類
│ ├─BaseModel.class.php 數據庫鏈接類
│ ├─BaseController.class.php 控制器公共操做(設置編碼,信息跳轉)
│ ├─FactoryModel.class.php 模型工廠類
│ └─MySQLDB.class.php 數據庫操做工具類
└─index.php 入口文件 ----------------------------------------------------------------
下載查看該項目源碼: https://gitee.com/NewbiesYang/young_blogphp
準備: 建立分支css
1 $ git checkout master 2 $ git checkout -b "folder-model-app"
說明:html
1)程序中3行 。。。 表示省略的代碼。從前面或源碼中可查看前端
2) 【XXX/XXX】表示項目文件相對路徑java
問題: 項目中模型操做數據表,一個動做可能就要操做一次數據庫,一次請求多個動做,每一個動做都須要去實例化對應模型jquery
解決想法: 建立一個模型類單例工廠
實現: 建立單例的模型類 FactoryModel.class.php
屬性$model=array(); 存儲模型類實例
方法: M($cmodelName, array $conf=null) 實例化模型類
使用: 控制器中使用模型類實例:$model=FactoryModel::M('模型名稱')git
1) 建立模型單例工廠 【Frame/FactoryModel.class.php】 數據庫
1 <?php 2 /** 3 * 單例模型工廠類 4 * User: young 5 */ 6 7 class FactoryModel 8 { 9 protected static $model = array(); //存儲模型類實例 10 11 /** 12 * 構造方法 13 */ 14 protected function __construct() 15 { 16 } 17 18 /* 19 * 傳遞一個模型類的類名,就返回該類的一個單例實例對象 20 *@param string $modelName 模型類的類名 21 *@param array $conf 數據庫配置信息 22 *@return object 傳入模型類的實例(單例) 23 */ 24 public static function M($modelName, array $conf=null) 25 { 26 $modelName = $modelName.'Model'; 27 if(empty(static::$model[$modelName]) || !(static::$model[$modelName] instanceof $modelName)){ 28 static::$model[$modelName] = new $modelName($conf); 29 } 30 return static::$model[$modelName]; 31 } 32 }
2) 引入該類文件 【index.php】apache
1 <?php 2 /** 3 * 入口文件 4 */ 5 require_once 'Frame/Db.class.php'; //數據庫操做類 6 require_once 'Frame/BaseModel.class.php'; //基礎模型類 7 require_once('Model/UserModel.class.php'); 8 9 require_once 'Frame/FactoryModel.class.php';//模型工廠類 10 。。。 11 。。。 12 。。。
3) 應用: 控制器中使用,如用戶控制器UserController中 登陸操做【Controller/UserController.class.php】
1 <?php 2 /** 3 * UserController.class.php 用戶控制器 4 */ 5 6 class UserController extends BaseController{ 7 。。。 8 。。。 9 。。。 10 11 /** 12 * 登陸操做: 校驗登陸信息 13 */ 14 public function dlogin() 15 { 16 //接收登陸信息 17 $data = array(); 18 $data['username'] = trim($_POST['username']); 19 $data['pwd'] = trim($_POST['pwd']); 20 21 //實例化模型,調用模型方法 22 //$model = new UserModel(); 23 //$result = $model->checkLoginInfo($data); 24 //替換上面兩行 25 $result = FactoryModel::M('User')->checkLoginInfo($data); 26 27 //跳轉提示 28 if($result){ 29 $this->msg('登陸成功!', '?a=index',3); 30 } else { 31 $this->msg('用戶名或密碼不正確!!'); 32 } 33 } 34 }
4) 測試程序運行,http://www.test.com/blog/index.php 登陸測試結果與前面一致。暫時先提交代碼
1 git add -A 2 git commit -m "完成模型工廠類"
多個平臺(模塊):先後,後臺
MVC結構分平臺
C: Controllers/Home Controllers/Admin .....
V: Views/Home Views/Admin .....
M: 操做數據表通常模塊共用
公共資源目錄Public: Public/Home Public/Admin .....
目錄結構變化,全部載入類,視圖的路徑作相應變化
1)操做步驟
1)目錄構建: step 1: 根目錄下建立目錄App, 將Model目錄,View目錄,Controller目錄放大App目錄下 既根目錄只有: App/ Public/ Frame/ index.php step 2: 在Controller目錄中,建立Back目錄和Home目錄。將UserController控制器類文件放入Home目錄中 step 3: 在View目錄中,建立Back目錄和Home目錄。將login.html文件放入Home目錄中 step 4: 在Public目錄中,建立Back目錄,Home目錄,Plugins目錄。將js,images,css目錄放入Home目錄中,公共插件放入對應的Plugins目錄中 2)文件引入修改: step 5: index.php入口文件對UserCotroller類的引入路徑修改 step 6:UserController類中對視圖login.html的include路徑的修改 step 7: 視圖login.html中對css和js路徑的引入
2) 具體代碼修改操做
入口文件引入類路徑修改【index.php】 主要是用戶模型類和用戶控制器類路徑引入修改
1 <?php 2 /** 3 * 入口文件 4 */ 5 require_once 'Frame/Db.class.php'; //數據庫操做類 6 require_once 'Frame/BaseModel.class.php'; //基礎模型類 7 require_once 'App/Model/UserModel.class.php'; 8 9 require_once 'Frame/FactoryModel.class.php';//模型工廠類 10 11 require_once 'Frame/BaseController.class.php'; //基礎控制器類 12 require_once 'App/Controller/Home/UserController.class.php'; 13 14 //實例化控制器 15 $userCtr = new UserController(); 16 17 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; 18 19 $userCtr -> $a();
用戶控制器類對登陸表單視圖路徑引入的修改 【App/Controller/Home/UserController.class.php】
1 <?php 2 /** 3 * UserController.class.php 用戶控制器 4 */ 5 6 class UserController extends BaseController{ 7 /** 8 * 展現登陸界面 9 * @access public 10 */ 11 public function login() 12 { 13 include "App/View/Home/User/login.html"; 14 } 15 。。。 16 。。。 17 。。。
登陸表單視圖 【App/View/Home/User/login.html】 對靜態資源路徑的修改
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>登陸</title> 6 <link rel="stylesheet" type="text/css" href="public/plugins/layui/css/layui.css"> 7 <link rel="stylesheet" type="text/css" href="public/Home/css/style.css"> 8 </head> 9 。。。 10 。。。 11 。。。 12 <script type="text/javascript" src="public/plugins/layui/layui.js"></script> 13 <script> 14 layui.use('form', function(){ 15 var form = layui.form; 16 }); 17 </script> 18 </body> 19 </html>
提交保存代碼
1 git add -A 2 git commit -m "目錄結構優化"
實現根據平臺的不一樣進行不一樣的操做
用戶點擊頁面請求,隨着url發送3個參數: p=平臺&c=控制器&a=動做
入口文件接收get數據就能夠知道: 平臺, 控制器, 動做
1) 操做步驟:
1)入口文件平臺區分: step 1: 入口-登陸頁面提交的action="?p=Home&c=User&a=dlogin" step 2: 入口文件index.php 接收$_GET step 3: 登陸判斷成功跳轉地址: $this->msg('登陸成功!', '?p=Admin&c=Index&a=index',3); 2) 後臺首頁: step 1: 靜態css,js,img文件放置 Public/Admin/ step 2: 建立後臺首頁控制器類, index() 載入後臺首頁視圖文件 step 3: View/Admin/Index/index.html 修正css等靜態文件路
2)登陸表單提交action=「?p=Home&c=User&a=dlogin」 【App/View/Home/User/login.html】
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>登陸</title> 6 <link rel="stylesheet" type="text/css" href="public/plugins/layui/css/layui.css"> 7 <link rel="stylesheet" type="text/css" href="public/Home/css/style.css"> 8 </head> 9 <body> 10 <div class="container"> 11 <div class="content"> 12 <form action="?p=Home&c=User&a=dlogin" class="layui-form" method="post"> 13 。。。。。。。
3) 入口文件區分平臺 【index.php】
<?php /** * 入口文件 */ $p = !empty($_GET['p']) ? $_GET['p'] : 'Home'; //平臺 $c = !empty($_GET['c']) ? $_GET['c'] : 'User'; //控制器 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //動做 require_once 'Frame/Db.class.php'; //數據庫操做類 require_once 'Frame/BaseModel.class.php'; //基礎模型類 require_once 'App/Model/UserModel.class.php'; require_once 'Frame/FactoryModel.class.php';//模型工廠類 require_once 'Frame/BaseController.class.php'; //基礎控制器類 require_once 'App/Controller/'.$p.'/'.$c.'Controller.class.php'; $ctr = $c."Controller"; //實例化控制器 $userCtr = new $ctr(); $userCtr -> $a();
用戶控制器登陸操做,登陸成功跳轉到後臺首頁 【App/Controller/Home/UserController.class.php】
1 <?php 2 /** 3 * UserController.class.php 用戶控制器 4 */ 5 6 class UserController extends BaseController{ 7 。。。 8 。。。 9 。。。 10 /** 11 * 登陸操做: 校驗登陸信息 12 */ 13 public function dlogin() 14 { 15 //接收登陸信息 16 $data = array(); 17 $data['username'] = trim($_POST['username']); 18 $data['pwd'] = trim($_POST['pwd']); 19 20 //實例化模型,調用模型方法 21 $result = FactoryModel::M('User')->checkLoginInfo($data); 22 23 //跳轉提示 24 if($result){ 25 $this->msg('登陸成功!', '?p=Admin&c=Index&a=index',3); 26 } else { 27 $this->msg('用戶名或密碼不正確!!'); 28 } 29 } 30 }
1)模板準備:
準備後臺視圖模板程序。能夠本身寫前端視圖模板程序,也能夠到網上下載別人寫好的前端模板,如到 模板之家 選擇所需求的 前臺,後臺模板
尋找模板: www.mycodes.net
2) 將後臺模板視圖的靜態資源文件(如 js, css,image)拷貝到 【Public/admin/】目錄下
3) 建立後臺首頁控制器 【App/Controller/Admin/IndexController.class.php】
1 <?php 2 /** 3 * IndexController控制器類 4 * 後臺相關操做 5 * User: young 6 */ 7 8 class IndexController extends BaseController 9 { 10 //展現後臺首頁 11 public function index() 12 { 13 include 'App/View/Admin/Index/index.html'; 14 } 15 }
4) 建立後臺首頁視圖 【App/View/Admin/Index/index.html】
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>後臺管理</title> 6 <link rel="stylesheet" type="text/css" href="./Public/Admin/css/common.css"/> 7 <link rel="stylesheet" type="text/css" href="./Public/Admin/css/main.css"/> 8 <script type="text/javascript" src="./Public/Admin/js/libs/modernizr.min.js"></script> 9 <script type="text/javascript" src="./Public//home/js/jquery1.42.min.js"></script> 10 </head> 11 <body> 12 13 14 <div class="topbar-wrap white"> 15 <div class="topbar-inner clearfix"> 16 <div class="topbar-logo-wrap clearfix"> 17 <h1 class="topbar-logo none"><a href="index.html" class="navbar-brand">後臺管理</a></h1> 18 <ul class="navbar-list clearfix"> 19 <li><a class="on" href="?p=back">首頁</a></li> 20 <li><a href="./" target="_blank">網站首頁</a></li> 21 </ul> 22 </div> 23 <div class="top-info-wrap"> 24 <ul class="top-info-list clearfix"> 25 <li><a href="">user1</a></li> 26 <li><a href="?p=back&c=Index&a=ChangePswd">修改密碼</a></li> 27 <li><a href="?c=User&a=Logout">退出</a></li> 28 </ul> 29 </div> 30 </div> 31 </div> 32 <div class="container clearfix"> 33 34 <!--左側菜單欄--> 35 36 <!--左側菜單欄 begin--> 37 <div class="sidebar-wrap"> 38 <div class="sidebar-title"> 39 <h1>菜單</h1> 40 </div> 41 <div class="sidebar-content"> 42 <ul class="sidebar-list"> 43 <li> 44 <a href="#"><i class="icon-font"></i>經常使用操做</a> 45 <ul class="sub-menu"> 46 <li><a href="#"><i class="icon-font"></i>分類管理</a></li> 47 <li><a href="#"><i class="icon-font"></i>博文管理</a></li> 48 <li><a href="#"><i class="icon-font"></i>評論管理</a></li> 49 <li><a href="#"><i class="icon-font"></i>友情連接</a></li> 50 </ul> 51 </li> 52 <li> 53 <a href="#"><i class="icon-font"></i>系統管理</a> 54 <ul class="sub-menu"> 55 <li><a href="#"><i class="icon-font"></i>系統設置</a></li> 56 <li><a href="#"><i class="icon-font"></i>數據備份</a></li> 57 <li><a href="#"><i class="icon-font"></i>數據還原</a></li> 58 </ul> 59 </li> 60 </ul> 61 </div> 62 </div> 63 <!--左側菜單欄 begin--> 64 65 <!--右側主操做區--> 66 <div class="main-wrap"> 67 <div class="crumb-wrap"> 68 <div class="crumb-list"> 69 <i class="icon-font"></i> 70 <span>歡迎使用博客後臺管理系統。</span> 71 </div> 72 </div> 73 <div class="result-wrap"> 74 <div class="result-title"> 75 <h1>系統基本信息</h1> 76 </div> 77 <div class="result-content"> 78 <ul class="sys-info-list"> 79 <li> 80 <label class="res-lab">操做系統</label><span class="res-info">WINNT</span> 81 </li> 82 <li> 83 <label class="res-lab">運行環境</label><span class="res-info">Apache/2.2.21 (Win64) PHP/5.3.10</span> 84 </li> 85 <li> 86 <label class="res-lab">PHP運行方式</label><span class="res-info">apache2handler</span> 87 </li> 88 <li> 89 <label class="res-lab">模板版本</label><span class="res-info">v-0.1</span> 90 </li> 91 <li> 92 <label class="res-lab">上傳附件限制</label><span class="res-info">2M</span> 93 </li> 94 <li> 95 <label class="res-lab">北京時間</label> 96 <span class="res-info" id='nowtime'><?php echo date('Y年m月d日 H:i:s',time()); ?></span> 97 </li> 98 <li> 99 <label class="res-lab">服務器域名</label><span class="res-info"><span id="host">localhost</span></span> 100 </li> 101 </ul> 102 </div> 103 </div> 104 </div> 105 <!--/main--> 106 <script > 107 $(function(){ 108 $("#nowtime").css({color:'red'}); 109 $("#host").html(location.host); 110 window.setInterval('ShowTime()',1000); 111 }); 112 function ShowTime(){ 113 var t = new Date(); 114 var str = t.getFullYear() + '年'; 115 str += t.getMonth()+1 + '月'; 116 str += t.getDate()-1 + '日 '; 117 str += t.getHours() + ':'; 118 str += t.getMinutes() + ':'; 119 str += t.getSeconds() + ''; 120 $("#nowtime").html(str); 121 } 122 </script> 123 </div> 124 125 </body> 126 </html>
1 $ git add -A 2 $ git commit -m "區分平臺,實現後臺首頁" 3 $ git checkout master 4 $ git merge 'folder-model-app' 5 $ git push origin master
小結: 根據平臺進一步優化目錄結構,製做模型的單例工廠,實現後臺首頁
1. 項目中能夠看到 include或require的文件路徑很長,容易出錯,也不便於使用 ==> 如何更加簡單引入且不易出錯
2. 寫一個類,就要到入口文件引入一次, 比較麻煩 ==> 如何實現自動加載類
3. 隨着類的引入增長,入口文件代碼量會愈來愈大 ==> 如何 封裝,簡化入口文件
4. 如今項目中任何一個目錄,均可以隨意訪問 ==> 如何增強安全訪問,限制目錄的訪問
下一步:常量使用,自動加載類實現,入口封裝,限制目錄訪問