124 lines
3.7 KiB
TypeScript
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' };
|
|
}
|
|
}
|
|
}
|