博客網(wǎng)站需求設(shè)計(jì)與方案設(shè)計(jì)
1 背景與規(guī)劃
很早就想通過(guò)寫(xiě)博客,對(duì)自己的技術(shù)進(jìn)行反思與沉淀,但是由于拖延癥晚期,一直沒(méi)有實(shí)際執(zhí)行,而且市面上的各種博客系統(tǒng)創(chuàng)建的博客頁(yè)面總是有很多第三方的元素,顯得頁(yè)面很繁瑣,我個(gè)人是很討厭這些多余的東西,所以就有了自己搭一個(gè)博客的念頭。
最初是2016年的時(shí)候打算用wordpress來(lái)搭建,因?yàn)檎w框架已經(jīng)成熟,api也很完善。但是用起來(lái)需要對(duì)這些api很熟悉才能靈活的定制博客,否則就會(huì)束手束腳,而且當(dāng)時(shí)編程能力還比較差,對(duì)前端代碼幾乎一無(wú)所知,寫(xiě)起來(lái)十分困難,加上剛換了工作,就沒(méi)有更深入的去了解。這兩年以來(lái)用業(yè)余時(shí)間斷斷續(xù)續(xù)學(xué)習(xí)了一些前端技術(shù),而且實(shí)際工作中對(duì)系統(tǒng)架構(gòu)設(shè)計(jì)的理解也有了比較大的成長(zhǎng),所以就萌生了從零搭建一個(gè)純凈博客系統(tǒng)的念頭,
用最簡(jiǎn)單粗暴的代碼實(shí)現(xiàn)功能。
支持文章的發(fā)布、修改與查看(離線發(fā)布)。
可以增加刪除文章分類(分類分為主分類和副分類,比如主分類:技術(shù),下屬有PHP、MySQL、Linux等副分類)。
PC瀏覽美觀,暫不考慮移動(dòng)端的兼容。
Google、百度等搜索引擎可搜到
兼容移動(dòng)端,考慮使用bootstrap的響應(yīng)式布局。
線上線下配置分離
對(duì)代碼進(jìn)行模塊化的封裝:1. 后端代碼抽象出路由模塊、數(shù)據(jù)庫(kù)模塊、網(wǎng)絡(luò)請(qǐng)求模塊、http響應(yīng)模塊。2. 前端代碼抽象出網(wǎng)絡(luò)請(qǐng)求模塊。
支持評(píng)論、訂閱功能
支持線上發(fā)布、修改文章(權(quán)限控制)
多機(jī)部署
將文章合成自動(dòng)生成的js代碼,實(shí)現(xiàn)簡(jiǎn)單的防爬機(jī)制
2 技術(shù)選型
最終選用的技術(shù)棧如下:
前端:Vue
后端:Golang(gin框架) + MySQL + Nginx + Linux
前端:
其實(shí)一年前我對(duì)前端技術(shù)還是一無(wú)所知,大概2017年5月份左右,有了一個(gè)想做教育APP的想法,直到17年12月左右工作的壓力才逐漸小了一些,每天大概有兩小時(shí)左右的業(yè)余時(shí)間可以搞一些小玩意。
當(dāng)時(shí)考慮到做APP的話,無(wú)論Andriod還是iOS如果想做原生APP,學(xué)習(xí)成本太高,而且要做兩套APP,就選了學(xué)習(xí)成本最低的微信小程序。小程序一旦寫(xiě)好,甚至不需要安裝就可以獲得媲美原生APP的功能,還有微信的流量,實(shí)在是方便。小程序使用的語(yǔ)言又恰好和html、js、css很像,于是這才漸漸有了一些了解。
回到這次開(kāi)發(fā)博客的技術(shù)棧,在經(jīng)過(guò)同學(xué)還有同事的安利后,前端框架決定使用Vue,輕量級(jí)框架,學(xué)習(xí)成本較低。
后端服務(wù)開(kāi)發(fā)語(yǔ)言:
后端服務(wù)的話,由于我本身是做了三年的PHP開(kāi)發(fā),使用PHP開(kāi)發(fā)博客的話,幾乎沒(méi)有什么新的技術(shù)難題,更不用說(shuō)成長(zhǎng)了。PHP屬于動(dòng)態(tài)腳本語(yǔ)言,所以打算使用一種之前沒(méi)用過(guò)的靜態(tài)編譯型語(yǔ)言。
近些年來(lái),Golang作為一門新興語(yǔ)言,實(shí)在是勁頭火熱,各大公司的許多項(xiàng)目也在向Golang逐漸轉(zhuǎn)型,所以我選擇Golang作為后端開(kāi)發(fā)語(yǔ)言,雖然可能暫時(shí)用不到channel和協(xié)程這些語(yǔ)言特性,但也可以為學(xué)習(xí)新語(yǔ)言打開(kāi)一扇大門了。
本來(lái)Golang是可以不用框架,直接裸寫(xiě)服務(wù),不過(guò)之前面試羅輯思維的時(shí)候,了解過(guò)他們框架用的gin,網(wǎng)上查了查發(fā)現(xiàn)這屬于一個(gè)輕量級(jí)框架,似乎評(píng)價(jià)還可以,所以就打算拿來(lái)用用,正好在博客的第二版可以對(duì)框架進(jìn)行一些二次開(kāi)發(fā),增加一些技術(shù)難題和工作量。
反向代理服務(wù)器:
Golang的服務(wù)器前面我是打算再搭一個(gè)Nginx,1是為了后續(xù)流量上升后的負(fù)載均衡做準(zhǔn)備,2是因?yàn)?/span>js、css等靜態(tài)資源肯定需要一個(gè)web服務(wù)器提供服務(wù)。反正CDN暫時(shí)是不考慮了orz
數(shù)據(jù)庫(kù):
數(shù)據(jù)庫(kù)選擇使用MySQL,畢竟MySQL可以說(shuō)是當(dāng)前業(yè)界最流行的關(guān)系型數(shù)據(jù)庫(kù)。
MongoDB這種數(shù)據(jù)庫(kù)說(shuō)實(shí)話我還沒(méi)用過(guò),從網(wǎng)上的資料看起來(lái)的應(yīng)用場(chǎng)景似乎也不太匹配,這次就不用了,等后續(xù)有時(shí)間再看看吧。
Redis暫時(shí)也就不用了,一開(kāi)始似乎也不需要用到這種設(shè)備,用了反而增加系統(tǒng)復(fù)雜度。
操作系統(tǒng):
服務(wù)器的操作系統(tǒng)不多嗶嗶,就是Linux,其他也不廢話了。
3 數(shù)據(jù)庫(kù)設(shè)計(jì)
第一版主要實(shí)現(xiàn)以下幾個(gè)功能:方便的增加、修改;瀏覽數(shù)計(jì)數(shù);記錄創(chuàng)建、修改時(shí)間;記錄文章分類。
建表語(yǔ)句如下:
CREATE TABLE `article_detail` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增ID',
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '文章ID',
`content` text COMMENT '文章內(nèi)容',
`browser_count` bigint(11) NOT NULL DEFAULT '0' COMMENT '瀏覽數(shù)',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '創(chuàng)建時(shí)間',
`main_category_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '主類別ID',
`sub_category_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '副類別ID',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章標(biāo)題',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uuid` (`uuid`),
KEY `idx_main_category_uuid` (`main_category_uuid`),
KEY `idx_sub_category_uuid` (`sub_category_uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表結(jié)構(gòu)就不多說(shuō)了,加了三個(gè)索引,uuid是每個(gè)文章的唯一標(biāo)記,主、副類別ID的索引是為了在篩選文章列表的時(shí)候加快查詢速度用的。加索引在數(shù)據(jù)量夠大時(shí),可以增加查詢速度,具體原理以后會(huì)寫(xiě)文章講解。
主副類別表;
建表語(yǔ)句如下:
CREATE TABLE `main_category` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增ID',
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '主類別ID',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '類別名稱',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '創(chuàng)建時(shí)間',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uuid` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sub_category` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增ID',
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '副類別ID',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '類別名稱',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '創(chuàng)建時(shí)間',
`main_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '對(duì)應(yīng)的主類別ID',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uuid` (`uuid`),
KEY `idx_main_uuid` (`main_uuid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
??其實(shí)這么建表我是有點(diǎn)糾結(jié)的,很多地方,為了父子節(jié)點(diǎn)的拓展方便,可能會(huì)只建一張表,然后表內(nèi)有一個(gè)父節(jié)點(diǎn)ID的字段,就可以實(shí)現(xiàn)無(wú)限多級(jí)的父子關(guān)系,不過(guò)我覺(jué)著這里沒(méi)必要有無(wú)限多級(jí)的父子關(guān)系,而且建兩張表的話,父子關(guān)系會(huì)更清晰。
文章內(nèi)容來(lái)源于網(wǎng)絡(luò),侵刪