Skip to content

API 文档

认证与考试 (app/api/auth.py)

GET /api/exam/questions

  • 作用:获取入学考试题库。
  • 请求参数:无。
  • 响应示例: json [ {"id": "1", "content": "题目内容", "score": 10}, ... ]
  • 备注:若题库加载失败,返回兜底题目,避免前端报错。

POST /api/exam/submit

  • 作用:提交考试答案,判分并颁发登录凭证。
  • 请求体 (application/json): json { "username": "用户昵称", "answers": {"1": "A", "2": "B"}, "token": "可选,老用户凭证", "custom_llm_model": "可选,会话级自定义模型", "custom_llm_api_key": "可选,会话级自定义 API Key" }
  • 响应 (success): json {"status": "success", "score": 90, "tier": "TIER_1", "token": "<JWT>"}
  • 错误场景:用户名被占用且未提供正确 token、黑名单、分数未达标、凭证错误等。

POST /api/exam/quick_login

  • 作用:老用户免试登录,验证用户名 + 凭证。
  • 请求体: json {"username": "用户昵称", "token": "老用户凭证", "custom_llm_model": "可选", "custom_llm_api_key": "可选"}
  • 响应: json {"status": "success", "token": "<JWT>", "username": "...", "assigned_major": "..."}
  • 备注:黑名单/限制用户将被拒绝。

POST /api/assign_major

  • 作用:考试通过后分配专业并初始化游戏存档。
  • 请求体: json {"token": "<JWT>"}
  • 响应: json {"success": true, "major": "计算机科学", "major_abbr": "CS", "courses": [...]}
  • 备注:若 Redis 中不存在存档,将创建初始存档后再分配专业。

GET /api/admission_info

  • 作用:查询当前用户用户名与已分配专业。
  • 认证:Authorization: Bearer <JWT>
  • 响应: json {"username": "...", "assigned_major": "...", "token": "老用户凭证"}

游戏 WebSocket (app/api/game.py)

路径:/ws/game

  • 握手:先 accept(),10s 内首条消息需提供鉴权信息。
  • 首条消息 JSON: json { "token": "<JWT>", "custom_llm_model": "可选,会话级自定义模型", "custom_llm_api_key": "可选,会话级自定义 Key" }
  • 鉴权失败:返回 {"type": "auth_error", "message": "无效凭证"} 并关闭。
  • 账号受限:返回 auth_error 并关闭。
  • 连接管理:同一用户重复连接会踢掉旧连接;心跳超时会清理。
  • 消息频率:最小间隔 0.05s。

服务端推送消息类型

  • auth_ok:鉴权通过。
  • init:初始状态包,包含玩家统计、课程等。
  • event / random_event / tick / save_result / exit_confirmed 等(详见游戏引擎)。

客户端发送动作

  • 心跳:{"action": "ping"} → 返回 pong 并刷新 TTL。
  • 保存并退出:{"action": "save_and_exit"} → 返回 save_result,清理 Redis 后断开。
  • 仅保存:{"action": "save_game"} → 返回 save_result
  • 不保存退出:{"action": "exit_without_save"} → 返回 exit_confirmed,清理后断开。
  • 其他游戏动作:engine.process_action 处理(如 relax/event_choice/next_semester 等)。

公共/依赖 (app/api/deps.py)

  • get_db():注入异步数据库会话。
  • get_redis():获取 Redis 客户端。
  • get_current_user_info(token):解析 JWT,失败抛 403。
  • get_world_service():世界数据服务。
  • get_redis_repo(user_info, redis):按用户构造 Redis 仓库。
  • get_game_service(user_info, repo, world):构造游戏业务服务。
  • get_save_service():构造存档服务。

Redis 工具 (app/api/cache.py)

  • RedisCache.get_client():获取共享连接池。
  • 列表操作:lpoprpushrpush_with_limitrpush_many_with_limitllen
  • KV 操作:set/get/delete/exists/expire
  • TTL 刷新:touch_ttl(keys, ttl_seconds)
  • 玩家 key 构造:build_player_keys(user_id)

认证方式说明

  • 登录成功后获取 JWT;所有受保护接口/WS 首消息需携带 JWT。
  • get_current_user_info 在 HTTP 路由中可作为依赖;WS 中由首条消息手动解析。
  • 黑名单/限制用户会在各入口被拒绝。

会话级自定义 LLM

  • 前端可在登录页提供 custom_llm_model / custom_llm_api_key,仅在当次会话传递,不落库。
  • WS 首条消息携带后,后端在本连接中使用该配置,若无效则回退默认环境配置。