import json from pathlib import Path from typing import List from models.game_data import GameData from core.db.database import Database class DataLoader: """数据加载器,负责加载游戏数据并提供按属性访问的能力""" def __init__(self): """初始化数据加载器,只在首次创建时加载数据""" self._data_cache: List[GameData] = [] self._db = Database() self._load_data() @property def all_data(self) -> List[GameData]: """获取所有游戏数据""" return self._data_cache @property def flag1_data(self) -> List[GameData]: """获取所有包含flag=1的解决方案的游戏数据""" return [ game for game in self._data_cache if any(solution.flag == 1 for solution in game.solutions) ] @property def flag2_data(self) -> List[GameData]: """获取所有包含flag=2的解决方案的游戏数据""" return [ game for game in self._data_cache if any(solution.flag == 2 for solution in game.solutions) ] def get_data_by_flag(self, flag: int) -> List[GameData]: """根据指定的flag获取游戏数据 Args: flag: 解决方案的标志值 Returns: 包含指定flag解决方案的游戏数据列表 """ return [ game for game in self._data_cache if any(solution.flag == flag for solution in game.solutions) ] def _load_data(self): """加载游戏数据,仅在初始化时调用一次""" try: # 首先尝试从数据库加载数据 if self._db.has_game_data(): # 从数据库加载数据 db_data = self._db.get_all_game_data() self._data_cache = [self._convert_db_to_dto(item) for item in db_data] print(f"从数据库成功加载 {len(self._data_cache)} 条游戏数据") return # 如果数据库中没有数据,则从JSON文件导入 data_path = Path(__file__).parent.parent.parent / 'data' / '24game_data.json' if not data_path.exists(): raise FileNotFoundError(f"数据文件未找到: {data_path}") # 导入数据到数据库 self._db.import_json_data(data_path) # 从数据库加载数据 db_data = self._db.get_all_game_data() self._data_cache = [self._convert_db_to_dto(item) for item in db_data] print(f"从JSON导入并加载 {len(self._data_cache)} 条游戏数据") except json.JSONDecodeError as e: raise ValueError(f"JSON解析错误: {e}") from e except Exception as e: raise RuntimeError(f"数据加载失败: {e}") from e def _convert_db_to_dto(self, db_item: dict) -> GameData: """将数据库记录转换为DTO对象 Args: db_item: 数据库记录 Returns: 转换后的DTO对象 """ # 创建DTO对象 dto_dict = { 'id': db_item['id'], 'n1': db_item['num1'], 'n2': db_item['num2'], 'n3': db_item['num3'], 'n4': db_item['num4'], 's': [] } # 添加解法 for solution in db_item['solutions']: dto_dict['s'].append({ 'c': solution['expression'], 'f': solution['flag'] }) return GameData.from_dict(dto_dict)