diff --git a/game-server/app.ts b/game-server/app.ts index 81f2ae4f2..e385a21da 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -28,6 +28,7 @@ import { updateTeamStatus } from './app/services/comBattleService'; import { resResult, genCode } from './app/pubUtils/util'; import { errlogger, infologger } from './app/util/logger'; import { connectThinkingData, getTire } from './app/services/sdkService'; +import { loadGmDb } from './app/db'; const filePath = (_pinus as any).FILEPATH; filePath.MASTER = '/config/master'; @@ -158,14 +159,17 @@ export function globalErrorHandler(err: Error, msg: any, resp: any, } } -function initMongodb(app: _pinus.Application) { - mongoose.connect(app.get('database').mongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }, (err) => { +async function initMongodb(app: _pinus.Application) { + await mongoose.connect(app.get('database').mongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }, (err) => { if (err) { errlogger.error('mongodb connect err', err); } else { console.log('mongodb connect suc'); } }); + + let gmconnect = await mongoose.createConnection(app.get('database').gmmongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }); + loadGmDb(gmconnect); } function initRedis(app: _pinus.Application) { diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index f4f416311..d1be3ab63 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -251,7 +251,8 @@ export class EntryHandler { // put user into channel return resResult(STATUS.SUCCESS, { - serverType: this.app.get('serverName') + serverType: this.app.get('serverName'), + env: this.app.get('env') }); } diff --git a/game-server/config/database.ts b/game-server/config/database.ts index 2238063f9..432ddce4e 100644 --- a/game-server/config/database.ts +++ b/game-server/config/database.ts @@ -1,37 +1,44 @@ module.exports = { 'development': { 'mongo': 'mongodb://127.0.0.1/zyz', + 'gmmongo': 'mongodb://127.0.0.1/zyzgm', 'redis': '127.0.0.1', 'redispw': 'zyz_2020' }, 'production': { 'mongo': 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_2020' }, 'alpha': { 'mongo': 'mongodb://dbop:zyzDev2021@dds-8vb5c74ba4263da41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb5c74ba4263da42.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb5c74ba4263da43.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?readPreference=secondary&replicaSet=mgset-506991391', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vbl8okinxn1zhkwh2.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_alpha_2021' }, 'dev': { 'mongo': 'mongodb://dbop:zyzDev2021@dds-8vb5c74ba4263da41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb5c74ba4263da42.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb5c74ba4263da43.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?readPreference=secondary&replicaSet=mgset-506991391', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vb418l8kkju9sis8k.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_dev_2021' }, 'isbn': { 'mongo': 'mongodb://root:Bantus123@dds-8vb74337eab84d641.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb74337eab84d642.mongodb.zhangbei.rds.aliyuncs.com:3717/admin?replicaSet=mgset-504694158', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vbekkbb3z8ru2ckuj.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_isbn_2021' }, 'monitor': { 'mongo': 'mongodb://dbop:zyzMon2021@dds-8vb7474e31ba7ed41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb7474e31ba7ed42.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-505529944', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vb130185rp2ir3lqn.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_monitor_2021' }, 'distribute': { 'mongo': 'mongodb://dbop:zyzDev2021@dds-8vb5c74ba4263da41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb5c74ba4263da42.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-506991391', + 'gmmongo': 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', 'redis': 'r-8vb418l8kkju9sis8k.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_dev_2021' } diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index 2fc1d6c5b..cd4089a63 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -3,7 +3,8 @@ module.exports = { 'connector': [ { 'id': 'connector-server-1', 'port': 4050, 'clientHost': '127.0.0.1', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true }, { 'id': 'connector-server-2', 'port': 4051, 'clientHost': '127.0.0.1', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true }, - { 'id': 'connector-server-3', 'port': 4052, 'clientHost': '127.0.0.1', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true } + { 'id': 'connector-server-3', 'port': 4052, 'clientHost': '127.0.0.1', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true }, + { 'id': 'connector-server-gm', 'port': 4099, 'clientHost': '127.0.0.1', 'host': '127.0.0.1', 'clientPort': 3099, 'frontend': true } ], 'chat': [ { 'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050, "args": " --inspect=9237" } diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index 45c0087c4..e4626c312 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -3,12 +3,6 @@ import { STATUS } from '@consts'; export default class GameController extends Controller { - public async getServerEnv() { - const { ctx } = this; - ctx.body = await ctx.service.game.getServerEnv(); - return - } - public async getServerListByEnv() { const { ctx } = this; ctx.body = await ctx.service.game.getServerListByEnv(); @@ -23,6 +17,13 @@ export default class GameController extends Controller { return } + public async getRegions() { + const { ctx } = this; + + ctx.body = await ctx.service.game.getRegions(); + return + } + public async getMaintenanceList() { const { ctx } = this; const {page, pageSize, sortField, sortOrder, form} = ctx.request.body; diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 7aee4e084..af3d0a471 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -50,9 +50,9 @@ export default (app: Application) => { // router.post('/api/users/delgiftCode', controller.users.delGiftCode); router.get('/api/users/getgiftcodedetails/:id/:filename', controller.users.getGiftCodeDetails); - router.post('/api/game/getserverenv', tokenParser, controller.game.getServerEnv); router.post('/api/game/getserverlistbyenv', tokenParser, controller.game.getServerListByEnv); router.post('/api/game/getserverlist', controller.game.getServerList); + router.post('/api/game/getregions', controller.game.getRegions); router.post('/api/game/getmaintenancelist', controller.game.getMaintenanceList); router.post('/api/game/updatemaintenance', controller.game.updateMaintenance); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index 182c66c68..b994ba8f9 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -13,25 +13,13 @@ import { MarqueeModel, MarqueeParam, MarqueeType } from '@db/Marquee'; import { MaintenanceModel, MaintenanceTypeParam } from '@db/Maintenance'; import { GMMailTypeParam, GMMailModel, GMMailType } from '@db/GMMail'; import { AccuseRecModel } from '@db/AccuseRec'; +import { RegionModel } from '@db/Region'; /** * Test Service */ export default class Game extends Service { - /** - * 获取正式服,测试服,开发服等环境 - */ - public async getServerEnv() { - const { ctx, app } = this; - const list = await GameModel.getServerEnvList(); - - return ctx.service.utils.resResult(STATUS.SUCCESS, { - list, - env: app.config.env - }); - } - /** * 获取正式服,测试服,开发服等环境 */ @@ -57,6 +45,16 @@ export default class Game extends Service { }); } + + public async getRegions() { + const { ctx } = this; + + const list = await RegionModel.getAllRegion(); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }); + } + public async getMaintenanceList(page: number, pageSize: number, sortField: string, sortOrder: string, form: { isOpen?: boolean } = {}) { const { ctx } = this; @@ -69,7 +67,7 @@ export default class Game extends Service { return { ...cur, startTime: cur.startTime.getTime(), marquee: marquee?{...marquee, startTime: marquee.startTime.getTime(), endTime: marquee.endTime.getTime()}:null, - notice: notice?{...notice, startTime: notice.startTime.getTime(), endTime: notice.endTime.getTime(), showStartTime: notice.showStartTime.getTime(), showEndTime: notice.showEndTime.getTime()}:null + notice: notice?{...notice, showStartTime: notice.showStartTime.getTime(), showEndTime: notice.showEndTime.getTime()}:null } }), total }); @@ -115,7 +113,7 @@ export default class Game extends Service { await ServerStategyModel.updateServerStategy(values, ctx.user?.uid); } catch(e) { - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, e.stack); + return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, (e).stack); } return ctx.service.utils.resResult(STATUS.SUCCESS); } @@ -130,7 +128,7 @@ export default class Game extends Service { await ServerlistModel.newServer({ name, openTime: new Date(openTime), serverType }, stategy, ctx.user?.uid); } catch(e) { - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, e.stack); + return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, (e).stack); } return ctx.service.utils.resResult(STATUS.SUCCESS); } @@ -153,7 +151,7 @@ export default class Game extends Service { await ServerlistModel.updateByServerId(id, update); } catch(e) { - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, e.stack); + return ctx.service.utils.resResult(STATUS.INTERNAL_ERR, null, (e).stack); } return ctx.service.utils.resResult(STATUS.SUCCESS); } @@ -206,21 +204,21 @@ export default class Game extends Service { }) } - public async getNoticeList(page: number, pageSize: number, sortField: string, sortOrder: string, form: { type?: number, content?: string }) { + public async getNoticeList(page: number, pageSize: number, sortField: string, sortOrder: string, form: { content?: string }) { const { ctx } = this; const list = await NoticeModel.findByCondition(page, pageSize, sortField, sortOrder, form); const total = await NoticeModel.countByCondition( form ) return ctx.service.utils.resResult(STATUS.SUCCESS, { list: list.map(cur => { - return { ...cur, startTime: cur.startTime.getTime(), endTime: cur.endTime.getTime(), showEndTime: cur.showEndTime.getTime(), showStartTime: cur.showStartTime.getTime()} + let env = this.app.config.env; + if(env == 'local') env = 'development'; + return { ...cur, showEndTime: cur.showEndTime.getTime(), showStartTime: cur.showStartTime.getTime(), env} }), total }); } public async updateNotice(id: string|number, params: NoticeTypeParam) { const { ctx } = this; - if(params.startTime) params.startTime = new Date(params.startTime); - if(params.endTime) params.endTime = new Date(params.endTime); if(params.showStartTime) params.showStartTime = new Date(params.showStartTime); if(params.showEndTime) params.showEndTime = new Date(params.showEndTime); let result = await NoticeModel.updateNotice(id, params); diff --git a/gm-server/config/config.default.ts b/gm-server/config/config.default.ts index 7fde84f9d..83153c182 100644 --- a/gm-server/config/config.default.ts +++ b/gm-server/config/config.default.ts @@ -72,14 +72,14 @@ export default (appInfo: EggAppInfo) => { maxFileSize: 1024, }; - config.bigServers = [ // 大区数据 + let regions = [ // 大区数据 { id: 1, env: 'stable', name: "常山少年", domain: 'http://pinus_gm_test.trgame.cn' }, { id: 2, env: 'alpha', name: "测试服", domain: 'http://zyz_gm.trgame.cn' }, { id: 3, env: 'dev', name: "开发服", domain: 'http://zyzdev_gm.trgame.cn' } ]; let httpProxy: any = {}; - for(let { env, domain } of config.bigServers) { + for(let { env, domain } of regions) { httpProxy[`/api/${env}`] = { target: domain, changeOrigin: true, @@ -90,7 +90,6 @@ export default (appInfo: EggAppInfo) => { } } } - config.proxy = httpProxy; // the return config will combines to EggAppConfig return { diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 8fbafede1..23477c89c 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -47,6 +47,7 @@ export const COUNTER = { NOTICE: { name: 'notice', def: 1 }, GIFT_CODE: { name: 'giftCode', def: 1 }, PVP_SEASON_NUM: { name: 'pvpSeason', def: 1 }, + REGION: { name: 'region', def: 1 } }; export const DEFAULT_HEROES = [19, 53,]; diff --git a/shared/db/Notice.ts b/shared/db/Notice.ts index 04563c953..7aca704a1 100644 --- a/shared/db/Notice.ts +++ b/shared/db/Notice.ts @@ -2,7 +2,6 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; import { COUNTER } from '../consts' import { CounterModel } from './Counter'; -import moment = require('moment'); /** * 游戏字段接口 @@ -24,15 +23,8 @@ export default class Notice extends BaseModel { @prop({ required: true }) timeStr: string; // 时间显示 - @prop({ required: true }) - startTime: Date; // 活动开始时间 - @prop({ required: true }) - endTime: Date; // 活动结束时间 public get time() { - let startTime = moment(this.startTime).format('YYYY/MM/DD'); - let endTime = moment(this.endTime).format('YYYY/MM/DD'); - - return this.timeStr.replace(/%startTime/g, startTime).replace(/%endTime/g, endTime); + return this.timeStr; } @prop({ required: true, select: false }) @@ -73,7 +65,6 @@ export default class Notice extends BaseModel { private static getSearchObj(form: { type?: number, content?: string }) { let searchObj = {}; - if(form['type']) searchObj['type'] = form.type; if(form['content']) searchObj['content'] = { $regex: new RegExp(form.content.toString(), 'i') }; return searchObj } diff --git a/shared/db/Region.ts b/shared/db/Region.ts new file mode 100644 index 000000000..401e4762d --- /dev/null +++ b/shared/db/Region.ts @@ -0,0 +1,60 @@ +import { COUNTER } from './../consts'; +import { CounterModel } from './Counter'; +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose'; + + +/** + * 大区数据 +*/ +@index({ id: 1 }) + +export default class Region extends BaseModel { + @prop({ required: true }) + id: number; // 大区id + + @prop({ required: true }) + name: string; // 大区名 + + @prop({ required: true }) + prefix: string; // 区名前缀 + + @prop({ required: true }) + env: string; // 环境变量 + + @prop({ required: true }) + gmLink: string; // 短链接地址 + + @prop({ required: true }) + gameHost: string; // 长链接地址 + + @prop({ required: true }) + gamePort: number; // 长链接地址 + + public static async createNewRegion(params: RegionUpdate) { + let id = await CounterModel.getNewCounter(COUNTER.REGION); + + const rec: RegionType = await RegionModel.findOneAndUpdate({ id }, { $setOnInsert: params }, { new: true, upsert: true }).lean(); + return rec; + } + + public static async getAllRegion() { + const rec: RegionType[] = await RegionModel.find().select('-_id').lean(); + return rec; + } + + public static async findRegionById(id: number) { + const rec: RegionType = await RegionModel.findOne({ id }).lean(); + return rec; + } +} + +export let RegionModel: ReturnModelType; +export function loadRegionModel(connect: mongoose.Connection) { + RegionModel = getModelForClass(Region, { + existingConnection: connect + }); +} + +export interface RegionType extends Pick, keyof Region> { }; +export type RegionUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/Serverlist.ts b/shared/db/Serverlist.ts index a4c593518..8157357b8 100644 --- a/shared/db/Serverlist.ts +++ b/shared/db/Serverlist.ts @@ -1,13 +1,11 @@ import BaseModel from './BaseModel'; -import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; +import { index, getModelForClass, prop, DocumentType, modelOptions, ReturnModelType, mongoose } from '@typegoose/typegoose'; import { GameModel } from './Game'; import { CounterModel } from './Counter'; import { COUNTER, SERVER_STATUS } from '../consts'; import { ServerStategyTypeParam } from './ServerStategy'; import { getServerName, getServerGroupName } from '../pubUtils/data'; -// 暂时服务器列表是从game表取的,之后会转移到使用这张表,目前用作查询该服战力中位数 - /** * 游戏字段接口 */ @@ -18,6 +16,15 @@ export default class Serverlist extends BaseModel { @prop({ required: true, default: 1 }) gameId: number; // 游戏id Game表的id + @prop({ required: true, default: 1 }) + regionId: number; // 大区id + + @prop({ required: true }) + env: string; // 环境变量 + + @prop({ required: true }) + serverType: string; + @prop({ required: true }) id: number; // 小区id 自增 @@ -28,10 +35,10 @@ export default class Serverlist extends BaseModel { name: string; // 小区区名 @prop({ required: true }) - groupId: number; // 大区id + groupId: number; // 战区id @prop({ required: true }) - groupName: string; // 大区区名 + groupName: string; // 战区区名 @prop({ required: true }) host: string; // pinus连接地址 @@ -57,9 +64,6 @@ export default class Serverlist extends BaseModel { @prop({ required: true }) openTime: Date; - @prop({ required: true }) - serverType: string; - @prop({ required: true, default: 0 }) maxPlayerCnt: number; // 最大玩家人数 @@ -183,7 +187,12 @@ export default class Serverlist extends BaseModel { } -export const ServerlistModel = getModelForClass(Serverlist); +export let ServerlistModel: ReturnModelType; +export function loadServerlistModel(connect: mongoose.Connection) { + ServerlistModel = getModelForClass(Serverlist, { + existingConnection: connect + }); +} export interface ServerlistType extends Pick, keyof Serverlist> { id: number; diff --git a/shared/db/index.ts b/shared/db/index.ts index 2a554d3b4..e39f504b1 100644 --- a/shared/db/index.ts +++ b/shared/db/index.ts @@ -4,6 +4,8 @@ import { loadGMGroupModel } from "./GMGroup"; import { loadGMRecordModel } from "./GMRecord"; import { loadGMUserModel } from './GMUser' import { loadGMUserGroupModel } from "./GMUserGroup"; +import { loadRegionModel } from "./Region"; +import { loadServerlistModel } from "./Serverlist"; export function loadGmDb(connect: mongoose.Connection) { loadApiModel(connect); @@ -11,4 +13,6 @@ export function loadGmDb(connect: mongoose.Connection) { loadGMUserModel(connect); loadGMUserGroupModel(connect); loadGMRecordModel(connect); + loadRegionModel(connect); + loadServerlistModel(connect); } \ No newline at end of file