zoukankan      html  css  js  c++  java
  • 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还不熟悉。

  • 相关阅读:
    Ubuntu下UFW防火墙简单设置
    ubuntu设置tomcat开机自动启动
    ubuntu16.04编辑器vi的使用
    Several ports (8005, 8080, 8009) required
    JavaScript检测浏览器(Firefox、IE)是否安装指定插件
    mongo 初级使用
    @Scheduled(cron = "0 0 * * * ?")实现定时任务
    Calendar时间类型数据设置
    Maven+STS工程中Maven Dependencies 文件夹丢失问题
    redis安装以及远程连接
  • 原文地址:https://www.cnblogs.com/arist/p/2527025.html
Copyright © 2011-2022 走看看