OOP 框架开发文档

一,需求分析
1,根据已有的业务,完成相应的逻辑,开发项目。
2,分析市场行情,设定需求,而开发。二,设计。
环境的设计,服务器,应用语言,数据库。
数据结构设计(数据表的设计) RDBMS。数据是项目的核心。
应用语言的实现的设计(项目怎么布局,代码怎么写,往那里写)三,实现:建表,php代码,实现相应的功能!
四,测试,调试
五,升级,维护。
六,庆功!——————————————————————–1,建立开发结构:
建立项目目录
建立数据库
建立项目结构(前台和后台)
注: 一个功能至少有两个文件完成1个php文件,1个html文件——————————————————————–2,建立后台管理框架 语法:对象还是过程:
功能文件(业务逻辑) —  面像过程来完成;
相关工具类(业务逻辑) —  面像对象来完成; 
数据库内数据的管理上,一个表一个操作对象,每个表,建立一个对象来管理;
数据表操作对象,前台和后台共用(因为前后台使用同一个数据);写 admin/privilege.php  //登陆功能文件(展示登陆表单)
写 admin/templates/login.html  //HTML CSS 布局 登陆表单HTML页面  建立后台管理框架index.html 主窗体
top.html 顶部  href=”main.html” target=”main”
main.html 右边 href=”main.html” target=”main”
menu.html 左边 黑认右边内容——————————————————————–3,登陆功能文件 admin/privilege.php 载入登录模板 admin/templates/login.html
  载入图片文件,载入CSS文件
images(图片文件) style(CSS文件) 放入 admin目录内——————————————————————–4,登录验证功能:admin/privilege.php
 写登录验证数据库表;-表–表–表–表–表–表–表–表–表–表–表-
admin_id
admin_name
admin_pass
admin_emaile
last_time 上次登录时间
last_ip   上次登录IP
actions
quesion
answer
-表–表–表–表–表–表–表–表–表–表–表-var_dump($ip_int = ip2long(‘192.168.1.1’));  //整型数字;
var_dump(long2ip($ip_int));                  //整型转为IP;  增加功能代码,处理表单提交请求:
 将一类的功能统一在一个文件,一个功能文件负责一个模块.(商品填加,删除,修改等,算一个功能!)
 所有登录相关的操作,都放在privilege.php 内完成(显示登陆表单,验证用户,退款,找回密码,保存登陆信息,反是登陆相关功能都放到privilege.php 一个功能文件中去做。在/admin/ 目录下,每出现一个文件,则为一个功能。)/* 
 * 判断根据请求的不同执行不同的功能 */
 * 解决方案,在登出页面的表单中,在浏览器请求privilege.php?a=action页面时,添加连接标识,执行相应的代* 码.
 * *///默认值
$action = isset($_REQUEST[‘a’])?$_REQUEST[‘a’]: ‘default’;if($action == ‘login’){
 //展示登陆表单
 //载入登录模板
}else if($action == ‘2’){
 //功能二验证登录数据
}else if($action == ‘3’){
 //退出登录
}在登出页面的表单中使用隐藏域:
<input type=”hidden” name=”变量名a” value=”值signin” />——————————————————————–5,实现验证模型类,增加一个初始化文件 admin/configs/init.php, 增加一个项目的后台公共类common.class.php
  实现验证: includes/AdminUserModel.class.php (继承Mysql类)
 收集表单数据(建立当前表的模型类,操作 admin_user,一个表一个,十个表十个);
   注:前台后统一管理,放到前后台共用目录。

  提取可能的公共代码; admin/includes/init.php  
 建立一个供后台所有功能使用的公共初始化代码(放置到后台的 includes/目录);
 完成一个比较强大的自动加载函数(反是需要类的地方,都需要自动加载);

 function autoload(){
 if(substr($class_name))
 ———————; 
 } 
 在 admin/privilege.php  文件中引入这个 admin/includes/init.php 公共代码;  增加一个项目前后台公共类 (common) shop/includes/common.class.php (tatic表态方法 ) 载入配置等公共类文件
 class common{
 //利用类的方法完成自动加载
}
 将该方法注册成自动加载的方法。 spl_autoload_register(array(‘Common’,’autoload’));//array(‘类或对象’,’autoload’);
 在初始化文件内admin/includes/init.php 引用公共类文件 并且注册成自动加载方法;——————————————————————–

6, admin/configs/init.php 初始化代码中,目录替换。 网站根目录
//初始化路径常量:
//网站根目录:
define(‘ROOT_DIR’, str_replace(‘admin/includes/init.php’, ”, str_replace(‘\\’, ‘/’, __FILE__)));
define(‘INCLUDE_DIR’, ROOT_DIR . ‘includes/’);//公共加载目录
define(‘MODEL_DIR’, INCLUDE_DIR . ‘models/’);//模型目录
define(‘ADMIN_DIR’, ROOT_DIR . ‘admin/’);//后台目录
define(‘ADMIN_TEMPLATE_DIR’, ADMIN_DIR . ‘templates/’);//后台模板目录
define(‘CONFIG_DIR’, ROOT_DIR . ‘configs/’);//配置目录
define(‘TOOL_DIR’, INCLUDE_DIR . ‘tools/’);//工具类目录——————————————————————–7,整理模型类:
  (1)增加数据库配置信息文件 return array(‘db’=>array());    目录:shop/configs/app.config.php return array(
    //数据库的配置信息组
    ‘DB’=>array(
        ‘host’ => ‘localhost’,
        ‘port’ => ‘3306’,
        ‘user’ => ‘shop’,
        ‘pass’ => ‘shop’,
        ‘dbname’ => ‘shop’,
        ‘charset’ => ‘utf8’,
        ‘prefix’ => ‘itcast_’
        ),
    //后台配置信息组
    ‘ADMIN’ => array(
        ‘debug’ => 1,//0||1开始调试,显示错误信息,为false,关闭错误信息
    ),
    //前台配置信息组
    ‘HOME’ => array(),
);  (2)在初始化文件内 admin/includes/init.php 加载配置信息 shop/configs/app.class.php                  注:特殊情况下可以—$GLOBALS[‘config’] = require ‘app.config.php’;  //强制放到全局变量中;admin/includes/init.php 
//初始化环境,是否开启错误调试
if($configs[‘ADMIN’][‘debug’]) {//真,开始错误调试模式, 开发环境
    ini_set(‘error_reporting’, E_ALL | E_STRICT);
    ini_set(‘display_errors’, 1);
} else {//不debug,生产环境,记录错误
    ini_set(‘error_reporting’, E_ALL | E_STRICT);
    ini_set(‘display_errors’, 0);
    ini_set(‘error_log’, INCLUDE_DIR . ‘error.log.txt’);
    ini_set(‘log_errors’, 1);
}  (3)修改基类模型的构造参数获得方式:MysqlModel.class.php  //每次实例化,可以不传递参数。直接实例化就可以    * @param $params array 关联数组,内部下标为需要的配置的项array(‘host’=>’localhost’,’port’=>’3306’…, ‘dbname’=>”)
     */
    public function __construct($params = array()) {
        //判断$params是否为空
        if(empty($params)) { //如果配置信息为空,则拿到配置信息数据;
            //空,使用配置系统内的数据
            $params = $GLOBALS[‘configs’][‘DB’];
        }        //通过判断用户是否传递了相应的参数,
        //来决定是否使用默认值
        $this->_host = isset($params[‘host’])?$params[‘host’]:’localhost’;
        //甚至可以使用一个默认的属性,来保存当前的默认信息
        $this->_port = isset($params[‘port’])?$params[‘port’]:$this->_default_params[‘port’];
        $this->_user = isset($params[‘user’])?$params[‘user’]:’root’;
        $this->_pass = isset($params[‘pass’])?$params[‘pass’]:”;
        $this->_charset = isset($params[‘charset’])?$params[‘charset’]:’utf8′;
        $this->_dbname = isset($params[‘dbname’])?$params[‘dbname’]:’test’;
        $this->_prefix = isset($params[‘prefix’])?$params[‘prefix’]:”;        //连接服务器
        $this->_connect();
        //设置编码
        $this->_setCharset();
        //选择数据库
        $this->_selectDB();        //获得当前表的结构
        $this->setFields();
    }——————————————————————–8,实现单例模式(工厂方法):  静态方法 common.class.php中  private static $models;//保存所有已经实例化过的模型对象。
    /**
     * 获得模型的单例,工厂方法
     * @param $model_name string 需要获得的模型名
     * @param $params array 特殊的连接参数,默认值 array()
     */
    public static function model($model_name, $params=array()) {
        //拼凑类名:
        $model_name_class = $model_name . ‘Model’;
        //利用单例效果实现。
        if(!isset(self::$models[$model_name])) {
            //不存在
            if(empty($params)) {
                self::$models[$model_name] = new $model_name_class;
            } else {
                self::$models[$model_name] = new $model_name_class($params);
            }
        }
        return self::$models[$model_name];
    }

   根据需要求调用:
 $model_admin_user = Common::model(‘AdminUser’);//目前需要的版本    if($admin_info = $model_admin_user->checkLogin($admin_name, $admin_pass)) {
        //判断用户是否选择了记录登录状态
        if (isset($_POST[‘remember’])) {
            //选择了记录状态
            setcookie(‘admin_id’, $admin_info[‘admin_id’], time() + 24*3600);
            setcookie(‘admin_pass’, $admin_info[‘admin_pass’], time() + 24*3600);
        }

   获得真实表名:
 * 获得当前 表的结构
     */
    protected function setFields() {
        $query = “desc {$this->table()}”;
        $rows = $this->getAll($query);//获得所有的字段数据
        //
        foreach($rows as $row) {
            $this->fields[] = $row[‘Field’];
            if($row[‘Key’] == ‘PRI’) {
                $this->fields[‘pk’] = $row[‘Field’];
            }
        }
    }    /**
     * 获得方法名
     */
    public function table() {
        return $this->_prefix . $this->table_name;
    }   登陆验证:
 <?php
//负责登录的功能文件
$action = isset($_REQUEST[‘a’])?$_REQUEST[‘a’]:’login’;/*公共代码区*/
/*公共代码区*/
//引入公共初始化代码
include ‘./includes/init.php’;
if($action == ‘login’) {
    //功能一,展示登录表单
    //载入 登录模板
    include ADMIN_TEMPLATE_DIR . ‘login.html’;
}
//处理登录数据
elseif ($action == ‘signin’) {
    //收集表单数据
    $admin_name = $_POST[‘admin_name’];
    $admin_pass = $_POST[‘admin_pass’];
    //连接数据库,进行验证
//    $model_admin_user = new AdminUserModel();// 过时的 deprecated
//    $model_admin_user = Common::model(‘AdminUser’, array(‘pass’=>’1234abcd’)); //可能用得上的
    $model_admin_user = Common::model(‘AdminUser’);//目前需要的版本    if($admin_info = $model_admin_user->checkLogin($admin_name, $admin_pass)) {
        //判断用户是否选择了记录登录状态
        if (isset($_POST[‘remember’])) {
            //选择了记录状态
            setcookie(‘admin_id’, $admin_info[‘admin_id’], time() + 24*3600);
            setcookie(‘admin_pass’, $admin_info[‘admin_pass’], time() + 24*3600);
        }        //将登录管理员信息,保存,帐号信息,上次登录信息等。
        $_SESSION[‘admin’] = $admin_info;        //记录下,当前的登录信息。
        $model_admin_user->setLoginInfo();        $_SESSION[‘is_login’] = 1;
        Common::jumpURL(‘index.php’);
    } else {
        //错误,重新登录
        Common::jumpURL(‘privilege.php?a=login’, ‘非法用户,可以重新登录’, 3);
    }     //利用验证结果,重新登录,回到后台首页
    echo ‘run check’;
}
——————————————————————–
9,admin/index.php 文件:(1)admin/index.php 文件
//确定当前的动作
//载入公共代码
//判断当前的动作,执行相应的代码<?php//确定当前的动作
$action = isset($_REQUEST[‘a’])?$_REQUEST[‘a’]:’index’;
//载入公共代码
require ‘./includes/init.php’;
//判断当前的动作,执行相应的代码
if($action == ‘index’) {
    //载入首页整体模板(框架集模板)
    include ADMIN_TEMPLATE_DIR . ‘index.html’;
}
elseif ($action == ‘top’) {
    $admin_name = $_SESSION[‘admin’][‘admin_name’];
    $last_time = date(‘Y-m-d H:i:s’, $_SESSION[‘admin’][‘last_time’]);
    $last_ip = $_SESSION[‘admin’][‘last_ip’];
    include ADMIN_TEMPLATE_DIR . ‘top.html’;
}
elseif ($action == ‘menu’) {
    include ADMIN_TEMPLATE_DIR . ‘menu.html’;
}
elseif ($action == ‘drag’) {
    include ADMIN_TEMPLATE_DIR . ‘drag.html’;
}
elseif ($action == ‘main’) {
    include ADMIN_TEMPLATE_DIR . ‘main.html’;
}(2)完成验证:admin/includes/init.php
//判断当前用户是否登录//判断当前用户是否登录
//session_start();
new SessionTool();//初始化session工具if(basename($_SERVER[‘SCRIPT_NAME’]) == ‘privilege.php’ && ($action == ‘login’ || $action ==’signin’)) {
    //不用验证
} else {
    //都需要验证
    if(!isset($_SESSION[‘is_login’])) {
        //没 session标志, 判断cookie
        $model_admin_user = Common::model(‘AdminUser’);
        if($model_admin_user->checkCookieLogin($_COOKIE[‘admin_id’], $_COOKIE[‘admin_pass’])) {
            //合法cookie,增加一个session
            $_SESSION[‘is_login’] = 1;
        } else {
            //非法
            Common::jumpURL(‘privilege.php?a=login’);
        }
    }
}——————————————————————–

发表评论