军团,创建查询列表,查询个人军团信息

This commit is contained in:
luying
2021-01-19 16:18:45 +08:00
parent 71c5182926
commit ee21a21e80
8 changed files with 220 additions and 97 deletions
+4 -1
View File
@@ -45,4 +45,7 @@ export enum USER_GUILD_STATUS {
ON = 1, // 成员
QUIT = 2, // 退出
DISMISSED = 3 // 解散
}
}
// 查询每页显示
export const GUILD_PER_PAGE = 30;
+39 -13
View File
@@ -1,8 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
import Role from './Role';
import Role, { RoleType } from './Role';
import { genCode } from '../pubUtils/util';
import { GUILD_STRUCTURE, GUILD_STATUS } from '../consts';
import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE } from '../consts';
class Structure {
@prop({ required: true })
@@ -29,6 +29,9 @@ export default class Guild extends BaseModel {
@prop({ required: true, default: 1 })
memberCnt: number;
@prop({ required: true, default: false, select: false })
isMemberMax: boolean;
@prop({ required: true, default: 1 })
managerCnt: number;
@@ -53,16 +56,19 @@ export default class Guild extends BaseModel {
@prop({ required: true, default: 0 })
activeDaily: number;
@prop({ required: true, default: new Date() })
refTimeDaily: number;
@prop({ required: true, default: 0 })
activeWeekly: number;
@prop({ required: true, default: new Date() })
refTimeWeekly: number;
@prop({ required: true, default: new Date(), select: false })
refTimeDaily: Date;
@prop({ required: true, default: new Date(), select: false })
refTimeWeekly: Date;
@prop({ required: true, default: 0 })
ce: number; // 总战力
@prop({ required: true, type: String, default: [] })
@prop({ required: true, type: String, default: [], select: false })
members: string[]; // 军团成员的roleId,用于增加战力的时候加入总战力
@prop({ required: true, type: Structure, default: getInitStructure(), _id: false })
@@ -71,31 +77,51 @@ export default class Guild extends BaseModel {
@prop({ required: true, default: GUILD_STATUS.RUNNING, enum: GUILD_STATUS })
status: number;
public static async createGuild(params: CreateParam) {
public static async createGuild(params: { name: string, icon: number, notice: string }, role: RoleType) {
const doc = new GuildModel();
const update = Object.assign(doc.toJSON(), params);
const update = Object.assign(doc.toJSON(), params, { leader: role._id, members: [role.roleId], ce: role.ce });
delete update._id;
const code = genCode(6);
const result: GuildType = await GuildModel.findOneAndUpdate({ code }, update, { upsert: true, new: true })
.select('code name icon notice introduce lv fund memberCnt managerCnt activeDaily activeWeekly ceLimit isAuto leader structure')
.populate('leader', 'name sHid headHid lv updatedAt', 'Role')
.populate('leader', 'roleName sHid headHid lv loginTime ce', 'Role')
.lean();
return result;
}
public static async checkName(name: string) {
const result = await GuildModel.findOne({ name, status: 1 }).lean();
const result = await GuildModel.findOne({ name, status: GUILD_STATUS.RUNNING }).lean();
return !!result;
}
public static async findByCondition(page: number, showPeopleMax: boolean, name: string) {
const condition = {};
if(!showPeopleMax) {
condition['isMemberMax'] = false;
}
if(!!name) {
condition['name'] = { $regex: new RegExp(name, 'i') }
}
const guildList = await GuildModel.find(condition)
.limit(GUILD_PER_PAGE).skip((page - 1) * GUILD_PER_PAGE)
.select('code icon name lv memberCnt leader ceLimit isAuto')
.populate('leader', 'roleName', 'Role')
.lean();
return guildList;
}
public static async findByCode(code: string) {
const result = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING }, { _id: 0 })
.populate('leader', 'roleName sHid headHid lv loginTime ce', 'Role')
.lean();
return result;
}
}
export const GuildModel = getModelForClass(Guild);
export interface GuildType extends Pick<DocumentType<Guild>, keyof Guild> { };
export type GuildUpdateParam = Partial<GuildType>; // 将所有字段变成可选项
type CreateParam = Pick<GuildType, 'name'|'icon'|'notice'|'leader'|'members'|'ce'>
function getInitStructure() {
let structure = new Array<Structure>();
+10 -5
View File
@@ -6,6 +6,7 @@ import User from './User';
import { shouldRefresh } from '../pubUtils/util';
import { initRoleAtrr } from '../pubUtils/playerCe';
import Hero,{} from '../db/Hero';
import { nowSeconds } from '../pubUtils/timeUtil';
interface roleUpdate {
ce?: number;
_id?:number;
@@ -162,10 +163,10 @@ export default class Role extends BaseModel {
@prop({ required: true, default: 1 })
loginCnt: number; // 登录次数
@prop({ required: true })
createTime: Date; // 创建时间
@prop({ required: true })
loginTime: Date; // 更新 / 登录时间
@prop({ required: true, default: nowSeconds() })
createTime: number; // 创建时间
@prop({ required: true, default: nowSeconds() })
loginTime: number; // 更新 / 登录时间
@prop({ required: true, type: Number, default: [], _id: false })
funcs: Array<number>; // 开启了的功能
@@ -217,8 +218,12 @@ export default class Role extends BaseModel {
@prop({ required: true, type: Teraph, default: getInitialTeraph(), _id: false })
teraphs:Array<Teraph>;
// 公会
@prop({ required: true, default: 0 })
quitGuildTime: number; // 上次退出公会的时间
public static async findByUid(uid: number, serverId: number, lean = true) {
const role: RoleType = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).lean(lean);
const role: RoleType = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, { loginTime: nowSeconds() }, { new: true }).lean(lean);
return role;
}
+23 -12
View File
@@ -1,8 +1,9 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
import Role from './Role';
import Role, { RoleType } from './Role';
import Guild from './Guild';
import { GUILD_AUTH, USER_GUILD_STATUS, GUILD_JOB } from '../consts';
import { GUILD } from '../pubUtils/dicParam';
class ActiveRecord {
@prop({ required: true })
@@ -22,9 +23,6 @@ export default class UserGuild extends BaseModel {
@prop({ required: true })
role: Ref<Role>;
@prop({ required: true })
guild: Ref<Guild>;
@prop({ required: true, default: GUILD_AUTH.MEMBER, enum: GUILD_AUTH })
auth: number;
@@ -45,18 +43,32 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, default: new Date() })
refTimeWeekly: number;
public static async getMyGuild(roleId: string) {
const myGuild: UserGuildType = await UserGuildModel.findOne({ roleId, status: USER_GUILD_STATUS.ON }).populate('guild').lean();
return myGuild||{ auth: GUILD_AUTH.OTHERS };
public static async getMyAuth(roleId: string, userGuild?: UserGuildType) {
let myGuild: UserGuildType;
if(!userGuild) {
myGuild = await this.getMyGuild(roleId, 'auth');
} else {
myGuild = userGuild;
}
return myGuild?myGuild.auth: GUILD_AUTH.OTHERS;
}
public static async getMyGuild(roleId: string, select?: string) {
const myGuild: UserGuildType = await UserGuildModel.findOne({ roleId, status: USER_GUILD_STATUS.ON })
.select(select)
.lean();
return myGuild;
}
public static async createUserGuild(params: UserGuildCreateParam) {
public static async createUserGuild(guildCode: string, role: RoleType, isLeader: boolean) {
const doc = new UserGuildModel();
const update = Object.assign(doc.toJSON(), params);
let job = isLeader? GUILD_JOB.JIANGJUN: GUILD_JOB.SHIZHANG;
let auth = isLeader? GUILD_AUTH.LEADER: GUILD_AUTH.MEMBER;
const update = Object.assign(doc.toJSON(), { guildCode, roleId: role.roleId, job, auth });
delete update._id;
const result: UserGuildType = await UserGuildModel.findOneAndUpdate({ guildCode: params.guildCode, status: USER_GUILD_STATUS.ON }, update, { upsert: true, new: true })
const result: UserGuildType = await UserGuildModel.findOneAndUpdate({ guildCode, status: USER_GUILD_STATUS.ON }, update, { upsert: true, new: true })
.select('honour job auth')
.lean();
@@ -68,4 +80,3 @@ export const UserGuildModel = getModelForClass(UserGuild);
export interface UserGuildType extends Pick<DocumentType<UserGuild>, keyof UserGuild> { };
export type UserGuildUpdateParam = Partial<UserGuildType>; // 将所有字段变成可选项
type UserGuildCreateParam = Pick<UserGuildType, 'guildCode'|'roleId'|'role'|'guild'|'auth'|'job'>;
+39
View File
@@ -2,6 +2,8 @@
import { reduceCe } from "./util";
import { PvpEnemies, PvpHeroInfo, PvpOtherHeroes } from "../db/generalField";
import { GuildType } from "../db/Guild";
import { RoleType } from "../db/Role";
export interface RewardInter {
id: number;
@@ -165,4 +167,41 @@ export class PlayerDetail {
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;
}
}
+4
View File
@@ -2,6 +2,10 @@
const PER_SECOND = 1 * 1000;
const PER_DAY = 24 * 60 * 60;
export function getSeconds(time: Date) {
return Math.floor(time.getTime() / PER_SECOND);
}
export function nowSeconds() {
return Math.floor(Date.now() / PER_SECOND );
}