import { RoleModel } from '@db/Role'; import { UserModel } from '@db/User'; import { SMS_IN_60S, SMS_CNT_LIMIT, STATUS_SUC, STATUS_WRONG_PARMS, SMS_INVALID, ROLE_NOT_FOUND } from '@consts/statusCode'; import { smsModel } from '@db/Sms'; import { Service } from 'egg'; import Counter from '@db/Counter'; const _ = require('underscore'); /** * Test Service */ export default class Auth extends Service { public checkTelNo(telNo) { if (!_.isString(telNo)) { return { status: 1, data: '参数类型错误' }; } if (telNo.length !== 11) { return { status: 1, data: '手机号长度错误' }; } return { status: 0, data: '手机号合法' }; } async sendSmsCodeByGuodu(tel, code) { const ctx = this.ctx; const url = `http://221.179.172.68:8000/QxtSms/QxtFirewall?OperID=bantu3&OperPass=c8XcTffG&DesMobile=${tel}&Content=${encodeURIComponent(`【同人游戏】验证码${code},您正在登录赵云传,若非本人操作,请勿泄露`)}&Content_Code=1`; const result = await ctx.curl(url, { method: 'GET', }); return result.data; } testLimit(sms, interval) { if (sms.updateTime.getTime() > Date.now() - interval) { return true; } return false; } /** * 用户获取手机验证码 * @param telNo - 用户手机号 */ public async getSms(tel: string) { const telVerify = this.checkTelNo(tel); if (telVerify.status !== 0) { return telVerify; } const sms = await smsModel.findByTel(tel, false); if (sms) { if (await sms.timeLimit(10000)) { return this.ctx.service.utils.exceptionResult(SMS_IN_60S); } if (await sms.cntLimit(8)) { return this.ctx.service.utils.exceptionResult(SMS_CNT_LIMIT); } } let code = ''; if (!sms || !sms.used) { code = this.ctx.service.utils.generateNum(6); } else { code = sms.code; } const smsResult = await this.sendSmsCodeByGuodu(tel, code); console.log(smsResult); await smsModel.updateByTel(tel, code, false, new Date(), sms?.hasSendToday() ? sms.countToday + 1 : 1); return this.ctx.service.utils.exceptionResult(STATUS_SUC); } /** * 用户获取到手机验证码之后发送验证登录请求 * @param tel 登录手机号 * @param code 登录验证码 * @param platform 平台 * @param pkgName 包名 * @param serverType 服务器类型 */ public async smsLogin(tel: string, code: string, platform: string, pkgName: string, serverType: string) { const ctx = this.ctx; // 参数检查 const telVerify = this.checkTelNo(tel); if (telVerify.status !== 0) { return telVerify; } if (!_.isString(code) || code.length !== 6) { return ctx.service.utils.exceptionResult(STATUS_WRONG_PARMS); } // 手机验证码核验 const smsValid: boolean = await smsModel.validateSms(tel, code); if (!smsValid) { return ctx.service.utils.exceptionResult(SMS_INVALID); } // 用户注册登录 const token = ctx.service.utils.generateStr(256); const user = await UserModel.updateToken(tel, token, platform, pkgName, serverType); return { status: STATUS_SUC.code, data: { token, uid: user?.uid } }; } public async checkRole(serverId: number) { const ctx = this.ctx; const { uid } = ctx; const role = await RoleModel.findByUid(uid, serverId); if (role) { return { status: STATUS_SUC.code, data: { roleId: role.roleId } }; } return ctx.service.utils.exceptionResult(ROLE_NOT_FOUND); } public async createRole(serverId: number, roleName: string) { console.log('enter Auth createRole'); const ctx = this.ctx; const { uid } = ctx; const roleId = ctx.service.utils.genCode(10); const code = ctx.service.utils.genCode(6); const seqId = await Counter.getNewCounter('role') || -1; const role = await RoleModel.createRole(uid, serverId, { roleId, code, roleName, seqId }); if (role) { return { status: STATUS_SUC.code, data: { roleId: role.roleId } }; } return ctx.service.utils.exceptionResult(ROLE_NOT_FOUND); } }