从零学习node.js之利用express搭建简易论坛(七)(3)

// views/login.ejs <!DOCTYPE html> <html> <head> <title>登录</title> <link href='https://www.jb51.net/stylesheets/style.css' /> <style type="text/css"> .tip{color: #f00;} </style> </head> <body> <div> <p><a href="https://www.jb51.net/" >回到首页</a></p> <h1>登录</h1> <form action="/user/login/" method="post"> <% if(errmsg){ %> <p>*<%= errmsg %></p> <% } %> <p>用户名: <input type="text" required="required"></p> <p>密&emsp;码: <input type="password" required="required"></p> <p><input type="submit" value="submit"></p> </form> <p>还没帐号?<a href="https://www.jb51.net/user/reg" >点击注册</a></p> </div> </body> </html>

然后在model/user.js中添加上对数据库的登录操作:

module.exports = { // ... // 登录 login : function(username, password, cb){ pool.getConnection(function(err, connection){ if(err) throw err; connection.query('SELECT `id` FROM `user` WHERE `username`=? AND `password`=?', [username, password], function(err, result){ if(err) throw err; cb(result); connection.release(); // 接下来connection已经无法使用,它已经被返回到连接池中 }) }); } }

最后在routes/user.js中添加上登录的路由:

// routes/user.js // 进入到登录页面 router.get('/login', function(req, res, next) { res.render('login', {errmsg:''}); }); // 处理登录请求 router.post('/login', function(req, res, next) { var username = req.body.username || '', password = req.body.password || ''; var password_hash = user_m.hash(password); user_m.login(username, password_hash, function(result){ if(result.length){ // console.log( req.session ); // req.session.user = { // uid : result[0].id, // username : username // } // res.redirect('https://www.jb51.net/'); res.send('登录成功'); }else{ // console.log('登录失败'); res.render('login', {errmsg:'用户名或密码错误'}); } }); });

登录功能也编写好了。

3.3 保存登录状态

我们通常是使用session来保存用户的登录状态,express框架没有对session处理的功能,需要我们引入额外的模块express-session:

$npm install express-session --save-dev

然后在app.js中引用:

var session = require('express-session') app.use(session({ secret: 'wenzi', // 建议使用 128 个字符的随机字符串 cookie: { maxAge: 60*60*1000 }, // 设置时间 resave : false, saveUninitialized : true }));

设置完成后,就可以使用session保存数据了。以登录成功后保存数据为例:

user_m.login(username, password_hash, function(result){ if(result.length){ // 将数据保存到名为user的session中 req.session.user = { uid : result[0].id, username : username } res.redirect('https://www.jb51.net/'); }else{ // console.log('登录失败'); res.render('login', {errmsg:'用户名或密码错误'}); } });

还有一个问题:如何把session中的数据传递给模板呢,比如没有登录时,显示“注册,登录”连接,登录后显示“用户名,登录”信息。

在app.js中添加:

app.use(function(req, res, next){ // 如果session中存在,则说明已经登录 if( req.session.user ){ res.locals.user = { uid : req.session.user.uid, username : req.session.user.username } }else{ res.locals.user = {}; } next(); })

然后在模板中就可以使用user变量了:

<% if(user.uid){ %> <!-- 登录状态下 --> <% }else{ %> <!-- 非登录状态下 --> <% } %>

四、首页及详情页

我们在首页能够展示主题列表并能发表主题,点击链接进入详情页后能该主题进行回复。当然发表主题和对主题进行回复都是在已经登录的状态进行的。

4.1 首页

在models目录创建list.js,从数据库中获取主题列表:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzjgf.html