Compare commits

...

1 Commits

Author SHA1 Message Date
yoga e71c219106 add(src): 添加一个业务样例user 2022-07-31 01:47:19 +08:00
5 changed files with 4765 additions and 0 deletions

4605
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

10
src/controller/user.js Normal file
View File

@ -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();

49
src/middlewares/auth.js Normal file
View File

@ -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,
}

View File

@ -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,
}

9
src/routers/user.js Normal file
View File

@ -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;