私人博客定制

?

項目背景?

可行性方面

需求分析:

詳細設計:

數據庫設計

博客管理API的設計

標簽相關API

服務器端的實現

對數據庫操作進行封裝

對服務器操作進行封裝

客戶端實現

具體操作

使用markdown

具體實現

測試

項目效果展示

維護

完整代碼


項目背景?

? ? ? ?現在的時代信息越來越多,我們每時每刻都在學習和接受各種信息,我們要怎樣保存這些信息,并且 向他人展示,寫博客就是一個很好的方法。
? ? ? ? 現在有很多的博客網站就是實現這樣的功能,這個項目就是實現一個自己的博客網站,可以把我們平時的學習和生活記錄下來。

可行性方面

  • 經濟可行性——低成本
  • 操作可行性——簡單
  • 技術可行性——借助其他工具

需求分析:

? ? ? ?支持單個用戶

? ? ? ?我們的客戶端是在瀏覽器上實現的,要在瀏覽器上進行對博客的操作,編輯,修改,刪除,增加等。

? ? ? ?服務器器端在Linux上實現,針對每一個客戶端的按鈕都要有對應的事件處理。

? ? ? ?存儲用MySQL數據庫,調用c/c++API進行對博客的管理

博客服務器端要實現的功能

  1. ?對博客的管理能力
  2. ?對標簽的管理能力

博客客戶端要實現的功能

  1. 博客標題列表頁面?
  2. 博客內容展示頁面
  3. 博客管理頁面
  4. 博客內容編輯頁面

數據存儲要實現的功能

  1. 服務器存儲 markdown 格式的數據
  2. ?前端通過 editor.md 這個工具將markdown的文檔內容提交給服務器, 或者解析服務器返回的 markdown 作為 前端頁面內容.?

詳細設計:

數據庫設計

? ? ? ?對于博客管理而言,一個博客除了自己的編號外,一但博客量比較大,我們還需要標簽來對其進行管理。所以我們的數據庫需要兩張表

對于博客表,那么它肯定有博客編號,標題,正文,創建時間,還有所對應的標簽信息

drop table if exists blog_table
create table blog_table(blog_id int(6) not null primary key auto_increment,title varchar(50),content text,tag_id int,create_time varchar(50));

對于標簽表而言,我們只需要有標簽的編號,和標簽所對應的名字即可

drop table if exists tag_table
create table tag_table(tag_id int not null primary key auto_increment  ,tag_name varchar(50)
);

有了這兩張表后接下來我們就要實現服務器端的程序了

博客管理API的設計

?新增博客
?

POST/blog
{title:xxxx,content:xxxx,create_time:xxxx,tag_id:xxxxx,
}
成功返回一個:
HTTP/1.1 200 OK
{ok:truereason: " "?? ??? ?//失敗的原因
}


展示博客列表
?

GET/blog?? ??? ??? ??? ??? ?//獲取所有
GET/blog?tag_id = 1;?? ?//按照標簽來篩選HTTP/1.1 200 OK
[{blog_id:1,title:"我的第一篇博客",create_time:"2019/--/--"tag_id:1?? ?},
]



展示博客詳細內容
?

GET/blog/:blog_id?? ??? ?//冒號后面代表一個真正的博客id,是一個數字。類似于/blog/10HTTP/1.1 200 OK
{"blog_id":1,"title":"我的第一篇博客",create_time:"2019/--/--",tag_id:1
}



?刪除博客
?

DELETE/blog/:blog_idHTTP/1.1 200 OK
{ok:true;
}


?修改博客
?

PUT/blog/:blog_id
{title:"修改后的標題",content:"修改之后的正文",tag_id:"修改之后的tag_id",
}HTTP/1.1 200 OK
{ok:true
}

?

標簽相關API


?新增標簽
?

POST/tag
{"tag_name": "新增的標簽名"
}HTTP/1.1 200 OK
{ok:true
}


?

刪除標簽
?

DELETE/tag/:tag_idHTTP/1.1 200 OK
{ok:true
}

查看所有標簽
?

GET/tagHTTP/1.1 200 OK
[{tag_id:1,tag_name:c++}
]

服務器端的實現

由于數據庫封裝和服務器端封裝代碼比較多,所以另寫兩篇博客


對數據庫操作進行封裝

封裝數據庫

對服務器操作進行封裝

服務器封裝的鏈接

客戶端實現

HTML-----網頁的骨架

CSS-----網頁的樣式(大小/顏色/位置/邊框/...)

JavaScript-----網頁和用戶之間的交互動作

我并沒有專門學過前端,但是考慮到開發項目客戶端,我還是專門學了一些簡單前端知識

JS教程? ? ?css教程? ??HTML教程

最后綜合各種的前端開發語言,我還是決定選擇用JQuery+Vue.js來實現

使用 Vue.js

為什么使用Vue.js。?

因為它的開源社區是中文的,而且作者是中國人(尤雨溪),既然是中國人肯定按照中國人的思維開發出的vue.js。所以因該用起來不是很難

網頁中需要動態交互的部分, 使用 JS 來實現. 但是原生的基于 Dom API 的交互方式比較麻煩, 因此 Vue.js 提供了更簡
單更方便的做法.

使用ajax來獲取數據

ajax具體操作學習----->學習網站

具體操作

使用markdown

提交,存儲博客的時候,都可以用markdown格式的數據來表示,展示的時候,就自動把markdown數據轉成html格式的數據

我們需要第三方庫來實現這樣的操作,Editor.md第三方的JS庫,完成markdown和html相互轉換,以及markdown在線編輯器的功能

具體的操作需要看官網介紹

http://editor.md.ipandao.com/

1. 博客列表頁

2.博客詳情頁

以上實現由于html靜態網頁實在是代碼量比較大,不方便在此展示,只能放到GitHub上,如果有需要請自行下載

上面兩個頁面都是給大家看的

而下面的頁面則是只能自己看

3.博客管理頁面

刪除博客

編輯博客:點擊博客進入編輯頁面,編輯頁面中應該有一個

插入博客:markdown編輯器,編輯器里的內容已經是博客當前內容了,編輯完成后,點擊提交按鈕,就把服務器發送到服務器上

?

具體實現

由于前端代碼量過大,不易展示,訪問下面網站查看詳情

https://github.com/514467952/Private-blog_workstation.git

測試

在完成三個面的實現后,我們需要對整個項目進行測

測試方式:在數據庫和服務器相應功能實現上,采用單元測試,且測試方法采用白盒測試

具體的測試代碼均在上面的網址。

文件加載測試:按鈕中實現跳轉頁面,確認是否能夠跳轉

總體測試:完整操作,驗證是否能和功能對應

項目效果展示

首頁展示

查看博客頁面

后臺管理博客頁面

后臺插入博客頁面

維護

  • 這是一個輕量級的項目,目前只針對單人使用。以后等我技能提升后,會支持多用戶登陸并進行操作。
  • 底層用的httplib的庫,這個底層實現了多線程,可以支持多用戶訪問。
  • 目前實現的功能,尚且只有博客的增刪改查,雖然關于標簽的增改,后臺功能已實現,但由于本人前端編程語言并不是很熟所以還無法實現
  • 博客的內容不易過長,因為本人端編程語言不是很熟,沒有實現翻頁的功能,

完整代碼

https://github.com/514467952/Private-blog_workstation.git

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383135.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初識c++中的函數模板

函數模板 函數模板概念 函數模板:編譯器生成代碼的一個規則。函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本。 函數模板格式 //要讓這個函數與類型無關 //Add函數模板 template…

深入理解c++中的函數模板

非類型模板參數 模板參數分類類型形參與非類型形參。 類型形參:出現在模板參數列表中,跟在class或者typename之類的參數類型名稱。 非類型形參,就是用一個常量作為類(函數)模板的一個參數,在類(函數)模板中可將該參數當成常量來使…

c++中的IO流

c語言中的IO操作 標準類型的輸入輸出: 輸入------>數據來源是通過鍵盤進行輸入輸出------>程序中的數據輸出到控制臺 c語言中: scanf:輸入 printf:輸出 兩個函數的相同點 1 —格式串 2 —不定參數 兩個函數的缺陷 1 —用戶要提供數據的格式—用戶要記憶大量的格式串—…

201301 JAVA2~3級---走格子

請編寫一個函數(允許增加子函數),計算n x m的棋盤格子(n為橫向的格子數,m為豎向的格子數)沿著各自邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即&…

復習Linux基本操作----常見指令

Linux基本操作 ls命令 ls(list):相當于windows上的文件資源管理器 語法: ls [選項][目錄或文件] 功能:對于目錄,該命令列出該目錄下的所有子目錄與文件。對于文件,將列出文件名以及其他信息。 常用選項: -a 列出目…

復習Linux基礎操作---權限操作

shell命令以及運行原理 Linux嚴格意義上說的是一個操作系統,我們稱之為“核心(kernel)“ ,但我們一般用戶,不能直接使用kernel。而是通過kernel的“外殼”程序,也就是所謂的shell,來與kernel溝…

【劍指offer】_01 (二維數組中的查找)

題目描述 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該…

【劍指offer】_02替換空格

題目描述 請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。 解題思路 首先我們先算出整個字符串的長度,還有總共多少個空格。因為空格只占一個字節&#…

【劍指offer】_04 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。 解題思路 用前序的順序…

再談c++中的多態

何為多態 多態的概念:通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。 多態的實現 在繼承的體系下 基類中必須有虛函數(被virtual關鍵字修飾的成員函數),在派生類中必須…

再談c++中的繼承

繼承的概念 繼承(inheritance)機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱派生類。繼承呈現了面向對象程序設計的層次結構,體現了…

紅黑樹概念及其相關操作的實現

紅黑樹的概念 紅黑樹,是一種二叉搜索樹,但它并不像AVL樹一樣,每個結點綁定一個平衡因子。但在每個結點上增加一個存儲位表示結點的顏色,可以是Red或Black。 通過 對任何一條從根到葉子的路徑上各個結點著色方式的限制&#xff0c…

模擬實現STL中map和set容器

紅黑樹的迭代器 //紅黑樹的迭代器 template<class T> struct RBTreeIterator {typedef RBTreeNode<T>Node;typedef RBTreeIterator<T> Self; public:RBTreeIterator(Node* pNode nullptr):_pNode(pNode){}//具有指針操作T& operator*(){return _pNode-…

【劍指offer】_05 連續子數組最大和

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會后,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,并期望旁邊的正數會彌補它呢&#…

排序上---(排序概念,常見排序算法,直接插入,希爾排序,直接選擇排序,堆排序)

排序的概念 排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的記錄&#xff0c;若經過排序&…

排序下---(冒泡排序,快速排序,快速排序優化,快速排序非遞歸,歸并排序,計數排序)

排序上 排序上 交換類排序 基本思想&#xff1a;所謂交換&#xff0c;就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置&#xff0c;交換排序的特點是&#xff1a;將鍵值較大的記錄向序列的尾部移動&#xff0c;鍵值較小的記錄向序列的前部移動。 冒泡…

哈希的概念及其操作

哈希概念 順序結構以及平衡樹中&#xff0c;元素關鍵碼與其存儲位置之間沒有對應的關系&#xff0c;因此在查找一個元素時&#xff0c;必須要經過關鍵碼的多次比較。順序查找時間復雜度為O(N)&#xff0c;平衡樹中為樹的高度&#xff0c;即O( Log2N)&#xff0c;搜索的效率取決…

軟件工程---1.概述

軟件的特征 抽象&#xff1a; 不可觸摸&#xff0c;邏輯實體&#xff0c;可記錄&#xff0c;但看不到復制成本低&#xff1a;不受物質材料的限制&#xff0c;不受物理定律或加工過程的制約&#xff0c;與開發成本相比&#xff0c;復制成本很低無折舊、受硬件制約、未完全擺脫手…

軟件工程---2.軟件過程

三個模型 瀑布模型增量模型集成和配置模型 沒有適用于所有不同類型軟件開發的過程模型。 瀑布模型 需求定義系統和軟件的設計實現與單元測試集成與系統測試運行與維護 瀑布模型的特征 從上一項活動中接受該項活動的工作成果&#xff08;工作產品&#xff09;&#xff0c;作…

軟件工程---3.敏捷軟件開發

敏捷軟件開發 極限編程&#xff08;XP&#xff0c; Beck1999&#xff09;Scrum方法&#xff08;Schwaber and Beedle 2001&#xff09;DSDM方法&#xff08;Stapleton 2003&#xff09; 敏捷軟件的開發宣言 個體和交互勝過過程和工具可以工作的軟件勝過面面俱到的文檔客戶合…