web-backset.cn/apps/server/src/controller/user.controller.ts
2023-03-21 21:47:03 +08:00

124 lines
3.7 KiB
TypeScript

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' };
}
}
}