Node项目之评分系统(三)- Web开发

在数据库设计完成之后,就可以开始项目开发了,实实在在的编写代码了。

生成项目目录

这里使用的是 express 框架,于是大大简化了 HTTP 方法以及路由访问的实现过程。安装完 express 模块后,建议同时装上 express-generator 项目生成器,快捷生成 express 项目初始目录及必要文件。

1
2
npm install --save express
npm install express-generator -g

注意:express-generator 模块需要全局安装。

安装完 express-generator生成器后,在项目目录下,运行 express -e 命令,即可生成 express项目目录。

例如:express -e ./test01 命令就是在当前目录下创建一个以 ejs 模版引擎的名叫 test01 的项目目录。

创建完之后,进入项目目录并安装依赖包,执行如下命令:

1
cd ./test01 && npm install

安装完之后,执行命令 npm start,一个 Node Web 项目就启动了,打开浏览器输入 http://localhost:3000 就可以看到 express 为你准备的首页了。

数据库方法

由于这里使用的是 MySQL 数据库,Node项目中需要安装 MySQL 模块以便使用 MySQL 数据库。使用 npm 包管理器很容易就能安装完成。

1
npm install mysql --save

开始一个项目,最好是先把数据库相关功能完成,由于项目简单,仅仅是表 message 以及 vote 两个表的操作,于是数据库的连接我全部写在了一个文件上了 db.js(新建db文件夹,在其中新建db.js),查看 MySQL 模块的 README 文档,大概知道了该模块的使用方法。

PS. 在安装了新的模块而不会用的情况下,最好是把模块里的 README 文档浏览一遍,虽然大部分是英文的,但是好过各种百度。
– 过来人忠告

看完文档,使用了最简单的连接方式,在 db.js 中开始编写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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,见下面简要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 登陆权限 */
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 中简单配置即可。以下是这里的简要配置:

1
2
3
4
5
6
7
8
9
10
// 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 项目,写的不好的地方请见谅,后续有可能对该项目进行进一步完善。