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({ 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({ 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 { 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 { 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 | 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> { return Promise.resolve(undefined); } async updateDanGrading(uid: string, value: number):Promise { let ret = await DBUserModel.findOneAndUpdate( {uid: uid}, {$set: {danGrading: value}}, {returnNewDocument: true}); return true; } updateFrameId(uid: string, value: number): Promise { return Promise.resolve(false); } updatePersonalBackground(uid: string, str: string): Promise { return Promise.resolve(false); } updateSignature(uid: string, str: string): Promise { return Promise.resolve(false); } updateTitle(uid: string, str: string): void { } updateUseFlag(uid: string, str: string): Promise { 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 { return Promise.resolve(false); } async updateVisualId(uid: string, value: number,frameId : number): Promise { 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 { 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 { 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 { let ret = await DBUserModel.findOneAndUpdate( {uid: uid}, {$set: {diamond: value}},//$set 操作符用于设置或更新文档中的字段值。当你使用 $set 时,如果指定的字段已经存在,它将被更新为新值;如果字段不存在,它将被创建并设置为新值。 // {$inc:{visualId : value}}, //`$inc` 操作符用于将文档中的数字字段增加一个指定的数值。`$inc` 只适用于数字类型的字段,并且只能用于增加数值,不能用于减少数值。 {returnNewDocument: true}); return true; } }