node 登录模块

一、配置后端环境配置

        

这样就后端的环境就基本配置好了

注意:

1.要使用express框架必须要npm下载

2.nodemon工具能让我们的代码更新的时候不用重新启动服务器

3.cors的作用就是为了解决跨域问题,也是需要npm下载的

4.body-parser是用于解决表单的中间件,处理表单里面的数据,也是需要npm下载的

二、将后端代码上传gitee 

https://gitee.com/zzwlbb/back.git

本人利用的工具是SourceTree相比于Git Bash图形化操作比较方便,无需使用git命令

三、完成本地数据库的配置

1.利用小皮面板创建一个数据库

2.创建完数据库之后使用Navicat来连接数据库

3.分析用户字段:

通常我们的用户要设计的字段为

数据库的唯一id(自增),账户account,密码password,身份identity,部门department,姓名name,性别gender,邮箱email或电话number,创建时间create_time,更新时间update_time(修改账号时间),账号状态status(用于判断用户是否冻结)

我们可以画出ER图

4.创建表

四、注册与登录功能分析

1.分析注册与登录模块需要考虑的逻辑

        (1)要考虑用户有没有输入账号和密码 

        (2)注册的账号会不会存在

        (3)对注册的密码进行加密

        (4)账号的输入是否正确

        (5)输入的账号是否被冻结

        (6)输入的密码是否正确

        (7)登陆后返回token

2.创建路由模块和路由函数处理模块

3.安装joi,对数据进行限制的中间件

4.安装brcyptjs,对密码进行加密的中间件

5.安装jwt,生成token的中间件

6.安装express-jwt,解析token的中间件

7.测试接口

五、完成后端登录与注册功能

1.创建与数据库之间的连接

const mysql = require('mysql');
//创建连接
const db = mysql.createPool({
    host: 'localhost',
    user:'back_system',
    password:'123321',
    database:'back_system'
})

module.exports = db

2.需要创建router_handle文件夹路由处理函数模块

3.创建router文件夹用于处理登录和注册功能的路由

4.在app.js中导入router

5.注册步骤

const db = require('../db/index')
const bcrypt = require('bcrypt.js')

exports.register = (req,res)=>{
    //前端传的数据 req
    //返回给前端的数据 res
    const reginfo = req.body
    //第一步 传过来的数据是否为空
    if(!reginfo.account || !reginfo.password){
        return res.send({
            status:1,
            msg:'用户名或密码不能为空'
        })
    }
    //第二步 判断用户名是否存在
    const sql = 'select * from userinfo where account = ?'
    //执行sql语句 接收到的参数
    db.query(sql,reginfo.account,(err,result)=>{
        if(result.length>0){
            return res.send({
                status:1,
                message:'用户名已存在'
            })
        }
    })
    //第三步 对密码加密 需要bcrypt.js
    reginfo.password = bcrypt.hashSync(reginfo.password,10)
    //第四步 插入数据
    const sql1 = 'insert into userinfo set ?'
    const identity = '普通用户'
    const create_time = new Date()
    db.query(sql1,{
        account:reginfo.account,
        password:reginfo.password,
        identity:identity,
        create_time:create_time,
        status:0
    },(err,results)=>{
        if(results.affectedRows !== 1){
            return res.send({
                status:1,
                message:'注册失败'
            })
        }
        res.send({
            status:0,
            message:'注册成功'
        })
    })
}

6.使用加密算法 排除不需要携带token的接口

(1)创建jwt-config文件夹 用来存放密钥

(2)在app.js引入和使用jwt

const {expressjwt:jwt} = require('express-jwt');
const jwtConfig = require('./jwt_config/index');

// 使用加密算法 排除不需要携带token的接口
app.use(jwt({
    secret:jwtConfig.jwtSecretKey,
    algorithms:['HS256']
}).unless({
    path:[/^\/api\/login/]
}))

   6.登录步骤

exports.login = (req,res)=>{
    const loginfo = req.body
    //第一步 查看有没有前端传过来的账号
    const sql = 'select * from userinfo where account = ?'
    db.query(sql,loginfo.account,(err,results)=>{
        //数据库连接失败会执行err
        //自定义中间件 在app.js定义
        if(err) return res.cc(err)
        if(results.length!==1) return res.cc('登录失败')
        //第二步 对前端密码进行解密 需要bcrypt.js      前端密码         数据库密码                 
        const compareResult = bcrypt.compareSync(loginfo.password,results[0].password)
        //比较失败
        if(!compareResult) return res.cc('登录失败')
        //第三步 是否冻结账号    
        if(results[0].status === 1) return res.cc('账号已被冻结')
        //第四步 生成token  
        //要剔除加密后的密码和其他数据
        const user = {
            ...results[0],
            password:'',
            identity:'',
            create_time:'',
            update_time:''
        }
        //设置token过期时间
        const tokenStr = jwt.sign(user,jwtconfig.jwtSecretKey,{
            expiresIn:'24h'
        })
        res.send({
            results,
            status:0,
            message:'登录成功',
            token:'Bearer '+ tokenStr
        })       
    })
}

7.限制规则

(1)在写完登录代码后要通过expressjoi来对前端传递过来的参数进行限制

(2)创建一个limit文件夹,在limit login中定义规则

const joi = require('joi')
const account = joi.string().alphanum().min(3).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()

exports.login_limit = {
    body:{
        account,
        password
    }
}

(3)在app.js中对不符合规则的进行报错

//使用 joi中间件
app.use((err,req,res,next)=>{
    if(err instanceof joi.ValidationError){
        res.cc(err)
    }
})

(4)然后在router中进行引入expressjoi来对账号密码进行限制

// 导入joi规则
const expressJoi = require('@escook/express-joi')
const {login_limit} = require('../limit/login')

router.post('/register',expressJoi(login_limit),loginHandler.register)
router.post('/login',expressJoi(login_limit),loginHandler.login)

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值