自學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還不熟悉。