后台:服务器维护

This commit is contained in:
luying
2021-12-08 10:25:21 +08:00
parent 103314a8bf
commit 22f8d3c438
29 changed files with 512 additions and 343 deletions

View File

@@ -707,6 +707,7 @@ export enum SERVER_STATUS {
HOT = 2, // 火爆
WILL_OPEN = 3, // 即将开启
MAINTENANCE = 4, // 维护中
HIDE = 0, // 隐藏
}
export enum WHITE_LIST_TYPE {

View File

@@ -1,5 +1,5 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, ReturnModelType, mongoose } from '@typegoose/typegoose';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
/**
* 自增 ID

View File

@@ -23,8 +23,6 @@ export class Receiver {
roleId?: string;
@prop({ required: true })
roleName?: string;
@prop({ required: true })
hasSend?: boolean;
}
export default class GMMail extends BaseModel {

View File

@@ -1,107 +0,0 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose';
import Marquee, { MarqueeType } from './Marquee';
import Notice, { NoticeType } from './Notice';
import GMMail from './GMMail';
import { genCode } from '../pubUtils/util';
import { GMMailType } from './GMMail';
/**
* 开服策略
*/
@index({ id: 1 })
export default class Maintenance extends BaseModel {
@prop({ required: true })
code: string; // 策略唯一标志
@prop({ required: true, type: Number })
serverIds: number[]; // 服务器类型
@prop({ required: true })
isOpen: boolean; // 维护是否使用
@prop({ required: true })
startTime: Date; // 维护开始时间
@prop({ ref: () => Marquee, type: mongoose.Schema.Types.ObjectId })
marquee: Ref<Marquee>; // 跑马灯连接到marquee表
@prop({ ref: () => Notice, type: mongoose.Schema.Types.ObjectId })
notice: Ref<Notice>; // 维护公告
@prop({ ref: () => GMMail, type: mongoose.Schema.Types.ObjectId })
mail: Ref<GMMail>; // 维护结束邮件
public static async createData(values: MaintenanceTypeParam, marquee: MarqueeType, notice: NoticeType, mail: GMMailType, uid = 1) {
const code = genCode(8);
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, {
$setOnInsert: {...values, code, isOpen: false, marquee: marquee._id, notice: notice._id, mail: mail._id, createdBy: uid}, $set: { updatedBy: uid }
}, { new: true, upsert: true }).lean();
return rec;
}
public static async updateData(code: string, values: MaintenanceTypeParam, uid = 1) {
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { ...values, updatedBy: uid } }, { new: true, upsert: true })
.populate('marquee', 'code')
.populate('notice')
.populate('mail')
.lean();
return rec;
}
public static async findOpenMaintenance() {
const rec: MaintenanceType = await MaintenanceModel.findOne({ isOpen: true }, { _id: 0 }).populate('marquee').populate('notice').populate('mail').lean();
return rec;
}
public static async findByCode(code: string) {
const rec: MaintenanceType = await MaintenanceModel.findOne({ code }).populate('marquee').populate('notice').populate('mail').lean();
return rec;
}
public static async updateStatusByCode(code: string, isOpen: boolean, uid = 1) {
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { isOpen, updatedBy: uid } }).populate('marquee').populate('notice').populate('mail').lean();
return rec;
}
private static getSearchObj(form: { isOpen?: boolean }) {
let searchObj = {};
if (form.isOpen) searchObj['isOpen'] = form.isOpen;
return searchObj
}
public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { isOpen?: boolean } = {}) {
let searchObj = this.getSearchObj(form);
let sort = {};
if (sortField && sortOrder) {
if (sortOrder == 'ascend') {
sort[sortField] = 1;
} else if (sortOrder == 'descend') {
sort[sortField] = -1;
}
}
const result: MaintenanceType[] = await MaintenanceModel.find(searchObj, { _id: 0 })
.populate('marquee').populate('notice', '+showStartTime +showEndTime').populate('mail')
.limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
return result;
}
public static async countByCondition(form: { isOpen?: boolean } = {}) {
let searchObj = this.getSearchObj(form);
const result = await MaintenanceModel.count(searchObj);
return result;
}
}
export const MaintenanceModel = getModelForClass(Maintenance);
export interface MaintenanceType extends Pick<DocumentType<Maintenance>, keyof Maintenance> { }
export type MaintenanceTypeParam = Partial<MaintenanceType>; // 将所有字段变成可选项

View File

@@ -3,6 +3,7 @@ import { CounterModel } from './Counter';
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';
import ServerStategy from './ServerStategy';
import { ServerlistType } from './Serverlist';
/**
@@ -35,6 +36,9 @@ export default class Region extends BaseModel {
@prop({ required: true })
latestServer: number; // 最新服
@prop({ required: true })
latestServerUniqId: number; // 最新服唯一id
@prop({ required: true })
serverCount: number; // 总数
@@ -56,6 +60,13 @@ export default class Region extends BaseModel {
return rec;
}
public static async newServer(id: number, newServer: ServerlistType, uid = 1) {
const rec: RegionType = await RegionModel.findOneAndUpdate({ id }, {
$set: { latestServer: newServer.serverId, latestServerUniqId: newServer.id, updatedBy: uid },
$inc: { serverCount: 1 }
}, { new: true }).lean();
return rec;
}
public static async getAllRegion() {
const rec: RegionType[] = await RegionModel.find().select('-_id -stategy').lean();
return rec;

View File

@@ -5,11 +5,31 @@ import { COUNTER, SERVER_STATUS } from '../consts';
import { CreateServerParam } from '../domain/backEndField/params';
import { RegionType } from './Region';
import { DicServerName } from '../pubUtils/dictionary/DicServerName';
import { nowSeconds } from '../pubUtils/timeUtil';
export class Maintenance {
@prop({ required: true })
batchCode: string; // 批次,如果是从大区列表维护就是一批的,小区列表上就是一服一个
@prop({ required: true })
isOpen: boolean; // 维护是否使用
@prop({ required: true })
startTime: number; // 维护开始时间
@prop({ required: true })
endTime: number; // 维护结束时间
@prop({ required: true })
hasNotify: boolean; // 是否有维护通知
}
/**
* 游戏字段接口
*/
@index({ id: 1 })
@index({ env: 1 })
@modelOptions({ schemaOptions: { id: false } })
export default class Serverlist extends BaseModel {
@@ -23,7 +43,7 @@ export default class Serverlist extends BaseModel {
prefix: string; // 前缀
@prop({ required: true })
id: number; // 小区id 自增
id: number; // 小区id 自增全大区共用自增counter玩家role表中存的就是这个serverId
@prop({ required: true })
serverId: number; // 相同serverType下的id不同serverType下id一定不同但是serverId可能相同
@@ -44,8 +64,7 @@ export default class Serverlist extends BaseModel {
activityGroupId: number[]; // 活动组
public get status() {
let now = new Date();
if (now > this.openTime) {
if (nowSeconds() > this.openTime) {
return this.serverStatus;
} else {
return SERVER_STATUS.WILL_OPEN; // 未开服
@@ -53,10 +72,10 @@ export default class Serverlist extends BaseModel {
}
@prop({ required: true })
openTime: Date;
openTime: number;
@prop({ required: true })
stopRegisterTime: Date;
stopRegisterTime: number;
@prop({ required: true, default: true })
canRegister: boolean;
@@ -67,6 +86,9 @@ export default class Serverlist extends BaseModel {
@prop({ required: true, default: 0 })
medianCe: number; // 中位数武将战力、缩小10000倍后的结果
@prop({ required: true, type: Maintenance, _id: false })
maintenance: Maintenance
public static async getAllServerList() {
let id = await CounterAllModal.getCounter(COUNTER.SERVER);
let result: ServerlistType[] = [];
@@ -79,7 +101,7 @@ export default class Serverlist extends BaseModel {
}
public static async findByServerId(serverId: number) {
let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).select('medianCe activityGroupId').lean({ getters: true, virtuals: true });
let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).lean({ getters: true, virtuals: true });
return server;
}
@@ -89,7 +111,7 @@ export default class Serverlist extends BaseModel {
}
public static async updateByServerId(serverId: number, update: ServerlistUpdate) {
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }).lean({ getters: true, virtuals: true });
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }, {new: true}).lean({ getters: true, virtuals: true });
return server;
}
@@ -98,19 +120,13 @@ export default class Serverlist extends BaseModel {
return result;
}
public static async updateGroupName(groupId: number, groupName: string) {
let server = await ServerlistModel.updateMany({ groupId }, { $set: { groupName } });
return server;
}
public static async newServer(params: CreateServerParam, region: RegionType, dicServerName: DicServerName, uid = 1 ) {
let { prefix, id: regionId, env } = region;
// 分大区
let id = await CounterAllModal.getNewCounter(COUNTER.SERVER);
let { openTime: openTimeNum, stopRegisterTime: hour, activityGroupId } = params;
let { openTime, stopRegisterTime: hour, activityGroupId } = params;
let { id: serverId, sname: name, groupId, groupName } = dicServerName;
let openTime = new Date(openTimeNum * 1000);
let stopRegisterTime = new Date(openTimeNum + hour * 60 * 60);
let stopRegisterTime = openTime + hour * 60 * 60;
const doc = new ServerlistModel();
const update = Object.assign(doc.toJSON(), {
@@ -124,49 +140,11 @@ export default class Serverlist extends BaseModel {
return server;
}
public static async findByServerType(serverType?: string) {
let condition = {};
if(serverType) {
condition['serverType'] = serverType;
}
let server: ServerlistType[] = await ServerlistModel.find(condition).sort({ id: -1 }).lean({ getters: true, virtuals: true });
public static async findByEnv(env?: string) {
let server: ServerlistType[] = await ServerlistModel.find({ env, serverStatus: { $gt: 0 } }).sort({ id: -1 }).lean({ getters: true, virtuals: true });
return server;
}
private static getSearchObj(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string }) {
let searchObj = {};
if (form.id != undefined) searchObj['id'] = form.id;
if (form.serverId != undefined) searchObj['serverId'] = form.serverId;
if (form.groupId != undefined) searchObj['groupId'] = form.groupId;
if (form.name != undefined) searchObj['name'] = { $regex: new RegExp(form.name.toString(), 'i') };
if (form.groupName != undefined) searchObj['groupName'] = { $regex: new RegExp(form.groupName.toString(), 'i') };
if (form.serverType != undefined) searchObj['serverType'] = form.serverType;
return searchObj
}
public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) {
let searchObj = this.getSearchObj(form);
let sort = {};
if(sortField && sortOrder) {
if(sortOrder == 'ascend') {
sort[sortField] = 1;
} else if (sortOrder == 'descend') {
sort[sortField] = -1;
}
}
const result: ServerlistType[] = await ServerlistModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
return result;
}
public static async countByCondition(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) {
let searchObj = this.getSearchObj(form);
const result = await ServerlistModel.count(searchObj);
return result;
}
//根据多个活动id查询活动数据
public static async findServerByIds(ids: number[]) {
let result: ServerlistType[] = await ServerlistModel.find({ id: { $in: ids } }).lean();

View File

@@ -10,6 +10,7 @@ import { loadGMMailModel } from './GMMail';
import { loadCounterModal } from "./CounterAll";
export function loadGmDb(connect: mongoose.Connection) {
// console.log('************')
loadApiModel(connect);
loadGMGroupModel(connect);
loadGMUserModel(connect);

View File

@@ -121,7 +121,9 @@ export class CreateServerParam {
env: string = '';
openTime: number = 0;
activityGroupId: number[] = [];
hasOpenMail: boolean = false;
openMail?: GMMail;
hasCircleMail: boolean = false;
circleMail?: GMMail;
stopRegisterTime: number = 0;
@@ -135,6 +137,8 @@ export class CreateServerParam {
if(!this.env || !this.openTime || !this.stopRegisterTime || !isArray(this.activityGroupId) || this.activityGroupId.length <= 0 ) {
return false
}
if(this.hasOpenMail && !this.openMail) return false;
if(this.hasCircleMail && !this.circleMail) return false;
return true;
}
}

View File

@@ -1,5 +1,4 @@
import { RoleType } from '../../db/Role';
import { getSeconds } from '../../pubUtils/timeUtil';
import { ServerlistType } from '../../db/Serverlist';
export class ServerParam {
@@ -15,10 +14,10 @@ export class ServerParam {
constructor(server: ServerlistType) {
this.id = server.id;
this.serverId = server.serverId;
this.serverStr = `S${server.serverId}`;
this.serverStr = `${server.prefix}${server.serverId}`;
this.name = server.name;
this.status = server.status;
this.openTime = getSeconds(server.openTime);
this.openTime = server.openTime;
}
}
@@ -31,15 +30,17 @@ export class GroupParam {
constructor(server: ServerlistType) {
this.groupId = server.groupId;
this.groupName = server.groupName;
this.groupStr = `S${server.serverId}-S${server.serverId + 9}`;
this.groupStr = `${server.prefix}${server.serverId}`;
this.servers = new Array<ServerParam>();
}
public pushServer(server: ServerlistType) {
let srv = new ServerParam(server);
this.servers.push(srv);
let min = this.servers.reduce((pre, cur) => pre < cur? pre: cur);
this.groupStr = `${min.serverId}-${min.serverId + 9}`
this.servers.sort((a, b) => b.serverId - a.serverId);
let min = this.servers[this.servers.length - 1];
let max = this.servers[0];
this.groupStr = `${min.serverStr}-${max.serverStr}`
}
}