PHP仿博客园 个人博客(1) 数据库与界面设计


Posted in PHP onJuly 05, 2013

自学PHP大半年多了,断断续续地,但是最终还是坚定了我的想法,将PHP继续下去,所以写这个PHP的博客是为了找个稳定的 PHP工作,不求工资多高,但求一收留之地。我能看懂大部分英语文档,人不蠢,爱学习,有兴趣地可以联系下!有诚意的来吧!qq:240382473
我会分3-5次发布所有关键代码和文档说明,博客后台所有的样式均套用博客园!

说明:

1. 不完全采用MVC架构,但是理念就是这样的。因为还不能写出很稳定的MVC架构。
2.几乎不采用JQUERY AJAX 因为不是特别熟悉,运用起来还不自如,留言本可以用AJAX,没问题。
3.有几个公用类,其他代码均手写,有不足地地方请多多指出,非常感谢。
4.欢迎批评与指导,但是请给出你的理由。

言归正传:先看数据库架构

PHP仿博客园 个人博客(1) 数据库与界面设计

这些表的引擎都是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 (本地)
博客架构

后台目录:

PHP仿博客园 个人博客(1) 数据库与界面设计

后台目录说明:

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 来的,采用表格布局的,兼容的,可自定义其他样式的,简单的,实用的,可扩展的,完美后台框架。

PHP仿博客园 个人博客(1) 数据库与界面设计

这个样式在其他的浏览器中表现同样兼容,写这篇博文的时候,我已完成了部分功能。 下一篇:实现随笔,文章,日记 以及他们分类的CRUD。

ps:这些操作还没有使用ajax,因为我对ajax还不熟悉。

PHP 相关文章推荐
PHP中GET变量的使用
Oct 09 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
smarty模板引擎之内建函数用法
Mar 30 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
分享php多功能图片处理类
May 15 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
PHP echo()函数讲解
Feb 15 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
php解决约瑟夫环算法实例分析
Sep 30 PHP
PHP cdata 处理(详细介绍)
Jul 05 #PHP
PHP的基本常识小结
Jul 05 #PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 #PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 #PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 #PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
You might like
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
第四章 php数学运算
2011/12/30 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
php生成圆角图片的方法
2015/04/07 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Python实现微信好友的数据分析
2019/12/16 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
英文自荐信
2013/12/15 职场文书
学习新党章思想汇报
2014/01/09 职场文书
高中生操行评语大全
2014/04/25 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
药店促销活动策划方案
2014/08/24 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
十八大观后感
2015/06/12 职场文书
停发工资证明范本
2015/06/12 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书