Node.js實戰項目:搭建自己的專屬博客

2021-03-02 計科學習社

前端作為當下非常火的職業之一,小編身邊有很多小夥伴在學習前端,但是大部分人在自學過程中十分盲目,不知道自己每個階段應該做什麼,不僅大大降低了學習的效率,也打擊自己的學習熱情。

小編想說,對於編程學科而言,在我們學習掌握了一部分知識,對前端有了進一步的了解之後,我們就急需要一些項目去幫我們整理一下自己學習的知識點,以及提高編程能力。

不斷地找項目練手,通過項目實戰來總結經驗,豐富技術的應用。這樣更有助於我們的學習和工作實踐,對於找工作而言有著大大的幫助。

下面小編就給有一定前端基礎的開發者,分享一個非常乾貨的項目——《個人博客系統開發》。

本項目是基於Node.js中的Express框架做的一個基本的入門案例,使用EJS模板引擎渲染頁面,以及MySQL資料庫實現數據的持久存儲。本項目涵蓋了Node.js連接資料庫的基本操作、接收前端請求並返回請求結果的前端基本交互功能。

特別指出的是,Node.js擁有廣大的JavaScript程式設計師基礎並且完全開源,所以它擁有一個強大的開發者社區。依靠繁榮的社區力量,現在已經發展出成熟的技術體系與龐大的生態。它被廣泛地用在Web服務、開發工作流、客戶端應用等諸多領域。其中,在Web服務開發這個領域,業界對Node.js的接受程度最高。

下面就進入具體的項目實戰吧!

Express框架快速搭建伺服器

Node.js操作MySQL資料庫

EJS模板引擎的使用


博客系統需要有存儲作者信息和文章信息的資料庫---MySQL資料庫。

博客系統需要有登錄註冊功能、博客撰寫功能、所有文章展示以及單篇文章閱讀功能、博客介紹、友情連結等。

首先我們建立一個Node.js的express項目,推薦大家使用使用WebStorm(因為WebStorm為大家集成了Express項目所需的模塊資源,十分方便,特別對於初學者而言是十分友好的哦)

 

安裝項目所必須的mysql第三方模塊(如果之前全局安裝過略過此步驟)

使用MySQL新建一個資料庫,命名為blog,並在資料庫中建立兩張表,分別為author和article,用於儲存項目中的博客作者和撰寫的博客信息,表的設計分別如下。

項目文件夾結構圖

主要文件夾說明

Public文件夾放公共資源

Routes文件夾放路由文件

Views放ejs模板文件(通俗理解為前端頁面文件)

 

首先,新建database.js和config.js文件,分別在其中加入資料庫配置信息。

PS:這兩個文件內容可以視作Node.js連接MySQL的模板配置,一般僅需替換資料庫名和密碼即可使用。

接下來,對項目的入口文件app.js做一些設置,具體設置見代碼注釋。

var createError = require('http-errors');var express = require('express');var path = require('path');var cookieParser = require('cookie-parser');var logger = require('morgan');var bodyParser = require('body-parser');var session = require('express-session');
var index = require('./routes/index');var users = require('./routes/users');
var app = express();
app.use(session({ secret:'blog', cookie:{maxAge:1000*60*24*30}, resave: false, saveUninitialized: true}));
app.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);app.use('/users', users);
app.use(function(req, res, next) { res.render('404');});
app.use(function(err, req, res, next) { res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500); res.render('error');});
app.listen(3000,function(){ console.log('listening port 3000');});module.exports = app;

可以看到,博客首頁左側為博客的導航欄,右側有所寫的全部文章概要信息。整個頁面的邏輯為在瀏覽器輸入博客首頁地址---瀏覽器向Node.js伺服器發起請求---伺服器接收到請求---查找資料庫,將所有文章信息返回給前端頁面---前端頁面根據返回的結果使用ejs模板引擎進行渲染顯示。

前端關鍵代碼為

<section class="main-articles">    <ul>        <% for(var  i = 0, max = articles.length; i < max; i++) {%>            <li class="main-articles-item">                <h2><a href="/articles/<%= articles[i].articleID%>"><%= articles[i].articleTitle %></a></h2>                <section class="main-articles-items-des">                    <p>                        <span>作者:<%= articles[i].articleAuthor %></span>                        <span>發布時間:<%= articles[i].articleTime %></span>                        <span>瀏覽量:<%= articles[i].articleClick %></span>                        <% if(user) {%>                            <span class="delete"><a href="/delete/<%= articles[i].articleID %>">刪除</a></span>                            <span class="modify"><a href="/modify/<%= articles[i].articleID %>">編輯</a></span>                        <% } %>                    </p>                </section>            </li>        <% } %>    </ul></section>

後臺代碼為

router.get('/', function(req, res, next) {  var query = 'SELECT * FROM article ORDER BY articleID DESC';  mysql.query(query, function(err, rows, fields){    var articles = rows;    articles.forEach(function(ele) {      var year = ele.articleTime.getFullYear();      var month;      if(ele.articleTime.getMonth() + 1 > 10) month = ele.articleTime.getMonth() + 1;      else month = '0' + (ele.articleTime.getMonth() + 1);      var date = ele.articleTime.getDate() > 10 ? ele.articleTime.getDate() : '0' + ele.articleTime.getDate();      ele.articleTime = year + '-' + month + '-' + date;    });    console.log(req.session.user);    res.render("index", {articles: articles,user:req.session.user});  });});

細心的小夥伴可能發現了,我們現在還沒有登錄博客系統呢!所以現在是寫不了博客的哦~

點擊左側「登錄博客」按鈕,出現登錄頁面

現在還沒有帳號呢,那點擊「沒有帳號,立即註冊」吧。

現在跳轉到註冊頁面了,輸入自己的用戶名和密碼,就註冊成功了。

登錄和註冊的邏輯基本一致,僅以登錄為例介紹運行邏輯。

輸入用戶名和密碼後---點擊登錄---向後臺發起一個post請求---後臺根據接收到的請求信息,解析出用戶名和密碼---將解析出來的用戶名和密碼與資料庫中的author表進行比對,信息正確則登陸成功;否則返回用戶名或密碼錯誤的提示信息。

前端關鍵代碼為

<form action="/login" method="POST">    <div class="form-group">        <input type="text" name="name" placeholder="登錄名">    </div>    <div class="form-group">        <input type="password" name="password" placeholder="密碼">        <%if(message) {%>            <p> <%= message%> </p>        <% } %>    </div>    <div class="form-group">        <input type="submit" value="登錄">        <a href="/register"><span style="color: aliceblue;display:block;text-align: center;">沒有帳號,點擊註冊</span></a>    </div></form>

後臺關鍵代碼為

router.get('/login', function(req, res, next) {  res.render('login', {message:'',user:req.session.user});});router.post('/login', function(req, res, next) {  var name = req.body.name;  var password = req.body.password;  var hash = crypto.createHash('md5');  hash.update(password);  password = hash.digest('hex');  var query = 'SELECT * FROM author WHERE authorName=' + mysql.escape(name) + ' AND authorPassword=' + mysql.escape(password);  mysql.query(query, function(err, rows, fields) {    if (err) {      console.log(err);      return;    }    var user = rows[0];    if(!user) {      res.render('login', {message:'用戶名或密碼錯誤'});      return;    }    req.session.user = user;    res.redirect('/');  });});

登錄成功後,首頁會發生一個小變化,那就是原來導航欄的「登錄博客」會變成「登出博客」。

好的,現在我們已經登錄成功,可以寫博客啦!

點擊左側導航欄的「撰寫文章」,會出現一個簡易的文本編輯器,在這裡根據提示寫完博客後,點擊保存,文章就發布成功了哦!

這個過程的邏輯為前端點擊保存按鈕,向後臺發起post請求---後臺根據接收到的請求信息,解析出文章信息,然後向資料庫中添加文章信息,並像前端發起重定向命令,頁面自動跳轉至博客首頁,你會看到剛寫的博客已經置頂啦。

前端關鍵代碼為

<section class="main-articles">    <form action="/edit" method="POST" class="edit">        <div class="form-group">            <label for="">標題</label>            <input type="text" name="title">        </div>        <div class="text-group">            <label for="">內容</label>            <textarea name="content"></textarea>        </div>        <p><input type="submit" value="保存"></p>    </form></section>

後臺關鍵代碼為

router.get('/edit', function(req, res, next) {  var user = req.session.user;  if(!user) {    res.redirect('/login');    return;  }  res.render('edit', {user:req.session.user});});router.post('/edit', function(req, res, next) {  var title = req.body.title;  var content = req.body.content;  var author = req.session.user.authorName;  var query = 'INSERT article SET articleTitle=' + mysql.escape(title) + ',articleAuthor=' + mysql.escape(author) + ',articleContent=' + mysql.escape(content) + ',articleTime=CURDATE()';  console.log(query)  mysql.query(query, function(err, rows, fields) {    if(err) {      console.log(err);      return;    }    res.redirect('/');  });});

寫博客的時候可能經常會遇到博客內容需要修改或者刪除博客的功能,可以發現我們在每篇文章的右下角都提供了相應按鈕,邏輯與前面的基本一致,代碼裡也附上了注釋,限於篇幅這裡就不再贅述了。

好的,到這基於Node.js的博客系統已經基本分享完畢,相信大家馬上可以搭建自己的專屬博客啦!

相關焦點

  • Node.js 學習資料和教程(值得收藏)
    >被誤解的 Node.jsNode.js C++ addon編寫實戰系列熱門node.js模塊排行榜,方便找出你想要的模塊nodejs多線程,真正的非阻塞淺析nodejs>一個周末掌握IT前沿技術之node.js篇用node+express搭建多人博客教程系列Node.js靜態文件伺服器實戰人人和微博登錄模塊的實現《京JS》會議 & V8上的
  • 如何搭建自己的個人博客
    大概17年初我將自己的寫博客主要陣地轉移到了CSDN,原因是CSDN在百度搜尋引擎中佔據了最高的權重。後面證明我的判斷是正確的,我的CSDN博文閱讀量一路飆升,讓更多的人可以的閱讀我的博客。就在上個月我閱讀了純潔的微笑的博文 技術人如何搭建自己的技術博客這篇文章,我決定折騰一下搭建一下自己的個人博客。
  • nodejs windows環境下搭建
    目前,Node.js是在前端開發中十分受歡迎,它是一套用來編寫高性能網絡伺服器的JavaScript工具包,官網中介紹:Node.js 是一個基於Chrome JavaScript 運行時建立的一個平臺, 用來方便地搭建快速的 易於擴展的網絡應用; Node.js 藉助事件驅動, 非阻塞I
  • Node.js 入門到幹活,10 個項目就夠了
    Node.js 入門到幹活,10 個項目就夠了 Node.js 在很多大公司都有不錯的實踐,比如:淘寶、天貓 Web 版,很多頁面都是在 Node 伺服器上渲染的。還有各種腳手架、前端打包發布工具、構建生態的小工具,也基本都是 Node.js 編寫的。
  • 推薦一些 GitHub 上值得前端學習的開源實戰項目,進階必看!
    最近好多同學問我了解找一些學習的實戰項目;看一個別人寫的優秀的項目,從中可以學到很多;比如代碼的規範,項目的結構;從項目作者每次提交記錄,去學習一些別人的開發思維以及開發整個項目的流程;下面我主要找了一些比較火的一些框架以及 node 項目。
  • 全程指導:Node JS實戰之製作塗鴉遊戲
    在本文中,將帶領讀者通過實戰製作一個能供多人在線塗鴉畫畫的遊戲,讓讀者體會Node.js的特殊魅力,這個遊戲的特點是多人在瀏覽這個頁面時,大家都可以在頁面上自由塗鴉,而且大家是互相看到其塗鴉的效果的。Node.js由於可以讓開發者編寫服務端運行的Javascript,因此能同時處理大量的連接,特別適合比如聊天,網路遊戲等需要對即時性要求高的。
  • 實戰:在Node.js和Vue.js中構建文件壓縮應用程式
    在桌面上,為應用程式創建一個文件夾,群毆取名為 compressor,並通過運行 npm init -y設置一個新的Node.js項目。我們先編寫後端服務,所以在項目中再建立一個 server 目錄。在開始之前,我們先創建一個 .gitignore 文件,並向其中添加 node_modules,這將防止將node_modules 文件夾添加到git中。
  • node.js、MongoDB下一代的LAMP
    node.js、MongoDB下一代的LAMP 我們大部分人在做網站時,都用的是LAMP,殊不知LAMP已成過去式,新一代的小生:nix、node.js、MongoDB誕生了,讓我們走進他們,知道他們的故事!
  • 10+ 最佳的 Node.js 教程結合實例
    同時網上有著大量的資源和教程教你怎樣構建自己的Node.js應用。我們不防看看Node.js大神針對Web Apps寫的Node.js最佳指南。我們所覆蓋的指南將包括針對初學者的Node.js、中級指南,同時還有教你怎樣構建複雜的Node.js項目。
  • 如何在Windows系統安裝最新版本的Node.js
    工具windows作業系統Node.js技術JavaScript在使用vue框架、react框架和angularjs框架時,隨著框架版本不斷更新,對應的Node.js版本也在不斷更新;如果版本不對應,搭建框架的項目就啟動不了。
  • 你不知道的 Npm(Node.js 進階必備好文)
    但是 npm 本身對兩個腳本提供了默認值,這兩個腳本不用在 script 屬性中定義,可以直接使用"start": "node server.js""install": "node-gyp rebuild"npm run start 的默認值是 node server.js ,前提是根目錄下有 server.js
  • Node.JS快速入門
    -v會顯示當前node的版本號2.快速入門2.1 控制臺輸出我們現在做個最簡單的小例子,演示如何在控制臺輸出,在e盤創建文件夾nodedemo ,創建文本文件demo1.js,代碼內容我們在命令提示符下輸入命令node demo1.js ,結果如下:2.2 使用函數我們剛才的例子非常簡單,咱們這裡再看一下函數的使用:我們在命令提示符下輸入命令node demo2.js ,結果如下:
  • 我開始討厭node.js了
    擁抱JavaScript2014年,我從一個半吊子c#程式設計師轉速前端,突然就愛上了JavaScript,感覺好像一顆被c#束縛已久的心終於解放了,js那种放蕩不羈愛自由的操作領悟神魂顛倒,我感覺自己擺脫了那些過度封裝的程序,所有的代碼都盡在掌握之中,那種感覺說不出的爽。
  • 推薦一些Node.js超好用的工具庫
    開源地址:https://github.com/axios/axiosnodemailernodemailer是我用過最好用的 node.js 發郵件庫,上代碼!qq郵箱收到開源地址:https://github.com/nodemailer/nodemailershowdownshowdown是將markdown轉html的庫,前後端均可用,我的博客就是使用
  • 在 Node.js 7 中甩掉 Callback Hell
    在幾個月之前,V8 引擎就實現了對 async/await 關鍵字的支持,Node.js 7中的 V8 經過幾次更新,終於在上一個 night build 版本中加入對異步編程的最高境界,就是根本不用關心它是不是異步, 所以 async/await 一直被譽為的 「殺手級解決方案」,讓你從回調地獄中解脫出來;現在就可以在 Node.js 7 中使用該關鍵字了,步驟如下:安裝 Node.js 7,可以使用 nvm 安裝;使用 async/await 寫一個簡單的示例使用 node --harmony-async-await
  • 【簡歷加分】hexo框架搭建個人博客站點,手把手教學.
    最近,粉絲們在金九銀十期間也是不斷的面試,有比較多的畢業生說我在這個期間出多一些面試題,上幾期都是傾向於面試文章,這期出一次簡歷加分項操作,使用hexo框架搭建個人博客。作為應屆畢業生或者1-3年工作經驗的程式設計師擁有自己的個人博客站點,絕對是簡歷的加分項,然而學習的成本確實非常的低,只要幾十分鐘就能搭建好自己的個人博客。閒話不多說,下面我們就開始動手來搭建自己的博客吧!
  • centos7編程實踐:安裝nodejs
    由於最近項目的需要,我需要在centos7上安裝nodejs,故總結這份教程,希望能幫助需要的同學。一、nodeJS簡介1、Nodejs是什麼?2、node.js的優勢2.1、Nodejs語法完全是js語法,只要你懂js基礎就可以學會Nodejs後端開發Node打破了過去JavaScript只能在瀏覽器中運行的局面。
  • 【實戰】基於Nginx、Node.js和Redis的Docker工作流
    作者通過一個完整的示例講述了構建一個基於Nginx、Node.js、Redis的應用服務的Docker流程。推薦所有Docker使用者閱讀,並根據文章實踐。在我的前一篇文章中,我已經介紹了關於容器和Docker是如何影響PaaS、微服務和雲計算的。
  • Node.js學習筆記第一天
    01-導入node模塊使用流程// node.js中將不同功能的代碼放在不同的js文件中,也叫模塊化,核心模塊會隨著安裝node.js時一併安裝// 1. /所在文件的 文件夾路徑nodejs中相對路徑: 是基於執行node命令時 終端所在的路徑如果nodejs中使用了相對路徑,就必須要在執行node命令前進入要執行文件的所在路徑,不然就會報錯所以最好不要在node中使用相對路徑,應該使用絕對路徑__dirname : 當前js所在的文件夾絕對路徑__filename : 當前js文件自身的絕對路徑path模塊: path.join(...paths:
  • Node.js與Ruby on Rails:二者哪個最適合Web開發?
    它類似於node . js的npm。所有Rails應用程式都有一個gem文件,您可以在其中指定gem。然後您可以運行一個bundler命令來安裝所有的程序,類似於npm安裝node . js。關於Ruby on Rails的另一件偉大的事情是它已經存在了一段時間,它有一個非常受人尊敬的智能社區。維護Ruby on Rails的開發人員非常聰明,對框架非常熱情。