[手把手教程][第二季]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的博客。因此在實際開發中,咱們能夠參考別人的完成並加以列用。

相關文章
相關標籤/搜索