数据库用户表
获取参数的中间件
登录接口
jwt会在config.default.js里进行配置
config.jwt = {
secret: 'secret', //密钥
ignore: [/^\/user\/login/], // 哪些请求不需要认证
}
比较加密和不加密的密码,存入数据库的时候是加密的,里面的comparePassword,使用的是bcryptjs
// 登录
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
}
注册接口
现在数据库里面查询有没有被注册,如果没有就存入数据库
saltPassword获取加密的密码
前端代码
再点击登录的时候会触发loginUser方法,之所以在onfinish外面写跳转是以为点击第一下是存储token,如果要获取token还需要再点击一次,所以写在外面,做个判断,也可以在redux,action里面进行跳转,可是我并没有成功,不知道哪里有问题
在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仓库