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还不熟悉。

(0)

相关推荐

  • PHP仿博客园 个人博客(2) 数据库增添改删

    废话不多说了,上一篇有个核心概念就是 give action do something ! 这篇我就用代码来解释这个概念是啥意思,先看我的 post.class.php . 这个文件是我们的数据层处理类. 简单介绍一下这个model 类,它继承了一个数据库基类来做crud 等常用操作, 每次初始化时就会初始化一个数据库对象 $db. 我们就用这个对象来操作我们的数据.对于数据操作有2个重要方法 storePostFormValues( ) , storeDiaryFormValues( ),它们

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

    自学PHP大半年多了,断断续续地,但是最终还是坚定了我的想法,将PHP继续下去,所以写这个PHP的博客是为了找个稳定的 PHP工作,不求工资多高,但求一收留之地.我能看懂大部分英语文档,人不蠢,爱学习,有兴趣地可以联系下!有诚意的来吧!qq:240382473 我会分3-5次发布所有关键代码和文档说明,博客后台所有的样式均套用博客园! 说明: 1. 不完全采用MVC架构,但是理念就是这样的.因为还不能写出很稳定的MVC架构. 2.几乎不采用JQUERY AJAX 因为不是特别熟悉,运用起来还不自

  • python3实现暴力穷举博客园密码

    我之前想写路由器的密码暴力破解器,我手上只有极路由,发现极路由有安全限制,只能允许连续10密码错误,所以我改拿博客园练手. 博客园的博客有个功能是给博文设置一个密码,输入正确的密码才能看到文章的内容.经过测试发现这个密码验证功能,既没有验证码也没有提交频率的限制, 要写这个针对博客园的密码暴力破解器模型会非常简单,很好实现. 比如打开这个博文,会显示一个密码输入框:http://www.cnblogs.com/post/readauth?url=/muer/archive/2011/11/27/

  • 打造博客园(cnblogs)超级自定义界面

    定制博客界面的核心方法是通过引用我们自己上传的外部JS,使外部JS的代码能在当前博客页面上执行,从而用这个JS修改页面DOM结构(加入新的界面元素,加入引用自定义的CSS,加入新的界面交互功能),然后我们就可以在自己写的这个外部JS里任意发挥了. 在博客园中的博客页面中引用外部JS的方法: 进入博客设置页面->设置->子标题,在这里,你可以输入你博客的一些子标题的内容,同时,你其实还可以输入如下html:<script src="XXXX">XXXX代表你的JS

  • 利用正则表达式抓取博客园列表数据

    鉴于我在要完成的asp.net MVC 3 仿照博客园企业系统要用到测试数据,我自己输入太累,所以我就抓取了博客园的部分列表数据,还请dudu不要见怪. 在抓取博客园数据的时候采用了正则表达式,所以有不熟悉正则表达式的朋友可以参考相关资料,其实很容易掌握,就是在具体的实例中会花些时间. 现在我就来把我抓取博客园数据的过程叙述一下,如果有朋友有更好的意见,欢迎提出来. 要使用正则表达式抓取数据,首先就要创建一个正则表达式进行匹配,我推荐使用regulator,这个正则表达式工具,我们可以先使用这个

  • 将博客园(cnblogs.com)数据导入到wordpress的代码

    我将这个分享出来,如果以后有谁需要可以直接下载下面插件 使用方法: 在cnblogs选择备份数据,导出一个XML到本地: 下载附件中的插件,安装至\wp-content\plugins目录: 后台开启插件后,可以在"工具"中找到"Cnblogs数据转换",进入: 选择刚才下载的XML文件,上传后系统会自动将数据转换并导入到wordpress中 备注: 这个插件只是单纯将博客园日志.随笔.文章导入到wordpress中,不会导入评论相册数据,因为cnblogs不提供这

  • 用ajax自动加载blogjava和博客园的rss

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>this is test</title> <sc

  • 如何利用http协议发布博客园博文评论

    先给大家介绍下实现原理: 给博文提交评论的实质就是通过http协议服务器发送一个post请求.在发布评论前,我们需要做什么呢?对,是必须要登录的.但登录是另一件事情,我们这里先不讨论.用户登录后,服务器给客户端设置一个cookie.http是无状态的.也就是说客户端向服务器发送请求后,服务器返回响应.一次通信完成.服务器不会记得刚才是谁向自己发送请求.所以客户端需要拿着服务器给自己设定好的cookie向服务器发送请求并告知服务器自己的身份,服务器根据cookie产生响应. 准备工作: 为了完成本

  • Python 批量刷博客园访问量脚本过程解析

    今早无聊...7点起来突然想写个刷访问量的..那就动手吧 仅供测试,不建议刷访问量哦~~ 很简单的思路,第一步提取代理ip,第二步模拟访问. 提取HTTP代理IP 网上很多收费的代理和免费的代理IP 如: 无论哪个网站,我们需要的就是爬取上面的ip和端口号,整理到一起. 具体的网站根据具体的结构爬取 比如上面那个网站,ip和端口在td标签 这里利用bs4爬取即可.贴上脚本 ##获取代理ip def Get_proxy_ip(): print("==========批量提取ip刷博客园访问量 By

  • Go秒爬博客园100页新闻

    利用go语言的协程并发优势爬取网页速度相当之快,博客园100页新闻标题只需一秒即可全部爬取 package main import ( "bytes" "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http" "runtime" "strconv" "sync" ) func Scraper(p

随机推荐