Node.js + Express 4.x + MongoDB 构建登录注册-简易用户管理(五)

  Node.js连接MongoDB、封装DBHelp、增删查改 都集齐了。

  下面开始Node.js连接MySQL。

  假设,正在看博客的读者有一定的T-SQL基础。

一、安装MySQL

  MySQL 5.7.17版: http://pan.baidu.com/s/1hsMcQFi

  提取码:8leg

  安装MySQL的时候,步骤中会要求输入root的密码,请妥善保管,后面有用。

  MySQL也是命令行形式的操作不方便,需要操作管理平台,这里推荐Navicat。

  Navicat Premium 11.0.17 64位:http://pan.baidu.com/s/1bSezqY

  提取码:q2hl

二、安装mysql模块

  执行命令:npm install mysql

三、连接MySQL

  mysql数据库,新建库userinfo,新建表users,表里有3个字段(id、username、password),其中id自动增加。

  废话不多说,直接贴上封装成DBHelp以后的代码,如下:

const mysql=require('mysql');

let connection=mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'****',  //填自己mysql数据库的密码
    database:'userinfo'
});


function DBHelp(){}

/**************************
*
* 功能:查询
* 参数:sqlStr(SQL语句)、callback(回调函数)
*
**************************/
DBHelp.prototype.Find=function(sqlStr,callback)
{
    connection=mysql.createConnection(connection.config);
    connection.connect();
    connection.query(sqlStr,function(err,result)
    {
        if(err)
        {
            console.log(err);
            return;
        }
        callback(result);
        /*
            result是数组对象,类似:[RowDataPacket{username:'fuzq'},RowDataPacket{username:'admin'}]
        */
    });
    connection.end();
};

/**************************
*
* 功能:添加
* 参数:sqlStr(SQL语句)、data(添加的数据)、callback(回调函数)
*
**************************/
DBHelp.prototype.Add=function(sqlStr,data,callback)
{
    connection=mysql.createConnection(connection.config);
    connection.connect();
    connection.query(sqlStr,data,function(err)
    {
        if(err)
        {
            console.log(err);
            return;
        }
        callback();
    });
    connection.end();
};

/**************************
*
* 功能:删除
* 参数:sqlStr(SQL语句)、callback(回调函数)
*
**************************/
DBHelp.prototype.Delete=function(sqlStr,callback)
{
    connection=mysql.createConnection(connection.config);
    connection.connect();
    connection.query(sqlStr,function(err)
    {
        if(err)
        {
            console.log(err);
            return;
        }
        callback();
    });
    connection.end();
};

/**************************
*
* 功能:修改
* 参数:sqlStr(SQL语句)、data(修改的数据)、callback(回调函数)
*
**************************/
DBHelp.prototype.Update=function(sqlStr,data,callback)
{
    connection=mysql.createConnection(connection.config);
    connection.connect();
    connection.query(sqlStr,data,function(err)
    {
        if(err)
        {
            console.log(err);
            return;
        }
        callback();
    });
    connection.end();
};

module.exports=DBHelp;

/*
     Error: Cannot enqueue Query after invoking quit.
     原因:多次调用connection.end()导致的
     原因在于node连接上mysql后如果因网络原因丢失连接或者用户手工关闭连接后,原有的连接挂掉,需要重新连接。
     那么每次访问都断开连接,就要每次访问都重新建立连接。
     另一种解决办法是不使用“mysql”模块,改用“easymysql”模块
     “easymysql”模块链接:https://github.com/aleafs/easymysql
*/

  对应的index.js也要修改,代码如下:

var express = require('express');
var router = express.Router();
const DBHelp=require('./DBHelp');

/* GET home page. */
router.get('/', function(req, res, next)
{
  res.render('index', { title: 'Index' });
});


//登录
router.route('/login').all(Logined).get(function(req,res)
{
    res.render('login',{title:'Login'});
}).post(function(req,res)
{
    let user={username:req.body.username,password:req.body.password};
    let sqlStr='select count(*) as count from users where username="'+user.username+'" and password="'+user.password+'"';
    let dbhelp=new DBHelp();
    dbhelp.Find(sqlStr,function(result)
    {
        if(result[0].count==1)
        {
            //出于安全,只把包含用户名存入session
            req.session.user={username:user.username};
            return res.redirect('/home');
        }
        else
        {
            req.session.error='用户名不存在或者密码错误!';
            return res.redirect('/login');
        }
    });
});


//注册
router.route('/register').all(Logined).get(function(req,res)
{
    res.render('register',{title:'Register'});
}).post(function(req,res)
{

    let newUser={username:req.body.username,password:req.body.password,passwordSec:req.body.passwordSec};
    let sqlStr2='select count(*) as count from users where username="'+newUser.username+'"';
    let dbhelp=new DBHelp();
    dbhelp.Find(sqlStr2,function(result)
    {
        if(result[0].count!=1)
        {
            if(newUser.password===newUser.passwordSec)
            {
                let sqlStr='insert into users(username,password) values(?,?)';
                let data=[newUser.username,newUser.password]
                dbhelp.Add(sqlStr,data,function()
                {
                    req.session.error='注册成功,请登录!';
                    return res.redirect('/login');
                });
            }
            else
            {
                req.session.error='两次密码不一致!';
                return res.redirect('/register');
            }
        }
        else
        {
            req.session.error='用户名已存在!';
            return res.redirect('/register');
        }
    });
});


//Home用户管理
router.route('/home').all(LoginFirst).get(function(req,res)
{
    let sqlStr='select username from users';
    let dbhelp=new DBHelp();
    dbhelp.Find(sqlStr,function(result)
    {
        if(result)
        {
            res.render('home',{title:'Home',Allusers:result});
        }
        else
        {
            res.render('home',{title:'Home'});
        }
    });
});

//删除
router.route('/delete/:URLusername').get(function(req,res)
{
    let reqUsername=req.params.URLusername;
    if(reqUsername!==req.session.user.username)
    {

        let sqlStr='delete from users where username="'+reqUsername+'"';
        let dbhelp=new DBHelp();
        dbhelp.Delete(sqlStr,function()
        {
            req.session.error='移除用户 '+reqUsername+' 成功!';
            return res.redirect('/home');
        });
    }
    else
    {
        req.session.error="不能操作当前登录用户!";
        return res.redirect('/home');
    }
});

//重置密码
router.get('/resetPwd/:URLusername',function(req,res)
{
    let reqUsername=req.params.URLusername;
    if(reqUsername!==req.session.user.username)
    {
        let sqlStr='update users set password=? where username=?';
        let data=['123456',reqUsername];
        let dbhelp=new DBHelp();
        dbhelp.Update(sqlStr,data,function()
        {
            req.session.error=reqUsername+' 的密码已重置为 123456!';
            return res.redirect('/home');
        });
    }
    else
    {
        req.session.error="不能操作当前登录用户!";
        return res.redirect('/home');
    }
});

//注销
router.get('/logout',function(req,res)
{
    req.session.user=null;
    return res.redirect('/');
});

function Logined(req,res,next)
{
    if(req.session.user)
    {
        req.session.error='您已登录!';
        return res.redirect('/home');
    }
    next();
}

function LoginFirst(req,res,next)
{
    if(!req.session.user)
    {
        req.session.error='请先登录!';
        return res.redirect('/login');
    }
    next();
}

module.exports = router;

 

posted @ 2017-04-21 15:29  子非魚87  阅读(454)  评论(0编辑  收藏  举报