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)
}
}