Node博客项目——登录退出功能
1.案例初始化
2.登录
- 初始化用户,连接数据库,创建用户集合,添加数据
- 设置路由
- 表单提交路径,name传值,服务端req.body获取传来的值
- 提交前,客户端进行验证,提交后服务器端验证。
- 服务端接受数据 与 服务器端查询数据库中的邮箱进行比对,若存在,再比对密码,比对成功,登录成功。
- 登录密码加密 使用模块
const bcrypt = require('bcrypt');
- 登录无状态解决方案cookie session
3. 代码
准备:模板模块化,将公共部分抽离,通过继承传递模板
//app.js
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser')
const session = require('express-session')
// 创建网站服务器
const app = express()
// 引入数据库连接
require('./model/connect.js')
// 处理post请求参数
app.use(bodyParser.urlencoded({extended:false}))
// 配置session
app.use(session({secret:'secret key'}))
// 模板所在的位置
app.set('views',path.join(__dirname,'views'))
// 默认后缀
app.set('view engine','art');
app.engine('art',require('express-art-template'))
// 开放静态资源文件
app.use(express.static(path.join(__dirname,'public')))
// 引入路由模块
const home = require('./route/home')
const admin = require('./route/admin')
// 中间件在配置路由之前
app.use('/admin',require('./middleware/loginGuard'))
// 配置请求路径
app.use('/home',home);
app.use('/admin',admin);
app.listen(3000)
console.log('success');
//路由整理 将单个功能的路由分离 留一个主文件引入
//admin
// 引用expess框架
const express = require('express');
const admin = express.Router();
// 渲染登录页面
admin.get('/login',require('./admin/loginPage') );
// 实现登录功能
admin.post('/login', require('./admin/login'))
// 挂载二级路由
// 创建用户列表路由
admin.get('/user', require('./admin/userPage'))
// 实现退出功能
admin.get('/logout',require('./admin/logout'))
// 将路由对象做为模块成员进行导出
module.exports = admin;
//login 实例 其他路由模块皆如此
// 导入用户集合构造函数
const { User } = require('../../model/user')
const bcrypt = require('bcrypt');
module.exports = async (req, res) => {
// 接受请求参数 body-parse
const { email, password } = req.body;
if (email.trim().length == 0 || password.trim().length == 0) {
return res.status(400).render('admin/error', { msg: '邮件地址或者密码错误' })
}
// 根据邮箱地址查询用户信息
let user = await User.findOne({email})
if(user){
// 查询到 比对 password == user.password
let isValid = await bcrypt.compare(password,user.password);
if(isValid){
// 比对成功 登录
req.session.username = user.username;
//重定向到用户列表页面
req.app.locals.userInfo = user;
res.redirect('/admin/user')
}else{
// 比对失败 提示
res.status(400).render('admin/error',{ msg: '邮件地址或者密码错误' })
}
}else{
// 没有用户
res.status(400).render('admin/error',{ msg: '邮件地址或者密码错误' })
}
}
小结:同步项目过程
session和cookie还要做详解