Node專案之評分系統
做一些小的Node開發專案,自己定需求,自己實踐,這個過程還是比較有意思的,這裡主要記錄一下開發一些小的Web專案的過程。
計劃要做的專案有:
- 評分系統
- 需求收集系統
- 調查問卷
評分系統非常簡易,算是初學Node的第一個實踐。
(三)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
,所以在專案動手之前最重要的要設計好資料庫表,大家常說:一個專案資料庫設計好了,基本上就完成了一大部分的工作。這麼說其實是有些道理的。好的資料表設計會讓後續的程式設計工作更加輕鬆。
該專案的功能簡單,所以資料表自然也很簡單,這裡我只是建立了三個資料表:message
、vote
以及user
,一個儲存主題資訊,一個儲存評分資訊,一個儲存管理員賬號資訊。
資料庫SQL語句不熟悉的可以選擇一個GUI工具,方便資料庫方面的工作,避免由於資料庫方面的一些問題阻礙了整個專案的程式設計工作。這一點很重要,特別對於像我這樣的小白來說,很有可能由於整個過程中的一點困難障礙,就阻礙了整個程式設計工作,甚至是放棄。
這個專案我是在Windows平臺上進行了,於是選擇了一個簡單的MySQL GUI工具-MySQL-Front,建立資料庫,建立表,新建測試資料等等都可以直接在軟體上點點滑鼠就可以完成了,大大簡化了開發流程。整個資料表的設計也非常簡單:
message:
title
: 代表評分主題author
: 主題作者average
: 該主題平均分status
: 主題狀態,是否允許評分createTime
: 建立時間endTime
: 關閉時間(該欄位後來沒有使用)
vote:
titleId
: 評分的主題idvoteIp
: 評分者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
程式碼,前臺頁面分為index
、show
,後臺頁面有admin
、login
、edit
以及show
,show
頁面公用,如果是管理員,顯示出投票者IP以及可以做刪除操作。介面樣式如下圖所示:
前臺:
後臺:
不足
- 沒有做使用者管理(註冊,登陸等)。由於在內網,並且使用並不是很頻繁,沒有考慮做使用者管理,管理員使用者直接在資料表中插入資料進行的賬戶密碼驗證。
- 沒有使用佈局模版。由於頁面比較少並且簡單,編寫前臺頁面的時候沒有做模版複用,views資料夾每個
ejs
檔案代表一個頁面。 - 沒有使用
js
以及ajax
等非同步驗證功能。登陸頁面直接後臺邏輯匹配並重新整理頁面。
當然還有程式碼質量上的一些問題就不一一列舉了,由於本人程式設計水平實在一般,第一次寫Node Web專案,業餘兩天內完成的,諸多紕漏在所難免,忘見諒。
這裡主要記錄了該評分系統的一些基本資訊,後面接著介紹一下,一些功能的具體實現,希望能幫到正在學習Node Web開發的諸位。
相關文章
- ERP專案中財務與分銷系統如何評估(轉)
- 資訊系統專案管理系列之四:專案可行性研究與評估專案管理
- 電商專案之支付系統
- IT專案管理之系統測試專案管理
- Vue、Node全棧專案~面向小白的部落格系統~Vue全棧
- 專案---考評系統排課演算法分析演算法
- 淺嘗Node檔案系統
- 【實訓專案】大獎賽計分系統
- 資訊系統專案管理系列之八:專案成本管理專案管理
- 資訊系統監理之資訊系統專案管理專案管理
- 軟體專案管理之系統思考(轉)專案管理
- 資訊系統專案管理系列之五:專案整體管理專案管理
- 資訊系統專案管理系列之六:專案範圍管理專案管理
- 資訊系統專案管理系列之九:專案質量管理專案管理
- 深度學習專案實戰:垃圾分類系統深度學習
- 通用漏洞評分系統 (CVSS)系統入門指南
- 職教考評系統專案開發手冊(一) (轉)
- 資訊系統專案管理系列之十:專案人力資源管理專案管理
- 從嚴治碼-系統整合專案之根本
- 【zz】論系統整合專案管理之範圍管理專案管理
- java版工程專案管理系統原始碼+系統管理+系統設定+專案管理Java專案管理原始碼
- 每天學點node系列-fs檔案系統
- node.js常用的fs檔案系統Node.js
- 國內外值得推薦的專案管理系統排行和點評專案管理
- 全面系統的入門教程——評《Node.js 開發指南》Node.js
- 考勤系統+(小專案)
- EasyWork專案管理系統專案管理
- 購物系統專案
- Google檔案系統(GFS)評析:(上)Go
- Google檔案系統(GFS)評析:(下)Go
- 好書短評之《專案管理修煉之道》專案管理
- 老專案重構手記之使用者系統
- hibernate+sturts整合專案之商品管理系統
- 多專案Node版本控制
- 每天學點node系列-fs檔案系統(續)
- 在Node.js中操作檔案系統(一)Node.js
- SAP專案評估
- 專案管理系統中的任務和專案專案管理