From c9817ea13ec2566cdd61963e6fa5b2f05bb6d7ec Mon Sep 17 00:00:00 2001 From: chen wei bo <1025839511@qq.com> Date: Mon, 1 Sep 2025 16:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ConfigManager=EF=BC=8C?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE=E6=95=B0=E6=8D=AE=E7=BB=A7?= =?UTF-8?q?=E6=89=BF=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Scripts/Main/Common/LanguageUtils.ts | 2 +- assets/Scripts/Sub/UI/PreloadUI.ts | 2 +- assets/Scripts/Sub/UI/SimpleLanguagePanel.ts | 2 +- assets/Scripts/chat18x/config/BaseConfig.ts | 87 +++++++++++++++ .../Scripts/chat18x/config/BaseConfig.ts.meta | 9 ++ assets/Scripts/chat18x/config/ThemeConfig.ts | 71 ++++++++++++ .../chat18x/config/ThemeConfig.ts.meta | 9 ++ .../Scripts/chat18x/core/ApiConfigLoader.ts | 2 +- .../Scripts/chat18x/core/EmotionAIService.ts | 2 +- .../Scripts/chat18x/core/RoleConfigLoader.ts | 2 +- assets/Scripts/chat18x/data/BaseData.ts | 2 + assets/Scripts/chat18x/data/ChatModel.ts | 2 +- assets/Scripts/chat18x/data/DataManager.ts | 9 +- .../Scripts/chat18x/manager/ConfigManager.ts | 103 +++++++++++++++++- .../chat18x/ui/panels/GirlDetailPanel.ts | 2 +- .../chat18x/ui/panels/GirlListPanel.ts | 2 +- .../chat18x/ui/panels/PurchasePanel.ts | 2 +- .../Scripts/chat18x/ui/panels/RecordPanel.ts | 2 +- .../Scripts/chat18x/ui/panels/ThemePanel.ts | 2 +- 19 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 assets/Scripts/chat18x/config/BaseConfig.ts create mode 100644 assets/Scripts/chat18x/config/BaseConfig.ts.meta create mode 100644 assets/Scripts/chat18x/config/ThemeConfig.ts create mode 100644 assets/Scripts/chat18x/config/ThemeConfig.ts.meta diff --git a/assets/Scripts/Main/Common/LanguageUtils.ts b/assets/Scripts/Main/Common/LanguageUtils.ts index 0bec76c8..ab18685b 100644 --- a/assets/Scripts/Main/Common/LanguageUtils.ts +++ b/assets/Scripts/Main/Common/LanguageUtils.ts @@ -1,6 +1,6 @@ import { _decorator, sys } from "cc"; import { Language } from "../../schema/schema"; -import ConfigManager from "../../chat18x/manager/ConfigManager"; +import { ConfigManager } from "../../chat18x/manager/ConfigManager"; import { CommonConfig } from "../Config/CommonConfig"; import li_EventManager from "./li_EventManager"; import Utils from "./Utils"; diff --git a/assets/Scripts/Sub/UI/PreloadUI.ts b/assets/Scripts/Sub/UI/PreloadUI.ts index 4dc55434..2cccd25a 100644 --- a/assets/Scripts/Sub/UI/PreloadUI.ts +++ b/assets/Scripts/Sub/UI/PreloadUI.ts @@ -32,7 +32,7 @@ import { WalletData } from "../../chat18x/data/WalletData"; import { AccountData } from "../../chat18x/data/AccountData"; import { MetaData } from "../../chat18x/data/MetaData"; import { NetTimeData } from "../../chat18x/data/NetTimeData"; -import ConfigManager from "../../chat18x/manager/ConfigManager"; +import { ConfigManager } from "../../chat18x/manager/ConfigManager"; import { AppConfig } from "db://assets/Scripts/chat18x/config/env/appConfig"; import DeviceIdService from "db://assets/Scripts/chat18x/foundation/identity/DeviceIdService"; import MachineInfoService from "db://assets/Scripts/chat18x/foundation/identity/MachineInfoService"; diff --git a/assets/Scripts/Sub/UI/SimpleLanguagePanel.ts b/assets/Scripts/Sub/UI/SimpleLanguagePanel.ts index 274f88c7..1f6362fc 100644 --- a/assets/Scripts/Sub/UI/SimpleLanguagePanel.ts +++ b/assets/Scripts/Sub/UI/SimpleLanguagePanel.ts @@ -12,7 +12,7 @@ import { import li_BaseView from "../../Main/Common/li_BaseView"; import LanguageUtils, { LanguageType } from "../../Main/Common/LanguageUtils"; import AudioManager from "../../Main/Manager/AudioManager"; -import ConfigManager from "../../chat18x/manager/ConfigManager"; +import { ConfigManager } from "../../chat18x/manager/ConfigManager"; const { ccclass, property } = _decorator; diff --git a/assets/Scripts/chat18x/config/BaseConfig.ts b/assets/Scripts/chat18x/config/BaseConfig.ts new file mode 100644 index 00000000..1fc01f76 --- /dev/null +++ b/assets/Scripts/chat18x/config/BaseConfig.ts @@ -0,0 +1,87 @@ +/** + * 配置数据类基类 + * 提供配置数据类的生命周期管理和基础功能 + */ +export class BaseConfig { + + /** 是否已初始化 */ + protected _isInitialized: boolean = false; + + /** 是否已销毁 */ + protected _isDestroyed: boolean = false; + + /** 配置数据ID */ + protected _configId: string = ''; + + /** + * 初始化数据 + * @param configId 配置数据ID + */ + public init(configId?: string): void{ + if (this._isInitialized) return; + this._isInitialized = true; + if (configId) { + this._configId = configId; + } + } + + /** + * 重置数据到初始状态 + */ + public reset(): void{ + + } + + /** + * 清空数据内容 + */ + public clear(): void{ + + } + + /** + * 销毁数据对象 + */ + public destroy(): void{ + if (this._isDestroyed) return; + this.clear(); + this._isDestroyed = true; + this._isInitialized = null; + this._configId = null; + } + + /** + * 获取配置数据ID + */ + public getConfigId(): string { + return this._configId; + } + + /** + * 设置配置数据ID + */ + public setConfigId(configId: string): void { + this._configId = configId; + } + + /** + * 是否已初始化 + */ + public isInitialized(): boolean { + return this._isInitialized; + } + + /** + * 是否已销毁 + */ + public isDestroyed(): boolean { + return this._isDestroyed; + } + + /** + * 获取所有配置 + */ + protected getAllConfig(): any | null { + return null; + } +} \ No newline at end of file diff --git a/assets/Scripts/chat18x/config/BaseConfig.ts.meta b/assets/Scripts/chat18x/config/BaseConfig.ts.meta new file mode 100644 index 00000000..79f050a2 --- /dev/null +++ b/assets/Scripts/chat18x/config/BaseConfig.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "f7335af0-3281-4f2e-8f8e-c59e869183f6", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/config/ThemeConfig.ts b/assets/Scripts/chat18x/config/ThemeConfig.ts new file mode 100644 index 00000000..2decd8df --- /dev/null +++ b/assets/Scripts/chat18x/config/ThemeConfig.ts @@ -0,0 +1,71 @@ +/** + * 主题配置 + */ +import { BaseConfig } from "./BaseConfig"; +import { ConfigManager } from "../manager/ConfigManager"; + +export class ThemeConfig extends BaseConfig { + + public reset(): void { + + } + + public clear(): void { + + } + + public destroy(): void { + super.destroy(); + } + + /** + * 获取所有配置 + */ + protected getAllConfig(): any | null { + return ConfigManager.tables.TbThemes; + } + + /** + * 获取配置,根据 id + */ + protected getConfigById(id: number): any | null { + let allData = this.getAllConfig(); + if (!allData) return null; + return allData.get(id); + } + + /** 根据主题 id 获取多语言键 */ + public getLanKeyById(id: number): string | null { + let oneData = this.getConfigById(id); + if (!oneData) return null; + return oneData.key; + } + + /** 根据主题 id 获取主题名称 */ + public getNameById(id: number): string | null { + let oneData = this.getConfigById(id); + if (!oneData) return null; + return oneData.name; + } + + /** 根据主题 id 获取主题枚举 */ + public getCategoryById(id: number): number | null { + let oneData = this.getConfigById(id); + if (!oneData) return null; + return oneData.category; + } + + /** 根据主题 id 获取是否解锁 */ + public getIsReleaseById(id: number): boolean | null { + let oneData = this.getConfigById(id); + if (!oneData) return null; + return oneData.isRelease; + } + + /** 根据主题 id 获取图片路径 */ + public getPathById(id: number): string | null { + let oneData = this.getConfigById(id); + if (!oneData) return null; + return oneData.path; + } +} \ No newline at end of file diff --git a/assets/Scripts/chat18x/config/ThemeConfig.ts.meta b/assets/Scripts/chat18x/config/ThemeConfig.ts.meta new file mode 100644 index 00000000..8579bd2f --- /dev/null +++ b/assets/Scripts/chat18x/config/ThemeConfig.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "161d34f2-7ca6-4f19-8dba-1f597dd28c4e", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/core/ApiConfigLoader.ts b/assets/Scripts/chat18x/core/ApiConfigLoader.ts index 024f3133..ec957223 100644 --- a/assets/Scripts/chat18x/core/ApiConfigLoader.ts +++ b/assets/Scripts/chat18x/core/ApiConfigLoader.ts @@ -3,7 +3,7 @@ * 统一管理所有API相关的配置信息 */ -import ConfigManager from "../manager/ConfigManager"; +import { ConfigManager } from "../manager/ConfigManager"; export interface AIConfig { /** API密钥 */ diff --git a/assets/Scripts/chat18x/core/EmotionAIService.ts b/assets/Scripts/chat18x/core/EmotionAIService.ts index 94fef494..7b6881f7 100644 --- a/assets/Scripts/chat18x/core/EmotionAIService.ts +++ b/assets/Scripts/chat18x/core/EmotionAIService.ts @@ -6,7 +6,7 @@ import { ChatHistoryManager } from "../manager/ChatHistoryManager"; import { ApiConfig } from "./ApiConfigLoader"; import { ErrorHandler, ErrorType } from "../utils/ErrorHandler"; import { VideoEmotion } from "../../schema/schema"; -import ConfigManager from "../manager/ConfigManager"; +import { ConfigManager } from "../manager/ConfigManager"; import LanguageUtils, { LanguageType } from "../../Main/Common/LanguageUtils"; import Utils from "../../Main/Common/Utils"; import { InnerMsgCode } from "../../Main/Config/InnerMsgCode"; diff --git a/assets/Scripts/chat18x/core/RoleConfigLoader.ts b/assets/Scripts/chat18x/core/RoleConfigLoader.ts index e40aeb91..35fb9019 100644 --- a/assets/Scripts/chat18x/core/RoleConfigLoader.ts +++ b/assets/Scripts/chat18x/core/RoleConfigLoader.ts @@ -1,5 +1,5 @@ import { AiCharacter } from "../../schema/schema"; -import ConfigManager from "../manager/ConfigManager"; +import { ConfigManager } from "../manager/ConfigManager"; /** * 角色配置映射 diff --git a/assets/Scripts/chat18x/data/BaseData.ts b/assets/Scripts/chat18x/data/BaseData.ts index c10559a4..3e2e3b37 100644 --- a/assets/Scripts/chat18x/data/BaseData.ts +++ b/assets/Scripts/chat18x/data/BaseData.ts @@ -46,6 +46,8 @@ export class BaseData { if (this._isDestroyed) return; this.clear(); this._isDestroyed = true; + this._isInitialized = null; + this._dataId = null; } /** diff --git a/assets/Scripts/chat18x/data/ChatModel.ts b/assets/Scripts/chat18x/data/ChatModel.ts index 18ea5c60..c270ea8c 100644 --- a/assets/Scripts/chat18x/data/ChatModel.ts +++ b/assets/Scripts/chat18x/data/ChatModel.ts @@ -1,6 +1,6 @@ import { VideoEmotion, purchase } from "../../schema/schema"; import { Dialog } from "./DialogData"; -import ConfigManager from "../manager/ConfigManager"; +import { ConfigManager } from "../manager/ConfigManager"; /** * 单个角色的聊天数据结构 diff --git a/assets/Scripts/chat18x/data/DataManager.ts b/assets/Scripts/chat18x/data/DataManager.ts index 8bd10dd5..348d4224 100644 --- a/assets/Scripts/chat18x/data/DataManager.ts +++ b/assets/Scripts/chat18x/data/DataManager.ts @@ -51,6 +51,13 @@ export class DataManager { */ public init(): void { console.log("[DataManager] 数据管理器初始化"); + this.registerAll(); + } + + /** + * 注册 数据ID → 构造器 + */ + private registerAll(): void { this.register(DataId.Login, LoginData); this.register(DataId.Player, PlayerData); this.register(DataId.Account, AccountData); @@ -65,7 +72,7 @@ export class DataManager { /** * 注册一个数据ID及其对应的构造器 */ - public register(dataId: string, ctor: DataCtor): void { + private register(dataId: string, ctor: DataCtor): void { if (this._config.has(dataId)) { console.warn(`[DataManager] 重复注册数据ID: ${dataId},将覆盖旧构造器`); } diff --git a/assets/Scripts/chat18x/manager/ConfigManager.ts b/assets/Scripts/chat18x/manager/ConfigManager.ts index f06b5f25..3a78a16d 100644 --- a/assets/Scripts/chat18x/manager/ConfigManager.ts +++ b/assets/Scripts/chat18x/manager/ConfigManager.ts @@ -6,8 +6,20 @@ import { } from "cc"; import * as cfg from "../../schema/schema"; import ByteBuf from "db://assets/Scripts/luban/ByteBuf"; +import { BaseConfig } from "../config/BaseConfig"; +import { ThemeConfig } from "../config/ThemeConfig"; -export default class ConfigManager { +/** + * 集中定义数据ID,避免写错字符串 + */ +export enum ConfigId { + Theme = "theme", // 主题配置 +} + +/** 构造器类型 */ +type DataCtor = new () => T; + +export class ConfigManager { private static _instance: ConfigManager = null; public static get I(): ConfigManager { if (!this._instance) { @@ -20,10 +32,16 @@ export default class ConfigManager { private static dataMap = new Map(); public static jsonFileNames: string[] = []; + // 数据实例缓存 + private _dataMap: Map = new Map(); + // 数据ID到构造器的映射 + private _config: Map = new Map(); + private constructor() {} public init() { this.loadAllConfig(); + this.registerAll(); } public loadConfigName(): void { @@ -83,4 +101,87 @@ export default class ConfigManager { } return null; } + + /** --------------------------------------------------------- 配置数据实例相关 --------------------------------------------------------- */ + + /** + * 注册 数据ID → 构造器 + */ + private registerAll(): void { + this.register(ConfigId.Theme, ThemeConfig); + } + + /** + * 注册一个数据ID及其对应的构造器 + */ + private register(configId: string, ctor: DataCtor): void { + if (this._config.has(configId)) { + console.warn(`[ConfigManager] 重复注册数据ID: ${configId},将覆盖旧构造器`); + } + this._config.set(configId, ctor); + } + + /** + * 获取数据(已存在则直接返回;否则按配置自动实例化并缓存) + */ + public getDataById(configId: string): T | null { + // 先从缓存取 + const cached = this._dataMap.get(configId) as T | undefined; + if (cached) return cached; + + // 缓存没有→ 查找构造器 + const Ctor = this._config.get(configId) as DataCtor | undefined; + if (!Ctor) { + console.warn(`[ConfigManager] 未找到 configId 的构造器配置: ${configId}`); + return null; + } + + // 动态创建 & init & 缓存 + const instance = new Ctor(); + // 若你的 BaseConfig.init 接受 configId,可传入 + instance.init?.(configId); + this._dataMap.set(configId, instance); + + console.log(`[ConfigManager] 实例化并缓存数据: ${configId}`); + return instance; + } + + /** + * 移除数据 + */ + public removeData(configId: string): boolean { + const data = this._dataMap.get(configId); + if (data) { + data.destroy?.(); + this._dataMap.delete(configId); + console.log(`[ConfigManager] 移除数据: ${configId}`); + return true; + } + return false; + } + + /** + * 重置所有数据 + */ + public resetAllData(): void { + console.log("[ConfigManager] 重置所有数据"); + this._dataMap.forEach((data) => data.reset?.()); + } + + /** + * 清空所有数据 + */ + public clearAllData(): void { + console.log("[ConfigManager] 清空所有数据"); + this._dataMap.forEach((data) => data.clear?.()); + } + + /** + * 销毁所有数据 + */ + public destroyAllData(): void { + console.log("[ConfigManager] 销毁所有数据"); + this._dataMap.forEach((data) => data.destroy?.()); + this._dataMap.clear(); + } } diff --git a/assets/Scripts/chat18x/ui/panels/GirlDetailPanel.ts b/assets/Scripts/chat18x/ui/panels/GirlDetailPanel.ts index febb6485..39cc7b0f 100644 --- a/assets/Scripts/chat18x/ui/panels/GirlDetailPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/GirlDetailPanel.ts @@ -11,7 +11,7 @@ import li_BaseView from "db://assets/Scripts/Main/Common/li_BaseView"; import ResManager from "db://assets/Scripts/Main/Manager/ResManager"; import { DetailImageItem } from "../../uiitems/DetailImageItem"; import { NavigationManager } from "../../manager/NavigationManager"; -import ConfigManager from "../../manager/ConfigManager"; +import { ConfigManager } from "../../manager/ConfigManager"; import LanguageUtils from "../../../Main/Common/LanguageUtils"; import Utils from "../../../Main/Common/Utils"; import { InnerMsgCode } from "../../../Main/Config/InnerMsgCode"; diff --git a/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts b/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts index 356b6979..6cf9653c 100644 --- a/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/GirlListPanel.ts @@ -3,7 +3,7 @@ import li_BaseView from "db://assets/Scripts/Main/Common/li_BaseView"; import Utils from "db://assets/Scripts/Main/Common/Utils"; import { GButton } from "db://assets/Scripts/Main/Common/GButton"; import { GirlListItem } from "../../uiitems/GirlListItem"; -import ConfigManager from "../../manager/ConfigManager"; +import { ConfigManager } from "../../manager/ConfigManager"; const { ccclass, property } = _decorator; @ccclass("GirlListPanel") diff --git a/assets/Scripts/chat18x/ui/panels/PurchasePanel.ts b/assets/Scripts/chat18x/ui/panels/PurchasePanel.ts index 44f1543d..4867f2e2 100644 --- a/assets/Scripts/chat18x/ui/panels/PurchasePanel.ts +++ b/assets/Scripts/chat18x/ui/panels/PurchasePanel.ts @@ -2,7 +2,7 @@ import { _decorator, Component, Label, Node } from "cc"; import li_BaseView from "../../../Main/Common/li_BaseView"; import Utils from "../../../Main/Common/Utils"; import { CommercialData } from "../../data/CommercialData"; -import ConfigManager from "../../manager/ConfigManager"; +import { ConfigManager } from "../../manager/ConfigManager"; import { GButton } from "../../../Main/Common/GButton"; import { PurchasePanelItem } from "../../uiitems/PurchasePanelItem"; import { ViewManager } from "../../../Main/Manager/ViewManager"; diff --git a/assets/Scripts/chat18x/ui/panels/RecordPanel.ts b/assets/Scripts/chat18x/ui/panels/RecordPanel.ts index dc5d4fb2..a121f7f4 100644 --- a/assets/Scripts/chat18x/ui/panels/RecordPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/RecordPanel.ts @@ -18,7 +18,7 @@ import { ChatContentsLayout } from "../components/ChatContentsLayout"; import { ViewManager } from "db://assets/Scripts/Main/Manager/ViewManager"; import GameRootUI from "db://assets/Scripts/Main/Common/GameRootUI"; import ResManager from "db://assets/Scripts/Main/Manager/ResManager"; -import ConfigManager from "../../manager/ConfigManager"; +import { ConfigManager } from "../../manager/ConfigManager"; import LanguageUtils from "../../../Main/Common/LanguageUtils"; import { Dialog } from "../../data/DialogData"; import { InnerMsgCode } from "../../../Main/Config/InnerMsgCode"; diff --git a/assets/Scripts/chat18x/ui/panels/ThemePanel.ts b/assets/Scripts/chat18x/ui/panels/ThemePanel.ts index 42eeab1d..d6dbb8f5 100644 --- a/assets/Scripts/chat18x/ui/panels/ThemePanel.ts +++ b/assets/Scripts/chat18x/ui/panels/ThemePanel.ts @@ -14,7 +14,7 @@ import ResManager from "db://assets/Scripts/Main/Manager/ResManager"; import { ThemeItem } from "../../uiitems/ThemeItem"; import { NavigationManager } from "../../manager/NavigationManager"; import { GirlListItem } from "../../uiitems/GirlListItem"; -import ConfigManager from "../../manager/ConfigManager"; +import { ConfigManager } from "../../manager/ConfigManager"; import LanguageUtils from "../../../Main/Common/LanguageUtils"; import { ViewManager } from "../../../Main/Manager/ViewManager"; import { InnerMsgCode } from "../../../Main/Config/InnerMsgCode";