PHP 仿博客園 個人博客(1)


本人本科學歷,自學PHP大半年多了,斷斷續續地,但是最終還是堅定了我的想法,將PHP繼續下去,所以寫這個PHP的博客是為了找個穩定的 PHP工作,不求工資多高,但求一收留之地。我能看懂大部分英語文檔,人不蠢,愛學習,有興趣地可以聯系下!有誠意的來吧!qq:240382473

我會分3-5次發布所有關鍵代碼和文檔說明,博客后台所有的樣式均套用博客園!

說明:

1. 不完全采用MVC架構,但是理念就是這樣的。因為還不能寫出很穩定的MVC架構。

2.幾乎不采用JQUERY AJAX 因為不是特別熟悉,運用起來還不自如,留言本可以用AJAX,沒問題。

3.有幾個公用類,其他代碼均手寫,有不足地地方請多多指出,非常感謝。

4.歡迎批評與指導,但是請給出你的理由。

 

言歸正傳:先看數據庫架構

這些表的引擎都是MYISAM, 利於存取。(黃色鑰匙表示的是 primary key; 藍色菱形的表示非空字段; 白色菱形表示的 null 字段) 圖中的鏈接僅表示他們之間有一種潛在關系,無法在操作時關聯.因為搜索引擎是  MyISAM。 所以需要聯合查詢, 以及多表操作。

我會挑最重要的 post , category 2個表中的特別字段來詳細說明,其他說重要的。

post:

post_id

category_id varchar(10) 這個是用來索引博文的分類, 這里的category_id 也是字符串類型,所以可以為每一個博文設置多個分類。

type varchar(20) 這個字段是用來區分 隨筆(post),文章(article),和日記(diary)的; 同時也是能夠 設置為 postDraft, articleDraft ;

visiable 博文是否可見

其他常用字段如 標題,內容,創建時間,最后改動時間,瀏覽次數,評論次數,標簽,允許評論,以及些保留字段。

category:

parent, count_child_number, count_parent_number 用於以后擴展

type 可以分別設置相冊、博文、日記的分類

其他常用字段如 名稱,描述,創建時間,可見性

comment:

address 用戶IP

user_agent 用戶瀏覽器類型


其它字段略...

服務器架構 

PHP5.4.2 + MYSQL 5.523 + APACHE 2.2.22 + Windows NT ARIST-PC 6.1 build 7600 (Windows 7 Home Basic Edition) i586 (本地)

博客架構

后台目錄:

 

后台目錄說明:

assert 存放各種資源 js,css,image

class 存放我們的類 常用類如 數據庫操作類,分頁類,和我們的大部分model 。。。

extention 存放些擴展 如 mce 的富編輯器

config 存放我們的 配置信息

templates 存放所有的模版(沒有采用 smarty)

upload 存放的是相片和其他文件

admin 根目錄下會有一些類似的控制器 如 index.php, post.php, article.php, photo.php

 

我們先看看 admin/config/config.php

<?php
ini_set( "display_errors", true );
date_default_timezone_set( "Asia/Shanghai" );  
// root and direcotry separate
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(dirname(__FILE__)));

// database information 
// need hash
define( "DB_USERNAME", "****" );
define( "DB_PASSWORD", '*****' );
define( "DB_NAME", "blog" );

// important directory
define( "CLASS_PATH", "classes" );
define( "TEMPLATE_PATH", "templates" );

// user imformation
define( "ADMIN_USERNAME", "admin" );
define( "ADMIN_PASSWORD", '$2a$08$wim8kpwHhAKa6MBSsGUMGOYfjkU1xvRKd4Fxwal.wj8dqFboCVSFawim8kpwHhAKa6MBSsGUMGO');
 // hash and verified the password
function hasher($info, $encdata = false){
  $strength = "08";
  //if encrypted data is passed, check it against input ($info)
  if ($encdata) {
    if (substr($encdata, 0, 60) == crypt($info, "$2a$".$strength."$".substr($encdata, 60))) {
      return true;
    }else {
      return false;
    }
  } else {
  //make a salt and hash it with input, and add salt to end
  $salt = "";
  for ($i = 0; $i < 22; $i++) {
    $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
  }
  //return 82 char string (60 char hash & 22 char salt)
    return crypt($info, "$2a$".$strength."$".$salt).$salt;
    }
}
 
function __autoload($className) {
    if (file_exists(ROOT . DS . 'classes' . DS . strtolower($className) . '.class.php')) {
        require_once(ROOT . DS . 'classes' . DS . strtolower($className) . '.class.php');
    } else {
        /* Error Generation Code Here */
    }
}

這里我們定義了一些基本常量,和幾個函數。

__autoload() 函數加載 admin/class/ 中的所有類

hasher() 函數加密了一個 88位的 不可逆密碼, 登錄過程就是用config.php 中的常量和 hasher( ) 函數來進行驗證。

來看我們的 admin/index.php 后台控制器 這個控制器主頁 顯示一些博客的相關數據

 

<?php
require_once( "config/config.php" );
session_start( );
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
$username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : "";
 
if ( $action != "login" && $action != "logout" && !$username ) {
  login();
  exit;
}

switch( $action ){
    case "login" :
        login( ) ;
    break;
    
    case "logout";
        logout( );
    break;
    
    default :     
        admin( );
    break;
}

function login( ){
    $results['pageTitle'] = "Login Form";
    // handle login 
    if( isset( $_POST['login'] ) ){
        // we simple verify it from constant variable
        // if we need to verify the user from database , do this later
        // $user = new User ;
        // $user->isValidateUser( $name, $password );
        
        if ( $_POST['username'] == ADMIN_USERNAME &&  $_POST['password'] == hasher($_POST['password'], ADMIN_PASSWORD ) ){
            // register a session data
            $_SESSION['username'] = ADMIN_USERNAME ;
            // location to admin page
            header( "Location:  index.php");
        } else {
             // Login failed: display an error message to the user
              $results['errorMessage'] = "Incorrect username or password. Please try again.";
              require( TEMPLATE_PATH . "/loginForm.php" );
        }
    } else {
             require( TEMPLATE_PATH . "/loginForm.php" );
    }
}

function admin( ){
    $results['pageTitle'] = "Administrator Page";
     require( TEMPLATE_PATH . "/admin.php" );
}

function logout( ){
    $results['pageTitle'] = "Login Page";
    unset( $_SESSION['username'] );
    header( "Location: index.php ");
}

 

 

這個設計模式是從一個老外那里學的!

原理就是:

首先我們加載我們的config.php, 初始化session變量,獲得 $action 這個重要變量的值;

然后我們判斷 $action 和 $username 的值, 如果用戶沒有登錄以及用戶名為空,返回登錄頁面;

如果用戶正確輸入了用戶名和密碼,則注冊一個session 變量 $username,然后跳轉到主頁面 index.php, 這時我們會調用默認的 $action  admin( ), 這個函數會加載一個模版admin.php;里面有個數組變量 $results['pageTitle'],以及我們的后台博客樣式框架。

如果用戶輸入錯了,則給出提示信息。

 

這個設計理念的核心就是, give {action} then {do something}

我們會在后面的代碼中反復看到。

 

 

這個就是博客后台的框架樣式,從博客園copy 來的,采用表格布局的,兼容的,可自定義其他樣式的,簡單的,實用的,可擴展的,完美后台框架。

 

 

 

這個樣式在其他的瀏覽器中表現同樣兼容,寫這篇博文的時候,我已完成了部分功能。 下一篇:實現隨筆,文章,日記 以及他們分類的CRUD。

ps:這些操作還沒有使用ajax,因為我對ajax還不熟悉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM