251 lines
11 KiB
TypeScript
251 lines
11 KiB
TypeScript
import mongoose, {now, Promise, Schema} from "mongoose"
|
|
import { DBUser, DBUserInfo } from "../DBUserDef";
|
|
import { TokenUtils } from "../../common/TokenUtils";
|
|
import {dbDan, dbHero, dbItem} from "../DBMgr";
|
|
import {CfgAreanMgr} from "../../configs/ConfigDataManager";
|
|
import {EAreanBuyType} from "../../shared/protocols/public/arean/AreanTypeDef";
|
|
import {AreanLogic} from "../../SrvGame/AreanLogic/AreanLogic";
|
|
|
|
interface DBAccountInfo {
|
|
account: string;
|
|
password: string;
|
|
uid: string;
|
|
createTime?: string;
|
|
}
|
|
|
|
const accountSchema = new mongoose.Schema<DBAccountInfo>({
|
|
account: { type: String, required: true },
|
|
password: { type: String, required: false },
|
|
uid: { type: String, required: true },
|
|
createTime: { type: String, required: false }
|
|
});
|
|
|
|
const DBAccountModel = mongoose.model("DBAccount", accountSchema);
|
|
accountSchema.index({ account: 1 }, { unique: true });// 唯一索
|
|
|
|
// 2. 创建一个与 document interface 相对应的 Schema
|
|
const schema = new mongoose.Schema<DBUserInfo>({
|
|
account: { type: String, required: true },
|
|
uid: { type: String, required: true },
|
|
name: { type: String, required: false },
|
|
visualId: { type: Number, required: false },
|
|
gender: { type: Number, required: false },
|
|
introduction: { type: String, required: false },
|
|
mails: { type: [String], required: false },
|
|
coin: { type: Number, required: true,default: 100 },
|
|
diamond: { type: Number, required: true ,default: 0 },
|
|
heroId: { type: Number, required: true ,default: 1001 },
|
|
danGrading: { type: Number, required: true ,default: 0 },
|
|
frameIcon: { type: Number, required: true ,default: 0 },
|
|
skinId: { type: Number, required: true ,default: 0 },
|
|
title: { type: String, required: false ,default: 'this is test' },
|
|
signature: { type: String, required: false ,default: '' },
|
|
useFlag: { type: String, required: false ,default: '' },
|
|
usedHeroes: { type: Array(Number), required: false ,default: [] },
|
|
PersonalBackground: { type: String, required: false ,default: '' },
|
|
battleCount: { type: Number, required: false ,default: 0 },
|
|
createTime: { type: String, required: false },
|
|
});
|
|
|
|
// 定义 索引
|
|
schema.index({ uid: 1 }, { unique: true });// 唯一索引
|
|
|
|
// 注册文档模块
|
|
const DBUserModel = mongoose.model("DBUser", schema);
|
|
|
|
/**
|
|
* 数据库-用户信息
|
|
*/
|
|
export class MongoDBUser implements DBUser {
|
|
/**
|
|
* 获取用户信息 通过密码
|
|
* @param account
|
|
* @param password
|
|
* @returns
|
|
*/
|
|
async getUserInfoWithPassword(account: string, password: string): Promise<DBUserInfo | undefined> {
|
|
|
|
let accountInfo = await DBAccountModel.findOne({ account: account });
|
|
if (!accountInfo) {
|
|
return;
|
|
}
|
|
|
|
let psd = TokenUtils.encodePassword(password);
|
|
if (accountInfo.password != psd) {
|
|
return;
|
|
}
|
|
|
|
return await this.getUserInfoByUid(accountInfo.uid);
|
|
}
|
|
|
|
public async hasUser(account: string): Promise<boolean> {
|
|
let user_info = await DBAccountModel.findOne({ account: account });
|
|
return user_info != null;
|
|
}
|
|
|
|
async insterNewUser(account: string, password: string) {
|
|
let uid = '';
|
|
while (true) {
|
|
uid = TokenUtils.genID(6, true);
|
|
let user_info = await DBUserModel.findOne({ uid: uid });
|
|
if (!user_info) {
|
|
break;
|
|
}
|
|
}
|
|
let createTime = AreanLogic.Instance.formatDate(new Date());
|
|
console.log(`注册的时间 == ${createTime}`);
|
|
let newUser: DBUserInfo = {
|
|
account: account,
|
|
uid: uid,
|
|
name: '',
|
|
gender: 0,
|
|
introduction: '',
|
|
visualId: 0,
|
|
mails: [],
|
|
coin: 200,
|
|
diamond: 0,
|
|
heroId: 1001,
|
|
createTime: createTime,
|
|
};
|
|
let pswd = TokenUtils.encodePassword(password);
|
|
await DBAccountModel.create({ account: account, password: pswd, uid: uid,createTime : createTime });
|
|
await DBUserModel.create(newUser);
|
|
await dbHero?.addHero(uid, 1001,EAreanBuyType.Free);
|
|
// await dbHero?.addHero(uid, 1002);
|
|
// await dbHero?.addHero(uid, 1003);
|
|
await dbDan?.initDanInfo(uid);
|
|
|
|
}
|
|
|
|
async getUserInfoByUid(uid: string): Promise<Readonly<DBUserInfo> | undefined> {
|
|
let user_info = await DBUserModel.findOne({ uid: uid });
|
|
if (!user_info) {
|
|
return;
|
|
}
|
|
return user_info
|
|
}
|
|
async updateUserDataByUid(uid: string, new_user_info: DBUserInfo) {
|
|
let user_model = await DBUserModel.findOne({ uid: uid });
|
|
if (!user_model) {
|
|
return;
|
|
}
|
|
Object.keys(new_user_info).forEach(key => {
|
|
(user_model as any)[key] = (new_user_info as any)[key];
|
|
});
|
|
user_model.save();
|
|
}
|
|
|
|
getCommonUseHero(): Promise<Readonly<number[] | undefined>> {
|
|
return Promise.resolve(undefined);
|
|
}
|
|
|
|
async updateDanGrading(uid: string, value: number):Promise<boolean> {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set: {danGrading: value}},
|
|
{returnNewDocument: true});
|
|
return true;
|
|
}
|
|
|
|
updateFrameId(uid: string, value: number): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
updatePersonalBackground(uid: string, str: string): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
updateSignature(uid: string, str: string): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
updateTitle(uid: string, str: string): void {
|
|
}
|
|
|
|
updateUseFlag(uid: string, str: string): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
async updateUseHeroId(uid: string, value: number) {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set:{heroId : value}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。
|
|
// {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。
|
|
{ returnNewDocument: true });
|
|
return {uid: uid,heroId: value};
|
|
}
|
|
|
|
updateUseSkinId(uid: string, heroId: number, value: number): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
async updateVisualId(uid: string, value: number,frameId : number): Promise<boolean> {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set:{visualId : value,frameIcon : frameId}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。
|
|
// {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。
|
|
{ returnNewDocument: true });
|
|
return true;
|
|
}
|
|
|
|
async updateBattleCount(uid: string, value: number): Promise<boolean> {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set:{visualId : value}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。
|
|
// {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。
|
|
{ returnNewDocument: true });
|
|
return true;
|
|
}
|
|
|
|
/******************************************* 服务端方法 ****************************************/
|
|
// 计算段位信息
|
|
public calDanData(star : number) : {curDan : number,mainDan : number,needStar : number,curDanStar : number}{
|
|
let data = CfgAreanMgr.DanCfg.getAllData();
|
|
let len = data.length;
|
|
let danInfo: any = {
|
|
curDan : -1,
|
|
mainDan : -1,
|
|
needStar : -1,
|
|
curDanStar : star
|
|
};
|
|
if(star > data[len - 2].allStar){
|
|
// 越界
|
|
}else{
|
|
if(star === 0){
|
|
danInfo.curDan = 1;
|
|
danInfo.mainDan = 1;
|
|
danInfo.needStar = data[0].allStar;
|
|
}else{
|
|
for (let i = 0; i < len; i++) {
|
|
if (star <= data[i].allStar) {
|
|
danInfo.curDan = i + 1;
|
|
danInfo.mainDan = data[i].mainDan;
|
|
danInfo.needStar = data[i].allStar;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return danInfo;
|
|
}
|
|
|
|
// 更新金币
|
|
async updateCoin(uid: string, value: number): Promise<boolean> {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set: {coin: value}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。
|
|
// {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。
|
|
{returnNewDocument: true});
|
|
return true;
|
|
}
|
|
|
|
// 更新银币
|
|
async updateDiamond(uid: string, value: number): Promise<boolean> {
|
|
let ret = await DBUserModel.findOneAndUpdate(
|
|
{uid: uid},
|
|
{$set: {diamond: value}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。
|
|
// {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。
|
|
{returnNewDocument: true});
|
|
return true;
|
|
}
|
|
} |