登录:装备,密码,短信登录

This commit is contained in:
luying
2021-03-02 20:21:12 +08:00
parent 95deef6230
commit 9dfee7f49c
7 changed files with 397 additions and 170 deletions

View File

@@ -7,6 +7,8 @@ export const ENCRYPT_KEY = 'fiqaxijabbantusmprc234fj';
export const AUTH_SMS_CNT_PER_DAY = 8;
export const ADULT_AGE = 18;
export const COUNTER = {
UID: { name: 'uid', def: 1 },
GMUID: { name: 'gmuid', def: 1 },

View File

@@ -17,6 +17,7 @@ export const STATUS = {
DUP_LOGIN: { code: 10006, simStr: '重复登录' },
NEW_SERVER_ERR: { code: 10007, simStr: '添加新服务器失败' },
SERVER_EXISTS: { code: 10008, simStr: '服务器已存在' },
PASSWORD_ERR: { code: 10009, simStr: '密码错误' },
// 战斗相关状态 20000 - 29999
// 战斗通用 20000 - 20099
BATTLE_MISS_INFO: { code: 20001, simStr: '缺少关卡信息' },

View File

@@ -3,6 +3,8 @@ import { CounterModel } from './Counter';
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { genCode } from '../pubUtils/util';
const bcrypt = require('bcrypt');
const SALT_WORK_FACTOR = 5
/**
* 用户字段接口
@@ -24,16 +26,42 @@ export default class User extends BaseModel {
token: string;
@prop({ required: true })
tel: string;
tel: string; // 账号
@prop({ required: true, default: '' })
telHash: string;
@prop({ required: true })
password: string;
@prop({ required: true })
salt: string;
@prop({ required: true, default: '' })
channelId: string;
// 游客相关
@prop({ required: false, default: false })
isGuest: boolean; // 是否是游客
@prop({ required: false })
guestId: string;
guestId: string; // 游客id
@prop({ required: false, default: 0 })
guestTime: number; // 游客体验时间
// 防沉迷相关
@prop({ required: false, default: false })
hasAuthenticated: boolean; // 是否是已认证
@prop({ required: false })
birthday: string; // 生日年月
@prop({ required: false })
pi: string; // 已通过实名认证用户唯一标识
@prop({ required: false, default: 0 })
todayPlayTime: number; // 今日游戏时间
@prop({ required: false })
refDaily: Date; // 刷新todayPlayTime时间
@prop({ required: false, default: false })
hasSetPw: boolean; // 是否设置过密码
// 最后登录 IP
@prop({ required: false })
@@ -52,6 +80,9 @@ export default class User extends BaseModel {
unionId: string; // 用户标识
}];
@prop({ required: true, type: String, default: [], _id: false })
device: string[];
@prop({ required: true, default: 'com.bantu.zyz' })
pkgName: string;
@@ -67,23 +98,68 @@ export default class User extends BaseModel {
@prop({ required: true, default: 0 })
auth: number;
public static async updateToken(tel: string, token: string, platform: string, pkgName: string, serverType: string, lean = true) {
let user: UserType = await UserModel.findOne({ tel }).lean();
public static async createUser(isGuest: boolean, tel: string, token: string, platform: string, pkgName: string, serverType: string, deviceId: string, lean = true) {
const curTime: Date = new Date();
const uid = await CounterModel.getNewCounter(COUNTER.UID);
const userCode = genCode(8);
const doc = new UserModel();
let update = {};
if (!user) {
const uid = await CounterModel.getNewCounter(COUNTER.UID);
const userCode = genCode(8);
const doc = new UserModel();
update = Object.assign(update, { platform, pkgName, serverType, createTime: curTime, uid, userCode, username: `用户${uid}` }, doc.toJSON());
}
update = Object.assign(update, doc.toJSON(), { platform, pkgName, serverType, createTime: curTime, uid, userCode, username: `用户${uid}`, isGuest });
if(isGuest) update["guestId"] = tel;
update = Object.assign(update, { token, lastLoginTime: curTime });
user = await UserModel.findOneAndUpdate({ tel }, update, { upsert: true, new: true }).lean(lean);
delete update["device"];
const user = await UserModel.findOneAndUpdate({ tel }, { $set: update, $addToSet: {device: deviceId}}, { upsert: true, new: true }).lean(lean);
return user;
}
public static async updateToken(tel: string, token: string, deviceId: string, lean = true) {
const curTime: Date = new Date();
let user = await UserModel.findOneAndUpdate({ tel }, { $set: { token, lastLoginTime: curTime }, $addToSet: {device: deviceId}}, { new: true }).lean(lean);
return user;
}
public static async createOrUpdate(isGuest: boolean, tel: string, token: string, platform: string, pkgName: string, serverType: string, deviceId: string) {
let user: UserType = await UserModel.findOne({ tel }).lean();
if (!user) {
user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId);
} else {
user = await UserModel.updateToken(tel, token, deviceId);
}
return user;
}
private static async encryptPass(password: string, salt?: string) {
if (!salt) {
salt = await bcrypt.genSalt(SALT_WORK_FACTOR);
}
let npassword = await bcrypt.hash(password, salt);
return { npassword, salt };
}
public static async setPass(uid: number, password: string, lean = true) {
let r = await this.encryptPass(password);
const user: UserType = await UserModel.findOneAndUpdate({ uid }, { $set: { password: r.npassword, salt: r.salt, hasSetPw: true }}).lean(lean);
return user;
}
public static async checkPass(tel: string, password: string, token: string, deviceId: string, lean = true) {
const user: UserType = await UserModel.findOne({ tel }).select('salt').lean();
if (user) {
const curTime: Date = new Date();
let { salt } = user;
let { npassword } = await this.encryptPass(password, salt);
const checkUser: UserType = await UserModel.findOneAndUpdate({ tel, password: npassword }, { $set: { token, lastLoginTime: curTime }, $addToSet: {device: deviceId}}).select('uid username name token').lean(lean);
return checkUser;
} else {
return null
}
}
public static async findUserByToken(token: string, lean = true) {
const user: UserType = await UserModel.findOne({ token }).select('uid token serverType auth userCode').lean(lean);
const user: UserType = await UserModel.findOne({ token }).select('uid token serverType auth tel userCode').lean(lean);
return user;
}
@@ -119,6 +195,7 @@ export default class User extends BaseModel {
}
}
export const UserModel = getModelForClass(User);
export interface UserType extends Pick<DocumentType<User>, keyof User>{};

View File

@@ -93,4 +93,24 @@ export function getTodayZeroDate() {
date.setMinutes(0);
date.setSeconds(0);
return date;
}
export function getAge(birthday: string) {
let d = new Date(birthday + ' 00:00:00');
let _year = d.getFullYear();
let _month = d.getMonth() + 1;
let _day = d.getDate();
let age = 0;
let now = new Date();
let year = now.getFullYear();
let month = now.getMonth() + 1;
let day = now.getDate();
if (year >= _year && month >= _month && day >= _day) {
age = year - _year;
}else{
age = year - _year - 1;
}
return age
}