基於Node和MongoDB的Web微博系統
概述
項目是受到《Node.js開發指南》一書啓發,做者BYVoid大佬是當時第一批Node開發者,當時學習者迫切須要一個這麼DEMO。固然如今已通過去不少年了,Node早就更新無數次了,12年的這本書也就過期,許多代碼都根本跑不通了,最後仍是要以官網API爲準。前端
- 項目的後臺用的express。
- 數據庫部分本身寫的原生MongoDB,沒有去用控制力更強大的mongoose框架,多寫原生東西對本身有好處。
- 前端用的是jQuery,underscore.js
- 樣式用的Bootstrap框架。
設計
形式上採用的是MVC結構,數據庫和加密部分在model層,路由控制充當Controller,ejs前端展現就是view層了。node
安裝依賴
"dependencies": {
"ejs": "^2.5.7",
"express": "^4.16.2",
"express-session": "^1.15.6",
"formidable": "^1.1.1",
"gm": "^1.23.0",
"mongodb": "^2.2.33" }
若是想二次開發,node——modules部分建議按照上面版本本身從新npm install,個人node版本是 v8.3.0 ,目前最新的是v8.9.0mysql
功能和實現
- 登錄模塊,註冊模塊,微博的發表,所有用戶的微博,我的所有微博,全部用戶列表,點擊某個用戶能夠看到該用戶發表過的微博,用戶退出,頭像的上傳和剪裁,登錄以後直接點擊本身的默認頭像可進入頭像上傳頁面,主頁根據登錄狀態變化呈現不一樣頁面。
- 狀態的判斷是經過express-session來傳遞。
- 服務器對頭像圖片的處理用到了GraphicsMagick ,這個插件能夠截屏,而後我寫了一個腳本獲取到這個插件截屏時大小參數,在前端界面上進行圖片的剪裁。
- 數據庫對mongo的增刪改查和分頁功能比較原生,直接參考官網Mongo對Nodejs開放的API,一些操做實現了重載化,JS裏是沒有函數重載的,只能本身手寫判斷,好比查詢操做find函數,能夠根據參數的不一樣進行重載,根據參數的個數判斷,來確實是否是要對查詢的結果進行排序,分頁,跳過和限制。
- 微博的展現部分,用到了underscore.js,因爲和ejs的模版標記重合了,我修改了underscore的源碼,把模版標記<%%>變成了{{}}。所有微博展現的處理中,由於用戶的信息是存在user集合裏,微博存在posts集合裏,mongo不像mysql傳統關係型數據庫那樣,是沒有外鍵的,我get全部微博的時候查詢的是posts集合,posts集合裏沒有存用戶的頭像,我要想在所有微博裏顯示用戶的頭像,只好採用雙重AJAX回調,第一層獲取到全部說說,第二層在迭代器中,這個迭代器是一個遞歸,爲了分頁效果,用迭代器實現了閉包,這是JS的坑誰用誰知道。(固然ES6能夠輕鬆解決這個問題),迭代器得到第一層回調結果的username,再查詢獲取到頭像,再合併到第一個查詢結果。
- 還有其餘的一些東西什麼的感興趣能夠fork,clone 看源碼。
待改進
微博的評論,點贊功能,每一個微博的主頁功能等等,能填的坑還有不少,不過大致框架寫好了,開源出來也是但願你們能一塊兒加功能。git
結語
這個項目用來練習Node比較好了,代碼註釋寫的不少,若是本項目對您有一絲絲的小幫助,求個star,也歡迎fork,一塊兒加上更多功能。github
DEMO
![](http://static.javashuo.com/static/loading.gif)
代碼:
GitHub倉庫web
有的問題能夠評論,Issue,或者加扣扣1104272319聯繫我。