Node專案之評分系統

魯鵬發表於2016-10-18

做一些小的Node開發專案,自己定需求,自己實踐,這個過程還是比較有意思的,這裡主要記錄一下開發一些小的Web專案的過程。

計劃要做的專案有:

  • 評分系統
  • 需求收集系統
  • 調查問卷

評分系統非常簡易,算是初學Node的第一個實踐。

Node專案 | LP's Blog

(三)Web開發

在資料庫設計完成之後,就可以開始專案開發了,實實在在的編寫程式碼了。

生成專案目錄

這裡使用的是express Web框架,於是大大簡化了HTTP方法以及路由訪問的實現過程。安裝完express模組後,建議同時裝上express-generator專案生成器,快捷生成express專案初始目錄及必要檔案。

npm install --save express
npm install express-generator -g

注意:express-generator模組需要全域性安裝。

安裝完express-generator生成器後,在專案目錄下,執行express -e命令,即可生成express專案目錄。

例如:express -e ./test01 命令就是在當前目錄下建立一個以ejs模版引擎的名叫test01的專案目錄。

建立完之後,進入專案目錄並安裝依賴包,執行如下命令:

cd ./test01 && npm install

安裝完之後,執行命令npm start,一個Node Web專案就啟動了,開啟瀏覽器輸入http://localhost:3000就可以看到express為你準備的首頁了。

資料庫方法

由於這裡使用的是MySQL資料庫,Node專案中需要安裝MySQL模組以便使用MySQL資料庫。使用npm包管理器很容易就能安裝完成。

npm install mysql --save

開始一個專案,最好是先把資料庫相關功能完成,由於專案簡單,僅僅是表message以及vote兩個表的操作,於是資料庫的連線我全部寫在了一個檔案上了 - db.js(新建db資料夾,在其中新建db.js),檢視MySQL模組的README文件,大概知道了該模組的使用方法。

PS. 在安裝了新的模組而不會用的情況下,最好是把模組裡的README文件瀏覽一遍,雖然大部分是英文的,但是好過各種百度。 -- 過來人忠告

看完文件,使用了最簡單的連線方式,在db.js中開始編寫程式碼:

var mysql = require('mysql');

var options = {
  host: 'localhost',
  user: 'lupeng',
  password: '080910',
  database: 'vote'
}

// 獲取資料庫物件
function getConn (){
  var client = mysql.createConnection(options);
  return client;
}

// 得到管理員帳戶
exports.getAdmin = function(callback){
  var client = getConn();
  var statement = 'select username,password from user where Id = 1';
  client.query(statement, function(errs,rows,fields){
    callback(errs,rows);
  });
  client.end();
}

這裡只是貼上了獲取管理員賬戶的方法示例,其他獲取資料庫的方法可以都寫在這個db.js的檔案裡,這裡就不多贅述,後面會附上專案程式碼自行檢視。

路由方法

express提供了非常簡單的路由編寫方式,這裡分別使用了HTTP協議GET//show/login/admin/add以及/edit來分別獲得首頁、檢視頁、登陸頁、後臺首頁、新增頁以及編輯頁。然後使用POST/來實現投票;使用/del來實現刪除;使用/edit來提交更新;使用/add來實現新增主題等。

這裡的程式碼我自認為寫的非常的亂,需要好好設計以及重新編寫,這裡就不貼出來。

在路由方法裡有個簡易的過濾器需要實現,也就是在使用者登陸後臺的時候,需要session的一個儲存以及獲取,來證明你是管理員。這裡我同樣採取了一個簡單的express中介軟體來實現了,也就是在訪問/admin的時候,需要驗證seesion,見下面簡要程式碼:

/* 登陸許可權 */
router.use(function (req, res, next) {
  db.getAdmin(function (errs, rows) {
    if (errs) {
      res.render('error', {
        message: errs,
        error: {}
      });
    } else {
      var username = rows[0].username;
      var password = rows[0].password;
      if (req.session && req.session.username == username && req.session.password == password) {
        next();
      } else {
        res.render('login', {
          title: '後臺登陸',
          info: '請登陸'
        });
      }
    }
  });
});

這個中介軟體放在訪問/admin的路由上,凡是對/admin的所有訪問請求都需要經過該中介軟體來驗證是否存在session,這樣就大概實現了管理員驗證的一個功能。當然,這裡還需要使用到express-session的模組,安裝並在app.js中簡單配置即可。以下是這裡的簡要配置:

// session config
app.set('trust proxy', 1);
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: {
    maxAge: 1000*60*60*1
  }
}));

由於沒有做登出功能,session設定了失效時間為1個小時。

大概的專案實現過程就寫到這裡,詳細可以看下該專案原始碼 - vote-node - Coding.net or vote-node - Github.com

由於初次嘗試使用Node寫一個Web專案,寫的不好的地方請見諒,後續有可能對該專案進行進一步完善。

(二)資料庫設計

經過前面的介紹,可以發現,其實這是一個非常小的入門級專案,整個功能的實現就是簡單的增刪改查。增加一條主題,修改一條主題,刪除一條主題或評分,檢視所有主題或是所有評分。根據需求得出要實現的功能,然後根據大體功能就要想如何設計資料庫表。

這裡我選用的是關係型資料庫MySQL,所以在專案動手之前最重要的要設計好資料庫表,大家常說:一個專案資料庫設計好了,基本上就完成了一大部分的工作。這麼說其實是有些道理的。好的資料表設計會讓後續的程式設計工作更加輕鬆。

該專案的功能簡單,所以資料表自然也很簡單,這裡我只是建立了三個資料表:messagevote以及user,一個儲存主題資訊,一個儲存評分資訊,一個儲存管理員賬號資訊。

資料庫SQL語句不熟悉的可以選擇一個GUI工具,方便資料庫方面的工作,避免由於資料庫方面的一些問題阻礙了整個專案的程式設計工作。這一點很重要,特別對於像我這樣的小白來說,很有可能由於整個過程中的一點困難障礙,就阻礙了整個程式設計工作,甚至是放棄。

這個專案我是在Windows平臺上進行了,於是選擇了一個簡單的MySQL GUI工具-MySQL-Front,建立資料庫,建立表,新建測試資料等等都可以直接在軟體上點點滑鼠就可以完成了,大大簡化了開發流程。整個資料表的設計也非常簡單:

message:

  • title: 代表評分主題
  • author: 主題作者
  • average: 該主題平均分
  • status: 主題狀態,是否允許評分
  • createTime: 建立時間
  • endTime: 關閉時間(該欄位後來沒有使用)

vote:

  • titleId: 評分的主題id
  • voteIp: 評分者IP,由於在內網環境,每臺電腦對應一個IP地址
  • voteTime: 評分時間
  • voteScore: 分數

user:

這個就不多說了,使用者名稱和密碼,在這個專案裡只是為了儲存管理員賬號使用。

由於專案比較簡單以及本人是個資料庫小白,所以看出這是個很簡單的資料表結構,能滿足該專案的需求即可。

  • 新建主題的時候,直接insert into message;
  • 刪除主題的時候,delete from message ;
  • 修改主題的時候,update message ;
  • 查詢的時候,select * from message。 同理,vote評分表也是這樣。

  • 在計算平均分的時候,通過titleId去表vote中查詢average(voteScore),然後更新到message表中即可。如下SQL語句:

    select avg(voteScore) average from vote v , message m where v.titleId = m.Id and v.titleId = titleId
    
  • 在檢查重複評分的時候,直接查詢titleId以及voteIp是否存在即可。如下SQL語句:

    select count(*) voteNum from vote where titleId= `titleId` and voteIp = `voteIp`
    

    當結果為0的時候,即表示沒有評過分。

  • 獲取每個主題的評分數量時,在vote表中查詢對應titleId對應的行數即可。SQL語句如下:

    select count(*) voteNum from vote where titleId= `Id`
    

整個後臺的資料庫設計大概就這些,並沒有很複雜的結構。

(一)基本介紹

最近半個月,一直在學習Node的Web開發,使用的Web的框架為express,模版引擎最後還是選用了ejs,相對於jade不需要學習新的語法規則,並且方便貼上一些HTML程式碼片段,減輕了前端設計的好多工作,而更多的注重在後臺業務邏輯的設計。前端CSS框架直接選用的bootstrap,簡單配置並且能得到不錯的頁面外觀。最後資料庫選擇的是Mysql,沒別的原因,相對熟悉一點,不過也在學習mongodb相關的知識,這個小的評分系統就直接使用mysql做了。

所以這裡針對Node Web專案的開發,在技術選擇上是非常中庸的,如下:

  • Web框架: Express,沒有選擇Koa是因為還不瞭解兩者的本質區別;
  • 模版引擎:ejs,沒有選擇jade僅僅是因為懶,不想重新學習語法,最重要的是網上HTML片段可以直接貼到ejs中使用,而jade不行;
  • CSS框架:bootstrap,暫時不知道有其他的選擇;
  • 資料庫:Mysql,前期僅僅為了熟悉,不過正在學習mongodb,後面專案開發應該會選用Mongodb;

第一次使用Node做Web的開發,學習Node的相關知識其實也有一段時間了,只是從來沒有動手寫過一個完整的專案,這個評分系統可以算是我的第一個Node Web專案了。

最初想法

最初的想法是給部門學習會的評分使用,以往都是通過聊天工具發訊息給統計人員,然後通過excel來統計評分以及計算平均分,這種方式感覺實在是太low了,並且礙於面子,所得分數基本沒有差異化,於是秉著公正,公平,公開的理念,有了最初的想法。

實現的功能

  • 統計平均分,實時顯示
  • 每個IP只允許投一次票
  • 管理員才可以新增、修改、刪除等功能
  • 前臺可以檢視投票詳情,但是看不到投票者IP

介面設計

全部使用bootstrap的基本元件,沒有寫一句CSS程式碼,前臺頁面分為indexshow,後臺頁面有adminloginedit以及showshow頁面公用,如果是管理員,顯示出投票者IP以及可以做刪除操作。介面樣式如下圖所示:

前臺:

首頁index

檢視頁show

後臺:

登陸頁login

後臺首頁admin

後臺檢視頁show

後臺編輯頁edit

不足

  • 沒有做使用者管理(註冊,登陸等)。由於在內網,並且使用並不是很頻繁,沒有考慮做使用者管理,管理員使用者直接在資料表中插入資料進行的賬戶密碼驗證。
  • 沒有使用佈局模版。由於頁面比較少並且簡單,編寫前臺頁面的時候沒有做模版複用,views資料夾每個ejs檔案代表一個頁面。
  • 沒有使用js以及ajax等非同步驗證功能。登陸頁面直接後臺邏輯匹配並重新整理頁面。

當然還有程式碼質量上的一些問題就不一一列舉了,由於本人程式設計水平實在一般,第一次寫Node Web專案,業餘兩天內完成的,諸多紕漏在所難免,忘見諒。

這裡主要記錄了該評分系統的一些基本資訊,後面接著介紹一下,一些功能的具體實現,希望能幫到正在學習Node Web開發的諸位。

相關文章