| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 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)
|