[手把手教程][第二季]java 后端博客系统文章系统——No1

转眼到了博客系统第二章了。这一张咱们主要介绍文章系统。毕竟博客系统的核心就是文章的发布和阅读。闲话很少说,老规矩走起来。前端

工具

  • IDE为idea16
  • JDK环境为1.8
  • gradle构建,版本:2.14.1
  • Mysql版本为5.5.27
  • Tomcat版本为7.0.52
  • 流程图绘制(xmind)
  • 建模分析软件PowerDesigner16.5

思惟导图web

按照前面咱们第二季第一章阐述的,咱们须要先了解咱们这个文章系统的整个功能模块组合,也就是咱们的思惟导图,只有这样才能实现总体功能的架设。下面如图所示:算法


其实在上面的系统中,我已经把前端用户的文章查阅功能排除掉的。为何我这里会单独排掉前端的查阅呢?前端的文章查阅功能基本在后端的全部文章中已经有体现相应功能。大概功能以下:sql

  • 前端文章查阅
    • 文章列表
    • 文章归档
    • 文章分类
    • 文章详情

流程图数据库


在上面的流程图中,咱们能够看到咱们清楚的把业务流程描述出来了。可能不少哥们会说咱们有其余不同的方式,或者相似的方式可是实现比如今的强势,这个无能否认。可是我认为这个是别人项目中存在且我使用的很符合我的习惯的东西。好的东西要学习,不友好的东西咱们须要本身改进。json

首先咱们访问站点的方式只有访问主页,而后才会有web应用的展现,也就是说咱们网站的首页是咱们web应用的总入口。后端

而咱们主页的功能也是须要围绕咱们的中心——博客来制做,这样才能达到咱们建设这个后端的目的。因此首页元素须要有如下方面:服务器

  • 文章列表
  • 文章归类
  • 做者介绍
  • 热门文章
  • 最高评论
  • 最近动态
  • 联系信息(二维码)
  • 标签导航
  • 等···

数据流图网络


为何咱们须要数据流图,咱们不是为了软件工程二故意作这个数据流图。而是数据流图能清晰的代表咱们这些流程中须要哪些关键的东西,能在必定程度上反应业务逻辑。因此咱们作这个仍是有意义。在上面咱们能够看到在咱们程序流转的过程当中,咱们须要知道具体的文章ID才能进行详情查看操做,因此咱们在拿到列表的时候就须要把文章ID拿到,同时文章归档的依据信息,也须要拿到,大概须要哪些简单的东西,具体跟下面首页的json数据相关。具体的首页预想效果以下图:框架


固然具体的原做者的博客请看这里。原做者的导航栏在右边,我的喜爱,因此改到左边。根据这一张图,咱们也能看到大概的功能以下:

  • 博客文章列表展现
  • 做者信息展现
  • 最新、热点、随机文章
  • *日期归档导航
  • 标签导航

数据来源

按照第二季开发标准来讲,前端页面展现的数据都是尽可能从服务器接口得到,将先后端解耦。因此按照通用接口标准来讲,咱们首页数据须要JSON的标准数据。分析可得,咱们的json格式大概以下:

{"code":1,
    "msg":"success",
    "data":{
        "posts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "totalNum":20,
        "author":{},
        "newPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "hotPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "randomPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "tag":{},
        "date":{}
    }
}复制代码

可能一些朋友看到这里就会迷糊了,你的json数据的实体类型怎么来的呢?其实咱们一开始就提过咱们的数据库是wordpress的数据库,也就是数据内容是来自个人我的博客系统上面的数据库。因此咱们须要看看wrodpress的博客系统上面文章表的结构和内容才能推测是表中字段及其分布各有什么意义。具体的数据库表结构以下:

DROP TABLE IF EXISTS `wp_posts`;
CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '做者ID',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '文章建立时间',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '文章最近修改时间',
  `post_content` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文章内容',
  `post_title` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文章标题',
  `post_excerpt` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `post_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'publish' COMMENT '文章状态',
  `comment_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open' COMMENT '评论状态',
  `ping_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open' COMMENT 'ping状态',
  `post_password` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文章密码',
  `post_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文章名字',
  `to_ping` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `pinged` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content_filtered` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `guid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'post' COMMENT '文章类型',
  `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件类型',
  `comment_count` bigint(20) NOT NULL DEFAULT '0' COMMENT '评论数',
  PRIMARY KEY (`ID`),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`),
  KEY `post_name` (`post_name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=289 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;复制代码

从上面的文章信息表中咱们能够看到这一张表只是用来存储全部的文章的基本信息,可是文章的一些其余信息都是没有的,好比说:

  • 评论
  • 特点图片
  • 文章归档
  • 等···

通常来讲,咱们的常规思路是须要将这些信息关联在一块儿的,并且这个思路也是没错的。可是可能有的实现咱们并无较好的设计思想,因此咱们能够简单的把数据库逆向到模型。因此闲话很少说,直接在有wrodpress环境的电脑上面连接数据库,打开wordpress数据库,选择逆向到模型。那么,数据库逆向模型以下所示:


从上面的数据库模型中咱们能够看出维持wordpress中心的有几张表,以下:

  • wp_posts 文章基础信息表
  • wp_postmeta 文章扩展数据表
  • wp_comments 评论基本表
  • wp_commentmeta 评论扩展表
  • wp_links 连接表
  • wp_options 设置信息表
  • wp_users 用户信息表
  • wp_usermeta 用户信息扩展表

为何我说上面这几张表是核心表呢?首先咱们能够看到这几张表都是存储了博客系统的一些基本的东西。接着咱们能够看到这些各个表中一些关联的表都是有彼此的键对应其余表的主键,因此看到这里你们可能也就内心有数。

因此上面咱们的json信息中的实体类型该怎么设定也就是很明显的,必须对应数据库字段嘛。既然都这样了,那咱们是否是也能够进一步猜测出其余的json内容呢?

日期归档

文章按照日期归档相信不少人都看到过,大概样子就是一个下拉列表中显示年月往后面加上数量,大概样子以下(节约流量,不上图):

  • 请选择日期 ↓
    • 全部
    • 2016年11月12日(2)
    • 2016年11月15日(1)
    • 2016年10月28日(3)

咱们要把这样的效果作出来,其实能够直接把文章信息传递给前台让前端完成。可是数据量过多的时候,网络传输也就相对吃力,因此咱们仍是直接后端处理,将网络传输的数据最精简。

那么咱们简单的首页集合的数据应该以下所示了:

{"code":1,
    "msg":"success",
    "data":{
        "posts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "totalNum":20,
        "author":{},
        "newPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "hotPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "randomPosts":[
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"},
            {
            "id": "282",
            "postDate": "Nov 16, 2016 12:51:13 AM",
            "postContent": "文章内容",
            "postTitle": "[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八)"}
        ],
        "tag":{},
        "date": [
            {
                "date": "2016-11-22",
                "idList": [
                    "286"
                ]
            },
            {
                "date": "2016-5-19",
                "idList": [
                    "192",
                    "191"
                ]
            }
        ]
    }
}复制代码

这里应该有朋友可能会问,为啥你的date(根据日期归档)的json数据这么奇怪呢?

其实咱们最直接的能够看到,在上面的日期归档的json中,日期能够很直观的看出来,同时idList中把文章ID也是展现出来的,因此咱们根据ID和日期都仍是能够互相参考的,同时ID的数量可让咱们明白每一个日期有多少篇文章。

既然咱们在上面把基本的首页框架数据归类,写出的json接口,同时经过逆向开发的思路等把项目咱们须要使用的一些模型图完成了,这样接下来就是具体编码的事情。 具体的编码问题,且听下回分解。


福利:用户密码算法

核心算法:SHA-256

步骤:

  • 注册用户
    • 客户端进行16位MD5小写加密
  • 生成随机的salt
  • 将密码和salt进行SHA-256加密
  • 数据库存入用户信息和对应的salt

这一期,咱们把文章系统一些作了基础的分析,下一期咱们须要完成wordpress数据库内容分析和文章系统模块开发,和文章的撰写相关的东西。其实通过上一季的一些东西咱们能明白,项目开发中的一些基本思想,可是可能咱们最终目的是倚赖wordpress的博客。因此在实际开发中,咱们能够参考别人的完成并加以列用。

相关文章
相关标签/搜索