import { Body, Controller, Get, Inject, Post } from '@midwayjs/core'; import { Context } from '@midwayjs/koa'; import { BizCode } from '../biz/code'; import { UserAdminAuthDTO, UserWebAuthDTO } from '../dto/user.dto'; import { XCodeService } from '../service/xcode.service'; import { UserService } from '../service/user.service'; import { createToken, decodeToken } from '../util/encrypt'; import { SmsService } from '../service/sms.service'; import { SmsDTO } from '../dto/sms.dto'; import { RedisService } from '@midwayjs/redis'; import * as CryptoJS from 'crypto-js'; import { ADMIN, WEB } from '../config/base.config'; @Controller('/user') export class UserController { @Inject() ctx: Context; @Inject() userService: UserService; @Inject() xcodeService: XCodeService; @Inject() smsService: SmsService; @Inject() redisService: RedisService; /** * 用户前台登录 */ @Post('/web/auth') async webAuth(@Body() params: UserWebAuthDTO) { try { const verifyCode = await this.redisService.get('' + params.user_login); if (!verifyCode) return { code: BizCode.ERROR, msg: '验证码无效' }; // 查询用户是否存在 const userExist = await this.userService.select(params); const payload = userExist?.id ? userExist : await this.userService.createUser(params); const expiredIn = new Date(Date.now() + WEB.EXPIRED); const token = createToken({ ...payload, hasLogin: true, expiredIn, platform: 'web', }); this.ctx.cookies.set(WEB.SIGN, token, { expires: expiredIn, httpOnly: false, }); await this.redisService.del('' + params.user_login); return { code: BizCode.OK, msg: '欢迎来到 backset.cn', data: { ...payload }, }; } catch (error) { this.ctx.logger.error(error); return { code: BizCode.ERROR, msg: '[error] web/auth error' }; } } /** * 管理员登录 */ @Post('/admin/auth') async AdminAuth(@Body() params: UserAdminAuthDTO) { try { const { username, password } = params; const expiredIn = new Date(Date.now() + ADMIN.EXPIRED); const token = createToken({ hasLogin: true, expiredIn, platform: 'admin', }); if (username === 'admin' && password === '123123') { this.ctx.cookies.set(ADMIN.SIGN, token, { expires: expiredIn, httpOnly: false, }); return { code: BizCode.OK }; } else { return { code: BizCode.ERROR, msg: '用户名密码错误' }; } } catch (error) { this.ctx.logger.error(error); return { code: BizCode.ERROR, msg: error }; } } @Get('/web/state') async state() { try { const token = this.ctx.cookies.get(WEB.SIGN); const user = decodeToken(token); return { code: BizCode.OK, data: user }; } catch (error) { this.ctx.logger.error(error); return { code: BizCode.ERROR, msg: '[error] /web/state error' }; } } @Post('/web/sms') async verifyCode(@Body() params: SmsDTO) { try { const { phoneNumber: phoneNumbers, sign } = params; const decrypted = CryptoJS.AES.decrypt(sign, phoneNumbers); const hackAction = decrypted.toString(CryptoJS.enc.Utf8) !== phoneNumbers; if (hackAction) return { code: BizCode.ERROR, msg: 'fuck u' }; const code = Math.floor(Math.random() * 9000 + 1000); await this.redisService.set('' + phoneNumbers, code, 'EX', 60); await this.smsService.send({ code, phoneNumbers }); return { code: BizCode.OK }; } catch (error) { console.log(error); this.ctx.logger.error(error); return { code: BizCode.ERROR, msg: '[error] /web/sms error' }; } } }