api.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from fastapi import APIRouter, HTTPException, Query
  2. from typing import Dict, Any, List, Optional
  3. from datetime import datetime
  4. from core.load import all_data, flag1_data, flag2_data
  5. from core.history import history_manager
  6. from core.db import db
  7. from models.question import Question
  8. router = APIRouter()
  9. @router.get("/questions")
  10. async def get_question(t: str) -> Dict[str, Any]:
  11. """
  12. 根据题型生成问题
  13. 参数:
  14. t: 题目类型,可选值为 A, B, C, D, E
  15. A - 推理未知数
  16. B - 一题多解1(两个解答)
  17. C - 一题多解2(三个或以上解答)
  18. D - 一星题目
  19. E - 二星题目
  20. 返回:
  21. 包含问题内容、数字和答案的字典
  22. """
  23. try:
  24. # 创建问题实例并生成题目
  25. question = Question(t)
  26. result = question.generate()
  27. # 记录历史(只有生成题目时记录)
  28. history_manager.record_question(result)
  29. return result
  30. except ValueError as e:
  31. raise HTTPException(status_code=400, detail=str(e))
  32. except Exception as e:
  33. raise HTTPException(status_code=500, detail=f"生成题目时发生错误: {str(e)}")
  34. @router.get("/solutions")
  35. async def get_solutions(num1: int, num2: int, num3: int, num4: int):
  36. """
  37. 根据4个数字查询所有可能的解法
  38. 参数:
  39. num1: 第一个数字 (1-13)
  40. num2: 第二个数字 (1-13)
  41. num3: 第三个数字 (1-13)
  42. num4: 第四个数字 (1-13)
  43. 返回:
  44. 包含所有解法的列表
  45. """
  46. # 验证输入
  47. for num, name in [(num1, "num1"), (num2, "num2"), (num3, "num3"), (num4, "num4")]:
  48. if not 1 <= num <= 13:
  49. raise HTTPException(status_code=400, detail=f"{name}必须在1到13之间")
  50. # 查找匹配的游戏数据
  51. matching_games = [
  52. game for game in all_data
  53. if sorted([game.num1, game.num2, game.num3, game.num4]) == sorted([num1, num2, num3, num4])
  54. ]
  55. if not matching_games:
  56. result = {"solutions": [], "message": "没有找到匹配的解法"}
  57. # 不再记录解法查询历史
  58. # history_manager.record_solutions([num1, num2, num3, num4], result)
  59. return result
  60. # 提取所有解法
  61. solutions = []
  62. for game in matching_games:
  63. for solution in game.solutions:
  64. solutions.append({
  65. "expression": solution.expression,
  66. "flag": solution.flag
  67. })
  68. result = {
  69. "solutions": solutions,
  70. "count": len(solutions),
  71. "flag1_count": sum(1 for s in solutions if s["flag"] == 1),
  72. "flag2_count": sum(1 for s in solutions if s["flag"] == 2)
  73. }
  74. # 不再记录解法查询历史
  75. # history_manager.record_solutions([num1, num2, num3, num4], result)
  76. return result
  77. @router.get("/flag")
  78. async def get_flag(flag: int, min_num: Optional[str] = None, max_num: Optional[str] = None):
  79. """
  80. 获取指定flag的游戏数据
  81. 参数:
  82. flag: 解法标志,1表示一星,2表示二星
  83. min_num: 最小数字过滤
  84. max_num: 最大数字过滤
  85. 返回:
  86. 匹配的游戏数据列表
  87. """
  88. flag_data = flag1_data if flag == 1 else flag2_data
  89. data = []
  90. if min_num and min_num != "0" or max_num and max_num != "0":
  91. for item in flag_data:
  92. if min_num and item.no.startswith(min_num + "_") or max_num and item.no.startswith("_" + max_num):
  93. data.append(item)
  94. continue
  95. else:
  96. data = flag_data
  97. # 不再记录flag查询历史
  98. # history_manager.record_flag_query(flag, min_num, max_num, data)
  99. return data
  100. @router.get("/history")
  101. async def get_history(
  102. game_type: Optional[str] = Query(None, description="游戏类型,可选值为A, B, C, D, E"),
  103. start_date: Optional[str] = Query(None, description="开始日期,格式为YYYY-MM-DD"),
  104. end_date: Optional[str] = Query(None, description="结束日期,格式为YYYY-MM-DD"),
  105. page: int = Query(1, description="页码,从1开始"),
  106. page_size: int = Query(10, description="每页记录数")
  107. ):
  108. """
  109. 获取历史记录
  110. 参数:
  111. start_date: 开始日期,格式为YYYY-MM-DD
  112. end_date: 结束日期,格式为YYYY-MM-DD
  113. page: 页码,从1开始
  114. page_size: 每页记录数
  115. 返回:
  116. 历史记录列表
  117. """
  118. try:
  119. # 使用分页直接从数据库获取当前页的历史记录
  120. current_page_items, total_count = history_manager.get_history(game_type,start_date, end_date, page, page_size)
  121. return {
  122. "history": current_page_items,
  123. "count": total_count,
  124. "page": page,
  125. "page_size": page_size,
  126. "total_pages": (total_count + page_size - 1) // page_size
  127. }
  128. except Exception as e:
  129. raise HTTPException(status_code=500, detail=f"获取历史记录失败: {str(e)}")