Files
18xchat/assets/Scripts/chat18x/data/DataManager.ts
T

149 lines
4.2 KiB
TypeScript
Raw Normal View History

2025-08-14 16:30:08 +08:00
/**
* 数据管理器
* 统一管理所有数据类
*/
import { BaseData } from "./BaseData";
import { LoginData } from "./LoginData";
import { PlayerData } from "./PlayerData";
2025-08-16 16:14:10 +08:00
import { AccountData } from "./AccountData";
import { MetaData } from "./MetaData";
import { NetTimeData } from "./NetTimeData";
2025-08-25 18:01:40 +08:00
import { ThemeData } from "./ThemeData";
2025-08-25 18:18:59 +08:00
import { WalletData } from "./WalletData";
2025-08-26 11:10:15 +08:00
import { ShopData } from "./ShopData";
2025-08-27 14:29:37 +08:00
import { OrderData } from "./OrderData";
2025-09-02 15:07:53 +08:00
import { GirlData } from "./GirlData";
2025-08-14 16:30:08 +08:00
/**
* 集中定义数据ID,避免写错字符串
*/
export enum DataId {
Login = "login", // 登录数据
Player = "player", // 玩家数据
Account = "account", // 账号数据
Meta = "meta", // 元数据
NetTime = "netTime", // 网络时间数据
Theme = "theme", // 主题数据
Wallet = "wallet", // 钱包数据
Shop = "shop", // 商城数据
Order = "order", // 订单数据
2025-09-02 15:07:53 +08:00
Girl = "girl", // 技师数据
2025-08-14 16:30:08 +08:00
}
/** 构造器类型 */
type DataCtor<T extends BaseData = BaseData> = new () => T;
export class DataManager {
private static _I: DataManager | null = null;
public static get I(): DataManager {
if (!DataManager._I) DataManager._I = new DataManager();
return DataManager._I;
}
// 数据实例缓存
private _dataMap: Map<string, BaseData> = new Map();
// 数据ID到构造器的映射
private _config: Map<string, DataCtor> = new Map();
private constructor() {}
/**
* 初始化:注册 数据ID → 构造器
*/
public init(): void {
console.log("[DataManager] 数据管理器初始化");
this.registerAll();
}
/**
* 注册 数据ID → 构造器
*/
private registerAll(): void {
2025-08-14 16:30:08 +08:00
this.register(DataId.Login, LoginData);
this.register(DataId.Player, PlayerData);
2025-08-16 16:14:10 +08:00
this.register(DataId.Account, AccountData);
this.register(DataId.Meta, MetaData);
this.register(DataId.NetTime, NetTimeData);
2025-08-25 18:01:40 +08:00
this.register(DataId.Theme, ThemeData);
2025-08-25 18:18:59 +08:00
this.register(DataId.Wallet, WalletData);
2025-08-26 11:10:15 +08:00
this.register(DataId.Shop, ShopData);
2025-08-27 14:29:37 +08:00
this.register(DataId.Order, OrderData);
2025-09-02 15:07:53 +08:00
this.register(DataId.Girl, GirlData);
2025-08-14 16:30:08 +08:00
}
/**
* 注册一个数据ID及其对应的构造器
*/
private register<T extends BaseData>(dataId: string, ctor: DataCtor<T>): void {
2025-08-14 16:30:08 +08:00
if (this._config.has(dataId)) {
console.warn(`[DataManager] 重复注册数据ID: ${dataId},将覆盖旧构造器`);
}
this._config.set(dataId, ctor);
}
/**
* 获取数据(已存在则直接返回;否则按配置自动实例化并缓存)
*/
public getDataById<T extends BaseData = BaseData>(dataId: string): T | null {
2025-08-25 18:01:40 +08:00
// 先从缓存取
2025-08-14 16:30:08 +08:00
const cached = this._dataMap.get(dataId) as T | undefined;
if (cached) return cached;
2025-08-25 18:01:40 +08:00
// 缓存没有→ 查找构造器
2025-08-14 16:30:08 +08:00
const Ctor = this._config.get(dataId) as DataCtor<T> | undefined;
if (!Ctor) {
console.warn(`[DataManager] 未找到 dataId 的构造器配置: ${dataId}`);
return null;
}
2025-08-25 18:01:40 +08:00
// 动态创建 & init & 缓存
2025-08-14 16:30:08 +08:00
const instance = new Ctor();
// 若你的 BaseData.init 接受 dataId,可传入
instance.init?.(dataId);
this._dataMap.set(dataId, instance);
console.log(`[DataManager] 实例化并缓存数据: ${dataId}`);
return instance;
}
/**
* 移除数据
*/
public removeData(dataId: string): boolean {
const data = this._dataMap.get(dataId);
if (data) {
data.destroy?.();
this._dataMap.delete(dataId);
console.log(`[DataManager] 移除数据: ${dataId}`);
return true;
}
return false;
}
/**
* 重置所有数据
*/
public resetAllData(): void {
console.log("[DataManager] 重置所有数据");
this._dataMap.forEach((data) => data.reset?.());
}
/**
* 清空所有数据
*/
public clearAllData(): void {
console.log("[DataManager] 清空所有数据");
this._dataMap.forEach((data) => data.clear?.());
}
/**
* 销毁所有数据
*/
public destroyAllData(): void {
console.log("[DataManager] 销毁所有数据");
this._dataMap.forEach((data) => data.destroy?.());
this._dataMap.clear();
}
}