php源码建博客5--建库建表-配置文件-错误日志
Posted 遗落的白菜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php源码建博客5--建库建表-配置文件-错误日志相关的知识,希望对你有一定的参考价值。
主要:
- 整理框架
- 建库建表
- 配置文件类
- 错误日志记录
--------------本篇后文件结构:-------------------------------------- blog ├─App │ ├─Model 模型目录 │ ├─View 视图目录 │ │ ├─Admin后台目录 │ │ └─Home前台目录 │ ├─Common 配置目录 │ │ └─config.php 配置文件 │ ├─Log 日志目录 │ │ └─log.txt 日志文件 │ ├─Controller 控制器 │ │ ├─Admin后台 │ │ │ └─DemoController.class.php 测试控制器 │ │ └─Home前台 ├─Public 静态公共文件(js,css,images) │ ├─Plugins 插件 │ ├─Back后台 │ └─Home前台 ├─Frame 公共使用的类 │ ├─BaseModel.class.php 数据库连接类 │ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转) │ ├─FactoryModel.class.php 模型工厂类 │ ├─Log.class.php 日志厂类 │ ├─Config.class.php 配置文件读取类 │ ├─Init.class.php 初始化应用类 │ └─mysqlDB.class.php 数据库操作工具类 └─index.php 入口文件 -----------------------------------------------------------------------------------------------------
利用上篇中搭建好的mvc框架结构,正式开始开发博客项目。首先建立数据表,然后开始搭建后台,数据前台展示,完成博客主要模块展示。
下载查看该项目源码: https://gitee.com/NewbiesYang/young_blog
整理框架
清理测试页面
1)前面构建框架结构,使用了用户登录测试页面以及后台首页页面。在此全部去掉,从新开始构建前台和后台页面。类似于我们下载了一个ThinkPHP或Laravel或其他的框架。 现在开始在这个微型框架上来构建我们的项目
2) 实际开发,会用前端人员做好的静态页面来进行开发。所以也可以在 【模板之家】或其他网站 下载 后台模板和前台博客静态页面。然后专注于后端开发,可以加快速度。本项目供学习研究使用,也就不那么着急了。
原本是准备全部利用别人写好的前端页面(包括前端显示和后台页面),专注于后端逻辑的开发。而且已经把分类页面列表都做好了。还提交传送了。 此刻,仔细想想,要是这样玩,那我直接用框架更好了。既然做后端开发,自己写个后端页面+程序处理,没什么问题吧..., 置于前端显示页面,那再用前辈写的前端页面倒是可以的 于是乎,卷起柚子,说干就干,先来整理框架,开始搭建博客。。。。。
框架结构:
--------------清理后MVC框架文件结构:--------------------------------------
blog
├─App
│ ├─Model 模型目录
│ ├─View 视图目录
│ │ ├─Back后台
│ │ └─Home前台
│ ├─Controller 控制器目录
│ │ ├─Back后台
│ │ └─Home前台
├─Public 静态公共文件(js,css,images)
│ ├─Plugins 插件
│ ├─Back后台
│ └─Home前台
├─Frame 公共使用的类
│ ├─BaseModel.class.php 数据库连接类
│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│ ├─FactoryModel.class.php 模型工厂类
│ ├─Init.class.php 初始化应用类
│ └─MySQLDB.class.php 数据库操作工具类
└─index.php 入口文件
-----------------------------------------------------------------
后续的开发只需要复制该目录结构文件, 就可以在此基础上进行开发了。
提交传送代码
git add -A git commit -m "清理MVC结构" git push origin master
插件准备
1) layui插件: 搭建后台程序,准备使用layui前端框架,这个框架个人认为做后台界面还是不错的。它还包含一些比较使用模块。
用bootstrap也可以,我更加倾向于用它来做前台页面。
下载网址: http://www.layui.com/
2) jQuery库: 更方便操作DOM, 尤其是经常使用ajax请求。
3) 其他插件: 如Ueditor编辑器等 需要使用时再下载吧。一般插件都会有demo示例, 按照示例和手册,懂web开发基本能使用。
上述插件暂时不熟悉没有关系,官网上有手册,需要什么模块,便查手册便使用,就像搭积木,如果要做得更好,当然要花更多的时间多练习。我本着后台给程序管理员使用,也不一定要非常漂亮,实用就好。
建库建表
准备: 创建分支
$ git checkout master $ git checkout -b "start-admin-module"
建表思路:
根据博客模板,从首页开始分析, 分析哪些需要动态数据,以便建立对应数据表。
用户: 登录, 注册, 修改, 删除
文章: 分类管理, 博文管理, 评论管理
角色管理: 管理员,普通用户
菜单管理: 不同权限人员,对应菜单栏也有区别
建表工具可以任意选择。初期手工写建表语句,熟悉后直接使用工具。 本项目中使用 Navicat 建立数据库和表
数据库,表
1) 创建数据库:php_blog
create database php_blog charset utf8
2) 用户表: y_users
CREATE TABLE `y_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'用户主键\', `username` varchar(20) NOT NULL COMMENT \'用户名\', `password` char(32) NOT NULL COMMENT \'密码\', `email` varchar(50) NOT NULL DEFAULT \'\' COMMENT \'注册邮箱\', `token_email` varchar(32) NOT NULL DEFAULT \'\' COMMENT \'邮箱验证\', `status` tinyint(1) unsigned NOT NULL DEFAULT \'0\' COMMENT \'状态, 0-正常,1-禁用\', `gid` tinyint(1) unsigned NOT NULL DEFAULT \'0\' COMMENT \'角色id,1-管理员,2-普通用户,0-无效\', `login_ip` varchar(20) NOT NULL DEFAULT \'\' COMMENT \'最后登录的ip地址\', `login_times` smallint(6) unsigned NOT NULL DEFAULT \'0\' COMMENT \'登录次数\', `created_at` int(10) unsigned NOT NULL DEFAULT \'0\' COMMENT \'注册时间\', `updated_at` int(10) unsigned NOT NULL DEFAULT \'0\' COMMENT \'最后一次登录时间\', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT=\'用户表\';
3)角色表: y_user_group
CREATE TABLE `y_user_group` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'角色id\', `name` varchar(20) NOT NULL DEFAULT \'\' COMMENT \'角色名称\', `auths` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'角色权限\', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT=\'角色表\';
4) 菜单表: y_menus
CREATE TABLE `y_menus` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'菜单id\', `title` varchar(20) DEFAULT \'\' COMMENT \'菜单名称\', `controller` varchar(30) DEFAULT \'\' COMMENT \'控制器名称\', `action` varchar(30) DEFAULT \'\' COMMENT \'操作名称\', `status` tinyint(1) unsigned DEFAULT \'1\' COMMENT \'状态,1-正常,0-禁用\', `is_hidden` tinyint(1) unsigned DEFAULT \'0\' COMMENT \'是否隐藏,0-正常显示,1-隐藏\', `sort` int(10) unsigned DEFAULT \'0\' COMMENT \'排序\', `pid` int(10) unsigned DEFAULT \'0\' COMMENT \'上一级菜单\', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT=\'菜单表\';
5) 文章表 y_article
CREATE TABLE `y_article` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'文章id\', `title` varchar(60) NOT NULL DEFAULT \'\' COMMENT \'标题\', `description` varchar(200) NOT NULL DEFAULT \'\' COMMENT \'文章简介\', `content` text NOT NULL COMMENT \'内容\', `cid` int(10) unsigned NOT NULL COMMENT \'文章类别\', `pic` varchar(150) NOT NULL DEFAULT \'\' COMMENT \'文章封面图\', `pic_watermark` varchar(150) NOT NULL DEFAULT \'\' COMMENT \'水印图\', `pic_thumb` varchar(150) NOT NULL DEFAULT \'\' COMMENT \'缩略图\', `uid` int(10) unsigned NOT NULL COMMENT \'作者\', `clicks` int(10) unsigned NOT NULL DEFAULT \'0\' COMMENT \'阅读数(点击数)\', `updated_at` int(10) unsigned NOT NULL DEFAULT \'0\' COMMENT \'更新时间\', `created_at` int(11) NOT NULL DEFAULT \'0\' COMMENT \'发布时间\', PRIMARY KEY (`id`), KEY `title` (`title`), KEY `uid` (`uid`), KEY `clicks` (`clicks`), KEY `cid` (`cid`) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=\'文章表\';
6) 文章类别表 y_category
CREATE TABLE `y_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'分类id\', `catename` varchar(15) NOT NULL COMMENT \'分类名\', `description` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'简介\', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT=\'文章类别表\';
7) 评论(回复)表 y_comment
CREATE TABLE `y_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'评论id\', `uid` int(10) unsigned NOT NULL COMMENT \'评论者\', `created_at` int(11) DEFAULT NULL COMMENT \'评论时间\', `content` varchar(255) NOT NULL DEFAULT \'\' COMMENT \'评论内容\', `aid` int(10) unsigned NOT NULL COMMENT \'被评论的文章\', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=\'评论(回复)表\';
8) session数据表 y_session (其实可以不用这个,目的是为了操作 "将session写入数据库" )
CREATE TABLE `y_session` ( `sess_id` varchar(50) NOT NULL DEFAULT \'\' COMMENT \'session id\', `data` text NOT NULL COMMENT \'session数据\', `created_at` int(11) NOT NULL COMMENT \'session创建时间\', PRIMARY KEY (`sess_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=\'session数据表\';
为了避免弄的太复杂, 暂时建立这些数据表,字段后续可以进行调整。如果需要加入模块功能,可以相应增加相应数据表。
连接数据库
在badeModel中修改数据连接的数组信息 【Frame/BaseModel.class.php】 (如果使用配置文件类,此处就可以省略了)
1 class BaseModel { 2 。。。 3 。。。 4 。。。 5 function __construct(array $config=null) 6 { 7 $conf = array( 8 \'host\'=>\'localhost\', 9 \'user\'=>\'root\', 10 \'pwd\'=>\'root\', 11 \'port\'=>\'3306\', 12 \'charset\'=>\'utf8\', 13 \'dbname\'=>\'php_blog\', 14 ); 15 $conf = empty($config)? $conf : array_merge($conf,$config); 16 $this->db = Db::getDb($conf); 17 } 18 }
配置文件类
需求分析:
为了框架便于数据库连接以及方便读取配置文件。如 希望在 App/Common/config.php 做一些配置项,要求能读取这些配置并应用到项目
思路:
step 1: 创建文件 App/Common/config.php 并将数据库连接信息写入该配置文件 step 2: 在Frame/目录下创建读取配置文件类 Config.class.php step 3: 设置自动加载 读取配置类 step 4: 基础模型类实例化 读取配置类。 操作数据库必须要经过基础模型类 step 5: 调整数据库工具类获取配置信息,既 其构造方法中通过传递进来的数据配置信息对象获取 step 6: 测试连接数据结果,验证获取配置
代码实现
1) 创建配置文件config.php 【App/Common/Config.php】
<?php /** * 配置文件 * User: young */ return [ //数据库连接配置 \'host\'=>\'localhost\', \'user\'=>\'root\', \'pwd\'=>\'root\', \'port\'=>\'3306\', \'charset\'=>\'utf8\', \'dbname\'=>\'php_blog\', ];
2) 创建读取配置文件类 【Frame/Config.class.php】
1 <?php 2 /** 3 * 配置文件读取类 4 * User: young 5 */ 6 7 class Config 8 { 9 protected static $ins = null; //本类实例 10 protected $cfg = array(); //存储配置项 11 12 /** 13 * 获取本类实例 14 * @access public 15 * @return object 本类的单例对象 16 */ 17 public static function getIns() { 18 if(false === (self::$ins instanceof self)){ 19 self::$ins = new self(); 20 } 21 return self::$ins; 22 } 23 24 /** 25 * 构造方法: 读取配置项 26 * @access public 27 * @return void 28 */ 29 final protected function __construct() { 30 require APP.\'Common\'.DS.\'config.php\'; //读取配置项 31 $this->cfg = $cfg; 32 } 33 34 /** 35 * 根据指定的配置项,返回该配置项的值 36 * @param string $k 配置项 37 * @return mixed|null 返回配置项的数据 38 */ 39 public function __get($k) { 40 if(!isset($this->cfg[$k])) { 41 return null; 42 } 43 return $this->cfg[$k]; 44 } 45 46 47 /** 48 * 根据指定的配置项,返回配置项的值 49 * @param string $k 配置项名称 50 * @param string $v 配置项对应的值 51 */ 52 public function __set($k,$v) { 53 $this->cfg[$k] = $v; 54 } 55 }
3) 自动加载配置类
需要自动加载该类, 该类在Frame目录下, 所以可以写入到 Init.class.php 类中的属性数组中 【Frame/Init.class.php】
1 <?php 2 /** 3 * 初始化应用类 4 * User: young 5 */ 6 7 class Init 8 { 9 protected static $frame = array(\'BaseController\',\'BaseModel\',\'Db\',\'FactoryModel\',\'Config\'); 10 。。。 11 。。。 12 。。。
4)基础模型类实例化配置类【Frame/BaseModel.class.php】
1 <?php 2 3 /** 4 * BaseModel.class.php 基础模型类 5 * 连接数据库 6 * @author young 7 */ 8 class BaseModel 9 { 10 protected $db = null; 11 /** 12 * 构造方法: 实例化数据库类 13 * @access public 14 */ 15 function __construct() 16 { 17 $conf = Config::getIns(); //读取配置项实例 18 $this->db = Db::getDb($conf); 19 } 20 }
5)数据库读取配置项信息 【Frame/Db.class.php】
1 <?php 2 /** 3 * Db.class.php 数据库操作工具类 4 * @author young 5 */ 6 7 class Db { 8 。。。 9 。。。 10 。。。 11 /** 12 * 构造方法: 保存数据库连接信息,连接数据库 13 * @access private 14 * @param array $conf 数据库连接信息 15 数据库系统概论(第5版)萨师煊.王珊代码mysql版本(建库建表查询语句)