diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index 07080532f..d04334846 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -208,4 +208,10 @@ export default class GameController extends Controller { ctx.body = await ctx.service.game.getDicTaskType(); return } + + public async getServerName() { + const { ctx } = this; + ctx.body = await ctx.service.game.getServerName(); + return + } } diff --git a/gm-server/app/controller/upload.ts b/gm-server/app/controller/upload.ts index e26b9422f..36a8ba1e5 100644 --- a/gm-server/app/controller/upload.ts +++ b/gm-server/app/controller/upload.ts @@ -14,9 +14,9 @@ const hotUpdateAddr = `/root/${folderName}`; const publishPath = '/root/hot_update_backup'; import {exec} from 'child_process' import { reloadResources } from '@pubUtils/data'; +import { decodeArrayStr } from '@pubUtils/util'; const sendToWormhole = require('stream-wormhole'); - export default class UploadController extends Controller { private deleteFolder (path) { @@ -148,7 +148,7 @@ export default class UploadController extends Controller { // 解压上传文件的stream var unzipExtractor = unzip.Extract({ path: dirPath }); unzipExtractor.on('close', function() { - resolve(); + resolve(null); }); unzipExtractor.on('close', function(e) { @@ -170,26 +170,30 @@ export default class UploadController extends Controller { public async uploadJson() { const { ctx } = this; + const parts = ctx.multipart({ }); const files = []; try { let stream; + let writeStream; + while ((stream = await parts()) != null) { + console.log('******', stream); const filename = stream.filename; let filenameWithoutEx = filename?filename.split('.')[0]:''; if (stream.mimeType == 'application/json') { if (filenameWithoutEx.match(/^\d{1,}$/)) { let target1 = path.join(this.config.baseDir, this.warjsonFolder, filename); let target2 = path.join(this.config.baseDir, this.distWarjsonFolder, filename); - const writeStream = fs.createWriteStream(target1); + writeStream = fs.createWriteStream(target1); await pump(stream, writeStream); fs.copyFileSync(target1, target2); files.push(filename); } else { let target1 = path.join(this.config.baseDir, this.jsonFolder, filename); let target2 = path.join(this.config.baseDir, this.distJsonFolder, filename); - const writeStream = fs.createWriteStream(target1); + writeStream = fs.createWriteStream(target1); await pump(stream, writeStream); fs.copyFileSync(target1, target2); files.push(filename); @@ -197,13 +201,23 @@ export default class UploadController extends Controller { } else if (stream.mimeType == 'application/octet-stream') { let target1 = path.join(this.config.baseDir, this.tsFolder, 'dicParam.js'); let target2 = path.join(this.config.baseDir, this.distTsFolder, filename); - const writeStream = fs.createWriteStream(target1); + writeStream = fs.createWriteStream(target1); await pump(stream, writeStream); fs.copyFileSync(target1, target2); files.push(filename); } + + let envs = decodeArrayStr(ctx.request.headers.env||'', ','); + + if(envs.length > 0) { // 转发 + for(let env of envs) { + if(env == ctx.app.config.realEnv) continue; + await ctx.service.utils.transmit(env, ctx.request.url, writeStream); + } + } sendToWormhole(stream); } + }catch(e) { console.error(e); } diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 1332ed1e9..bb858dda3 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -8,7 +8,7 @@ export default (app: Application) => { router.post('/api/login/account', controller.login.login); router.post('/api/login/changeMyPass', tokenParser, controller.login.changeMyPass); router.post('/api/get_route', controller.login.getMenu); - router.get('/api/currentUser', tokenParser, controller.login.currentUser); + router.post('/api/currentUser', tokenParser, controller.login.currentUser); router.post('/api/upload/hotupdate', tokenParser, controller.upload.upload); router.post('/api/upload/uploadjson', tokenParser, controller.upload.uploadJson); router.post('/api/upload/reloadresource', tokenParser, controller.upload.reloadResource); @@ -73,6 +73,7 @@ export default (app: Application) => { router.post('/api/game/getdicrmb', tokenParser, controller.game.getDicRMB); router.post('/api/game/getdicactivitytype', tokenParser, controller.game.getDicActivityType); router.post('/api/game/getdictasktype', tokenParser, controller.game.getDicTaskType); + router.post('/api/game/getservername', controller.game.getServerName) // router.post('/api/game/getserverstategylist', controller.game.getServerStategyList); // router.post('/api/game/updateserverstategy', controller.game.updateServerStategy); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index b0b0e0b54..f628029d4 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -16,6 +16,7 @@ import { nowSeconds } from '@pubUtils/timeUtil'; import { WhiteListModel } from '@db/RegionWhiteList'; import { RoleModel } from '@db/Role'; import { SearchMarqueeParam } from '@domain/backEndField/search'; +import { DicServerName } from '@pubUtils/dictionary/DicServerName'; /** * Test Service @@ -278,6 +279,16 @@ export default class Game extends Service { }) } + public async getServerName() { + let list: DicServerName[] = []; + for(let [_, serverName] of gameData.serverNames) { + list.push(serverName); + } + return this.ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }) + } + 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); diff --git a/gm-server/app/service/Utils.ts b/gm-server/app/service/Utils.ts index 009ae8c1d..09714a08f 100644 --- a/gm-server/app/service/Utils.ts +++ b/gm-server/app/service/Utils.ts @@ -72,4 +72,18 @@ export default class Utils extends Service { log.error(`${message}`); } } + + public async transmit(env: string, route: string, stream: any) { + const { ctx } = this; + console.log('****transmit', stream); + const result = await ctx.curl(`http://127.0.0.1:7002${route}`, { + method: 'POST', + files: stream, + + headers: { + token: ctx.request.headers.token + } + }); + console.log(env, result) + } } diff --git a/gm-server/config/config.default.ts b/gm-server/config/config.default.ts index 65796df9d..5218dfc53 100644 --- a/gm-server/config/config.default.ts +++ b/gm-server/config/config.default.ts @@ -81,6 +81,7 @@ export default (appInfo: EggAppInfo) => { { id: 2, env: 'alpha', name: "测试服", domain: 'http://zyz_gm.trgame.cn' }, { id: 3, env: 'dev', name: "开发服", domain: 'http://zyzdev_gm.trgame.cn' } ]; + config.regions = regions; let httpProxy: any = {}; for(let { env, domain } of regions) { diff --git a/gm-server/config/config.local.ts b/gm-server/config/config.local.ts index 4c8fda355..b80a021ec 100644 --- a/gm-server/config/config.local.ts +++ b/gm-server/config/config.local.ts @@ -22,7 +22,25 @@ export default (appInfo: EggAppInfo) => { url: '127.0.0.1', // 内网 pw: '' }; - config.proxy = {}; + + let regions = [ // 大区数据 + { id: 1, env: 'test', name: "测试", domain: 'http://127.0.0.1:7002' }, + ]; + config.regions = regions; + + let httpProxy: any = {}; + for(let { env, domain } of regions) { + httpProxy[`/api/${env}`] = { + target: domain, + changeOrigin: true, + secure: true, + pathRewrite: function(path) { + console.log('proxy', path, path.replace(`/api/${env}`, '/api')) + return path.replace(`/api/${env}`, '/api') + } + } + } + config.proxy = httpProxy; // the return config will combines to EggAppConfig return { diff --git a/gm-server/package-lock.json b/gm-server/package-lock.json index 93dd3800b..cd2db131b 100644 --- a/gm-server/package-lock.json +++ b/gm-server/package-lock.json @@ -1039,8 +1039,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -2894,7 +2893,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3291,8 +3289,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", @@ -5471,13 +5468,12 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -5488,13 +5484,20 @@ "dev": true }, "formstream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.0.tgz", - "integrity": "sha1-UfOXDyYTbrCtRDBN5M67UCB7RHk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.1.tgz", + "integrity": "sha512-yHRxt3qLFnhsKAfhReM4w17jP+U1OlhUjnKPPtonwKbIJO7oBP0MvoxkRUwb8AU9n0MIkYy5X5dK6pQnbj+R2Q==", "requires": { "destroy": "^1.0.4", - "mime": "^1.3.4", + "mime": "^2.5.2", "pause-stream": "~0.0.11" + }, + "dependencies": { + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + } } }, "fragment-cache": { @@ -7123,7 +7126,8 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, "mime-db": { "version": "1.44.0", @@ -10445,6 +10449,17 @@ "ms": "^2.1.1" } }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", diff --git a/gm-server/package.json b/gm-server/package.json index 66bb370b8..a07fb77f8 100644 --- a/gm-server/package.json +++ b/gm-server/package.json @@ -21,7 +21,9 @@ "lint": "eslint . --ext .ts", "clean": "ets clean", "local": "EGG_SERVER_ENV=local npm run dev", - "prod": "EGG_SERVER_ENV=prod npm run dev" + "prod": "EGG_SERVER_ENV=prod npm run dev", + "deve": "EGG_SERVER_ENV=dev npm run dev", + "dis": "EGG_SERVER_ENV=dis npm run dev" }, "dependencies": { "await-stream-ready": "^1.0.1", @@ -34,6 +36,8 @@ "egg-cors": "^2.2.3", "egg-http-proxy-middleware": "^1.0.3", "egg-scripts": "^2.6.0", + "form-data": "^4.0.0", + "formstream": "^1.1.1", "moment": "^2.29.0", "pump": "^3.0.0", "reflect-metadata": "^0.1.13", diff --git a/shared/db/AccuseRec.ts b/shared/db/AccuseRec.ts index d22d9abad..31f126af0 100644 --- a/shared/db/AccuseRec.ts +++ b/shared/db/AccuseRec.ts @@ -37,7 +37,8 @@ export default class AccuseRec extends BaseModel { } private static getSearchObj(form: {}) { - let searchObj = form; + let searchObj = {}; + console.log(form); return searchObj } @@ -52,6 +53,7 @@ export default class AccuseRec extends BaseModel { sort[sortField] = -1; } } + console.log('page', page, 'pageSize', pageSize, 'sort', sort) const result: AccuseRecType[] = await AccuseRecModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); return result;