diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 23cfb5262..55033d709 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -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(); diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 88e3a72d1..b47e4f0f9 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -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: '缺少关卡信息' }, diff --git a/shared/db/Game.ts b/shared/db/Game.ts index f17a0d795..cc751b843 100644 --- a/shared/db/Game.ts +++ b/shared/db/Game.ts @@ -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 = 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; } diff --git a/shared/db/User.ts b/shared/db/User.ts index 7a41edcb7..27f054031 100644 --- a/shared/db/User.ts +++ b/shared/db/User.ts @@ -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, lean = true) { let searchObj = {}; if(field != 'all') { diff --git a/web-server/app/controller/account.ts b/web-server/app/controller/account.ts index 007d6e424..30317ec1f 100644 --- a/web-server/app/controller/account.ts +++ b/web-server/app/controller/account.ts @@ -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); + } } diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index adec9aba6..68e341c33 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -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 = []; - 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 + } + + } diff --git a/web-server/app/router.ts b/web-server/app/router.ts index 15f983671..4f592a5b2 100644 --- a/web-server/app/router.ts +++ b/web-server/app/router.ts @@ -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); }; diff --git a/web-server/app/service/Auth.ts b/web-server/app/service/Auth.ts index a7a4e7891..3e00f1302 100644 --- a/web-server/app/service/Auth.ts +++ b/web-server/app/service/Auth.ts @@ -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}`; + } }