react 项目--博客系统 (十六)

Loading......

接上一篇文章,完成用户的登录功能;

实现思路:

  1. 获取请求数据
  2. 验证请求数据       
    1. email 是否正确       
    2. password是否正确
  3. 业务逻辑验证       
    1. 用户是否存在
    2. 密码是否匹配
  4. 返回数据
    1. 生成token
    2. 返回数据

实现过程:

测试:

启动终端后用 postman 进行测试,显示用户登录成功 

 详细代码:

controller/users.js:

const {
  validateCreateUser,
  validateUserLogin,
} = require("../utils/validate/user_validate");
const HttpException = require("../exceptions/http_expetion");
const User = require("../models/user");
const { md5Password, matchPassword } = require("../utils/md5");
const { sign } = require("../utils/jwt");

// 注册用户
module.exports.createUser = async (req, res, next) => {
  try {
    let { username, password, email } = req.body.user;

    // 数据校验
    let { error, validate } = validateCreateUser(username, password, email);
    if (!validate) {
      throw new HttpException(422, "用户提交验证数据失败!!!", error);
    }

    //业务验证
    //验证email是否存在
    const exisUser = await User.findByPk(email);
    if (exisUser) {
      throw new HttpException(422, "用户邮箱已存在!!!", "email 存在");
    }

    //创建用户
    //密码加密
    const md5PWD = await md5Password(password);
    //User model 存储数据库
    const user = await User.create({
      username,
      password: md5PWD,
      email,
    });

    //创建成功
    if (user) {
      console.log(user);
      //创建token
      let data = {};
      data.username = username;
      data.email = email;
      data.token = await sign(username, email);
      data.bio = null;
      data.avatar = null;
      //返回数据
      res.status(201).json({
        status: 1,
        data,
        message: "创建用户成功",
      });
    }
    //整体异常捕获
  } catch (error) {
    next(error);
  }
};

//登录用户
module.exports.login = async (req, res, next) => {
  try {
    //获取请求数据
    let { email, password } = req.body.user;

    //验证请求数据
    let { error, validate } = validateUserLogin(email, password);

    //验证业务逻辑
    //用户是否存在
    const user = await User.findByPk(email);
    console.log("user", user);
    if (!user) {
      throw new HttpException(401, "用户不存在", "user not found!!!");
    }
    //密码是否匹配
    const oldMd5Pwd = user.dataValues.password;
    const match = matchPassword(oldMd5Pwd, password);
    if (!match) {
      throw new HttpException(401, "用户密码错误", "password not match!!!");
    }

    //返回数据
    //生成token
    delete user.dataValues.password;
    user.dataValues.token = await sign(
      user.dataValues.username,
      user.dataValues.email
    );
    //返回数据
    return res.status(200).json({
      status: 1,
      data: user.dataValues,
      message: "用户登录成功",
    });
  } catch (err) {
    next(err);
  }
};

//获取用户
module.exports.getUser = async (req, res) => {
  
};

未完待续......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值