因为http是无状态的,所以在网页中输入的数据如果没有保存到数据库当中,一旦刷新页面就会变回原来的样子,所以用户的登录状态需要使用cookie,session或者token来保存。本篇文章就使用node.js
来设置session来实现登录状态的保存
文章当中涉及express和MongoDB的操作
express基础知识:https://blog.csdn.net/ziyue13/article/details/114716481
node.js操作MySQL:https://blog.csdn.net/ziyue13/article/details/115731143
node.js操作MongoDB:https://blog.csdn.net/ziyue13/article/details/113819566
//引入express框架
const express = require('express');
//使用express开启一个服务器
const app = express();
//引入path,拼接文件的路径
const path=require('path');
//引入body-parser,接收post请求参数
const bodyParser = require('body-parser');
//引入express-session,设置session
const session = require('express-session');
//设置session的秘钥
app.use(session({secret:'key'}));
//引入mongoose模块,操作MongoDB数据库
const mongoose = require('mongoose');
//设置post请求参数
app.use(bodyParser.urlencoded({extended:false}));
//引入模板引擎,并且设置模板引擎的路径
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,'views')));
//连接数据库
mongoose.connect('mongodb://localhost/app',{useUnifiedTopology: true,useNewUrlParser: true,useCreateIndex: true})
.then(()=>console.log('数据库连接成功'))
.catch(err=>console.log('数据库连接失败'));
//创建数据规则
const userSchema = new mongoose.Schema({
username:{
type:String,
//必填字段
required:true,
minlength:2,
maxlength:20
},
password:{
type:String,
//必填字段
required:true,
minlength:2,
maxlength:20
},
});
//保存到mongoose数据库当中
const User = mongoose.model('User',userSchema);
//数据库SQL代码
/*
User.create({
username:'admin',
password:'admin',
}).then(()=>{
console.log('用户创建成功');
}).catch(()=>{
console.log('用户创建失败');
})
*/
//get路径访问登录页面
app.get('/login',(req,res)=>{
res.render('denglu/denglu');
});
//点击按钮发送post请求
app.post('/login',async(req,res)=>{
//console.log('接收到post请求方式');
console.log(req.body);
//接收请求参数
const { username,password } = req.body;
//先使用js判断当前的表单是否符合校验规则
if(username.trim().length == 0||password.trim().length == 0){
//console.log('输入的邮件或者密码为空');
return res.status(400).send('<h4>邮件地址或者密码错误</h4>');
}else{
//console.log('输入的邮件或者密码不为空');
//根据邮箱地址查询用户信息
//如果查询到了用户user变量的值是对象类型,如果没有查询到用户,user变量为空
//对象中储存的是用户信息
let user = await User.findOne({username});
//查询到用户
if(user){
//console.log('查询到对应的用户');
if(password == user.password){
console.log('密码一样,登录成功');
//设置session属性
req.session.flag=1;
//把用户数据保存在req.app.locals全局对象下面
req.app.locals.userInfo=user;
res.redirect('/button');
}else{
res.send('404');
}
}else{
console.log('没有查询到对应的用户');
//没有查询到用户
res.send('404');
}
}
});
//访问button页面
app.get('/button',(req,res)=>{
//判断用户是否登录,没有登录就重定向到登录页面
if(req.session.flag&&req.session.flag==1){
res.render('index');
}
else{
res.render('denglu/denglu');
}
})
//监听4000端口号
app.listen(4000);