处理用户输入用户名或密码不正确的情况:
开始的写法会产生alert和重定向冲突:
var tpl = '<script language=javascript>alert("用户名或密码不正确")</script>';
res.send(tpl);
res.redirect("/");
修改为:
var tpl = '<script language=javascript>alert("用户名或密码不正确"); location.href="/";</script>';
res.send(tpl);
输入错误的信息会弹出警告窗口并返回主界面:
为了记录用户注册、登录、查询等操作,设计log表如下:
记录用户登陆的代码:
connection.query('insert into log(name,action,content,date) VALUES(?,?,?,?)', [myUser.name, 'SIGNIN', req.ip, myDate.toLocaleString()], function (qerr, vals, fields) {
if (qerr) {
console.error(`用户行为数据库查询失败-${qerr}`);
return;
}
});
用户登陆成功后的数据库:
记录用户注册的代码:
var myDate = new Date();
connection.query('insert into log(name,action,content,date) VALUES(?,?,?,?)', [req.query.name, 'REGISTER', req.ip, myDate.toLocaleString()], function (qerr, vals, fields) {
if (qerr) {
console.error(`用户行为数据库查询失败-${qerr}`);
return;
}
});
用户lll注册后的数据库:
查看用户操作记录和管理用户在/manage路由下实现:
server.get('/manage', function (req, res) {
let body = $.html();
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(body);
});
这里的$是myCheerio.load(fs.readFileSync("./html/log.html"));
log.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户信息</title>
<script>
function StopUser() {
document.getElementById("stop-form").submit();
}
function StartUser() {
document.getElementById("start-form").submit();
}
</script>
</head>
<body>
<form id="stop-form" action="/stopuser" method="get">
<div class="search bar2">
<input type="text" name="name" id="stopuser" placeholder="请输入要停用的用户">
<input type="button" value="确定" onclick="StopUser()">
</div>
</form>
</br>
<form id="start-form" action="/startuser" method="get">
<div class="search bar2">
<input type="text" name="name" id="startuser" placeholder="请输入要启用的用户">
<input type="button" value="确定" onclick="StartUser()">
</div>
</form>
<table border="8" >
</table>
</body>
</html>
页面效果是:
在第一个框内输入需要停用的用户名,提交表单后转到/stopuser路由下处理;
在第二个框内输入需要启用的用户名,提交表单后转到/startuser路由下处理;
表格用于展示用户操作信息。
表格的生成应当在所有路由外做,一开始我将下面这段代码放在了/manage路由下,导致加载一次网页就为表格增加一次数据库中的所有内容,与需求不符。
$("table").append(`<tr>
<td>序号</td>
<td>用户</td>
<td>操作</td>
<td>内容</td>
<td>时间</td>
</tr>`);
connection.query("SELECT * from log", function (qerr, vals, fields) {
if (qerr) {
console.error(`数据库查询失败-${qerr}`);
return;
}
cnt = vals.length;
for (var x = 0; x < cnt; ++x) {
var sqlfetch = vals[x];
$("table").append(`
<tr id="line${x}">
<td>${x}</td>
<td>${sqlfetch.name}</a></td>
<td>${sqlfetch.action}</td>
<td>${sqlfetch.content}</td>
<td>${sqlfetch.date}</td>
</tr>
`);
}
});
在/startuser和/stopuser路由下,需要修改user表的state字段,0表示用户已被停用,1表示用户已被启用(可正常使用),修改成功后返回/manage路由。
server.get('/stopuser', function (req, res) {
connection.query('update user set ? where name=?',[{state:0},req.query.name], function (qerr, vals, fields) {
if (qerr) {
console.error(`数据库查询失败-${qerr}`);
return;
}
var tpl = '<script language=javascript>alert("停用该用户成功"); location.href="/manage";</script>';
res.send(tpl);
});
});
server.get('/startuser', function (req, res) {
connection.query('update user set ? where name=?',[{state:1},req.query.name], function (qerr, vals, fields) {
if (qerr) {
console.error(`数据库查询失败-${qerr}`);
return;
}
var tpl = '<script language=javascript>alert("启用该用户成功"); location.href="/manage";</script>';
res.send(tpl);
});
});
效果如下:
由于用户有用户状态这一性质,考虑修改用户登陆的代码,使被停用账号的用户不能正常登陆。
if(vals[3]==0){
var tpl = '<script language=javascript>alert("账号异常,请联系管理员"); location.href="/";</script>';
res.send(tpl);
}
结果并没有达到预想的效果,尝试输出vals[3]得到:
是我晕了。。。vals是得到的一列数据,只有vals[0],应该判断vals[0].state的值:
if(vals[0].state==0){
var tpl = '<script language=javascript>alert("账号异常,请联系管理员"); location.href="/";</script>';
res.send(tpl);
}
效果如下: