12.27

user 

//抽离用户路由模块中的处理函数
//导入数据库模块
const db = require('../db/index.js')
//导入bcryptjs模块
const bcrypt = require('bcryptjs')
//导入jsonwebtoken包
const jwt = require('jsonwebtoken')
//导入配置密匙的文件
const config=require('../config.js')
//注册模块
exports.regUser = (req, res) => {
    //1.检测表单是否合法
    //接收表单数据
    const userinfo = req.body
    //判断数据是否合法
    // if (!userinfo.username || !userinfo.password) {
    //     return res.send({
    //         status: 1,
    //         message:'用户名或者密码不能为空'
    //     })
    // }

    //2.监测用户名是否被占用 需要导入数据库模块
    const sql1 = 'select * from ev_users where username=?'
    db.query(sql1, userinfo.username, (err,results) => {
        if (err) {
            // return res.send({status:1 ,message:err.message})
            return res.cc(err)
        }
        if (results.length > 0) { //查询返回的是数组 如果数组里有数据 长度大于零 说明用户已存在
            // return res.send({status:1, message:'用户名已存在 请更换'})
          return   res.cc('用户名已存在 请更换')
        }
    
        //给符合要求的用户密码加密
    userinfo.password = bcrypt.hashSync(userinfo.password, 10)
    //插入注册的新用户信息
        const sql2 = 'insert into ev_users set ?'
        db.query(sql2, { username: userinfo.username, password: userinfo.password }, (err, results) => {
            if (err) {
                // return res.send({status:1 ,message:err.message})
             return    res.cc(err)
            }
            //语句执行成功但是影响行数不唯一 也是失败
            if (results.affectedRows !== 1) {
                // return res.send({status:1, message:'注册用户失败 稍后再试'})
                return res.cc('注册用户失败 稍后再试')
            }
            //注册成功
            // res.send({ status: 0, message: '注册成功' })
            res.cc('注册成功',0)
        })
    })
   


}
//登录模块
exports.login = (req, res) => {
    //1.检测表单数据是否合法 在router 下user.js已经配置检测用户信息的中间件
    //2.根据用户名查询用户数据
    const userinfo=req.body
    const sql = 'select * from ev_users where username=?'
    db.query(sql, userinfo.username, (err,results) => {
        if (err) {
            return res.cc(err)
        }
        if (results.length !== 1) {
           return res.cc(' 用户名不正确 登录失败') 
        }
        //用户名正确 接下来判断输入的密码是否正确
        //数据库密码与用户输入的密码进行对比 调用bcrypt.compareSync 返回布尔值
        const compareResult=bcrypt.compareSync(userinfo.password,results[0].password)
        if (!compareResult) {
             return res.cc('登录失败')
        }
        //登录成功 服务器生成token字符串
        //因为是保存在客户端的 所以要剔除密码 头像这两个敏感信息
        const user = { ...results[0], password: '', user_pic: '' }
       //生成token字符串
        const tokenStr = jwt.sign(user, config.jwtSecretKey, {
            expiresIn:'10h'
        })
        //将生成的token响应给客户端
        res.send({
            status: 0,
            message: '登陆成功',
            token:'Bearer '+tokenStr
       })
        

    })
 
}

userinfo 

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

exports.getUserInfo = (req,res) => {
  //获取用户基本信息 查询数据库是否有用户信息
    //导入数据库模块
    const db = require('../db/index.js')
    const sql1='select id, username,nickname,email,user_pic from ev_users where id=?'
    db.query(sql1, req.user.id, (err,results) => {
        if (err) {
            return res.cc(err)
        }
        if (results.length !== 1) {
            return res.cc('获取用户失败')
        }
        res.send({
            status: 0,
            message: '获取用户信息成功',
            data: results[0],
        })
    })

}
exports.updateUserInfo = (req,res) => {
    const sql2 = 'update ev_users set ? where id=?'
    db.query(sql2, [req.body, req.body.id], (err, results) => {
        if (err) {
            return res.cc(err)
        }
        if (results.affectedRows !== 1) {
            return res.cc('更新失败')
        }
        return res.cc('更新成功',0)
    })
}
exports.updatePassword = (req, res) => {
    //查询用户是否存在
    const sql3 = 'select * from ev_users where id=?'
    db.query(sql3, req.user.id, (err, results) => {
        if (err) {
            return res.cc(err)
        }
        if (results.length !== 1) {
            return res.cc('用户不存在')
        }
        //判断用户输入密码正确与否 需要引入bcrypt 模块
      const compareResult=bcrypt.compareSync(req.body.oldPwd,results[0].password)
        if (!compareResult) {
          return res.cc('原密码错误')
        }
        //将新密码加密并且更新数据库密码
        //加密
        const newPwd = bcrypt.hashSync(req.body.newPwd, 10)
        //更新
        const sql4 = 'update ev_users set password=? where id=?'
        db.query(sql4, [newPwd, req.user.id], (err, results) => {
            if (err) {
                return res.cc(err)
            }
            if (results.affectedRows !== 1) {
                return res.cc('更换失败')
            }
            res.cc('更换成功',0)
        })
        
    })
}

 配置userinfo路由

//此模块是用户登录后的个人中心
const express = require('express')
const router = express.Router()
const userinfo_handler = require('../router_handler/userinfo')
//配置更新的验证表单数据的模块
const expressJoi = require('@escook/express-joi')
const {update}=require('../schema/user.js')
const {update_pwd}=require('../schema/user')
router.get('/userinfo', userinfo_handler.getUserInfo)
//更新用户信息
router.post('/userinfo', expressJoi(update), userinfo_handler.updateUserInfo)
//重置密码路由
router.post('/updatepwd',expressJoi(update_pwd) ,userinfo_handler.updatePassword)
module.exports=router

验证 

//优化表单数据验证


//用户信息验证规则模块
const joi = require('joi')
//用户名验证规则
const username = joi.string().alphanum().min(1).max(10).required()
//密码验证规则
const password = joi.string().pattern(/^[\S]{6,12}$/).required() //非空字符6-12位
//id验证规则
const id=joi.number().integer().min(1).required()
//nickname验证规则
const nickname=joi.string().required()
//email验证规则
const email=joi.string().email().required()
//暴露验证规则
exports.text = {
    body: { //验证表单数据req.body上的username password
        username,
        password,
        
    },
}
exports.update = {
    body: {
        id,
        nickname,
        email
    }
}
exports.update_pwd = {
    body: {
        oldPwd: password,
        newPwd:joi.not(joi.ref('oldPwd')).concat(password)
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值