node使用express框架结合mysql实现登录、注册、忘记密码等功能(使用邮箱验证)

今天没废话,直接看代码。

目录

  • 一.环境以及包
  • 二.文件目录
  • 三.数据库
  • 四.登录接口
  • 五.注册接口
  • 六.忘记密码接口
  • 七.数据库配置文件
  • 八.主程序入口


一.环境以及包

npm i express
npm i mysql
npm i cors
npm i body-parser
npm i cookie-parser
npm i jsonwebtoken
npm i nodemailer

二.文件目录

node使用express框架结合mysql实现登录、注册、忘记密码等功能(使用邮箱验证)_第1张图片


三.数据库

(数据经过修改,请勿打扰两个邮箱的持有者,谢谢)
在这里插入图片描述
node使用express框架结合mysql实现登录、注册、忘记密码等功能(使用邮箱验证)_第2张图片


四.登录接口

const express = require('express')
const router = express.Router()
// token生成插件模块
const jwt = require('jsonwebtoken');
// Token签名
var secret = 'I LOVE LXD';
// 引入数据库
const mysql = require('../mysql/mysql')
var connection = null;
router.post('/login', (req, res) => {
    // 数据库连接
    connection = mysql.createConnection();
    connection.connect();
    // 查询语句
    var sql = 'SELECT * FROM user_table Where uemail=?';
    // 前端传来参数
    var params = [req.body.email, req.body.pwd]
    //登录验证
    connection.query(sql,req.body.email, function (err, result) {
        // 存储返回结果
        var result1
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            result1 = {
                code: 501,
                msg: '数据库链接失败...'
            }
            return;
        } else {
            // 用户没有输入时
            if (req.body.email === undefined || req.body.pwd === undefined) {
                result1 = {
                    code: 401,
                    msg: '邮箱或密码不能为空',
                    xl: 0
                }
            } else {
                if(result.length!==0){
                    console.log(result)
                    for (let i = 0; i < result.length; i++) {
                        // 邮箱或者密码不正确的时候
                        if (req.body.email !== result[i].uemail || req.body.pwd !== result[i].upwd) {
                            result1 = {
                                code: 400,
                                result: '邮箱或者密码错误!',
                                xl: 1
                            }
                        }
                        // 邮箱和密码输入正确
                        if (req.body.email === result[i].uemail && req.body.pwd === result[i].upwd) {
                            // 获取客户端的ip地址
                            var clientIp = getIp(req)
                            // 传输的token内容
                            let payload = { uid: result[i].uid ,ip:clientIp};
                            let token = jwt.sign(payload, secret);
                            console.log("用户信息存储token:"+token)
                            // 写入cookie中
                            res.cookie('tooken', token, { httpOnly: true, signed: true })
                            // 返回结果
                            result1 = {
                                code: 200,
                                token: token,
                                msg: '信息正确,返回登录',
                                xl:2,
                                ip:clientIp
                            }
                        }
    
                    }
                }else{
                    result1={
                        code:402,
                        msg:'账号不存在请注册!'
                    }
                }
 
            }

        }
        // 返回结果,关闭数据库连接
        res.send(result1)
        connection.end();
    });
})
//通过req的hearers来获取客户端ip
var getIp = function (req) {
    var ip = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddres || req.socket.remoteAddress || '';
    if (ip.split(',').length > 0) {
        ip = ip.split(',')[0];
    }
    return ip;
};
// 返回router,映射出去
module.exports = router

五.注册接口

const express = require('express')
const router = express.Router()
// 引入数据库
const mysql = require('../mysql/mysql')
var connection = null;
const nodemailer = require('nodemailer');
// 存储验证码以供注册使用
var code = ''
// 存储用户注册时的邮箱以防伪注册
var oldemail = ''
// 获取验证码
router.get('/sendemail/register', (req, res) => {
    if (req.query.email === undefined) {
        res.send({
            code: 400,
            msg: '必填参数不能为空,请检查!'
        })
    } else {
        //2. 创建运输对象
        let transporter = nodemailer.createTransport({
            host: 'smtp.qq.com',
            secure: true,
            port: 465,
            auth: {
                user: '', //qq邮箱账号
                pass: '' //邮箱的授权码
            }
        })
        // 存储验证码
        code = YzId(5)
        // 存储邮箱
        oldemail = req.query.email
        //3.配置发送邮件的信息
        let mailOptions = {
            from: '', // 发送者
            to: req.query.email, // 传过来的邮箱
            subject: '注册验证码', // 邮件标题
            html: `验证码为:${code},序号:1,注册使用`
        };
        //4.发送邮件
        transporter.sendMail(mailOptions, function (err, data) {
            //回调函数,用于判断邮件是否发送成功
            if (err) {
                console.log('发送异常' + err)
            } else {
                let result = {
                    code: 200,
                    msg: '验证码发送成功,请及时查收!',
                }

                res.send(result)
            }
        })
    }

})
router.post('/register', (req, res) => {
    // 数据库连接
    connection = mysql.createConnection();
    connection.connect();
    // 查询语句
    var sql = 'SELECT * FROM user_table Where uemail=?';
    var params = req.body.email
    try {
        if (req.body.code !== code || req.body.code === undefined) {
            res.send({
                code: 403,
                msg: '验证码有误'
            })
        } else {
            // 用户没有输入时
            if (req.body.email === undefined || req.body.name === undefined || req.body.pwd === undefined) {
                res.send({
                    code: 401,
                    msg: '必须参数为空,已知异常,请重新输入!',
                    xl: 0
                })
            } else {
                if (req.body.email !== oldemail) {
                    res.send({
                        code: 405,
                        msg: '邮箱不一致,请检查!'
                    })
                } else {
                    connection.query(sql, params, (err, result) => {
                        if (err) {
                            console.log('注册查重异常,请稍后重试!')
                            return
                        } else {
                            var result1;
                            // 查询结果数组长度不为零,就是有存在的数据
                            if (result.length !== 0) {
                                res.send({
                                    code: 202,
                                    msg: '该邮箱已经存在,请重新输入!',
                                    xl: 1
                                })
                            } else {
                                // 没有数据时候,进行注册
                                // 获取客户端的ip地址
                                var clientIp = getIp(req)
                                // 插入数据的sql语句
                                let sql = "INSERT INTO user_table(uid,uname,upwd,uemail,uimg,utime,uintroduction,uip,ustatus) VALUES(?,?,?,?,?,?,?,?,?)"
                                // 参数
                                let params = [YzId(6), req.body.name, req.body.pwd, req.body.email, 'http://192.168.1.80:3333/static/default.jpg', timestampToTime(Date.now()), "用户太懒了,还没有简介...", clientIp, '1']
                                connection.query(sql, params, (err, result) => {
                                    if (err) {
                                        result1 = {
                                            code: 401,
                                            msg: '注册数据库异常,请稍后重试!'
                                        }
                                    } else {
                                        result1 = {
                                            code: 200,
                                            result: {
                                                msg: "注册成功,请返回登录!",
                                                IP: clientIp,
                                                id: YzId(6)
                                            }
                                        }
                                        // 完成后进行验证码清空以及邮箱清空
                                        code=''
                                        oldemail=''
                                    }
                                    // 返回结果
                                    res.send(result1)
                                })
                            }
                        }
                        // 关闭数据库连接
                        connection.end();
                    })
                }
            }
        }
    } catch (e) {
        // 异常情况
        res.send(e)
        connection.end();
    }
})
// 随机生成6位id
function YzId(n) {
    let str = "";
    const arr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
    ];
    for (let i = 0; i < n; i++) {
        str += arr[Math.floor(Math.random() * arr.length)];
    }
    return str;
}
//通过req的hearers来获取客户端ip
var getIp = function (req) {
    var ip = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddres || req.socket.remoteAddress || '';
    if (ip.split(',').length > 0) {
        ip = ip.split(',')[0];
    }
    return ip;
};
// 时间转换以及补零操作
function timestampToTime(timestamp) {
    var date = new Date(timestamp)
    var Y = date.getFullYear() + '-'
    var M = (date.getMonth() + 1).toString().padStart(2, '0') + '-'
    var D = date.getDate().toString().padStart(2, '0') + ' '
    var h = date.getHours().toString().padStart(2, '0') + ':'
    var m = date.getMinutes().toString().padStart(2, '0') + ':'
    var s = date.getSeconds().toString().padStart(2, '0')
    return Y + M + D + h + m + s
}
// 映射出
module.exports = router

六.忘记密码接口

const express = require('express')
const router = express.Router()
const nodemailer = require('nodemailer');
// 引入数据库
const mysql = require('../mysql/mysql')
var connection = null;
router.post('/forget/user', (req, res) => {
    if (req.body.email === undefined) {
        res.send({
            code: 400,
            msg: '必填参数不能为空,请仔细检查'
        })
    } else {
        // 数据库连接
        connection = mysql.createConnection();
        connection.connect();
        var result1
        var sql = "SELECT * From user_table Where uemail=?"
        var params = req.body.email
        connection.query(sql, params, (err, result) => {
            if (err) {
                console.log('查询忘记密码邮箱数据库异常')
                return
            } else {
                if (result.length !== 0) {
                    forget(req.body.email, result[0].uname, result[0].upwd,req)
                    result1 = {
                        code: 200,
                        msg: '您的个人信息已经发送至您的邮箱,请注意查收!'
                    }
                } else {
                    result1 = {
                        code: 401,
                        msg: '暂无此用户,请先去注册!'
                    }
                }
            }
            // 返回结果,关闭数据库连接
            res.send(result1)
            connection.end();
        })
    }
})
// 发送邮件找回密码
function forget(email, name, pwd,req) {
    //2. 创建运输对象
    let transporter = nodemailer.createTransport({
        host: 'smtp.qq.com',
        secure: true,
        port: 465,
        auth: {
            user: '', //qq邮箱账号
            pass: '' //邮箱的授权码
        }
    })
    //3.配置发送邮件的信息
    let mailOptions = {
        from: '', // 发送者
        to: email, // 传过来的邮箱
        subject: '忘记密码找回', // 邮件标题
        html: `用户名:${name}
邮箱:
${email}
密码:${pwd}
操作ip:${getIp(req)}(我们不会存储您的IP信息,仅作为提示所用。),
请妥善保管您的个人信息!` }; //4.发送邮件 transporter.sendMail(mailOptions, function (err, data) { //回调函数,用于判断邮件是否发送成功 if (err) { console.log('发送异常' + err) } else { let data = { code: 200, msg: '验证码发送成功', } res.send(data) } }) } //通过req的hearers来获取客户端ip var getIp = function (req) { var ip = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddres || req.socket.remoteAddress || ''; if (ip.split(',').length > 0) { ip = ip.split(',')[0]; } return ip; }; module.exports = router

七.数据库配置文件

const mysql = require('mysql')

function createConnection() {
    const connection = mysql.createConnection({
        host: '',  //地址
        user: '',  //用户名
        password: '',  //密码
        port: '',  //端口
        database: ''  //数据库名
    });
    return connection;
}

module.exports.createConnection = createConnection;

八.主程序入口

// 引入express框架
const express = require('express')
// 解析参数格式
const bodyParser = require('body-parser')
// 跨域
const cors = require('cors')
// 文件路径
const path = require('path')
// 操作cookie模块
const cookieParser = require('cookie-parser');
// 实例化
const app = express()
// 解决跨域问题
app.use(cors());
// 解析 application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
  extended: false
}));
// 解析 application/json
app.use(bodyParser.json());
// 加入cookie签名
app.use(cookieParser('I LOVE LXD')); //使用cookie中间件,加密值为:I LOVE LXD
//设置跨域访问
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "content-type");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8");
  next();
})
// 静态文件
app.use('/static', express.static(path.join(__dirname, 'public')));

// 引入登录模块
const login = require('./router/login')
app.use(login)
// 引入注册模块
const register=require('./router/register')
app.use(register)
// 引入验证码发送模块
const email=require('./email/email')
app.use(email)
// 引入忘记密码模块
const forget=require('./router/forget')
app.use(forget)
// 监听服务开启
app.listen('3333', '0.0.0.0', (res) => {
  console.log('Server running http://0.0.0.0:3333')
})

有问题及时留言沟通哦

你可能感兴趣的:(node,mysql,前端,数据库,node.js,javascript)