摘要
本节将介绍网站的后端开发。
项目要求
- 基于第一个项目爬虫爬取的数据,完成数据展示网站。
- 基本要求
1.用户可注册登录网站,非注册用户不可登录查看数据
2、用户注册、登录、查询等操作记入数据库中的日志
3、爬虫数据查询结果列表支持分页和排序
4、用Echarts或者D3实现3个以上的数据分析图表展示在网站中
5、实现一个管理端界面,可以查看(查看用户的操作记录)和管理(停用启用)注册用户。 - 扩展要求(非必须):
1、实现对爬虫数据中文分词的查询
2、实现查询结果按照主题词打分的排序
3、用Elastic Search+Kibana展示爬虫的数据结果
register
- 后端在接收到前端register界面传来的post请求后,解析出其中的username和password。随后在数据库的users表查询是否存在相同的username,如果已经存在则返回注册失败。
- 注册成功后,首先在users表中插入用户记录,并同时记录日志。在ActionLogs表中插入一下注册信息。
router.post('/register', function (req, res) {
var response = {}
var name = req.body.name;
// console.log(name);
var password = req.body.passwd;
// console.log(password);
var fetchSql = "SELECT username FROM users WHERE username = $1;";
var fetch_name_Sql_Params = [name];
pgsql.query(fetchSql, fetch_name_Sql_Params, function (err, result) {
if (err) {
console.log(err);
return;
}
if (result.rows[0] == null) { //该username没有被注册过
var AddSql = 'INSERT INTO users (uuid,username, password,authority)'
+ 'VALUES ($1, $2,$3,$4);';
var newsAddSql_Params = [uuidv1(), name, password, 'true'];
pgsql.query(AddSql, newsAddSql_Params, function (err, result) {
if (err) {
response.status = "注册失败";
// console.log(response);
res.end(JSON.stringify(response));
return;
} else {
var fetchInsertSql = 'INSERT INTO ActionLogs (username, action)' + 'VALUES ($1, $2);';
var fetchInsertSql_Params = [name, 'register'];
pgsql.query(fetchInsertSql, fetchInsertSql_Params, function (err, result) {
if (err) {
console.log(err);
}
})
response.status = "注册成功";
res.end(JSON.stringify(response));
return;
}
});
} else {
response.status = "该用户已经注册过";
console.log(response);
res.end(JSON.stringify(response));
return
}
});
});
login
- 与注册功能类似,后端首先判断用户名是否存在,如果存在则继续比较用户密码是否正确。反之,返回登录失败。
- 由于users表中authority列存放的是一个bool值,用来确定用户是否仍有权限访问。如果该值为true则登录成功,反之失败。
- 用户登录成功后,在ActionLogs表中插入一条日志记录。
router.post('/login', function (req, res) {
var username = req.body.name;
var password = req.body.passwd;
var response = {};
var fetchSql = "SELECT password,authority FROM users WHERE username =$1;";
var fetch_name_Sql_Params = [username];
pgsql.query(fetchSql, fetch_name_Sql_Params, function (err, result, fields) {
if (err) {
console.log(err);
return;
}
if (result.rows[0] == null) {
response.status = '该用户名没有被注册';
// console.log(response);
res.end(JSON.stringify(response));
return;
}
passwd = result.rows[0].password;
authority = result.rows[0].authority;
if (password == passwd) {
var fetchInsertSql = 'INSERT INTO ActionLogs (username, action)' + 'VALUES ($1, $2);';
var fetchInsertSql_Params = [username, 'login'];
pgsql.query(fetchInsertSql, fetchInsertSql_Params, function (err, result) {
if (err) {
console.log(err);
}
})
if (authority) {
response.status = '登录成功';
res.cookie("username", username);
res.end(JSON.stringify(response));
return;
}
else {
response.status = '该用户没有权限';
// res.cookie("username", username);
res.end(JSON.stringify(response));
return;
}
} else {
response.status = '密码错误';
// console.log(response);
res.end(JSON.stringify(response));
return;
}
});
});