Nodo登陆注册表单,数据库md5加密

按钮绑定AJAX发起post请求的事件,Node后台来处理。

 

doregist把数据插入mongo中,密码md5多重加密。

密码稍微长点,复杂点的,md5加密现在还不能反向破解。

以base64格式经md5加密后,长度固定。

 

dologin时,把接受的密码用同样公式的md5加密和数据库做对比。

 

regist.ejs:

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
    <meta charset="utf-8">
    <title>登陆</title>
    </head>
    <body>
        <div>
            <p>
                登录名: <input type="text" id="username">
            </p>
            <p>
                密码:<input type="password" id = "password">
            </p>
            <p>
                <input type="submit" value="注册" id = "signin">
            </p>
            <script type="text/javascript" src = "/js/jquery-1.11.3.min.js"></script>
            <script type="text/javascript">
                //用AJAX提交表单
                $("#signin").click(function () {
                    $.post("/doregist",{
                        "username" : $("#username").val(),
                        "password" : $("#password").val()
                    },function (result) {
                        if(result == "1")
                            alert("注册成功");
                        else {
                            alert("注册失败");
                        }
                    })
                })
            </script>
        </div>
    </body>
    </html>
View Code

login.ejs:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>登陆</title>
</head>
<body>
<div>
    <p>
        登录名: <input type="text" id="username">
    </p>
    <p>
        密码:<input type="password" id = "password">
    </p>
    <p>
        <input type="submit" value="登陆" id = "signin">
    </p>
    <script type="text/javascript" src = "/js/jquery-1.11.3.min.js"></script>
    <script type="text/javascript">
        //用AJAX提交表单
        $("#signin").click(function () {
            $.post("/dologin",{
                "username" : $("#username").val(),
                "password" : $("#password").val()
            },function (result) {
                if(result == "1")
                    alert("登陆成功");
                else {
                    alert("登陆失败");
                }
            })
        })
    </script>
</div>
</body>
</html>
View Code

login.js:

var express = require("express");
var app = express();
var formidable = require("formidable");
var db = require("./model/logindb.js");

var md5 = require("./model/md5.js");


app.set("view engine","ejs");

app.use(express.static("./public"));

app.get("/regist",function (req,res,next) {
    res.render("regist");
});

app.get("/login",function (req,res,next) {
    res.render("login");
});

//注册,中间件,注意加next
app.post("/doregist",function (req,res,next) {
    var form = new formidable.IncomingForm();
    form.parse(req, function(err, fields, files) {
       var username = fields.username;
       var password = fields.password;
       //加密

        password = md5(md5(password).substr(4,7) + md5(password));
       db.insertOne("users",{
           "username" : username,
           "password" : password
       },function (err,result) {
           if(err) {
               res.send("-1")
           }
           res.send("1");
       })
    });
});

app.post("/dologin",function (req,res,next) {
    var form = new formidable.IncomingForm();
    form.parse(req, function(err, fields, files) {
        var username = fields.username;
        var password = fields.password;

        //检索数据库,按登录名检索数据库,查看密码是否匹配
        db.find("users",{"username":username},function (err,result) {
            if(result.length == 0 ) {
                res.send("-2");//-2没有这个人
                return ;
            }
            var dbpassword = result[0].password;
            var mdpassword = md5(md5(password).substr(4,7) + md5(password));
            if(dbpassword == mdpassword) {
                res.send("1");//成功
            }
            else {
                res.send("-1");
            }
        });

    });
});

app.listen(3000);
View Code

logindb.js:

//优化后,加入skip,limit参数的写法
//这个模块里面封装了所有对数据库的常用操作
var settings = require("../settings.js");
var MongoClient = require('mongodb').MongoClient;

//不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库
//封装成为函数

function _connectDB(callback) {
    var url = settings.dburl;
    MongoClient.connect(url, function (err,db) {
        if(err) {
            callback(err,null);
            return;
        }
        callback(err,db);
    });
}

exports.insertOne = function (collectionName, json, callback) {
    _connectDB(function (err,db) {
        if(err) {
            callback(err,null);
            return;
        }
        db.collection(collectionName).insertOne(json, function (err, result) {
            callback(err, result);
            db.close();//关闭数据库
        })
    });
}

exports.find = function (collectionName,json,C,D) {
    var result = [];   //结果数组
    //JS没有函数重载,只能手动实现
    if(arguments.length == 3) {
        //如果没有传args
        //那么参数C就是callback,参数D没有传。
        var callback = C;
        var skipnumber = 0;
        //数目限制,limit(0)就是没有限制
        var limit = 0;
    }else if(arguments.length == 4) {
        var args = C;
        var callback = D;
        //应该省略的条数
        var skipnumber = args.pageamount * args.page;
        //数目限制
        var limit = args.pageamount;
    }else {
        throw new Error("find函数的参数个数,必须是3个,或者4个");
        return;
    }
    //从第零页开始
    console.log("略过了"+skipnumber+"条"+"限制在"+limit+"条");
    //链接数据库,链接之后查找所有
    _connectDB(function (err,db) {
        var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit);
        cursor.each(function (err, doc) {
            if(err) {
                callback(err,null);
                db.close();
                return;
            }
            if(doc != null) {
                result.push(doc); //放入结果数组
            }else {
                //遍历结束,没有更多的文档
                callback(null,result);
                db.close();//关闭数据库
            }
        });
    });
}

exports.deleteMany = function (collectionName,json,callback) {
    _connectDB(function (err, db) {
        //删除
        db.collection(collectionName).deleteMany(
            json,
            function (err, results) {
                callback(err, results);
                db.close();
            }
        );
    });
}

exports.updateMany = function (collectionName,json1,json2,callback) {
    _connectDB(function (err,db) {
        db.collection(collectionName).updateMany(
            json1,
            json2,
            function(err,results) {
                callback(err,results);
                db.close();//关闭数据库
            });
    });
};
View Code

md5.js:

var crypto = require("crypto");
module.exports = function (password) {
    var md5 = crypto.createHash("md5");
    var password = md5.update(password).digest("base64");

    return password;
}
View Code

 

posted @ 2017-11-28 21:43  Lawliet__zmz  阅读(179)  评论(0编辑  收藏  举报