添加domain文件夹

This commit is contained in:
luying
2021-02-01 17:10:08 +08:00
parent 67668097d6
commit 39b68de801
23 changed files with 299 additions and 161 deletions

1
game-server/app/domain Symbolic link
View File

@@ -0,0 +1 @@
../../shared/domain

View File

@@ -9,7 +9,8 @@ import { ARMY } from '../../../pubUtils/dicParam';
import { handleCost, addItems } from '../../../services/rewardService';
import { getGoldObject } from '../../../pubUtils/itemUtils';
import { nowSeconds, getBeforeDaySeconds, getSeconds } from '../../../pubUtils/timeUtil';
import { GuildListInfo, GuildRankParam, GuildLeader } from '../../../pubUtils/interface';
import { GuildListInfo } from '../../../domain/battleField/guild';
import { GuildRankParam, GuildLeader } from '../../../domain/rank';
import { UserGuildApplyModel } from '../../../db/UserGuildApply';
import { hasStructureConsume, getStructureConsume, gameData } from '../../../pubUtils/data';
import { GuildRecModel } from '../../../db/GuildRec';

View File

@@ -7,7 +7,9 @@ import { STATUS } from '../../../consts/statusCode';
import { resResult, genCode } from '../../../pubUtils/util';
import { PvpDefenseModel, OppPlayers } from '../../../db/PvpDefense';
import { pvpEndParamInter, RankParam, PlayerDetail, PlayerDetailHero } from '../../../pubUtils/interface';
import { pvpEndParamInter } from '../../../pubUtils/interface';
import { RankParam } from '../../../domain/rank';
import { PlayerDetail, PlayerDetailHero } from '../../../domain/battleField/guild';
import { PVP_HERO_POS, REDIS_KEY } from '../../../consts';
import { PVP } from '../../../pubUtils/dicParam';
import { addItems } from '../../../services/rewardService';

View File

@@ -12,7 +12,7 @@ import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, createCurT
import { handleFixedReward, addItems, handleCost } from '../../../services/rewardService';
import { checkBattleHeroes } from '../../../services/normalBattleService';
import { getRank, setRank, existsRank, initSingleRankWithServer } from '../../../services/redisService';
import { RankParam } from '../../../pubUtils/interface';
import { RankParam } from '../../../domain/rank';
import { getGoldObject } from '../../../pubUtils/itemUtils';
export default function(app: Application) {

View File

@@ -14,7 +14,7 @@ import { chackFunOpenWhenLogin } from '../../../services/funcSwitchService';
import { loginRefresh } from '../../../services/playerEventService';
import { nowSeconds } from '../../../pubUtils/timeUtil';
import { getRedis, setRedis, delRedis, rmRoleFromQueue } from '../../../services/redisService';
import { GuildModel } from '../../../db/Guild';
export default function (app: Application) {
return new EntryHandler(app);
}

View File

@@ -0,0 +1,29 @@
import { Application, BackendSession } from "pinus";
import { resResult, getRandEelm } from "../../../pubUtils/util";
import { STATUS, ROLE } from "../../../consts";
import { RoleModel } from "../../../db/Role";
import { getBeforeDaySeconds } from "../../../pubUtils/timeUtil";
export default function (app: Application) {
return new FriendHandler(app);
}
export class FriendHandler {
constructor(private app: Application) {
}
// 获取推荐好友列表
public async getRecommend(msg: { }, session: BackendSession) {
let roleId: string = session.get('roleId');
const day = getBeforeDaySeconds(1);
const { lv } = await RoleModel.findByRoleId(roleId, ROLE.GET_LV);
const allList = await RoleModel.getRecommedList(lv - 5, lv + 5, day);
let list = getRandEelm(allList, 10);
if(!list.length) list = allList;
return resResult(STATUS.SUCCESS, { list });
}
}

View File

@@ -11,7 +11,7 @@ import { STATUS } from '../consts/statusCode';
import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec';
import { TowerTaskRecModel } from '../db/TowerTaskRec';
import { setRank } from './redisService';
import { RankParam } from '../pubUtils/interface';
import { RankParam } from '../domain/rank';
import { cloneDeep } from 'lodash';
export async function checkTowerWar(roleId: string, battleId: number, heroes: Array<number>) {

View File

@@ -12,7 +12,7 @@ import { GuildRecType } from "../db/GuildRec";
import { ARMY } from "../pubUtils/dicParam";
import { sendMail } from "./mailService";
import { setRank, getMyRank, initSingleRank } from "./redisService";
import { GuildRankParam, GuildLeader } from "../pubUtils/interface";
import { GuildRankParam, GuildLeader } from "../domain/rank";
import { lockData, isLocked } from '../services/redLockService';
import { ErrLogModel } from '../db/ErrLog';

View File

@@ -5,7 +5,8 @@ import { PVP_HERO_POS, ROBOT_NAME, REDIS_KEY, PVP_CONST } from '../consts';
import { setPvpDefResult } from '../services/timeTaskService';
import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
import { getRandomIndexByLen, genCode, getRandomByLen, shouldRefresh, reduceCe, getChineseName } from '../pubUtils/util';
import { oppPlayersInter, RankParam, pvpEndParamInter, oppHeroesDefenseInter, Attributes } from '../pubUtils/interface';
import { oppPlayersInter, pvpEndParamInter, Attributes } from '../pubUtils/interface';
import { RankParam } from '../domain/rank';
import { gameData, getPLvByScore } from "../pubUtils/data";
import { PVP } from '../pubUtils/dicParam';
import { SystemConfigModel } from '../db/SystemConfig'

View File

@@ -7,7 +7,7 @@ import { promisifyAll } from 'bluebird';
import { pinus } from 'pinus';
import { PvpDefenseModel } from '../db/PvpDefense';
import { SystemConfigModel } from '../db/SystemConfig';
import { RankParam, GuildRankParam, GuildLeader } from '../pubUtils/interface';
import { GuildRankParam, GuildLeader, RankParam } from '../domain/rank';
import { GuildModel } from '../db/Guild';
import { comBtlRanges } from '../pubUtils/gamedata';
/**

View File

@@ -9,7 +9,7 @@ import { deepCopy, getRandomArr } from '../pubUtils/util';
import { getLvByScore } from './pvpService';
import { getMyRank, setRank, getRedis, resetPvpRanks } from './redisService';
import { REDIS_KEY } from '../consts';
import { RankParam } from '../pubUtils/interface';
import { RankParam } from '../domain/rank';
import { RoleModel } from '../db/Role';
import { MailModel, MailType } from '../db/Mail';
import { pinus } from 'pinus';

1
gm-server/app/domain Symbolic link
View File

@@ -0,0 +1 @@
../../shared/domain

View File

@@ -0,0 +1,8 @@
export enum ROLE {
// 玩家列表显示基础数据
SHOW_SIMPLE = 'roleId roleName ce headHid sHid lv title job quitTime',
GET_LV = 'lv'
};

View File

@@ -5,4 +5,5 @@ export * from './constModules/heroConst';
export * from './constModules/itemConst';
export * from './constModules/sysConst';
export * from './constModules/guildConst';
export * from './constModules/selectConst';
export * from './statusCode';

View File

@@ -1,5 +1,6 @@
import { prop, pre, modelOptions } from '@typegoose/typegoose';
import { prop, pre, modelOptions, plugin } from '@typegoose/typegoose';
import { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
import mongooseLeanVirtuals = require('mongoose-lean-virtuals');
/**
* BaseModel
@@ -15,6 +16,7 @@ import { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
@modelOptions({schemaOptions: {id: false}})
@plugin(mongooseLeanVirtuals)
export default class BaseModel extends TimeStamps {
_id?: string

View File

@@ -0,0 +1,34 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose';
import Role from './Role';
import FriendShip from './FriendShip';
class Relation {
@prop({ required: true, default: '' })
roleId: string; // 对方玩家id
@prop({ required: true, ref: 'Role', type: mongoose.Schema.Types.ObjectId })
role: Ref<Role>;
@prop({ required: true, ref: 'FriendRelation', type: mongoose.Schema.Types.ObjectId })
friendShip: Ref<FriendShip>;
}
/**
* 好友系统关系表
*/
@index({ roleId: 1, createdAt: -1 })
export default class FriendRelation extends BaseModel {
@prop({ required: true, default: '' })
roleId: string; // 操作玩家本人id
@prop({ required: true, default: [], type: Relation, _id: false })
friends: Relation[]; // 好友列表
@prop({ required: true, default: [], type: Relation, _id: false })
blacklist: Relation[]; // 黑名单列表
}
export const FriendRelationModel = getModelForClass(FriendRelation);
export interface FriendRelationType extends Pick<DocumentType<FriendRelation>, keyof FriendRelation>{};

42
shared/db/FriendShip.ts Normal file
View File

@@ -0,0 +1,42 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
/**
* 好友直接的亲密值
*/
@index({ roleIds: 1 })
export default class FriendShip extends BaseModel {
@prop({ required: true, default: '' })
roleIds: string; // 玩家A和玩家B按字母顺排序后合成的字符串
@prop({ required: true, default: '' })
roleIdA: string; // 玩家A
@prop({ required: true, default: '' })
roleIdB: string; // 玩家B
@prop({ required: true, default: 0 })
sendHeartCntA: number; // 玩家A给玩家B送的心
@prop({ required: true, default: 0 })
sendHeartCntB: number; // 玩家B给玩家A送的心
@prop({ required: true, default: 0 })
receiveHeartCntA: number; // 玩家B领取玩家A送的心
@prop({ required: true, default: 0 })
receiveHeartCntB: number; // 玩家A领取玩家B送的心
@prop({ required: true, default: new Date() })
refTime: Date;
@prop({ required: true, default: 0 })
frdValue: number; // 两人之间的亲密值
public get frdLv() { // 亲密等级
return this.frdValue;
}
}
export const FriendShipModel = getModelForClass(FriendShip);
export interface FriendShipType extends Pick<DocumentType<FriendShip>, keyof FriendShip>{};

View File

@@ -1,9 +1,9 @@
import { HANG_UP_CONSTS, ROLE_TERAPH } from './../consts';
import { HANG_UP_CONSTS, ROLE_TERAPH, ROLE } from './../consts';
import BaseModel from './BaseModel';
import { CeAttrRole } from './generalField';
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typegoose/typegoose';
import User from './User';
import { shouldRefresh } from '../pubUtils/util';
import { shouldRefresh, reduceCe } from '../pubUtils/util';
import { initRoleAtrr } from '../pubUtils/playerCe';
import Hero,{} from '../db/Hero';
import { nowSeconds } from '../pubUtils/timeUtil';
@@ -112,7 +112,7 @@ export default class Role extends BaseModel {
exp: number; // 经验值
@prop({ required: true, default: 1 })
lv: number; // 主公等级
@prop({ required: true, default: 0 })
@prop({ required: true, default: 0, set: (val: number) => val, get: (val: number) => reduceCe(val) })
ce: number; // 总战力
@prop({ required: true, default: new CeAttrRole(), _id: false })
globalCeAttr: CeAttrRole; // 总战力
@@ -223,8 +223,14 @@ export default class Role extends BaseModel {
return role;
}
public static async findByRoleId(roleId: string, lean = true) {
const role: RoleType = await RoleModel.findOne({ roleId }).lean(lean);
/**
* 根据roleId获取一条数据
* @param roleId 玩家id
* @param select 选取字段,来自 selectConst/ROLE
* @param virtuals 是否使用虚拟字段如ce使用了自动缩小1w倍
*/
public static async findByRoleId(roleId: string, select?: string, virtuals = false) {
const role: RoleType = await RoleModel.findOne({ roleId }).select(select).lean({virtuals});
return role;
}
@@ -428,6 +434,15 @@ export default class Role extends BaseModel {
return result;
}
// 获取好友推荐列表
public static async getRecommedList(minLv: number, maxLv: number, time: number) {
const result = await RoleModel.find({ quitTime: { $gt: time }, lv: { $gte: minLv, $lte: maxLv } }, { _id: 0 })
.select(ROLE.SHOW_SIMPLE)
.sort({quitTime: -1, lv: -1, ce: -1})
.limit(100).lean({ virtuals: true });
return result;
}
// 公会解散
public static async dissmissGuild(members: string[]) {
const result = await RoleModel.updateMany({ roleId: { $in: members } }, { hasGuild: false }).lean();

View File

@@ -0,0 +1,88 @@
import { PvpEnemies, PvpOtherHeroes } from "../../db/generalField";
import { reduceCe } from "../../pubUtils/util";
import { GuildType } from "../../db/Guild";
import { RoleType } from "../../db/Role";
export class PlayerDetailHero {
actorId: number;
lv: number;
star: number;
colorStar: number;
quality: number;
score: number;
setPvpHeroInfo?(hero: PvpEnemies|PvpOtherHeroes) {
this.actorId = hero.actorId;
this.lv = hero.lv;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.quality = hero.quality;
this.score = hero.score;
}
}
export class PlayerDetail {
roleId: string;
roleName: string;
lv: number;
title?: number = 1;
sHid?: number = 19;
headHid?: number = 19;
score?: number = 0;
pLv?: number = 1;
defCe?: number = 0;
heroes: PlayerDetailHero[];
rank?:number = 0;
constructor(detail: PlayerDetail) {
if(detail.roleId) this.roleId = detail.roleId;
if(detail.roleName) this.roleName = detail.roleName;
if(detail.lv) this.lv = detail.lv;
if(detail.title) this.title = detail.title;
if(detail.sHid) this.sHid = detail.sHid;
if(detail.headHid) this.headHid = detail.headHid;
if(detail.score) this.score = detail.score;
if(detail.pLv) this.pLv = detail.pLv;
if(detail.defCe) this.defCe = reduceCe(detail.defCe);
if(detail.heroes) this.heroes = detail.heroes;
if(detail.rank) this.rank = detail.rank;
}
}
// 军团返回
export class GuildMainInfo {
code: string; // 军团唯一编号
icon: number; // 头像
name: string; // 军团名
lv: number; // 等级
memberCnt: number; // 人数
isAuto: boolean; // 是否是自动加入
ceLimit: number; // 战力条件
constructor(guild: GuildType) {
this.code = guild.code;
this.icon = guild.icon;
this.name = guild.name;
this.lv = guild.lv;
this.memberCnt = guild.memberCnt;
this.ceLimit = guild.ceLimit;
this.isAuto = guild.isAuto;
}
}
// getGuildList里的返回
export class GuildListInfo extends GuildMainInfo {
leader: string; // 团长名
hasApply: boolean = false; // 是否有申请过
constructor(guild: GuildType) {
super(guild);
let leader = <RoleType>guild.leader;
this.leader = leader.roleName;
}
setApply(hasApply: boolean) {
this.hasApply = hasApply;
}
}

58
shared/domain/rank.ts Normal file
View File

@@ -0,0 +1,58 @@
// 排行榜返回玩家值
export class RankParam {
roleName: string;
lv: number;
vLv: number;
guildName: string = "";
head: string = 'zhaoyun';
headHid: number = 19;
sHid: number = 19;
title: number;
constructor(roleName: string, lv: number, vLv: number, headHid: number, sHid: number, title: number) {
this.roleName = roleName;
this.lv = lv;
this.vLv = vLv;
this.headHid = headHid;
this.sHid = sHid;
this.title = title;
}
}
// 公会排行榜返回值
export class GuildRankParam {
icon: number;
name: string;
lv: number;
leader: {
roleName: string;
title: number;
lv: number;
headHid: number;
sHid: number;
}
constructor(icon: number, name: string, lv: number, leader: {roleName: string, title: number, lv: number, headHid: number, sHid: number}) {
this.icon = icon;
this.name = name;
this.lv = lv;
let _leader = new GuildLeader(leader);
this.leader = _leader;
}
}
export class GuildLeader {
roleName: string;
title: number;
lv: number;
headHid: number;
sHid: number;
constructor(leader: {roleName: string, title: number, lv: number, headHid: number, sHid: number}) {
this.roleName = leader.roleName;
this.title = leader.title;
this.lv = leader.lv;
this.headHid = leader.headHid;
this.sHid = leader.sHid;
}
}

View File

View File

@@ -1,10 +1,5 @@
// 一些通用的interface定义
import { reduceCe } from "./util";
import { PvpEnemies, PvpOtherHeroes } from "../db/generalField";
import { GuildType } from "../db/Guild";
import { RoleType } from "../db/Role";
export interface RewardInter {
id: number;
count: number;
@@ -101,144 +96,3 @@ export interface pvpEndParamInter {
heal: number;
underDamage: number;
}
export class RankParam {
roleName: string;
lv: number;
vLv: number;
guildName: string = "";
head: string = 'zhaoyun';
headHid: number = 19;
sHid: number = 19;
title: number;
constructor(roleName: string, lv: number, vLv: number, headHid: number, sHid: number, title: number) {
this.roleName = roleName;
this.lv = lv;
this.vLv = vLv;
this.headHid = headHid;
this.sHid = sHid;
this.title = title;
}
}
export class GuildRankParam {
icon: number;
name: string;
lv: number;
leader: {
roleName: string;
title: number;
lv: number;
headHid: number;
sHid: number;
}
constructor(icon: number, name: string, lv: number, leader: {roleName: string, title: number, lv: number, headHid: number, sHid: number}) {
this.icon = icon;
this.name = name;
this.lv = lv;
let _leader = new GuildLeader(leader);
this.leader = _leader;
}
}
export class GuildLeader {
roleName: string;
title: number;
lv: number;
headHid: number;
sHid: number;
constructor(leader: {roleName: string, title: number, lv: number, headHid: number, sHid: number}) {
this.roleName = leader.roleName;
this.title = leader.title;
this.lv = leader.lv;
this.headHid = leader.headHid;
this.sHid = leader.sHid;
}
}
export class PlayerDetailHero {
actorId: number;
lv: number;
star: number;
colorStar: number;
quality: number;
score: number;
setPvpHeroInfo?(hero: PvpEnemies|PvpOtherHeroes) {
this.actorId = hero.actorId;
this.lv = hero.lv;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.quality = hero.quality;
this.score = hero.score;
}
}
export class PlayerDetail {
roleId: string;
roleName: string;
lv: number;
title?: number = 1;
sHid?: number = 19;
headHid?: number = 19;
score?: number = 0;
pLv?: number = 1;
defCe?: number = 0;
heroes: PlayerDetailHero[];
rank?:number = 0;
constructor(detail: PlayerDetail) {
if(detail.roleId) this.roleId = detail.roleId;
if(detail.roleName) this.roleName = detail.roleName;
if(detail.lv) this.lv = detail.lv;
if(detail.title) this.title = detail.title;
if(detail.sHid) this.sHid = detail.sHid;
if(detail.headHid) this.headHid = detail.headHid;
if(detail.score) this.score = detail.score;
if(detail.pLv) this.pLv = detail.pLv;
if(detail.defCe) this.defCe = reduceCe(detail.defCe);
if(detail.heroes) this.heroes = detail.heroes;
if(detail.rank) this.rank = detail.rank;
}
}
// 军团返回
export class GuildMainInfo {
code: string; // 军团唯一编号
icon: number; // 头像
name: string; // 军团名
lv: number; // 等级
memberCnt: number; // 人数
isAuto: boolean; // 是否是自动加入
ceLimit: number; // 战力条件
constructor(guild: GuildType) {
this.code = guild.code;
this.icon = guild.icon;
this.name = guild.name;
this.lv = guild.lv;
this.memberCnt = guild.memberCnt;
this.ceLimit = guild.ceLimit;
this.isAuto = guild.isAuto;
}
}
// getGuildList里的返回
export class GuildListInfo extends GuildMainInfo {
leader: string; // 团长名
hasApply: boolean = false; // 是否有申请过
constructor(guild: GuildType) {
super(guild);
let leader = <RoleType>guild.leader;
this.leader = leader.roleName;
}
setApply(hasApply: boolean) {
this.hasApply = hasApply;
}
}

1
web-server/app/domain Symbolic link
View File

@@ -0,0 +1 @@
../../shared/domain