php源碼建博客3--區分平臺的MVC結構

主要:javascript

  1. 模型單例工廠
  2. 目錄結構優化
  3. 區分平臺(前臺,後臺....)

--------------文件結構:--------------------------------------
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 。。。。。。。
登陸表單form提交action修改

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">&#xe003;</i>經常使用操做</a>
 45                     <ul class="sub-menu">
 46                         <li><a href="#"><i class="icon-font">&#xe008;</i>分類管理</a></li>
 47                         <li><a href="#"><i class="icon-font">&#xe005;</i>博文管理</a></li>
 48                         <li><a href="#"><i class="icon-font">&#xe012;</i>評論管理</a></li>
 49                         <li><a href="#"><i class="icon-font">&#xe052;</i>友情連接</a></li>
 50                     </ul>
 51                 </li>
 52                 <li>
 53                     <a href="#"><i class="icon-font">&#xe018;</i>系統管理</a>
 54                     <ul class="sub-menu">
 55                         <li><a href="#"><i class="icon-font">&#xe017;</i>系統設置</a></li>
 56                         <li><a href="#"><i class="icon-font">&#xe046;</i>數據備份</a></li>
 57                         <li><a href="#"><i class="icon-font">&#xe045;</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">&#xe06b;</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. 如今項目中任何一個目錄,均可以隨意訪問  ==> 如何增強安全訪問,限制目錄的訪問

下一步:常量使用,自動加載類實現,入口封裝,限制目錄訪問

相關文章
相關標籤/搜索