登录:同一设备不可重复使用游客模式

This commit is contained in:
luying
2021-03-04 15:34:03 +08:00
parent bbdc20240d
commit 0e7fa64393
3 changed files with 34 additions and 16 deletions
+2
View File
@@ -8,6 +8,8 @@ export const ENCRYPT_KEY = 'fiqaxijabbantusmprc234fj';
export const AUTH_SMS_CNT_PER_DAY = 8; export const AUTH_SMS_CNT_PER_DAY = 8;
export const ADULT_AGE = 18; export const ADULT_AGE = 18;
export const GUEST_MAX_TIME = 60 * 60 * 100; // 游客体验时间
export const GUEST_DAY = 15; // 同一设备15天内不得重复体验游客模式
export const COUNTER = { export const COUNTER = {
UID: { name: 'uid', def: 1 }, UID: { name: 'uid', def: 1 },
+8 -4
View File
@@ -98,19 +98,23 @@ export default class User extends BaseModel {
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
auth: number; auth: number;
public static async createUser(isGuest: boolean, tel: string, token: string, platform: string, pkgName: string, serverType: string, deviceId: string, lean = true) { public static async createUser(isGuest: boolean, tel: string, token: string, platform: string, pkgName: string, serverType: string, deviceId: string, guestTime?: number) {
const curTime: Date = new Date(); const curTime: Date = new Date();
const uid = await CounterModel.getNewCounter(COUNTER.UID); const uid = await CounterModel.getNewCounter(COUNTER.UID);
const userCode = genCode(8); const userCode = genCode(8);
const doc = new UserModel(); const doc = new UserModel();
let update = {}; let update = {};
update = Object.assign(update, doc.toJSON(), { platform, pkgName, serverType, createTime: curTime, uid, userCode, username: `用户${uid}`, isGuest }); update = Object.assign(update, doc.toJSON(), { platform, pkgName, serverType, createTime: curTime, uid, userCode, username: `用户${uid}`, isGuest, token, lastLoginTime: curTime, guestTime });
if(isGuest) update["guestId"] = tel; if(isGuest) update["guestId"] = tel;
update = Object.assign(update, { token, lastLoginTime: curTime });
delete update["device"]; delete update["device"];
const user = await UserModel.findOneAndUpdate({ tel }, { $set: update, $addToSet: {device: deviceId}}, { upsert: true, new: true }).lean(lean); const user: UserType = await UserModel.findOneAndUpdate({ tel }, { $set: update, $addToSet: {device: deviceId}}, { upsert: true, new: true }).lean();
return user;
}
public static async getLastDeviceGuest(deviceId: string) {
const user: UserType = await UserModel.findOne({ device: { $elemMatch: { $eq: deviceId } }, isGuest: true }).sort({createTime: -1}).lean();
return user; return user;
} }
+24 -12
View File
@@ -1,4 +1,4 @@
import { COUNTER, HERO_SYSTEM_TYPE, DEFAULT_LV, DEFAULT_ITEMS, ITID, DEFAULT_GOLD, DEFAULT_HERO_LV, DEFAULT_EQUIPS, DEFAULT_COIN, ADULT_AGE } from '@consts'; import { COUNTER, HERO_SYSTEM_TYPE, DEFAULT_LV, DEFAULT_ITEMS, ITID, DEFAULT_GOLD, DEFAULT_HERO_LV, DEFAULT_EQUIPS, DEFAULT_COIN, ADULT_AGE, GUEST_MAX_TIME, GUEST_DAY } from '@consts';
import { DEFAULT_HEROES } from '@consts'; import { DEFAULT_HEROES } from '@consts';
import { HeroModel } from '@db/Hero'; import { HeroModel } from '@db/Hero';
import { RoleModel } from '@db/Role'; import { RoleModel } from '@db/Role';
@@ -34,17 +34,29 @@ export default class Auth extends Service {
if(isGuest) { if(isGuest) {
const tel = ctx.service.utils.genCode(10); const tel = ctx.service.utils.genCode(10);
const token = ctx.service.utils.generateStr(256); const token = ctx.service.utils.generateStr(256);
user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId); let lastGuest = await UserModel.getLastDeviceGuest(deviceId);
let param = this.getReturnParam(user); let { guestTime, createdAt } = lastGuest;
// TODO 判断同一设备号15天内是否重复使用游客模式 if(shouldRefresh(createdAt, new Date(), 0, GUEST_DAY)) {
if(param.isGuest && param.guestTime > 60*60*1000) { guestTime = 0;
loginType = 2;
} }
return this.ctx.service.utils.resResult(STATUS.SUCCESS, { if(guestTime > GUEST_MAX_TIME) {
canLogin: true, loginType = 3;
loginType, return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
...param canLogin: true,
}); loginType
});
} else {
user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId, guestTime);
let param = this.getReturnParam(user);
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
canLogin: true,
loginType,
...param
});
}
} else { } else {
return this.ctx.service.utils.resResult(STATUS.SUCCESS, { return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
@@ -56,7 +68,7 @@ export default class Auth extends Service {
user = await UserModel.updateToken(user.tel, token, deviceId); user = await UserModel.updateToken(user.tel, token, deviceId);
let param = this.getReturnParam(user); let param = this.getReturnParam(user);
if(param.isGuest && param.guestTime > 60*60*1000) { if(param.isGuest && param.guestTime > GUEST_MAX_TIME) {
loginType = 2; loginType = 2;
} }
return this.ctx.service.utils.resResult(STATUS.SUCCESS, { return this.ctx.service.utils.resResult(STATUS.SUCCESS, {