使用nodejs(4)_登录接口的逻辑_初始化信息

173 阅读1分钟

1-services文件夹下的登录业务逻辑

    /**
     * 描述: 业务逻辑处理 - 用户相关接口
    */


    const { querySql, queryOne } = require('../utils/index');
    const md5 = require('../utils/md5');
    const jwt = require('jsonwebtoken');
    const boom = require('boom');
    const { body, validationResult } = require('express-validator');
    const { 
      CODE_ERROR,
      CODE_SUCCESS, 
      PRIVATE_KEY, 
      JWT_EXPIRED,
      USER_MESSAGE
    } = require('../utils/constant');
    const { decode } = require('../utils/user-jwt');
    var myData = new Date()
    const currentYear = myData.getFullYear()
    const currentMonth = myData.getMonth() + 1
    const currentTime = myData.toLocaleString('chinese',{hour12:false})

    // 登录
    function login(req, res, next) {
      addInitData();
      const err = validationResult(req);
      // 如果验证错误,empty不为空
      if (!err.isEmpty()) {
        // console.log('errorlogin')
        // 获取错误信息
        const [{ msg }] = err.errors;
        // 抛出错误,交给我们自定义的统一异常处理程序进行错误返回 
        next(boom.badRequest(msg));
      } else {
        let { username, password } = req.body;
        // md5加密
        // password = md5(password);
        const query = `select * from user where username='${username}' and password='${password}'`;
        querySql(query)
        .then(user => {
            // console.log('用户登录===', user);
          if (!user || user.length === 0) {
            res.json({ 
                    code: CODE_ERROR, 
                    msg: '用户名或密码错误', 
                    data: null 
            })
          } else {
            // 登录成功,签发一个token并返回给前端
            const token = jwt.sign(
              // payload:签发的 token 里面要包含的一些数据。
              { username },
              // 私钥
              PRIVATE_KEY,
              // 设置过期时间
              { expiresIn: JWT_EXPIRED }
            )

            let userData = {
              id: user[0].id,
              username: user[0].username,
              userChinese: user[0].userChinese,
            };

            res.json({ 
                    code: CODE_SUCCESS, 
                    msg: '登录成功', 
                    data: { 
                token,
                userData
              } 
            })
          }
        })
      }
    }
    module.exports = {
      login
    }

这里导入了md5对用户密码加密,jwt签发token,jwt解密详情可以查看知识点(2)。还引入来了boom对错误信息统一处理,validator对请求信息验证。这里使用res.json。

2-登录函数中调用了addInitData()方法。初始化信息。操作数据库,插入数据。

    //添加初始信息
    function addInitData() {
     let query = `select id, month, year, username from filltotal where username='${USER_MESSAGE[0].username}' and year='${currentYear}' and month='${currentMonth}' `
     queryOne(query).then((task)=>{
      if(!task){ //判断若数据库中存在则不添加
        let addQuery;
        USER_MESSAGE.forEach((item)=>{
          addQuery = `insert into filltotal(username, year, month, department, status, time, userChinese, departChinese) values('${item.username}', '${currentYear}', '${currentMonth}','${item.userMessage.department}', '0', '${currentTime}', '${item.userMessage.userChinese}', '${item.userMessage.departChinese}')`;
          querySql(addQuery).then(()=>{})
        })
      }
     })
    }

后续会对操作数据库方法统一说明