diff --git a/game-server/app.ts b/game-server/app.ts index 9cc8b6505..d61360f4d 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -126,7 +126,7 @@ app.configure(ALL_ENVS, 'guild', function () { }) app.configure(ALL_ENVS, 'systimer', function () { - app.afterStart(async () => { + app.event.on('start_all', async (servers) => { await redisService.initAllRank(); await timeTaskService.init(); redisService.redisSubScribe(); diff --git a/game-server/app/servers/gm/handler/gmRoleHandler.ts b/game-server/app/servers/gm/handler/gmRoleHandler.ts index 60249fcaf..0db0d7324 100644 --- a/game-server/app/servers/gm/handler/gmRoleHandler.ts +++ b/game-server/app/servers/gm/handler/gmRoleHandler.ts @@ -1,12 +1,21 @@ import { Application, BackendSession, pinus } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; -import { getRoleOnlineInfo } from '../../../services/redisService'; +import { getRoleOnlineInfo, updateUserInfo } from '../../../services/redisService'; import { addItems, createHeroes } from '../../../services/rewardService'; import { RewardInter } from '../../../pubUtils/interface'; import { getExpByLv } from '../../../pubUtils/data'; -import { RoleModel } from '../../../db/Role'; -import { BLOCK_TYPE, ITEM_CHANGE_REASON } from '../../../consts'; +import { RoleModel, RoleType } from '../../../db/Role'; +import { BLOCK_TYPE, GUILD_DISMISS_WAY, GUILD_STRUCTURE, ITEM_CHANGE_REASON, REDIS_KEY, TA_EVENT } from '../../../consts'; +import { GuildFormParam } from '../../../domain/backEndField/params'; +import { GuildModel, GuildUpdateParam } from '../../../db/Guild'; +import { getGuildChannelSid } from '../../../services/chatService'; +import { pushGuildNoticeUpdateMsg } from '../../../services/sysChatService' +import { Rank } from '../../../services/rankService'; +import { UserGuildModel } from '../../../db/UserGuild'; +import { UserGuildApplyModel } from '../../../db/UserGuildApply'; +import { reportTAEvent } from '../../../services/sdkService'; + let timer: NodeJS.Timer; export default function (app: Application) { return new GmRoleHandler(app); @@ -57,4 +66,94 @@ export class GmRoleHandler { } return resResult(STATUS.SUCCESS); } + + async updateGuild(msg: GuildFormParam, session: BackendSession ) { + const uid = session.get('uid'); + let params = new GuildFormParam(msg); + if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS); + + let guild = await GuildModel.findByCode(params.code); + let structure = guild.structure||[]; + + let updateParams: GuildUpdateParam = { code: params.code }; + if(params.name && guild.name != params.name) updateParams.name = params.name; + if(params.fund != undefined && guild.fund != params.fund) updateParams.fund = params.fund; + if(params.notice && guild.notice != params.notice) updateParams.notice = params.notice; + if(params.lv && guild.lv != params.lv) updateParams.lv = params.lv; + for(let id = GUILD_STRUCTURE.START; id < GUILD_STRUCTURE.END; id ++) { + let curStructure = structure.find(cur => cur.id == id); + let lv = params.lv; + switch(id) { + case GUILD_STRUCTURE.ARMY_CENTER: + lv = params.lv; break; + case GUILD_STRUCTURE.EQUIP_PRODUCE: + lv = params.equipProduce; break; + case GUILD_STRUCTURE.BOSS: + lv = params.boss; break; + case GUILD_STRUCTURE.TRAIN: + lv = params.train; break; + case GUILD_STRUCTURE.DONATE: + lv = params.donate; break; + case GUILD_STRUCTURE.WISH_POOL: + lv = params.wishPool; break; + case GUILD_STRUCTURE.STORE: + lv = params.store; break; + } + if(curStructure) { + curStructure.lv = lv; + } else { + structure.push({ id, lv }); + } + } + updateParams.structure = structure; + let chatSid = await getGuildChannelSid(params.code); + console.log('*****', params.code, updateParams) + this.app.rpc.chat.guildRemote.updateInfo.toServer(chatSid, params.code, updateParams); + // 设置玩家名 + if(updateParams.name != undefined || updateParams.lv != undefined) { + let arr = []; + if(updateParams.name != undefined) arr.push({ field: 'name', value: updateParams.name }); + if(updateParams.lv != undefined) arr.push({ field: 'lv', value: updateParams.lv }); + await updateUserInfo(REDIS_KEY.GUILD_INFO, params.code, arr); + } + if (updateParams.lv != undefined) { + let r = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId: guild.serverId }); + await r.setRankWithGuildInfo2(guild.code, updateParams.lv, guild.activeWeekly, guild.lvUpdateTime, guild); + } + + guild = await GuildModel.updateInfo(params.code, updateParams); + return resResult(STATUS.SUCCESS); + } + async dismissGuild(msg: { code: string }, session: BackendSession) { + + const { code } = msg; + + let guild = await GuildModel.findByCode(code, null, '+serverId'); + if(!guild) return resResult(STATUS.GUILD_NOT_FOUND); + + let serverId = guild.serverId; + guild = await GuildModel.dismiss(code, serverId); + if (!guild) return resResult(STATUS.GUILD_DELETE_ERROR); + + await UserGuildModel.dismiss(code); + const { members } = guild; + await RoleModel.dissmissGuild(members); + await UserGuildApplyModel.deleteApplyByGuild(code); + + await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast(members.map(roleId => { return { roleId, userGuild: null } })); // 更新session + + // 删除channel + + let chatSid = await getGuildChannelSid(code); + this.app.rpc.chat.guildRemote.dismiss.toServer(chatSid, code); + + let r = new Rank(REDIS_KEY.GUILD_ACTIVE_RANK, { serverId }); + await r.removeFromRank({ guildCode: code }); + let r2 = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId }); + await r2.removeFromRank({ guildCode: code }); + let leader = guild.leader; + reportTAEvent(leader.roleId, TA_EVENT.GUILD_DISMISS, { name: guild.name, way: GUILD_DISMISS_WAY.BACKEND }); + + return resResult(STATUS.SUCCESS, { code, status: guild.status }); + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/guildHandler.ts b/game-server/app/servers/guild/handler/guildHandler.ts index 572b02212..dd17adaa3 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -109,7 +109,7 @@ export class GuildHandler { const serverId = session.get('serverId'); const { page = 1, showPeopleMax, name } = msg; - const guildList = await GuildModel.findByCondition(page, showPeopleMax, name, serverId); + const guildList = await GuildModel.getGuildList(page, showPeopleMax, name, serverId); const applyList = await UserGuildApplyModel.findApplyByRole(roleId); const { quitGuildTime: quitTime = 0 } = await RoleModel.findByRoleId(roleId); diff --git a/game-server/app/services/rankService.ts b/game-server/app/services/rankService.ts index f7bb21a31..583695106 100644 --- a/game-server/app/services/rankService.ts +++ b/game-server/app/services/rankService.ts @@ -925,6 +925,7 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe await r.setRankWithGuildInfo(guild.code, guild.activeWeekly, guild.activeUpdateTime, guild); } } else if (type == REDIS_KEY.GUILD_LV_RANK) { + let serverId = args.serverId; let ranks = await GuildModel.getRank(type, serverId); let r = new Rank(type, { serverId }); diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 5c896d69a..9ce64eca6 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -17,7 +17,7 @@ import { getRandSingleEelm } from '../pubUtils/util'; */ export async function initAllRank() { console.log('******* initAllRank ******') - const serverList = await ServerlistModel?.findByEnv(pinus.app.get('env'))||[]; + const serverList = await ServerlistModel.findByEnv(pinus.app.get('env')); await delKeys(REDIS_KEY.ONLINE_USERS); await delKeys(REDIS_KEY.USER_INFO); await delKeys(REDIS_KEY.GUILD_INFO); diff --git a/gm-server/app.ts b/gm-server/app.ts index 7e3ab82ac..eeb6e74a1 100644 --- a/gm-server/app.ts +++ b/gm-server/app.ts @@ -2,6 +2,7 @@ import 'reflect-metadata' import * as mongoose from 'mongoose'; import { Application, IBoot } from 'egg'; import { loadGmDb } from '@db/index'; +import { connectRedis } from '@pubUtils/redis'; export default class FooBoot implements IBoot { private readonly app: Application; @@ -16,6 +17,7 @@ export default class FooBoot implements IBoot { // this is the last chance to modify the config. await this.connectDB(this.app) await this.connectGMDB(this.app); + await this.connectRedis(this.app); this.app.config.realEnv = this.app.config.env; if(this.app.config.env == 'local') { @@ -78,6 +80,13 @@ export default class FooBoot implements IBoot { } } + public async connectRedis(app: Application) { + const { url, pw } = app.config.redis + if (url) { + const redisClient = connectRedis(url, pw); + app.context.redisClient = redisClient; + } + } //#endregion } diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index 3fdbce300..46cd3edb9 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -120,8 +120,14 @@ export default class UserController extends Controller { public async getItemList() { const { ctx } = this; - const { field, value } = ctx.request.body; - ctx.body = await ctx.service.users.getItemList(field, value); + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.users.getItemList(page, pageSize, sortField, sortOrder, form); + } + + public async getGuildList() { + const { ctx } = this; + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.users.getGuildList(page, pageSize, sortField, sortOrder, form); } public async deleteEquip() { diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index e09606a41..27d348705 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -41,6 +41,7 @@ export default (app: Application) => { // router.post('/api/users/removeherofromdefense',tokenParser, controller.users.removeHeroFromDefense); router.post('/api/users/getequiplist', tokenParser, controller.users.getEquipList); router.post('/api/users/getitemlist', tokenParser, controller.users.getItemList); + router.post('/api/users/getguildlist', controller.users.getGuildList); router.post('/api/users/deleteequip', tokenParser, controller.users.deleteEquip); router.post('/api/users/deleteitem', tokenParser, controller.users.deleteItem); router.post('/api/users/setitemcount', tokenParser, controller.users.setItemCount); diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index 06d87b9e0..7826d94df 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -6,7 +6,7 @@ import { PvpDefenseModel } from '@db/PvpDefense'; import { Service } from 'egg'; import Counter from '@db/Counter'; -import { STATUS, HERO_SYSTEM_TYPE } from '@consts'; +import { STATUS, HERO_SYSTEM_TYPE, ITEM_CHANGE_REASON, REDIS_KEY } from '@consts'; import { ITID, COUNTER } from '@consts'; import { ItemModel } from '@db/Item'; import { gameData, getExpByLv } from '@pubUtils/data'; @@ -21,9 +21,11 @@ import { CreateHeroes, deletRole } from '@pubUtils/roleUtil'; import { RScriptRecordModel } from '@db/RScriptRecord'; import { DicWar } from '@pubUtils/dictionary/DicWar'; import { SkinModel } from '@db/Skin'; -import { SearchEquipParam, SearchHeroParam, SearchUserParam, SearchGiftCodeParam, SearchGiftCodeDetailParam } from '@domain/backEndField/search'; +import { SearchEquipParam, SearchHeroParam, SearchUserParam, SearchGiftCodeParam, SearchGiftCodeDetailParam, SearchItemParam, SearchGuildParam } from '@domain/backEndField/search'; import { CreateGiftCode, UpdateGiftCode } from '@domain/backEndField/params'; import { isNumber } from 'util'; +import { GuildModel } from '@db/Guild'; +import { RedisClient } from 'redis'; // import { resResult } from '@pubUtils/util'; @@ -200,7 +202,7 @@ export default class GMUsers extends Service { weapons.push({ id: eid, hid: ehid }); } } - await addEquips(roleId, role.roleName, weapons); + await addEquips(roleId, role.roleName, weapons, ITEM_CHANGE_REASON.DEBUG); } else { flag = 1, msg = '未找到角色' + roleId; } @@ -241,7 +243,7 @@ export default class GMUsers extends Service { for (let roleId of uids) { let role = await RoleModel.findByRoleId(roleId); if (role) { - await addBags(roleId, role.roleName, datas); + await addBags(roleId, role.roleName, datas, ITEM_CHANGE_REASON.DEBUG); } else { flag = 1, msg = '未找到角色' + roleId; } @@ -591,17 +593,10 @@ export default class GMUsers extends Service { public async getEquipList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchEquipParam) { const { ctx } = this; - const heroes = await EquipModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const equips = await EquipModel.findByCondition(page, pageSize, sortField, sortOrder, form); const total = await EquipModel.countByCondition( form ) - let roleMap = new Map(); - for(let { roleId } of heroes) { - if(!roleMap.has(roleId)) { - let role = await RoleModel.findByRoleId(roleId, 'attr'); - roleMap.set(roleId, role.attr); - } - } - let list = heroes.map(cur => { + let list = equips.map(cur => { return {...cur, env: ctx.app.config.realEnv} }) @@ -612,20 +607,37 @@ export default class GMUsers extends Service { /** * 根据类型等搜索道具 */ - public async getItemList(field: string, value: (string | number)) { + public async getItemList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchItemParam) { const { ctx } = this; - let items = await ItemModel.findByField(field, value); + const items = await ItemModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const total = await ItemModel.countByCondition( form ) - if (items) { + let list = items.map(cur => { + return {...cur, env: ctx.app.config.realEnv} + }) - return ctx.service.utils.resResult(STATUS.SUCCESS, { list: items }); - } else { - console.error('role list not found'); - return ctx.service.utils.resResult(STATUS.INTERNAL_ERR); - } + return ctx.service.utils.resResult(STATUS.SUCCESS, { list, total }) } + public async getGuildList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchGuildParam) { + const { ctx } = this; + let redisClient: RedisClient = ctx.app.context.redisClient; + + const guilds = await GuildModel.findByCondition(page, pageSize, sortField, sortOrder, form); + const total = await GuildModel.countByCondition( form ) + + let list = []; + for(let guild of guilds) { + let rank = await redisClient.zrevrankAsync(`${REDIS_KEY.GUILD_LV_RANK}:${guild.serverId}`, guild.code); + + list.push({ ...guild, rank: rank == undefined? '未上榜': rank + 1, env: ctx.app.config.realEnv }) + } + + return ctx.service.utils.resResult(STATUS.SUCCESS, { list, total }) + } + + public async getGiftCodeList(page: number, pageSize: number, sortField: string, sortOrder: string, form: SearchGiftCodeParam = {}) { const { ctx } = this; diff --git a/gm-server/config/config.alpha.ts b/gm-server/config/config.alpha.ts index 44c4110b6..9e4a4580d 100644 --- a/gm-server/config/config.alpha.ts +++ b/gm-server/config/config.alpha.ts @@ -11,6 +11,10 @@ export default (appInfo: EggAppInfo) => { options: { useNewUrlParser: true, useUnifiedTopology: true }, }; + config.redis = { + url: 'r-8vbl8okinxn1zhkwh2.redis.zhangbei.rds.aliyuncs.com', // 内网 + pw: 'zyz_alpha_2021' + }; // the return config will combines to EggAppConfig return { ...defaultConfig(appInfo), diff --git a/gm-server/config/config.default.ts b/gm-server/config/config.default.ts index e4930fbb5..65796df9d 100644 --- a/gm-server/config/config.default.ts +++ b/gm-server/config/config.default.ts @@ -29,6 +29,10 @@ export default (appInfo: EggAppInfo) => { url: 'mongodb://dbop:zyzGm2021@dds-8vb9964bb4cc7f241.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb9964bb4cc7f242.mongodb.zhangbei.rds.aliyuncs.com:3717/zyzgm?replicaSet=mgset-507933150', // 内网 options: { useNewUrlParser: true, useUnifiedTopology: true }, }; + config.redis = { + url: 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com', // 内网 + pw: 'zyz_2020' + }; config.security = { csrf: { diff --git a/gm-server/config/config.dev.ts b/gm-server/config/config.dev.ts index 44c4110b6..40f79f2dd 100644 --- a/gm-server/config/config.dev.ts +++ b/gm-server/config/config.dev.ts @@ -10,6 +10,10 @@ export default (appInfo: EggAppInfo) => { url: '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', // 内网 options: { useNewUrlParser: true, useUnifiedTopology: true }, }; + config.redis = { + url: 'r-8vb418l8kkju9sis8k.redis.zhangbei.rds.aliyuncs.com', // 内网 + pw: 'zyz_dev_2021' + }; // the return config will combines to EggAppConfig return { diff --git a/gm-server/config/config.isbn.ts b/gm-server/config/config.isbn.ts index 49428e217..afc9c55ad 100644 --- a/gm-server/config/config.isbn.ts +++ b/gm-server/config/config.isbn.ts @@ -10,6 +10,10 @@ export default (appInfo: EggAppInfo) => { url: 'mongodb://root:Bantus123@dds-8vb74337eab84d641.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb74337eab84d642.mongodb.zhangbei.rds.aliyuncs.com:3717/admin?replicaSet=mgset-504694158', // 内网 options: { useNewUrlParser: true, useUnifiedTopology: true }, }; + config.redis = { + url: 'r-8vbekkbb3z8ru2ckuj.redis.zhangbei.rds.aliyuncs.com', // 内网 + pw: 'zyz_isbn_2021' + }; // the return config will combines to EggAppConfig return { diff --git a/gm-server/config/config.local.ts b/gm-server/config/config.local.ts index a89c194f0..4c8fda355 100644 --- a/gm-server/config/config.local.ts +++ b/gm-server/config/config.local.ts @@ -18,6 +18,10 @@ export default (appInfo: EggAppInfo) => { url: 'mongodb://127.0.0.1:27017/zyzgm', // 内网 options: { useNewUrlParser: true, useUnifiedTopology: true }, }; + config.redis = { + url: '127.0.0.1', // 内网 + pw: '' + }; config.proxy = {}; // the return config will combines to EggAppConfig diff --git a/gm-server/config/config.stable.ts b/gm-server/config/config.stable.ts new file mode 100644 index 000000000..7ae29f720 --- /dev/null +++ b/gm-server/config/config.stable.ts @@ -0,0 +1,28 @@ +import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg'; +import defaultConfig from './config.default'; + +export default (appInfo: EggAppInfo) => { + const config = {} as PowerPartial; + + config.mongoose = { + url: 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', // 内网 + options: { useNewUrlParser: true, useUnifiedTopology: true }, + }; + config.redis = { + url: 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com', // 内网 + pw: 'zyz_2020' + }; + + config.xtransit = { + server: 'ws://172.26.117.35:9092', + appId: 3, + appSecret: 'a48ad5ca44e2d02cbd7f4c0326fa3101', + error_log: [ '/root/logs/zyz/zyz-web.log', '/root/logs/zyz/common-error.log', '/root/logs/zyz/egg-agent.log' ], + }; + + // the return config will combines to EggAppConfig + return { + ...defaultConfig(appInfo), + ...config + }; +}; diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 20942b85e..91b3970f1 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -5,6 +5,7 @@ import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE, GUILD_SELECT, REDIS_KEY, import { getZeroPoint, getZeroPointD, nowSeconds } from '../pubUtils/timeUtil'; import { reduceCe } from '../pubUtils/util'; import { gameData } from '../pubUtils/data'; +import { SearchGuildParam } from '../domain/backEndField/search'; class Structure { @prop({ required: true }) @@ -132,7 +133,7 @@ export default class Guild extends BaseModel { return result; } - public static async findByCondition(page: number, showPeopleMax: boolean, name: string, serverId: number) { + public static async getGuildList(page: number, showPeopleMax: boolean, name: string, serverId: number) { const condition = { status: GUILD_STATUS.RUNNING, serverId }; if(!showPeopleMax) { condition['isMemberMax'] = false; @@ -193,6 +194,7 @@ export default class Guild extends BaseModel { public static async dismiss(code: string, serverId: number) { const result: GuildType = await GuildModel.findOneAndUpdate({ code, status: GUILD_STATUS.RUNNING, serverId }, { status: GUILD_STATUS.DISMISSED }, { new: true }) + .populate('leader', {roleId: 1, _id: 0}, 'Role') .select('+members').lean(); return result; } @@ -277,6 +279,41 @@ export default class Guild extends BaseModel { const role: RoleType = await GuildModel.findOneAndUpdate({ code, serverId }, { $set: { sdkMark: true } }, { new: true }).select(select).lean({ getters, virtuals: true }); return role; } + + + private static getSearchObj(form: SearchGuildParam) { + let searchObj = {}; + if (form.serverId) searchObj['serverId'] = form.serverId; + if (form.name) searchObj['name'] = { $regex: new RegExp(form.name.toString(), 'i') }; + return searchObj + } + + public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchGuildParam = {}) { + + 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: GuildType[] = await GuildModel + .find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort) + .select('-_id -__v -createdAt -updatedAt +serverId') + .populate('leader', { roleId: 1, roleName: 1, _id: 0 }, 'Role') + .lean({ getters: true, virtuals: true }); + return result; + + } + + public static async countByCondition(form: SearchGuildParam = {}) { + + let searchObj = this.getSearchObj(form); + const result = await GuildModel.count(searchObj); + return result; + } } export const GuildModel = getModelForClass(Guild); diff --git a/shared/db/Item.ts b/shared/db/Item.ts index e562744d8..adb13ca92 100644 --- a/shared/db/Item.ts +++ b/shared/db/Item.ts @@ -2,6 +2,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; import { findIndex } from 'underscore'; import { BAG } from '../pubUtils/dicParam'; +import { SearchItemParam } from '../domain/backEndField/search'; // const Transaction = require("mongoose-transactions"); @index({ roleId: 1, id: 1 }) @index({ seqId: 1 }) @@ -101,18 +102,35 @@ export default class Item extends BaseModel { return result; } - public static async findByField(field: string, value?: number|string, lean = true) { + private static getSearchObj(form: SearchItemParam) { let searchObj = {}; - if(field != 'all') { - if(field == 'roleName') { - searchObj['roleName'] = { $regex: new RegExp(value.toString(), 'i') } - } else { - searchObj[field] = value; + if (form.roleId) searchObj['roleId'] = form.roleId; + if (form.roleName) searchObj['roleName'] = { $regex: new RegExp(form.roleName.toString(), 'i') }; + if (form.id) searchObj['id'] = form.id; + return searchObj + } + + public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchItemParam = {}) { + + let searchObj = this.getSearchObj(form); + let sort = {}; + if (sortField && sortOrder) { + if (sortOrder == 'ascend') { + sort[sortField] = 1; + } else if (sortOrder == 'descend') { + sort[sortField] = -1; } } - //.select('uid tel username') - const user: ItemType[] = await ItemModel.find(searchObj).lean(lean); - return user; + const result: ItemType[] = await ItemModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).select('-_id -__v -createdAt -updatedAt').lean({ getters: true, virtuals: true }); + return result; + + } + + public static async countByCondition(form: SearchItemParam = {}) { + + let searchObj = this.getSearchObj(form); + const result = await ItemModel.count(searchObj); + return result; } } diff --git a/shared/domain/backEndField/params.ts b/shared/domain/backEndField/params.ts index 9054d8a4d..a065fb244 100644 --- a/shared/domain/backEndField/params.ts +++ b/shared/domain/backEndField/params.ts @@ -225,4 +225,41 @@ export class UpdateGiftCode { if(!isNumber(this.codeLen) || this.codeLen <= 0) return false; return true; } +} + +export class GuildFormParam { + code: string; + name: string; + notice: string; + fund: number; + lv: number; + equipProduce: number; + boss: number; + train: number; + wishPool: number; + store: number; + donate: number; + + constructor(obj?: any) { + if(obj) { + for(let key in obj) { + this[key] = obj[key]; + } + } + } + + checkParams() { + if(!this.code || !isString(this.code)) return false; + if(this.name && !isString(this.name)) return false; + if(this.notice && !isString(this.notice)) return false; + if(this.fund && !isNumber(this.fund)) return false; + if(this.lv && !isNumber(this.lv)) return false; + if(this.equipProduce && !isNumber(this.equipProduce)) return false; + if(this.boss && !isNumber(this.boss)) return false; + if(this.train && !isNumber(this.train)) return false; + if(this.wishPool && !isNumber(this.wishPool)) return false; + if(this.store && !isNumber(this.store)) return false; + if(this.donate && !isNumber(this.donate)) return false; + return true; + } } \ No newline at end of file diff --git a/shared/domain/backEndField/search.ts b/shared/domain/backEndField/search.ts index 7f16375dd..03b324ef5 100644 --- a/shared/domain/backEndField/search.ts +++ b/shared/domain/backEndField/search.ts @@ -24,6 +24,17 @@ export interface SearchEquipParam { id?: number; } +export interface SearchItemParam { + roleId?: string; + roleName?: string; + id?: number; +} + +export interface SearchGuildParam { + serverId?: number; + name?: string; +} + export interface SearchMailParam { createTimeStart?: number; createTimeEnd?: number;