ThinkPHP搭建博客

简介: 博客源码:https://github.com/pleated/blog源码地址:https://github.com/xialeistudio/thinkphp-inaction/tree/master/blog功能管理员登陆,修改密码,退出登录文章分类添加,编辑,删除。

博客源码:https://github.com/pleated/blog
源码地址:https://github.com/xialeistudio/thinkphp-inaction/tree/master/blog
功能

  • 管理员登陆,修改密码,退出登录
  • 文章分类添加,编辑,删除。
  • 文章添加,编辑,删除。
  • 发表,管理评论
  • 添加,删除,展示友情链接

创建数据表

CREATE TABLE blog_admin (`adminId` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL COMMENT '账号', `password` char(32) NOT NULL COMMENT '密码', `createdAt` int(10) NOT NULL COMMENT '添加时间',`loginAt` int(11) NOT NULL DEFAULT '0' COMMENT '最近登录时间',`loginIp`varchar(15) NOT NULL DEFAULT '' COMMENT '最近登录IP',PRIMARY KEY (`adminId`), KEY `createdAt` (`createdAt`),KEY `account`(`username`,`password`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `blog_admin` VALUES ('1', 'admin', '6f1779da8462d85c012588fb73a2efb7', '0', '0', '');//添加管理员账号密码admin和admin

CREATE TABLE  blog_article (`articleId` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(40) NOT NULL COMMENT '标题', `description` varchar(100) NOT NULL DEFAULT '' COMMENT '简介',`image` varchar(128) NOT NULL DEFAULT '' COMMENT '封面图片',`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击数',`createdAt` int(11) NOT NULL COMMENT '添加时间',`updateAt` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',`content` text NOT NULL COMMENT '文章内容',`categoryId` int(10) unsigned NOT NULL,PRIMARY KEY (`articleId`),KEY `hit` (`hits`),KEY `createdAt` (`createdAt`),KEY `status` (`status`),KEY `sort` (`sort`),KEY `fk_blog_article_blog_category_idx` (`categoryId`),CONSTRAINT `fk_blog_article_blog_category` FOREIGN KEY (`categoryId`) REFERENCES `blog_category` (`categoryId`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE  blog_category (`categoryId` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT '分类名称',`isNav` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示在导航栏',`total` int(11) NOT NULL DEFAULT '0' COMMENT '文章总数',`sort` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序',PRIMARY KEY (`categoryId`),KEY `sort` (`total`),KEY `total` (`total`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE  blog_comment (`commentId` int(11) NOT NULL AUTO_INCREMENT,`nickname` varchar(20) NOT NULL COMMENT '昵称',`createdAt` int(11) NOT NULL COMMENT '评论时间',`createdIp` varchar(15) NOT NULL COMMENT 'ip地址',`content` text NOT NULL COMMENT '评论内容',`articleId` int(11) NOT NULL,PRIMARY KEY (`commentId`),KEY `created` (`createdAt`),KEY `fk_blog_comment_blog_article1_idx` (`articleId`),CONSTRAINT `fk_blog_comment_blog_article1` FOREIGN KEY (`articleId`) REFERENCES `blog_article` (`articleId`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE  blog_link( `linkId` int(11) NOT NULL AUTO_INCREMENT `name` varchar(20) NOT NULL COMMENT '站点名称',`link` varchar(100) NOT NULL COMMENT '链接地址',`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',PRIMARY KEY (`linkId`),KEY `sort` (`sort`),KEY `status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

thinkphp\blog\Application\Admin模块
这是后台管理模块,需要管理文章,分类,评论,友情链接等功能。
thinkphp\blog\Application\Admin\Controller是这些功能的控制器:

ArticleController.class.php 文章控制器
CategoryController.class.php 分类控制器
CommentController.class.php 评论控制器
LinkController.class.php 友情链接控制器

admin模块是受保护的模块,所以这四个控制器许登陆后才能正常访问,在同级目录下创建BaseController.class.php控制器处理登录检测,需要进行权限检测的控制器继承它就行。例如:thinkphp\blog\index.php\admin\index\login调用的是blog\Application\Admin\Controller\IndexController.class.php//U('index/admin/index/login')

②分页处理
数据量不可预测,须在列表页进行分页处理,在需要分页的功能的控制器里面加入分页代码

③文章分类
文章是分类的,在读取文章列表的时候将分类信息同时查询处理,在这里使用ThinkPHP提供的ViewModel,在thinkphp\blog\Application\Common\Model\ArticleCategoryViewModel.class.php实现

④文件上传
thinkphp\blog\Application\Admin\View\Common\upload.html中定义上传功能,然后在thinkphp\blog\Application\Admin\Controller\IndexController.class.php控制器中添加upload方法,在thinkphp\blog\Application\Admin\View\Article\post.html中使用<include file="Common:upload"/>引用

thinkphp\blog\Application\Common模块
①分类处理
此模块是公用模块,其他模块公用的功能可以放在该模块下,例如上面提到的③文章分类是公用Model,所以放在Common/Model下。
文章分类时有'isNav'字段,这是用来标识分类是否是导航栏中的分类:

status为1:读取属于导航栏的分类
status为0:读取不属于导航栏的分类
读取全部分类

以上需求返回值是一致的,将以上三个需求封装成一个函数,根据传入的status决定返回数据
thinkphp\blog\Application\Common\Common\function.php

function getCategory($isNav = -1)
{
    $map = array();
    if ($isNav > -1)
    {
        $map['isNav'] = $isNav;
    }
    $model = new \Think\Model('Category');
    return $model->where($map)->order('sort DESC')->select();
}//当给定的status>-1时添加一个过滤参数,=-1则不添加。

②友情链接列表
友情链接是通过函数来定义,前端通过函数调用。thinkphp\blog\Application\Common\Common\function.php

③数据库字段大小写
在使用ThinkPHP的Model进行数据库操作时,返回的数据键名是大写的。
编辑'thinkphp\blog\Application\Common\Conf\db.php',在其中添加

'DB_PARAMS' => array(
        PDO::ATTR_CASE => PDO::CASE_NATURAL
    )//控制大小写

Home模块
①前台布局
此模块用到了ThinkPHP的模板布局功能
thinkphp\blog\Application\Common\Conf\config.php添加'LAYOUT_ON' => true,开启模板布局,ThinkPHP会默认使用名为“layout”的模板,在thinkphp\blog\Application\Home\View\layout.html文件。(代码就不贴了,github中都有),在此布局文件用到了模板常量,而ThinkPHP自带的模板常量只有_PUBLIC_,所以需在thinkphp\blog\Application\Home\Conf\config.php中单独定义

return array(
    'TMPL_PARSE_STRING' => array(
        '__VENDOR__' => '/thinkphp/blog/public/vendor',
        '__JS__' => '/thinkphp/blog/public/home/js',
        '__CSS__' => '/thinkphp/blog/public/home/css',
        '__IMAGE__' => '/thinkphp/blog/public/home/images'
    ),

我的项目是部署在localhost/thinkphp中,在定义模板常量的时候需要写全。
公用部分用vendor目录,
导航栏,友情链接等这几个功能都是公用功能,在模板文件使用调用thinkphp\blog\Application\Common\Common\function.php中的getCategorygetLinks函数,不会出现读取不到数据的问题。

②评论间隔处理
使用缓存来做评论间隔处理
thinkphp\blog\Application\Home\Controller\IndexController.class.php里的comment()方法执行此操作。$id是被评论文章的ID,$key = get_client_ip() . '-view-article-' . $id;是使用ID+IP的方式识别当前评论用户,若S函数返回值不为空,则缓存有效期内已经评论过,返回错误信息,若评论成功,则使用当前$key写入缓存

③Ajax评论
在文章页评论功能的开发中使用Ajax, 在thinkphp\blog\Application\Home\View\Index\article.html中。提交的时候使用$.post方式提交。在回调函数中需要先判断是否出错,如果出错则显示错误信息,否则显示该评论。评论使用的是jQuery的prepend方法。因最新的评论在最前面,须将生成的html添加到最前面。

其他总结

  • 入口index.php文件调用thinkphp\blog\Application\Home\Controller\IndexController.class.php和thinkphp\blog\Application\Common\Model\ArticleCategoryViewModel.class.php。
    thinkphp\blog\Application\Common\Conf\config.php应用配置文件也就是调用所有模块之前都会首先加载的公共配置文件

  • thinkphp\blog\Application\Admin\View\..这个文件中index.html是后台的编写各个模块的列表,post.html则是发表页面

  • 前台Home模块用到了ThinkPHP的模块布局功能。编辑
    thinkphp\blog\Application\Common\Conf\config.php文件,默认调用thinkphp\blog\Application\Home\View下的layout.html文件

  • 该布局用到了常量模块,而ThinkPHP自带的模块常量只有PUBLIC,所以需在
    thinkphp\blog\Application\Common\Conf\config.php中单独定义,并在
    thinkphp\blog\Application\Home\Conf\config.php中调用需要的布局。

目录
相关文章
|
28天前
WordPress小白傻瓜式一键搭建博客个人网站详细教程
用宝塔功能来一键搭建WordPress博客网站。 最详细教程! 整个过程简单、易用,即使是零基础用户也能轻松上手。
108 1
|
1月前
|
PHP
36 玩玩 ThinkPHP
本文介绍如何使用 PHPStudy 和 Composer 安装并配置 ThinkPHP 6。主要内容包括:创建工程目录、安装包管理工具 Composer、下载 ThinkPHP 架构包以及测试运行和配置。最后展示了 ThinkPHP 的目录结构和一些基本配置。通过这些步骤,你可以快速搭建一个 ThinkPHP 6 的开发环境。
40 1
|
6月前
|
缓存 关系型数据库 MySQL
Thinkphp5技术交流分享个人博客网站源码
Thinkphp5技术交流分享个人博客网站源码
99 0
|
Web App开发 缓存 数据安全/隐私保护
phpcms服务器搭建之 phpcms网站基本介绍
phpcms服务器搭建之 phpcms网站基本介绍
126 0
|
开发者 SEO
新手搭建WordPress网站需要做什么?
对于刚接触WordPress的新手来说,在建立网站之前先了解一些WordPress的基本概念非常重要,这样可以更加熟悉并高效地进行建站。
|
前端开发 PHP SEO
thinkphp3.23开发的“二当家的”官网
源码介绍: 该源码是一套简洁大方的网站源码,采用目前最流行的php框架thinkphp3.2.3开发,后台布局采用BootStrap。
1143 0
|
PHP
ThinkPhp学习05
原文:ThinkPhp学习05 一、ThinkPHP 3 的CURD介绍  (了解)二、ThinkPHP 3 读取数据    (重点) 对数据的读取 Read $m=new Model('User'); $m=M('User'); select $m->select();//获取所有数据,以数组形式...
840 0
|
PHP
ThinkPhp学习10
原文:ThinkPhp学习10 查询操作 Action模块 User下的search 1 public function search(){ 2 //判断username是否已经传入,且不为空 3 if(isset($_POST['username'])&&$_POST['username']!=null){ 4 //不管{是出现在$前面还是后面,只有两者紧挨着时花括号才会被当成是界定符号。
1006 0
|
关系型数据库 PHP 数据库
Thinkphp学习04
原文:Thinkphp学习04 一、ThinkPHP 3 的输出      (重点)  a、通过 echo 等PHP原生的输出方式在页面中输出  b、通过display方法输出   想分配变量可以使用assign方法  c、修改左右定界符   休要修改配置文件中的配置项   'TMPL_L_D...
1349 0
|
SQL .NET 开发框架
ThinkPhp学习11
原文:ThinkPhp学习11 一、模板的使用        (重点)   a、规则    模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].
760 0