zoukankan      html  css  js  c++  java
  • Node.js + Express 4.x + MongoDB 构建登录注册-简易用户管理(四)

      登录和注册的功能算实现了,下面封装DBHelp和增加一个简单的用户管理,这样增删查改就集齐了。

      在routes文件夹下面新建DBHelp.js,代码如下:

    const MongoClient=require('mongodb').MongoClient;
    const DB_CONN_STR='mongodb://localhost:27017/userinfo';
    
    function DBHelp(){}
    
    /**************************
    *
    * 功能:条件查询,返回遇到的第一条符合条件的数据
    * 参数:tableName(查询的表名)、selectStr(查询条件)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.FindOne=function(tableName,selectStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).findOne(selectStr,function(err,result)
            {
                if(err)
                {
                    console.log(err);
                    return;
                }
                callback(result);
            });
            db.close();
        });
    };
    
    /**************************
    *
    * 功能:条件查询
    * 参数:tableName(查询的表名)、selectStr(查询条件)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.Find=function(tableName,selectStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).find(selectStr).toArray(function(err,result)
            {
                if(err)
                {
                    console.log(err);
                    return;
                }
                callback(result);
            });
            db.close();
        });
    };
    
    /**************************
    *
    * 功能:查询所有数据,显示指定字段
    * 参数:tableName(查询的表名)、selectStr(查询条件)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.FindAll=function(tableName,selectStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).find({},selectStr).toArray(function(err,result)
            {
                if(err)
                {
                    console.log(err);
                    return;
                }
                callback(result);
            });
            db.close();
        });
    };
    
    /**************************
    *
    * 功能:添加
    * 参数:tableName(查询的表名)、dataStr(添加的数据)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.Add=function(tableName,dataStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).insert(dataStr,function(err)
            {
                if(err)
                {
                    console.log(err);
                    return false;
                }
                else
                {
                    callback();
                }
            });
            db.close();
        });
    };
    
    /**************************
    *
    * 功能:删除
    * 参数:tableName(查询的表名)、delStr(删除条件)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.Delete=function(tableName,delStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).remove(delStr,function(err)
            {
                if(err)
                {
                    console.log(err);
                    return false;
                }
                else
                {
                    callback();
                }
            });
            db.close();
        });
    };
    
    /**************************
    *
    * 功能:修改
    * 参数:tableName(查询的表名)、whereStr(修改条件)、updateStr(修改数据)、callback(回调函数)
    *
    **************************/
    DBHelp.prototype.Update=function(tableName,whereStr,updateStr,callback)
    {
        MongoClient.connect(DB_CONN_STR,function(err,db)
        {
            db.collection(tableName).update(whereStr,updateStr,function(err)
            {
                if(err)
                {
                    console.log(err);
                    return false;
                }
                else
                {
                    callback();
                }
            });
            db.close();
        });
    };
    
    module.exports=DBHelp;

      修改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 selectStr={username:user.username};
        let dbhelp=new DBHelp();
        dbhelp.FindOne('users',selectStr,function(result)
        {
            if(result)
            {
                if(result.password===user.password)
                {
                    //出于安全,只把包含用户名的对象存入session
                    req.session.user=selectStr;
                    return res.redirect('/home');
                }
                else
                {
                    req.session.error='用户名或者密码错误!';
                    return res.redirect('/login');
                }
            }
            else
            {
                req.session.error='账号不存在!';
                return res.redirect('/login');
            }
        });
    });
    
    
    //注册
    router.route('/register').all(Logined).get(function(req,res)
    {
        res.render('register',{title:'Register123'});
    }).post(function(req,res)
    {
        //从前端获取到的用户填写的数据
        let newUser={username:req.body.username,password:req.body.password,passwordSec:req.body.passwordSec};
        //准备添加到数据库的数据(数组格式)
        let addStr=[{username:newUser.username,password:newUser.password}];
        //用于查询用户名是否存在的条件
        // let selectStr={username:newUser.username};
        let dbhelp=new DBHelp();
        dbhelp.FindOne('users',{username:newUser.username},function(result)
        {
            if(!result)
            {
                if(newUser.password===newUser.passwordSec)
                {
                    dbhelp.Add('users',addStr,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 selectStr={username:1,_id:0}
        let dbhelp=new DBHelp();
        dbhelp.FindAll('users',selectStr,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)
    {
        if(req.params.URLusername!==req.session.user.username)
        {
            let whereStr={username:req.params.URLusername};
            let dbhelp=new DBHelp();
            dbhelp.Delete('users',whereStr,function()
            {
                req.session.error='移除用户 '+whereStr.username+' 成功!';
                return res.redirect('/home');
            });
        }
        else
        {
            req.session.error="不能操作当前登录用户!";
            return res.redirect('/home');
        }
    });
    
    //重置密码
    router.get('/resetPwd/:URLusername',function(req,res)
    {
        if(req.params.URLusername!==req.session.user.username)
        {
            let whereStr={username:req.params.URLusername};
            let update={$set:{password:'123456'}};
            let dbhelp=new DBHelp();
            dbhelp.Update('users',whereStr,update,function()
            {
                req.session.error=whereStr.username+' 的密码已重置为 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;

      在home.html中展示简单的用户列表,代码如下:

      使用了简单的ejs语法,简单明了,想深入了解的可以自行百度。

    <% include header.html %>
    <%-message%>
    <h1><%= title %></h1>
    <p>Welcome<span class="fuzq_home_name"><%= user.username %></span>to <%= title %></p>
    <a href="/logout">注销</a>
    <div class="fuzq_home_manage">
        <h3>用户管理</h3>
        <table class="fuzq_home_manage_table">
            <tr>
                <th>用户名</th>
                <th>操作</th>
            </tr>
            <% Allusers.forEach(function(u){
                if(u.username===user.username){%>
                <tr>
                    <td style="color:#3c3;"><%-u.username%></td>
                    <td>
                        <span style="color:#3c3;">当前用户</span>
                    </td>
                </tr>
                <%}
                else{%>
                <tr>
                    <td><%-u.username%></td>
                    <td>
                        <span><a href="/delete/<%-u.username%>">删除</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="/resetPwd/<%-u.username%>">重置密码</a></span>
                    </td>
                </tr>
                <%}
            })%>
        </table>
    </div>
    <% include footer.html %>

      home.html页面的头部和尾部也分开了,分别在views文件夹下新建header.html和footer.html,代码如下:

    <!DOCTYPE html>
    <html>
      <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
      </head>
      <body>
      </body>
    </html>
  • 相关阅读:
    POJ 2456 Aggressive cows
    POJ 1064 Cable master
    POJ 3723 Conscription
    左偏树
    tarjan模板
    [bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑
    [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列
    [bzoj3218]a + b Problem 网络流+主席树优化建图
    #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
    【UOJ UNR #1】火车管理 可持久化线段树
  • 原文地址:https://www.cnblogs.com/fu277/p/6743681.html
Copyright © 2011-2022 走看看