From 1c18565c8d78819c4f0358b83ab79212107d0b08 Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 18 Apr 2023 16:45:39 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(37=E9=9C=80=E6=B1=82):=20?= =?UTF-8?q?=E6=B3=A8=E9=94=80=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/consts/statusCode.ts | 2 ++ shared/db/Role.ts | 15 ++++++++++++++- shared/domain/gameField/serverlist.ts | 5 +++++ web-server/app/controller/account.ts | 12 ++++++++++++ web-server/app/router.ts | 2 ++ web-server/app/service/Auth.ts | 19 ++++++++++++++++++- web-server/app/service/Sdk.ts | 4 +++- 7 files changed, 56 insertions(+), 3 deletions(-) diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index c8963fac3..ffadb674d 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -54,6 +54,8 @@ export const STATUS = { CHANNEL_ERR: { code: 10018, simStr: '无此渠道' }, VALIDATE_ERR: { code: 10019, simStr: '渠道校验错误' }, SERVER_STOP_REGISTER: { code: 10020, simStr: '服务器已停止注册' }, + ROLE_CLOSE_TIME_OVER: { code: 10021, simStr: '该账号已注销不可再取消' }, + ROLE_CLOSED: { code: 10022, simStr: '该账号已注销' }, // 战斗相关状态 20000 - 29999 // 战斗通用 20000 - 20099 BATTLE_MISS_INFO: { code: 20001, simStr: '缺少关卡信息' }, diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 4f4480081..65ebc12d0 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -355,8 +355,11 @@ export default class Role extends BaseModel { @prop({ required: false }) hasComment: boolean; + @prop({ required: true, select: false }) + closeTime: number; + public static async findAllByUid(uid: number, getters = false, virtuals = true) { - const role: RoleType[] = await RoleModel.find({ 'userInfo.uid': uid }).select('roleId roleName serverId head frame spine heads frames spines lv updatedAt createTime').lean({ getters, virtuals }); + const role: RoleType[] = await RoleModel.find({ 'userInfo.uid': uid }).select('roleId roleName serverId head frame spine heads frames spines lv updatedAt createTime +closeTime').lean({ getters, virtuals }); return role; } @@ -858,6 +861,16 @@ export default class Role extends BaseModel { let role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $set: { hasComment } }, { new: true }).select('-_id roleId hasComment').lean(); return role; } + + public static async closeAccount(roleId: string, closeTime: number) { + let role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $set: { closeTime } }, { new: true }).select('roleId +closeTime').lean(); + return role; + } + + public static async cancelCloseAccount(roleId: string, now: number) { + let role: RoleType = await RoleModel.findOneAndUpdate({ roleId, closeTime: { $gte: now } }, { $set: { closeTime: 0 } }, { new: true }).select('roleId +closeTime').lean(); + return role; + } } export const RoleModel = getModelForClass(Role); diff --git a/shared/domain/gameField/serverlist.ts b/shared/domain/gameField/serverlist.ts index 0aa331234..370885a2a 100644 --- a/shared/domain/gameField/serverlist.ts +++ b/shared/domain/gameField/serverlist.ts @@ -1,3 +1,4 @@ +import { nowSeconds } from 'app/pubUtils/timeUtil'; import { RoleType } from '../../db/Role'; import { ServerlistType } from '../../db/Serverlist'; @@ -55,6 +56,8 @@ export class ServerParamWithRole extends ServerParam { spine: number; // 形象 lv: number; // 等级 updatedAt: Date; + isClose: boolean; // 是否已经注销 + closeTime: number; // 注销生效时间 constructor(role: RoleType, server: ServerlistType) { super(server); @@ -68,5 +71,7 @@ export class ServerParamWithRole extends ServerParam { this.spine = role.spine; this.lv = role.lv; this.updatedAt = role.updatedAt; + this.isClose = role.closeTime > 0 && role.closeTime < nowSeconds(); + this.closeTime = role.closeTime||0; } } \ No newline at end of file diff --git a/web-server/app/controller/account.ts b/web-server/app/controller/account.ts index d3775a5d6..aa6221c17 100644 --- a/web-server/app/controller/account.ts +++ b/web-server/app/controller/account.ts @@ -72,4 +72,16 @@ export default class AccountController extends Controller { const { roleId, magicWord } = ctx.request.body; ctx.body = await ctx.service.auth.deleteRole(roleId, magicWord); } + + public async closeAccount() { + const { ctx } = this; + const { roleId } = ctx.request.body; + ctx.body = await ctx.service.auth.closeAccount(roleId); + } + + public async cancelCloseAccount() { + const { ctx } = this; + const { roleId } = ctx.request.body; + ctx.body = await ctx.service.auth.cancelCloseAccount(roleId); + } } diff --git a/web-server/app/router.ts b/web-server/app/router.ts index 2fcaec865..2bfd5bb2b 100644 --- a/web-server/app/router.ts +++ b/web-server/app/router.ts @@ -23,6 +23,8 @@ export default (app: Application) => { router.post('/user/checkversion', tokenParser, controller.game.checkVersion); router.post('/user/checkv', tokenParser, controller.game.checkVersion); // 增加一个接口,规避 iOS 敏感词 router.post('/user/deleterole', controller.account.deleteRole); + router.post('/user/closeaccount', controller.account.closeAccount); + router.post('/user/cancelcloseaccount', controller.account.cancelCloseAccount); router.post('/game/getserverlist', tokenParser, controller.game.getServerList); router.post('/game/getnotice', tokenParser, controller.game.getnotice); router.post('/gate/queryenter', tokenParser, controller.game.queryEnter); diff --git a/web-server/app/service/Auth.ts b/web-server/app/service/Auth.ts index 2af4f7e49..e152206f0 100644 --- a/web-server/app/service/Auth.ts +++ b/web-server/app/service/Auth.ts @@ -307,11 +307,14 @@ export default class Auth extends Service { let canLogin = await this.ctx.service.utils.validateCanLogin(); if(!canLogin) return this.ctx.service.utils.resResult(STATUS.ONLINE_USER_MAX); - const role = await RoleModel.findByUid(uid, serverId); + const role = await RoleModel.findByUid(uid, serverId, 'roleId blockType +closeTime'); if (role) { if(role.blockType == BLOCK_TYPE.BLOCK) { return ctx.service.utils.resResult(STATUS.BLOCKED); } + if(role.closeTime > 0 && role.closeTime < nowSeconds()) { + return ctx.service.utils.resResult(STATUS.ROLE_CLOSED); + } return ctx.service.utils.resResult(STATUS.SUCCESS, { roleId: role.roleId }); } return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND); @@ -480,5 +483,19 @@ export default class Auth extends Service { if(!result) return ctx.service.utils.resResult(STATUS.WRONG_PARMS); return ctx.service.utils.resResult(STATUS.SUCCESS); } + + public async closeAccount(roleId: string) { + const ctx = this.ctx; + let role = await RoleModel.closeAccount(roleId, nowSeconds() + 15 * 24 * 60 * 60); + if(!role) return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND); + return ctx.service.utils.resResult(STATUS.SUCCESS, { closeTime: role.closeTime }); + } + + public async cancelCloseAccount(roleId: string) { + const ctx = this.ctx; + let role = await RoleModel.cancelCloseAccount(roleId, nowSeconds() + 15 * 24 * 60 * 60); + if(!role) return ctx.service.utils.resResult(STATUS.ROLE_CLOSE_TIME_OVER); + return ctx.service.utils.resResult(STATUS.SUCCESS, { closeTime: role.closeTime }); + } } diff --git a/web-server/app/service/Sdk.ts b/web-server/app/service/Sdk.ts index bf0bb4da5..8749bb428 100644 --- a/web-server/app/service/Sdk.ts +++ b/web-server/app/service/Sdk.ts @@ -560,7 +560,9 @@ export default class Sdk extends Service { let redisClient: RedisClient = this.ctx.app.context.redisClient; let servers = await redisClient.hgetallAsync(REDIS_KEY.SERVER); let roles = await RoleModel.findAllByUid(user.uid); - let result = roles.map(role => ({ + let result = roles + .filter(role => role.closeTime > 0 && role.closeTime < nowSeconds()) + .map(role => ({ id: role.roleId, name: role.roleName, level: role.lv.toString(),