zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    C# 关于反射事件
    SqlBulkCopy 帮助类
    【转载】FormsAuthenticationTicket 对象
    c# 安全队列
    用户离职后网盘数据交接的实现
    网盘文件被下载过的记录查询脚本(亲测有效)
    学校搭建教学资源库平台的成熟方案
    【不务正业】太空工程师自动导航v1.0 beta
    golang的sort研究
    关于golang的defer的练习
  • 原文地址:https://www.cnblogs.com/fu277/p/6743827.html
Copyright © 2011-2022 走看看