nodejs基础教程-简单blog(5)-cookie保存用户登录状态

26 篇文章 0 订阅
21 篇文章 0 订阅

用户登录—前端发送登录请求—后端保存用户 cookies—页面刷新 —前端判断用户id存在—显示登录状态—用户退出—前端发送退出请求–后端清空用户cookies—页面刷新—前端判断用户id不存在—-显示需要登录的界面

当我们登录成功,在这个页面刷新,页面并没有保存登录状态;今天这节教程需要的效果就是。后台cookie保存用户登录状态。做到刷新页面仍然显示在用户登录界面;

app.js 设置中间件

var Cookies=require('cookies')
app.use(function (req,res,next) {
    req.cookies=new Cookies(req,res)
    next();
})

api.js

这里写图片描述

请求登录
这里写图片描述
刷新页面重新请求登录
这里写图片描述

在mian 中分配模板数据;

这里写图片描述

在index.html 使用模板变量; 如果存在userInfo._id 则显示欢迎您,否则显示请登录
这里写图片描述

如此登录状态得以保持;
这里写图片描述

上面的代码添加了{{userInfo.username}}这里需要注意的是后台模板引擎“双花括号”会和vue.js的产生冲突,冲突时的解决办法,delimiters: ['${', '}'], ,如何使用,【nodejs基础教程-简单blog(3)-vue】这篇教程中有讲到;

现在我们做退出功能;
index.html中加入

logout: function () {
                $.ajax({
                    type: 'post',
                    url: "/api/user/logout",
                    success: function (result) {
                        if (!result.code) {
                            alert(result.message)
                            window.location.reload();
                        }
                    }
                });
            },

appjs

//设置cookie
app.use(function (req,res,next) {
    req.cookies=new Cookies(req,res)
    console.log(typeof req.cookies.get('userInfo'))//返回 string;
    //解析用户的cookie信息;
    req.userInfo={};
    var cookiesUserInfo=req.cookies.get('userInfo')
    if(cookiesUserInfo){
        try{
            req.userInfo=JSON.parse(cookiesUserInfo)
        }catch(e){}
    }

    next();
})

api.js中

router.post('/user/logout',function (req,res,next) {
    console.log(req.body)
    req.cookies.set('userInfo',null);
    res.json(resoinseData)

});

用户登录—前端发送登录请求—后端保存用户 cookies—页面刷新 —前端判断用户id存在—显示登录状态—用户退出—前端发送退出请求–后端清空用户cookies—页面刷新—前端判断用户id不存在—-显示需要登录的界面

完整的index.html 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/public/bg.css">

</head>
<body>
<div id="app2" v-cloak>
    {% if userInfo._id%}
    <div>
        <h1 style="color:red" class="bg">{{userInfo.username}},您好,欢迎您 </h1>
        <button @click="logout">退出</button>
    </div>
    {% else %}
    <div v-if="page==0">
        <h1>登录</h1>
        用户名:<input type="text" v-model="username">
        密码: <input type="text" v-model="pwd">
        <button @click="login">登录</button>
        <button @click="registerPage">马上注册</button>
    </div>
    <div v-if="page==1">
        <h1>注册</h1>
        用户名:<input type="text" v-model="username">
        密码: <input type="text" v-model="pwd">
        确认密码: <input type="text" v-model="pwd2">
        <button @click="register">注册</button>
    </div>
    {% endif %}

</div>

</body>
<script src="/public/jquery-1.4.2.min.js"></script>
<script src="/public/vue.js"></script>
<script>
    var vm = new Vue({
        delimiters: ['${', '}'],
        el: '#app2',
        data: {
            username: '',
            pwd: '',
            pwd2: '',
            page: 0,
            message: "登录成功"
        },
        mounted: function () {

        },
        methods: {
            login: function () {
                $.ajax({
                    type: 'post',
                    url: "/api/user/login",
                    dataType: 'json',
                    data: {username: this.username, password: this.pwd},
                    success: function (result) {

                        if (result.code == 200) {
                            console.log(result)
                            window.location.reload();
                            alert(result.message)
                        } else {
                            alert(result.message)
                        }
                    }
                });
            },
            logout: function () {
                $.ajax({
                    type: 'post',
                    url: "/api/user/logout",
                    success: function (result) {
                        if (!result.code) {
                            alert(result.message)
                            window.location.reload();
                        }
                    }
                });
            },
            registerPage: function () {
                this.page = 1;
                this.pwd = this.pwd2 = '';
            },
            register: function () {
                if (this.pwd == '' || this.pwd2 == '') {
                    alert("用户名或密码不能为空")
                    return;
                }
                if (this.pwd != this.pwd2) {
                    alert("密码不一致!")
                    this.pwd = this.pwd2 = ''
                    return;
                }

                this.page = 1;
                $.ajax({
                    type: 'post',
                    url: "/api/user/register",
                    data: {username: this.username, password: this.pwd},
                    dataType: 'json',
                    success: function (result) {
                        if (result.code == 200) {
                            console.log(result)
                            vm.page = 0;
                            alert(result.message)
                        } else {
                            alert(result.message)
                        }

                    }
                });
            }
        }

    });


</script>
</html>

api.js

var express=require('express')
var router=express.Router();
var User=require('../models/User')




//统一返回方式;
var resoinseData;
/**
 * router.use([path],function)
 * 当前路由将会使用此中间件
 */
//
router.use(function (req,res,next) {
    resoinseData={
        code:0,
        message:''
    }
    next();
})
/**
 * 用户注册
 * 1,用户名是否存在;数据库查询;
 * router.post:
 * 处理任何以"/user/register"结束的请求

 */
router.post('/user/register',function (req,res,next) {
    console.log(req.body)
    var username=req.body.username;
    var password=req.body.password;
    if(username==''||password==''){
        resoinseData.code=1
        resoinseData.message='用户名或密码不能为空!'
        res.json(resoinseData);//json格式返回给前端;
        return
    }
    //findOne 查询是否存在用户名。如果存在说明用户已被注册
    User.findOne({
        username:username
    }).then(function (userInfo) {
        console.log(userInfo,"userInfo");
        if(userInfo){
            resoinseData.code=2
            resoinseData.message='用户名已被注册!'
            res.json(resoinseData)
            return
        }else{
            //保存数据;
            var user=new User(req.body);
            return user.save();
        }
    }).then(function (newUserInfo) {
        console.log(newUserInfo,"newUserInfo");
        resoinseData.message='操作成功!'
        resoinseData.code=200
        res.json(resoinseData)
    })


});

router.post('/user/login',function (req,res,next) {
    console.log(req.body)
    var username=req.body.username;
    var password=req.body.password;
    if(username==''||password==''){
        resoinseData.code=1
        resoinseData.message='用户名或密码不能为空!'
        res.json(resoinseData);//json格式返回给前端;
        return
    }
    //findOne 查询是否存在用户名。如果存在说明用户已被注册
    User.findOne({
        username:username,
        password:password
    }).then(function (userInfo) {
        console.log(userInfo,"userInfo");
        if(!userInfo){
            resoinseData.code=2
            resoinseData.message='用户名或密码错误'
            res.json(resoinseData)
        }else{
            resoinseData.code=200
            resoinseData.message='登录成功!'
            resoinseData.userInfo={
                _id:userInfo._id,
                username:userInfo.username
            }
            req.cookies.set('userInfo',JSON.stringify(resoinseData.userInfo));
            res.json(resoinseData)
            return;
        }
    })
});

router.post('/user/logout',function (req,res,next) {
    console.log(req.body)
    req.cookies.set('userInfo',null);
    res.json(resoinseData)

});

module.exports=router;

app.js



var mongoose=require('mongoose')
//应用启动入口
var express=require('express')

//模板处理模块
var swig=require('swig')
var Cookies=require('cookies')
//创建app应用 相当于=》NodeJS Http.createServer();
var app=express();

// /**
//  * 首页
//  *
//  */
// app.get('/',function (req,res,next) {
//     // res.send("<h1>欢迎光临我的博客!</h1>")
//     /**
//      * 读取views目录下的指定文件,解析并返回给客户端;
//      * 参数1:模板文件,相对于views;
//      * 参数2:传递给模板使用的数据;
//      */
//     res.render('index');
// })
//D:\Program Files\MongoDB\Server\3.4\bin>mongod --dbpath=E:\nodejsTest\blog2\db --port=27018




//加载body-parser,用来处理post提交过来的数据;
var bodyParser=require('body-parser');
/**
 * //bodyParser配置
 *  返回一个只解析urlencoded消息体的中间件,
 *
 *  urlencoded:url编码,只接受utf-8对消息体进行编码,
 *  在前台返回的req对象添加一个新属性body,同时支持自动的gzip/deflate编码解析过的消息放在req.body对象中,
 *  这个对象包含的键值对
 *  当extended设置为true,是任何类型
 *  当extended为false的时候,是string或者一个数组。
 *  extended:如果设置为false,那么对URL-encoded的数据的解析采用querystring库,如果设置为true那么采用qs
 */
app.use(bodyParser.urlencoded({extended:true}))








// var mongoose=require('mongoose')
// //加载模板
// var swig=require('swig')
/**
 * 定义模板引擎
 * 参数1:引擎名称,模板文件后缀;
 * 参数2:用于解析处理模板内容的方法
 */
app.engine('html',swig.renderFile);
/**
 * 设置模板文件存放目录
 * 参数1,必须是views。
 * 参数2,是目录
 */
app.set('views','./views');
/**
 * 注册使用的模板引擎;
 * 参数1,必须是'view engine'
 * 参数2,被注册的模板引擎的名称;
 */
app.set('view engine','html')
/**
 * 开发过程中需要取消模板缓存
 * 改变html时,直接刷新就可以不需要重启服务;
 */
//设置静态文件托管
app.use('/public',express.static(__dirname+"/public"))
swig.setDefaults({cache:false})
//
//
//
//
//设置cookie
app.use(function (req,res,next) {
    req.cookies=new Cookies(req,res)
    console.log(typeof req.cookies.get('userInfo'))//返回 string;
    //解析用户的cookie信息;
    req.userInfo={};
    var cookiesUserInfo=req.cookies.get('userInfo')
    if(cookiesUserInfo){
        try{
            req.userInfo=JSON.parse(cookiesUserInfo)
        }catch(e){}
    }

    next();
})

/**
 * 根据不同功能划分模块
 */
app.use('/admin',require('./routers/admin'))
app.use('/api',require('./routers/api'))
app.use('/',require('./routers/main'))



//
// //连接数据库
// mongoose.connect('mongodb://localhost:27018/blog',function (err) {
//     if(err){
//         console.log("数据库连接失败")
//
//     }else{
//         console.log("数据库连接成功")
//         //监听http请求
//         app.listen(8089);
//     }
// })
//

mongoose.connect('mongodb://localhost:27018/blog2',function (err) {
    if(err){
        console.log('数据连接失败')
    }else{
        console.log('数据连接成功')
        //监听app请求;
        app.listen("8089")
    }
});

//用户发送http请求--》url-》解析路由--》找到匹配的规则-》指定绑定函数,返回对应内容至用户
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值