diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index fd474fde6..8b6f98397 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -57,6 +57,30 @@ export default class GameController extends Controller { return } + // getPackages + public async getPackages() { + const { ctx } = this; + const { regionId, pid, gid, pkgName } = ctx.request.body; + ctx.body = await ctx.service.game.getPackages({ regionId, pid, gid, pkgName }); + return; + } + + // createNewPackage + public async createNewPackage() { + const { ctx } = this; + const { regionId, pkgName, pkgDesc, pid, gid, isOpen } = ctx.request.body; + ctx.body = await ctx.service.game.createNewPackage(regionId, pid, gid, pkgName, pkgDesc, isOpen); + return; + } + + // editPackage + public async editPackage() { + const { ctx } = this; + const { regionId, pkgName, pkgDesc, pid, gid, isOpen } = ctx.request.body; + ctx.body = await ctx.service.game.editPackage(regionId, pid, gid, pkgName, pkgDesc, isOpen); + return; + } + public async getChannelInfo() { const { ctx } = this; diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index d4f81e316..88547d23b 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -46,6 +46,9 @@ export default (app: Application) => { router.post('/api/game/getregions', tokenParser, controller.game.getRegions); router.post('/api/game/createregion', tokenParser, controller.game.createRegion); router.post('/api/game/getservers', tokenParser, controller.game.getServers); + router.post('/api/game/getpackages', tokenParser, controller.game.getPackages); + router.post('/api/game/createnewpackage', tokenParser, controller.game.createNewPackage); + router.post('/api/game/editpackage', tokenParser, controller.game.editPackage); router.post('/api/game/getOnlineUsersByServer', controller.game.getOnlineUsersByServer); router.post('/api/game/getregionstategy', tokenParser, controller.game.getRegionStategy); router.post('/api/game/getwhitelist', tokenParser, controller.game.getWhiteList); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index 811e6825a..9cf6e5c41 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -1,3 +1,4 @@ +import { PackageModel } from '@db/Package'; import { Service } from 'egg'; import { REDIS_KEY, STATUS } from '@consts'; import { ServerlistModel } from '@db/Serverlist'; @@ -66,6 +67,41 @@ export default class Game extends Service { }); } + // 获取推广包 + public async getPackages(queryParams: {regionId: number, pkgName: string, gid: string, pid: string}) { + const { ctx } = this; + const list = await PackageModel.getPackagesByQuery(queryParams); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }); + } + + // 创建新的推广包 + public async createNewPackage(regionId: number, pid: string, gid: string, pkgName: string, pkgDesc: string, isOpen = true) { + const { ctx } = this; + const packageInfo = await PackageModel.createNewPackage({regionId, pkgName, pkgDesc, pid, gid, isOpen}, ctx.user?.uid); + if (!packageInfo) { + return ctx.service.utils.resResult(STATUS.PACKAGE_CREATE_FAILED); + } + const list = await PackageModel.getAllPackagesByRegionId(regionId); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }); + } + + // 更新推广包 + public async editPackage(regionId: number, pid: string, gid: string, pkgName: string, pkgDesc: string, isOpen = true) { + const { ctx } = this; + const packageInfo = await PackageModel.updatePackage({regionId, pkgName, pkgDesc, pid, gid, isOpen}, ctx.user?.uid); + if (!packageInfo) { + return ctx.service.utils.resResult(STATUS.PACKAGE_UPDATE_FAILED); + } + const list = await PackageModel.getAllPackagesByRegionId(regionId); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }); + } + public async getChannelInfo() { const { ctx } = this; diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index c06c0d642..ac5530b19 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -24,6 +24,10 @@ export const STATUS = { UPDATE_INFO_ERR: {code: 1004, simStr: '热更新配置错误'}, DEBUG_FUNCTION_ERR: {code: 1005, simStr: '功能逻辑已改,debug接口不再提供'}, DEVELOP_ONLY: {code: 1006, simStr: '只有测试环境才可以使用该接口'}, + PACKAGE_NOT_FOUND: {code: 1007, simStr: '您的版本未被支持,请前往应用商店重新下载或联系客服解决'}, + REGION_NOT_FOUND: {code: 1008, simStr: '未找到此版本对应区服'}, + PACKAGE_CREATE_FAILED: {code: 1009, simStr: '创建子包失败'}, + PACKAGE_UPDATE_FAILED: {code: 1010, simStr: '更新子包失败'}, // http请求 REQUEST_TIME_OUT: { code: 2000, simStr: '请求超时' }, diff --git a/shared/db/Package.ts b/shared/db/Package.ts new file mode 100644 index 000000000..45e47b836 --- /dev/null +++ b/shared/db/Package.ts @@ -0,0 +1,95 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose'; +import { genCode } from '../pubUtils/util'; + +/** + * 推广包数据 +*/ +@index({ gid: 1, pid: 1 }) + +export default class Package extends BaseModel { + @prop({ required: true }) + regionId: number; // 大区id + + // @prop({ required: true }) + // regionName: string; // 大区名 + + @prop({ required: true }) + packageCode: string; // 包唯一 id + + @prop({ required: true }) + gid: string; // 37 childGameId + + @prop({ required: true }) + pid: string; // 37 platformId + + @prop({ required: true }) + pkgName: string; // 包名 + + @prop({ required: true }) + pkgDesc: string; // 包描述 + + @prop({ required: true, default: false }) + isOpen: boolean; // 是否开启 + + public static async createNewPackage(params: PackageUpdate, uid = 1) { + const { gid, pid } = params; + let rec: PackageType | null = await PackageModel.findOne({ gid, pid }).lean(); + if (rec) { + return rec; + } + const packageCode = genCode(6); + rec = await PackageModel.findOneAndUpdate({ gid, pid }, { $setOnInsert: { ...params, packageCode, createdBy: uid}, $set: { updatedBy: uid } }, { new: true, upsert: true }).lean(); + return rec; + } + + // 更新推广包的可更新字段 + public static async updatePackage(params: PackageUpdate, uid = 1) { + const { gid, pid, regionId } = params; + if (!gid || !pid || !regionId) { + return null; + } + const rec: PackageType | null = await PackageModel.findOneAndUpdate({ gid, pid, regionId }, { $set: { ...params, updatedBy: uid } }, { new: true }).lean(); + return rec; + } + + public static async getPackageByGidPid(gid: string, pid: string, isOpen = true) { + const rec: PackageType | null = await PackageModel.findOne({ gid, pid, isOpen }).lean(); + return rec; + } + + // 获取所有包 + public static async getAllPackages() { + const recs: PackageType[] = await PackageModel.find().lean(); + return recs; + } + + // 根据大区id获取所有包 + public static async getAllPackagesByRegionId(regionId: number) { + const recs: PackageType[] = await PackageModel.find({ regionId }).lean(); + return recs; + } + + // 获取符合查询条件的子包 + public static async getPackagesByQuery(params: PackageUpdate) { + const queryParams = Object.keys(params).reduce((acc, key) => { + if (!!params[key]) { + acc[key] = params[key]; + } + return acc; + }, {}); + const recs: PackageType[] = await PackageModel.find(queryParams).lean(); + return recs; + } + +} + +export let PackageModel: ReturnModelType; +export function loadPackageModel(connect: mongoose.Connection) { + PackageModel = getModelForClass(Package, { + existingConnection: connect + }); +} + +export interface PackageType extends Pick, keyof Package> { }; +export type PackageUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/db/index.ts b/shared/db/index.ts index acb7074ba..8d5cfb6e7 100644 --- a/shared/db/index.ts +++ b/shared/db/index.ts @@ -12,6 +12,7 @@ import { loadActivityGroup } from "./ActivityGroup"; import { loadActivityGroupType } from "./ActivityGroupType"; import { loadActivityTaskPoint } from "./ActivityTaskPoint"; import { loadChannelInfo } from "./ChannelInfo"; +import { loadPackageModel } from "./Package"; export function loadGmDb(connect: mongoose.Connection) { // console.log('************') @@ -28,4 +29,5 @@ export function loadGmDb(connect: mongoose.Connection) { loadMarqueeModel(connect); loadActivityTaskPoint(connect); loadChannelInfo(connect); + loadPackageModel(connect); } \ No newline at end of file diff --git a/shared/resource/jsons/dic_api.json b/shared/resource/jsons/dic_api.json index 73a706c58..0d0f80fbc 100644 --- a/shared/resource/jsons/dic_api.json +++ b/shared/resource/jsons/dic_api.json @@ -950,5 +950,27 @@ "name": "武将所有装备强化、升品、升星到当前最高", "module": "user", "type": "update" + }, + { + "id": 137, + "api": "/api/game/getpackages", + "name": "获取大区的子包", + "module": "server", + "type": "find" + }, + { + "id": 138, + "api": "/api/game/createnewpackage", + "name": "创建一个新的子包", + "module": "server", + "type": "find" + }, + { + "id": 139, + "api": "/api/game/editpackage", + "name": "编辑子包", + "module": "server", + "type": "find" } + ] \ No newline at end of file diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index 7256f9ce1..1e9edaf40 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -19,6 +19,7 @@ import { getLocalRplUrl, getRemoteRplUrl } from 'app/pubUtils/battleUtils' import { ChannelInfoModel } from '@db/ChannelInfo'; import { GVGVestigeRecModel } from '@db/GVGVestigeRec'; import { GVGBattleRecModel } from '@db/GVGBattleRec'; +import { PackageModel } from '@db/Package'; const sendToWormhole = require('stream-wormhole'); const pump = require('mz-modules/pump'); @@ -278,4 +279,28 @@ export default class GameController extends Controller { ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { rplUrl: remoteUrl }); return; } + + // 根据 pid 和 gid 获取大区地址 + public async getRegionAddr() { + const { ctx } = this; + const { pid, gid } = ctx.request.body; + if (!pid || !gid) { + ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); + return; + } + const pkg = await PackageModel.getPackageByGidPid(gid, pid); + if (!pkg) { + ctx.body = ctx.service.utils.resResult(STATUS.PACKAGE_NOT_FOUND); + return; + } + const { regionId } = pkg; + const region = await RegionModel.findRegionById(regionId); + if (!region) { + ctx.body = ctx.service.utils.resResult(STATUS.REGION_NOT_FOUND); + return; + } + const { webHost } = region; + ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { webHost }); + return; + } } diff --git a/web-server/app/router.ts b/web-server/app/router.ts index 725f9fda6..476e51629 100644 --- a/web-server/app/router.ts +++ b/web-server/app/router.ts @@ -30,6 +30,7 @@ export default (app: Application) => { router.post('/update/getupdateurl', controller.update.getUpdateUrl); router.post('/web/reloadresource', app.middleware.gmTokenParser(), controller.game.reloadResource); router.post('/web/upload', controller.game.upload); + router.post('/game/getregionaddr', controller.game.getRegionAddr); // sdk 回调