add(src): 添加一个业务样例user
This commit is contained in:
parent
73e3bc918b
commit
e71c219106
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
||||||
|
class UserController {
|
||||||
|
async register(ctx, next) {
|
||||||
|
ctx.body = { code: 0, message: "success" };
|
||||||
|
}
|
||||||
|
|
||||||
|
async getUserList(ctx, next) {
|
||||||
|
ctx.body = { code: 0, message: "success" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
module.exports = new UserController();
|
|
@ -0,0 +1,49 @@
|
||||||
|
const jwt = require('jsonwebtoken')
|
||||||
|
|
||||||
|
const { JWT_SECRET } = require('../config/config.default')
|
||||||
|
|
||||||
|
const {
|
||||||
|
tokenExpiredError,
|
||||||
|
invalidToken,
|
||||||
|
hasNotAdminPermission,
|
||||||
|
} = require('../constant/error.type')
|
||||||
|
|
||||||
|
const auth = async (ctx, next) => {
|
||||||
|
const { authorization = '' } = ctx.request.header
|
||||||
|
const token = authorization.replace('Bearer ', '')
|
||||||
|
// console.log(token)
|
||||||
|
|
||||||
|
try {
|
||||||
|
// user中包含了payload的信息(id, user_name, is_admin)
|
||||||
|
const user = jwt.verify(token, JWT_SECRET)
|
||||||
|
ctx.state.user = user
|
||||||
|
} catch (err) {
|
||||||
|
switch (err.name) {
|
||||||
|
case 'TokenExpiredError':
|
||||||
|
console.error('token已过期', err)
|
||||||
|
return ctx.app.emit('error', tokenExpiredError, ctx)
|
||||||
|
case 'JsonWebTokenError':
|
||||||
|
console.error('无效的token', err)
|
||||||
|
return ctx.app.emit('error', invalidToken, ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断:是否有管理员权限
|
||||||
|
const hadAdminPermission = async (ctx, next) => {
|
||||||
|
const { is_admin } = ctx.state.user
|
||||||
|
|
||||||
|
if (!is_admin) {
|
||||||
|
console.error('该用户没有管理员的权限', ctx.state.user)
|
||||||
|
return ctx.app.emit('error', hasNotAdminPermission, ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
auth,
|
||||||
|
hadAdminPermission,
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
const bcrypt = require('bcryptjs')
|
||||||
|
|
||||||
|
const { getUerInfo } = require('../service/user.service')
|
||||||
|
const {
|
||||||
|
userFormateError,
|
||||||
|
userAlreadyExited,
|
||||||
|
userRegisterError,
|
||||||
|
userDoesNotExist,
|
||||||
|
userLoginError,
|
||||||
|
invalidPassword,
|
||||||
|
} = require('../constant/error.type')
|
||||||
|
|
||||||
|
const userValidator = async (ctx, next) => {
|
||||||
|
const { user_name, password } = ctx.request.body
|
||||||
|
// 合法性
|
||||||
|
if (!user_name || !password) {
|
||||||
|
console.error('用户名或密码为空', ctx.request.body)
|
||||||
|
ctx.app.emit('error', userFormateError, ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
const verifyUser = async (ctx, next) => {
|
||||||
|
const { user_name } = ctx.request.body
|
||||||
|
|
||||||
|
// if (await getUerInfo({ user_name })) {
|
||||||
|
// ctx.app.emit('error', userAlreadyExited, ctx)
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
try {
|
||||||
|
const res = await getUerInfo({ user_name })
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
console.error('用户名已经存在', { user_name })
|
||||||
|
ctx.app.emit('error', userAlreadyExited, ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('获取用户信息错误', err)
|
||||||
|
ctx.app.emit('error', userRegisterError, ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
const crpytPassword = async (ctx, next) => {
|
||||||
|
const { password } = ctx.request.body
|
||||||
|
|
||||||
|
const salt = bcrypt.genSaltSync(10)
|
||||||
|
// hash保存的是 密文
|
||||||
|
const hash = bcrypt.hashSync(password, salt)
|
||||||
|
|
||||||
|
ctx.request.body.password = hash
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
const verifyLogin = async (ctx, next) => {
|
||||||
|
// 1. 判断用户是否存在(不存在:报错)
|
||||||
|
const { user_name, password } = ctx.request.body
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await getUerInfo({ user_name })
|
||||||
|
|
||||||
|
if (!res) {
|
||||||
|
console.error('用户名不存在', { user_name })
|
||||||
|
ctx.app.emit('error', userDoesNotExist, ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 密码是否匹配(不匹配: 报错)
|
||||||
|
if (!bcrypt.compareSync(password, res.password)) {
|
||||||
|
ctx.app.emit('error', invalidPassword, ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
return ctx.app.emit('error', userLoginError, ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
userValidator,
|
||||||
|
verifyUser,
|
||||||
|
crpytPassword,
|
||||||
|
verifyLogin,
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
const { getUserList, register } = require("../controller/user");
|
||||||
|
|
||||||
|
const Router = require("koa-router");
|
||||||
|
const router = new Router({ prefix: "/user" });
|
||||||
|
|
||||||
|
router.post("/list", getUserList);
|
||||||
|
router.post("/register", register);
|
||||||
|
|
||||||
|
module.exports = router;
|
Loading…
Reference in New Issue