登录:绑定、服务器列表
This commit is contained in:
@@ -34,7 +34,7 @@ export async function init() {
|
||||
let seasonEndTime = 0;
|
||||
let systemConfig = await SystemConfigModel.findSystemConfig();//系统全局参数表
|
||||
if (!systemConfig) {
|
||||
console.log('create season seasonNum = '+ systemConfig.seasonNum);
|
||||
console.log('create season seasonNum = '+ systemConfig?.seasonNum);
|
||||
let warIds = getPvpGkWarIds();
|
||||
let warId = warIds[0];
|
||||
seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint();
|
||||
|
||||
@@ -18,6 +18,9 @@ export const STATUS = {
|
||||
NEW_SERVER_ERR: { code: 10007, simStr: '添加新服务器失败' },
|
||||
SERVER_EXISTS: { code: 10008, simStr: '服务器已存在' },
|
||||
PASSWORD_ERR: { code: 10009, simStr: '密码错误' },
|
||||
PASSWORD_ILLEGEL: { code: 10010, simStr: '请输入密码' },
|
||||
TEL_HAS_USED: { code: 10011, simStr: '该手机号已被使用' },
|
||||
ACCOUNT_NOT_GUEST: { code: 10012, simStr: '该账号已绑定过' },
|
||||
// 战斗相关状态 20000 - 29999
|
||||
// 战斗通用 20000 - 20099
|
||||
BATTLE_MISS_INFO: { code: 20001, simStr: '缺少关卡信息' },
|
||||
|
||||
@@ -1,28 +1,60 @@
|
||||
import { APP_ID } from './../consts';
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
||||
import { getSeconds } from 'app/pubUtils/timeUtil';
|
||||
|
||||
class ServerInfo {
|
||||
@prop({ required: true })
|
||||
id: number;
|
||||
id: number; // 小区id
|
||||
|
||||
@prop({ required: true })
|
||||
name: string;
|
||||
name: string; // 小区区名
|
||||
|
||||
@prop({ required: true })
|
||||
host: string;
|
||||
groupId: number; // 大区id
|
||||
|
||||
@prop({ required: true })
|
||||
groupName: string; // 大区区名
|
||||
|
||||
@prop({ required: true })
|
||||
host: string; // pinus连接地址
|
||||
|
||||
@prop({ required: false })
|
||||
port: number;
|
||||
port: number; // pinus端口
|
||||
|
||||
@prop({ required: true })
|
||||
status: number;
|
||||
serverStatus: number; // 服务器状态
|
||||
|
||||
public get status() {
|
||||
let now = new Date();
|
||||
if( now > this.openTime) {
|
||||
return this.serverStatus;
|
||||
} else {
|
||||
return 3; // 未开服
|
||||
}
|
||||
}
|
||||
|
||||
@prop({ required: true, set:(val: Date) => { return val }, get: (val: Date) => {return getSeconds(val)} })
|
||||
openTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
createTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
serverType: string;
|
||||
|
||||
constructor(id: number, name: string, groupId: number, groupName: string, host: string, port: number, serverStatus: number, serverType: string, openTime?: Date) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.groupId = groupId;
|
||||
this.groupName = groupName;
|
||||
this.host = host;
|
||||
this.port = port;
|
||||
this.serverStatus = serverStatus;
|
||||
this.serverType = serverType;
|
||||
this.openTime = openTime||new Date();
|
||||
this.createTime = new Date();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,26 +97,23 @@ export default class Game extends BaseModel {
|
||||
}
|
||||
}
|
||||
|
||||
public static async getServerListByType(serverType: string) {
|
||||
let game: GameType = await GameModel.findOne().lean();
|
||||
public static async getServerList() {
|
||||
let game: GameType = await GameModel.findOne().lean({ getter: true, virtuals: true });
|
||||
if (!game) {
|
||||
const serverInfo: ServerInfo = { id: 1, name: '常山少年', host: 'pinus_test.trgame.cn', port: 3014, status: 1, createTime: new Date(), serverType: 'official' };
|
||||
const serverInfo = new ServerInfo(1, '常山少年', 1, '逍遥津', 'pinus_test.trgame.cn', 3014, 1, 'official');
|
||||
const iconUrl = `https://download.tgamebox.cn/avatar/${APP_ID}/1.png`;
|
||||
game = await GameModel.findOneAndUpdate(
|
||||
{},
|
||||
{ id: 1, name: '赵云传', nameEn: 'zyz', des: '牛逼的战棋', iconUrl, version: '0.0.1', versionCode: 1, $push: { serverList: serverInfo } },
|
||||
{ upsert: true, new: true },
|
||||
).lean();
|
||||
).lean({ getter: true, virtuals: true });
|
||||
}
|
||||
console.log(serverType, game);
|
||||
let serverList: Array<ServerInfo> = game ? game.serverList : [];
|
||||
serverList = serverList.filter(item => { return item.serverType === serverType; });
|
||||
console.log(serverType, serverList);
|
||||
return serverList;
|
||||
}
|
||||
|
||||
public static async newServer(serverId: number, serverType: string, name: string, host: string, port: number, status: number, lean = true) {
|
||||
let serverInfo: ServerInfo = {id: serverId, name, host, port, status, createTime: new Date(), serverType};
|
||||
let serverInfo = new ServerInfo(serverId, name, 1, '逍遥津', host, port, status, serverType);
|
||||
let game: GameType = await GameModel.findOneAndUpdate({}, {$push: {serverList: serverInfo}}, {new: true}).lean(lean);
|
||||
return game;
|
||||
}
|
||||
|
||||
@@ -141,7 +141,13 @@ export default class User extends BaseModel {
|
||||
|
||||
public static async setPass(uid: number, password: string, lean = true) {
|
||||
let r = await this.encryptPass(password);
|
||||
const user: UserType = await UserModel.findOneAndUpdate({ uid }, { $set: { password: r.npassword, salt: r.salt, hasSetPw: true }}).lean(lean);
|
||||
const user: UserType = await UserModel.findOneAndUpdate({ uid }, { $set: { password: r.npassword, salt: r.salt, hasSetPw: true }}, {new: true}).lean(lean);
|
||||
return user;
|
||||
}
|
||||
|
||||
public static async bindTel(uid: number, tel: string, password: string, lean = true) {
|
||||
let r = await this.encryptPass(password);
|
||||
const user: UserType = await UserModel.findOneAndUpdate({ uid, isGuest: true }, { $set: { password: r.npassword, salt: r.salt, hasSetPw: true, tel, isGuest: false }}, {new: true}).lean(lean);
|
||||
return user;
|
||||
}
|
||||
|
||||
@@ -183,6 +189,11 @@ export default class User extends BaseModel {
|
||||
return user;
|
||||
}
|
||||
|
||||
public static async authentication(uid: number, birthday: string, pi: string, lean = true) {
|
||||
const user: UserType = await UserModel.findOneAndUpdate({ uid }, { hasAuthenticated: true, birthday, pi }, {new: true}).lean(lean);
|
||||
return user;
|
||||
}
|
||||
|
||||
public static async findUserByField(field: string, value?: Array<number|string>, lean = true) {
|
||||
let searchObj = {};
|
||||
if(field != 'all') {
|
||||
|
||||
@@ -28,8 +28,8 @@ export default class AccountController extends Controller {
|
||||
|
||||
public async pwLogin() {
|
||||
const { ctx } = this;
|
||||
const { tel, deviceId, pw } = ctx.request.body;
|
||||
ctx.body = await ctx.service.auth.pwLogin(tel, deviceId, pw);
|
||||
const { tel, deviceId, password } = ctx.request.body;
|
||||
ctx.body = await ctx.service.auth.pwLogin(tel, deviceId, password);
|
||||
}
|
||||
|
||||
public async checkRole() {
|
||||
@@ -43,4 +43,16 @@ export default class AccountController extends Controller {
|
||||
const { serverId, roleName } = ctx.request.body;
|
||||
ctx.body = await ctx.service.auth.createRole(serverId, roleName);
|
||||
}
|
||||
|
||||
public async bind() {
|
||||
const { ctx } = this;
|
||||
const { tel, code, password } = ctx.request.body;
|
||||
ctx.body = await ctx.service.auth.bind(tel, code, password);
|
||||
}
|
||||
|
||||
public async authentication() {
|
||||
const { ctx } = this;
|
||||
const { name, idNum } = ctx.request.body;
|
||||
ctx.body = await ctx.service.auth.authentication(name, idNum);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,39 +1,83 @@
|
||||
import { STATUS } from '@consts';
|
||||
import { GameModel } from '@db/Game';
|
||||
import { Controller } from 'egg';
|
||||
import { RoleModel } from '@db/Role';
|
||||
|
||||
export default class GameController extends Controller {
|
||||
public async getServerList() {
|
||||
const { ctx } = this;
|
||||
let serverList: Array<any> = [];
|
||||
let { serverType, auth } = ctx;
|
||||
if (auth === 1) {
|
||||
serverList = await GameModel.getAllServerList();
|
||||
} else if (!auth) {
|
||||
serverList = await GameModel.getServerListByType(serverType);
|
||||
}
|
||||
if (serverList && serverList.length > 0) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { serverList });
|
||||
} else {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SERVER_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
public async newServer() {
|
||||
const { ctx } = this;
|
||||
const { serverId, serverType, name, host, port, status } = ctx.request.body;
|
||||
const serverList = await GameModel.getAllServerList();
|
||||
for (let { id, host: preHost, port: prePort } of serverList) {
|
||||
if (preHost === host && prePort === port && id === serverId) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SERVER_EXISTS);
|
||||
return;
|
||||
}
|
||||
public async getServerList() {
|
||||
const { ctx } = this;
|
||||
let { serverType, auth, uid } = ctx;
|
||||
|
||||
let serverList = [];
|
||||
let loginServerList = [];
|
||||
|
||||
let allServers = await GameModel.getServerList();
|
||||
let roles = await RoleModel.findAllByUid(uid);
|
||||
console.log(roles.length)
|
||||
|
||||
for(let server of allServers) {
|
||||
if(auth === 1 || (!auth && server.serverType == serverType)) {
|
||||
serverList.push(server);
|
||||
let role = roles.find(role => role.serverId == server.id);
|
||||
if(!!role) {
|
||||
let roleInfo = {
|
||||
roleId: role.roleId,
|
||||
roleName: role.roleName,
|
||||
headHid: role.headHid,
|
||||
sHid: role.sHid,
|
||||
lv: role.lv
|
||||
};
|
||||
loginServerList.push({...server, ...roleInfo});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (serverList && serverList.length > 0) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { serverList, loginServerList });
|
||||
} else {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SERVER_NOT_FOUND);
|
||||
}
|
||||
return
|
||||
}
|
||||
const gameInfo = await GameModel.newServer(serverId, serverType, name, host, port, status);
|
||||
if (gameInfo) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { gameInfo });
|
||||
} else {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.NEW_SERVER_ERR);
|
||||
|
||||
public async newServer() {
|
||||
const { ctx } = this;
|
||||
const { serverId, serverType, name, host, port, status } = ctx.request.body;
|
||||
const serverList = await GameModel.getAllServerList();
|
||||
for (let { id, host: preHost, port: prePort } of serverList) {
|
||||
if (preHost === host && prePort === port && id === serverId) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SERVER_EXISTS);
|
||||
return;
|
||||
}
|
||||
}
|
||||
const gameInfo = await GameModel.newServer(serverId, serverType, name, host, port, status);
|
||||
if (gameInfo) {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { gameInfo });
|
||||
} else {
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.NEW_SERVER_ERR);
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async getnotice() {
|
||||
const { ctx } = this;
|
||||
let { serverType } = ctx;
|
||||
|
||||
console.log(serverType);
|
||||
let notice = [{
|
||||
id: 1,
|
||||
title: '粮草先行',
|
||||
tag: 1,
|
||||
type: 1,
|
||||
content: '欢迎来到三国志赵云传',
|
||||
startTime: 1584921600,
|
||||
endTime: 1585353600
|
||||
}]
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { notice });
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -12,5 +12,7 @@ export default (app: Application) => {
|
||||
router.post('/user/pwlogin', controller.account.pwLogin);
|
||||
router.post('/user/checkrole', tokenParser, controller.account.checkRole);
|
||||
router.post('/user/createrole', tokenParser, controller.account.createRole);
|
||||
router.post('/user/bind', tokenParser, controller.account.bind);
|
||||
router.post('/user/authentication', tokenParser, controller.account.authentication);
|
||||
router.post('/game/getserverlist', tokenParser, controller.game.getServerList);
|
||||
};
|
||||
|
||||
@@ -28,6 +28,7 @@ export default class Auth extends Service {
|
||||
const ctx = this.ctx;
|
||||
|
||||
let user = await UserModel.findUserByToken(token);
|
||||
let loginType = 1;
|
||||
|
||||
if (!user) {
|
||||
if(isGuest) {
|
||||
@@ -35,8 +36,13 @@ export default class Auth extends Service {
|
||||
const token = ctx.service.utils.generateStr(256);
|
||||
user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId);
|
||||
let param = this.getReturnParam(user);
|
||||
// TODO 判断同一设备号15天内是否重复使用游客模式
|
||||
if(param.isGuest && param.guestTime > 60*60*1000) {
|
||||
loginType = 2;
|
||||
}
|
||||
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
|
||||
canLogin: true,
|
||||
loginType,
|
||||
...param
|
||||
});
|
||||
} else {
|
||||
@@ -49,8 +55,13 @@ export default class Auth extends Service {
|
||||
const token = ctx.service.utils.generateStr(256);
|
||||
user = await UserModel.updateToken(user.tel, token, deviceId);
|
||||
let param = this.getReturnParam(user);
|
||||
|
||||
if(param.isGuest && param.guestTime > 60*60*1000) {
|
||||
loginType = 2;
|
||||
}
|
||||
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
|
||||
canLogin: true,
|
||||
loginType,
|
||||
...param
|
||||
});
|
||||
}
|
||||
@@ -135,7 +146,11 @@ export default class Auth extends Service {
|
||||
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.resResult(STATUS.SUCCESS);
|
||||
|
||||
let user = await UserModel.findUserByTel(tel);
|
||||
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
|
||||
hasAccount: !!user
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,6 +204,7 @@ export default class Auth extends Service {
|
||||
public async setPassword(password: string) {
|
||||
const { ctx } = this;
|
||||
const { uid } = ctx;
|
||||
if(!password) return ctx.service.utils.resResult(STATUS.PASSWORD_ILLEGEL);
|
||||
|
||||
let user = await UserModel.setPass(uid, password);
|
||||
if (user) {
|
||||
@@ -290,4 +306,66 @@ export default class Auth extends Service {
|
||||
}
|
||||
return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND);
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定账号
|
||||
* @param password 密码
|
||||
*/
|
||||
public async bind(tel: string, code: string, password: string) {
|
||||
const ctx = this.ctx;
|
||||
// 参数检查
|
||||
const telVerify = this.checkTelNo(tel);
|
||||
if (telVerify.status !== 0) {
|
||||
return telVerify;
|
||||
}
|
||||
|
||||
if (!isString(code) || code.length !== 6 || !password) {
|
||||
return ctx.service.utils.resResult(STATUS.WRONG_PARMS);
|
||||
}
|
||||
|
||||
// 手机验证码核验
|
||||
const smsValid: boolean = await smsModel.validateSms(tel, code);
|
||||
if (!smsValid) {
|
||||
const sms = await smsModel.findByTel(tel);
|
||||
if (sms && sms.isFixed) { // 固定手机号登录
|
||||
if (sms.code !== code) {
|
||||
return ctx.service.utils.resResult(STATUS.SMS_INVALID);
|
||||
}
|
||||
} else {
|
||||
return ctx.service.utils.resResult(STATUS.SMS_INVALID);
|
||||
}
|
||||
}
|
||||
|
||||
let telUser = await UserModel.findUserByTel(tel);
|
||||
if(telUser && telUser.uid != ctx.uid) {
|
||||
return ctx.service.utils.resResult(STATUS.TEL_HAS_USED);
|
||||
}
|
||||
|
||||
let user = await UserModel.bindTel(ctx.uid, tel, password);
|
||||
if(!user) return ctx.service.utils.resResult(STATUS.ACCOUNT_NOT_GUEST);
|
||||
let param = this.getReturnParam(user);
|
||||
return ctx.service.utils.resResult(STATUS.SUCCESS, param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实名认证
|
||||
* @param password 密码
|
||||
*/
|
||||
public async authentication(name: string, idNum: string) {
|
||||
const ctx = this.ctx;
|
||||
// TODO 接SDK
|
||||
console.log(name, idNum);
|
||||
|
||||
let birthday = this.getBirthdayByIdCard(idNum);
|
||||
let user = await UserModel.authentication(ctx.uid, birthday, '');
|
||||
let param = this.getReturnParam(user);
|
||||
return ctx.service.utils.resResult(STATUS.SUCCESS, param);
|
||||
}
|
||||
|
||||
private getBirthdayByIdCard(idNum: string) {
|
||||
let year = idNum.slice(6,10);
|
||||
let month = idNum.slice(10,12);
|
||||
let date = idNum.slice(12,14);
|
||||
return `${year}-${month}-${date}`;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user