2020年6月22日(egg 登录)


数据库用户表

image-20200622200434575

获取参数的中间件

image-20200622202606339

登录接口

image-20200622202831881

jwt会在config.default.js里进行配置

config.jwt = {
   secret: 'secret', //密钥
   ignore: [/^\/user\/login/], // 哪些请求不需要认证
 }

比较加密和不加密的密码,存入数据库的时候是加密的,里面的comparePassword,使用的是bcryptjs

image-20200622203243490

// 登录
 async login(params) {
   const { ctx,app } = this
   let { username,password } = params
   let secret = app.config.jwt.secret
   let sql = `select * from users where username=${"'" + username + "'"}`
   let result
   let result1 = await app.mysql.query(sql)
   if (result1.length > 0) {
     //比较加密后密码
     await ctx.helper.comparePassword(password, result1[0].password).then((isMatch) => {
       if (isMatch) {
         const token = ctx.helper.getToken({
           id: result1[0].id,
           name: result1[0].username
         }, secret)
         //  用户信息
         const userInfo = {
           id: result1[0].id,
           username: result1[0].username
         }
         result = {
           code: 200,
           token,
           userInfo,
           message: '登录成功'
         }
       } else {
         result = {
           code: 401,
           message: '密码错误'
         }
       }
     }).catch(err => {
       ctx.status = 500
       result = {
         message: err
       }
     })
   } else {
     result = {
       code: 500,
       message: "用户名不存在,请注册"
     }
   }
   return result
 }

注册接口

现在数据库里面查询有没有被注册,如果没有就存入数据库

image-20200622203640859

saltPassword获取加密的密码

image-20200622203805183

前端代码

再点击登录的时候会触发loginUser方法,之所以在onfinish外面写跳转是以为点击第一下是存储token,如果要获取token还需要再点击一次,所以写在外面,做个判断,也可以在redux,action里面进行跳转,可是我并没有成功,不知道哪里有问题

image-20200622204511236

在react-redux的action进行login接口的调用

//actionCreators
import { USER_INFO, SET_CURRENT_USER } from './constants'
import { login, register } from '../../../api/demoInfo'
import { message } from 'antd'
export const getUserInfo = (data) => ({
  type: USER_INFO,
  data
})
export const loginUser = (params) => async dispatch => {
  login(params).then(res => {
    if (res.code === 200) {
      const token = res.token;
      localStorage.setItem('token', token); //存储token
      dispatch(setCurrentUser(token))
    } else if (res.code === 401) {
      message.error(res.message)
    } else {
      message.error(res.message)
    }
  })
}
export const setCurrentUser = decoded => {
  return {
    type: SET_CURRENT_USER,
    data: decoded
  }
}
export const logoutUser = () => dispatch => {
  localStorage.removeItem('token');
  dispatch(setCurrentUser({}));

}
// 注册
export const registerUser = (params) => dispatch => {
  register(params).then(res => {
    if (res.code === 200) {
      message.success(res.message)
    } else {
      message.error(res.message)
    }
  })
}

完整代码可看backend仓库


Author: wxy
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source wxy !
  TOC