Node.JS项目:简单的用户管理系统(带有Token验证,Mysql数据库并且实现7天免登录)

首先,我们需要创建一个项目,在里面创建一个package.json文件,里面包含了包的属性,之后我们可以通过命令来一次性安装package.json中所包含的包

①创建package.json文件

{
  "dependencies": {
    "body-parser": "^1.18.3",
    "cookie-parser": "^1.4.4",
    "express": "^4.16.4",
    "jsonwebtoken": "^8.5.0",
    "multer": "^1.4.1",
    "mysql": "^2.16.0"
  }
}

执行命令

cnpm install

①建议选择单独安装各个插件(建议采用这中方式,避免出错)

cnpm install mysql -S  //安装mysql模块
cnpm install express -S  //安装express框架模块
cnpm install body-parser -S	//node.js中间件
cnpm install cookie-parser -S	//解析Cookie的工具
cnpm install multer -S	//node.js中间件
cnpm  install  jsonwebtoken  -S		//Token插件

这里使用-S后缀可以在package.json文件中生成模块的名称
注:单独安装插件是不用创建package.json文件,会自动生成

body-parser : node.js中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
cookie-parser :解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象
multer :node.js中间件,用于处理 enctype=“multipart/form-data”(设置表单的MIME编码)的表单数据

②之后创建文件getDBcon.js(操作数据库模块)

getDBcon.js文件

//此模块作用为获取数据库的链接
var mysql = require('mysql'); //导入mysql模块

var defaultDBObj={
    host: '127.0.0.1', //数据库地址
    user: 'root', //数据库用户名
    password: '123456', //数据库密码
    database: 'database' //数据库名
}

function getDBcon(DBobj=defaultDBObj ){
    var connection = mysql.createConnection(DBobj);
    connection.connect(); //启动链接
    return connection;
}

module.exports=getDBcon;	//将模版导出,方便我们在别的文件中引用

③创建server.js文件(服务器模块)

var express = require("express");   //导入我们刚刚安装的express模块
var getDBcon = require("./getDBcon.js");    //导入上面的数据库模版文件
var bodyParser = require('body-parser');    //导入我们刚刚安装的body-parser模块
var app = express();    //使用express

app.listen(8081, function () {
    console.log("服务器构建完成,访问地址为 http://127.0.0.1:8081");
});

//设置跨域访问(设置在所有的请求前面即可)
app.all("*", function (req, res, next) {
    //设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //允许的header类型
    res.header("Access-Control-Allow-Headers", "content-type");
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
    if (req.method == 'OPTIONS')
        res.send(200); //让options尝试请求快速结束
    else
        next();
});

//在后端可以使用body-Parser模块来接收发到后端的数据
//然后在请求中使用 req.body获取请求参数
app.use(bodyParser.urlencoded({entend:false}));
app.use(bodyParser.json());


③创建jwt.js文件(Token验证模块)

var jwt = require("jsonwebtoken");  //引用jws模块

//用es6的语法对生成Token和验证Token方法进行函数的封装
class tokenObj {
    createToken(cont, time) {
        var payload = { msg: cont }  // Token 数据
        var secret = 'gys.com' // 这是加密的key(密钥或私钥) 
        var token = jwt.sign(payload, secret, {
            expiresIn: time // 24小时过期,以秒作为单位
        })
        return token;
    }
    checkToken(token, fn) {
        var secret = 'gys.com' // 这是加密的key(密钥或私钥) 
        jwt.verify(token, secret, function (err, decode) {
            if (err) { // 当token过期,或这是一个伪造的token,或这是无效的token时会触发此逻辑 
                console.log(err)
                fn(false);
            } else {
                console.log(decode.msg);
                fn(true);
            }
        })
    }

}

这里放上一个请求的示例
js页面

(function ($) {
    $(function () {

        $("#login").on("click", function () {
            $.ajax({
                type: "post",
                url: "http://127.0.0.1:8081/login",
                data: $("form").serializeArray(),  //序列化对象数组
                success: function (response) {
                    console.log(response);
                    if (response == "null") {   //登陆失败
                        alert("用户名或密码错误,请重新输入");
                        return;
                    } else {
                        //登陆成功
                        var token = JSON.parse(response).token;    //将后端传过来的数据转为对象
                        sessionStorage.setItem('token', token);      //存储到页面的临时会话中
                        if ($("input[type='checkbox']").is(':checked')) {     //用户勾选了7天免登录
                            var myobj = { loginState: "yes" };  //将用户的信息写入对象数组myobj
                            cookieObj.setCookies(myobj);    //调用下面简单封装的函数存储cookie信息
                            alert("登陆成功");
                            location.assign("./operation.html");    //页面跳转
                        } else {      //用户没有勾选7天免登录
                            location.assign("./operation.html");
                        }
                    }
                }
            });
        })
        //对Cookie的简单封装调用
        var myobj = {};  //对象数组,用来存储后台返回的信息
        //将对象数组中的信息保存在cookie中
        function setCookies(objArr) {
            var d = new Date();
            d.setTime(d.getTime() + 60 * 60 * 24 * 7);
            d = d.toUTCString();
            document.cookie = "loginState=" + objArr.loginState + ";expires=" + d + ";path=/";
        }
        //获取所有的cookie,以对象的形式返回
        function getAllcookies() {
            var obj = {};
            var arr = document.cookie.split(";");
            arr.forEach(function (ele) {
                var arr2 = ele.split("=");
                obj[arr2[0].trim()] = arr2[1];
            });
            return obj;
        }
        //将这几个函数作为一个对象的属性
        var cookieObj = {
            setCookies: setCookies,
            getAllcookies: getAllcookies,
        }
        var state = cookieObj.getAllcookies().loginState;
        if (state == "yes") {
            setTimeout(function () {
                $.ajax({
                    type: "post",
                    url: "http://127.0.0.1:8081/noLogin",
                    success: function (response) {
                        var token = JSON.parse(response).token;    //将后端传过来的数据转为对象
                        sessionStorage.setItem('token', token);      //存储到页面的临时会话中
                    }
                });
                location.assign("./operation.html?");
            }, 2000)
        }

        console.log(state);

    })
})(jQuery)

服务端的响应

var express = require("express");   //导入我们刚刚安装的express模块
var getDBcon = require("./getDBcon.js");    //导入上面的数据库模版文件
var bodyParser = require('body-parser');    //导入我们刚刚安装的body-parser模块
var app = express();    //使用express
var tokenObj = require('./jwt.js');

app.listen(8081, function () {
    console.log("服务器构建完成,访问地址为 http://127.0.0.1:8081");
});

//设置跨域访问(设置在所有的请求前面即可)
app.all("*", function (req, res, next) {
    //设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //允许的header类型
    res.header("Access-Control-Allow-Headers", "content-type");
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
    if (req.method == 'OPTIONS')
        res.send(200); //让options尝试请求快速结束
    else
        next();
});

//在后端可以使用body-Parser模块来接收发到后端的数据
//然后在请求中使用 req.body获取请求参数
app.use(bodyParser.urlencoded({ entend: false }));
app.use(bodyParser.json());

app.get("/get", function (req, res) {
    res.send("Hello World");
});

app.post("/login", function (req, res) {
    var obj = req.body;     //获取登陆传过来的数据
    var connection = getDBcon();       //数据库对象
    var sql = `select * from users where username=? and password=?;`;
    //像数据库查询
    connection.query(sql, [obj.username, obj.password], function (err, result) {
        var resObj = {};
        //登陆成功
        if (result[0] != undefined) {
            var myToken = new tokenObj();
            var tokenv = myToken.createToken('login', 60 * 15);
            resObj.msg = '登陆成功';
            resObj.token = tokenv;
            res.send(JSON.stringify(resObj));
        } else {
            res.send("null");
        }
        connection.end(); //关闭数据库链接
    });

});
app.post("/noLogin", function (req, res) {      //勾选了7天免登录,当登陆的时候将重新给用户一个token
    var resObj = {};
    var myToken = new tokenObj();
    var tokenv = myToken.createToken('noLogin', 60 * 15);
    resObj.token = tokenv;
    res.send(JSON.stringify(resObj));
});
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值