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程序之die调试法 快速解决错误
Sep 17 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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程序的方法小结
2012/02/23 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
tagName的使用,留一笔
2006/06/26 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
xml转json的js代码
2012/08/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
python删除过期log文件操作实例解析
2018/01/31 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Python基于内置函数type创建新类型
2020/10/22 Python
"序列点" 是什么
2016/07/29 面试题
《母亲的恩情》教学反思
2014/02/13 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
网络技术专业推荐信
2014/02/20 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
一般党员对照检查材料
2014/09/24 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
python可视化之颜色映射详解
2021/09/15 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis