个人中心
一、获取用户信息
1.初始化路由模块
const express = require('express')
const router = express.Router()
// 验证数据的中间件
const expressjoi = require('@escook/express-joi')
// 导入验证规则
const {update_userinfo_schema,update_password_schema,update_avatar_schema} = require('../schemn/user')
// 导入处理函数
const userinfo_handle = require('../router_handle/userinfo')
// 挂载路由
// 获取路由信息的路由
router.get('/userinfo',userinfo_handle.getUserinfo )
2.在 app.js 中导入并使用个人中心的路由模块
// 导入使用用户信息的模块
const userinfoRouter = require('./router/userinfo')
app.use('/my',userinfoRouter)
3.初始化路由处理函数,注意:req 对象上的 user 属性,是 Token 解析成功,express-jwt 中间件帮我们挂载上去的
const db = require('../router/db/index')
// 导入处理密码的模块
const bcrypt = require('bcryptjs')
const express = require('express')
// 获取用户信息 的基本的处理函数
exports.getUserinfo =(req,res) => {
// 定义查询sql语句
const sql = 'select id,username,nickname,email,user_pic from ev_users where id=?'
// 调用db.query()语句执行这个语句 res.send(req.user)
db.query(sql,req.user.id, (err,results) =>{
// 执行SQL语句失败
if(err) return res.cc(err)
// SQL成功 查询为空的情况
if(results.length !==1 ) return res.cc('获取用户信息失败')
// 获取用户信息成功
res.send({
status:0,
message:'获取用户信息成功',
data:results[0]
})
})
}
执行成功
二、更新用户信息
1.定义路由和初始函数
1.1在 userinfo.js模块中,添加更新基本用户信息的路由,以及导入验证信息的对象
// 更新用户的基本信息
router.post('/userinfo', expressJoi(update_userinfo_schema), userinfo_handler.updateUserInfo)
1.2定义并向外共享更新用户基本信息的路由处理函数
// 更新用户基本信息的处理函数
exports.updateUserInfo = (req, res) => { res.send('ok') }
2.验证表单
2.1 定义验证规则
// 定义id,nickname,email的验证规则 integer整数
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
2.2 使用 exports 向外共享如下的 验证规则对象
// 更新用户信息的验证规则
exports.update_userinfo_schema = {
body: {
id,
nickname,
email
}
}
3.实现更新用户基本信息
3.1定义SQL的语句
const sql = 'update ev_users set ? where id=?'
3.2 调用db.querey()执行SQL语句
db.query(sql,[req.body,req.body.id], (err,results) => {
// 执行sql失败
if(err) return res.cc(err)
//语句执行成功,但是影响的行数不等于一
if(results.affectedRows !==1) return res.cc('更新用户信息失败')
res.cc('更新用户信息成功')
})
注意填写Authorization信息
执行成功结果:
缺少验证规则:
三、修改密码
1.定义路由和处理函数
1.1新增重置密码的路由
// 更新密码的路由
router.post('/updatepwd', expressjoi(update_password_schema),userinfo_handle.updarePass)
1.2 创建重置密码的处理函数,并且向外共享
// 重置密码的处理函数 exports.updatePassword = (req, res) => { res.send('ok') }
2.验证表单规则
2.1 定义验证表单规则:核心验证思路:旧密码与新密码,必须符合密码的验证规则,并且新密码不能与旧密码一致
exports.update_password_schema = {
body:{
// 使用password这个规则,验证req.body.oldPwd的值
oldPwd: password,
// joi.ref('oldPwd')代表着newPwd的值必须和old一致;joi.not(joi.ref('oldPwd'))代表着不能和旧密码一致
// .concat()用于合并joi.not(joi.ref('oldPwd'))和password的规则
newPwd: joi.not(joi.ref('oldPwd')).concat(password)
}
}
2,2 导入并且使用验证规则
//导入需要的验证规则对象
const { update_userinfo_schema, update_password_schema } = require('../schema/user')
router.post('/updatepwd', expressJoi(update_password_schema), userinfo_handler.updatePassword)
3.实现重置密码的功能
3.1 查询用户的id是否存在
// 定义根据 id 查询用户数据的 SQL 语句 const sql = `select * from ev_users where id=?`
// 执行 SQL 语句查询用户是否存在 db.query(sql, req.user.id, (err, results) => {
// 执行 SQL 语句失败
if (err) return res.cc(err)
// 检查指定 id 的用户是否存在
if (results.length !== 1)
return res.cc('用户不存在!')
// TODO:判断提交的旧密码是否正确
})
3.2 判断旧密码是否正确,在头部区域导入 bcryptjs 后, 即可使用 bcrypt.compareSync(提交的密码,数据库中的密码) 方法验证密码是否正确 ,compareSync() 函数的返回值为布尔值,true 表示密码正确,false 表示密码错误
const bcrypt = require('bcryptjs')
// 判断提交的旧密码是否正确
const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult)
return res.cc('原密码错误!')
3.3 密码正确之后,修改密码,首先将密码进行一次bcrypt加密
// 将旧密码改成新密码
const sqlStr = 'update ev_users set password=? where id=?'
// 将新密码进行bcrypt加密
const newPwd = bcrypt.hashSync(req.body.newPwd,10)
// 执行更新密码的语句
db.query(sqlStr,[newPwd,req.user.id], (err,results) => {
if(err) return res.cc(err)
// 判断影响的行数
if(results.affectedRows !==1) return res.cc('密码更新失败')
// 成功
res.cc('密码更新成功',0)
})
实现的效果:
四、更新头像照片
1.定义路由和处理函数
1.1 新增添加修改用户头像的路由模块
// 更新用户头像的路由 router.post('/update/avatar', userinfo_handler.updateAvatar)
1.2 定义更改头像的处理函数
// 更新用户头像的处理函数 exports.updateAvatar = (req, res) => { res.send('ok') }
2.定义验证规则信息
2.1 定义 avatar 的验证规则如下
// dataUri() 指的是如下格式的字符串数据:
//data:image/png;base64,VE9PTUFOWVNFQ1JFVFM=
const avatar = joi.string().dataUri().required()
2.2 想外共享验证规则
// 验证规则对象 - 更新头像 exports.update_avatar_schema = { body: { avatar,
},
}
2.3获取验证规则并使用
const { update_avatar_schema } = require('../schema/user')
router.post('/update/avatar', expressJoi(update_avatar_schema), userinfo_handler.updateAvatar)
3.实现更新用户头像的功能
3.1 定义SQL语句
const sql = 'update ev_users set user_pic=? where id=?'
3.2 执行SQL语句
db.query(sql, [req.body.avatar, req.user.id], (err, results) => {
// 执行 SQL 语句失败
if (err) return res.cc(err)
// 执行 SQL 语句成功,但是影响行数不等于 1
if (results.affectedRows !== 1)
return res.cc('更新头像失败!')
// 更新用户头像成功
return res.cc('更新头像成功!', 0)
})
实现的效果: