web_api.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """前端取数接口:从 app.db 分页/筛选返回 query 与真实搜索结果。
  2. 挂到现有 FastAPI(creation_knowledge/api.py)。前端从「读死 json」改成调这些接口:
  3. GET /api/runs 有哪些批次
  4. GET /api/methods?table=queries|search 某表的打法清单(筛选下拉)
  5. GET /api/queries?method=&run_id=&page=&size=
  6. GET /api/search?platform=&method=&ok=&run_id=&page=&size=
  7. 每个请求开一个 sqlite 连接(轻、够用);连接出错时接口照常返回空集,不 500。
  8. """
  9. from __future__ import annotations
  10. from typing import Optional
  11. from fastapi import APIRouter, Query
  12. from acquisition import store
  13. from acquisition.query import (
  14. ACTIONS, CARRIER_POS_GROUPED, DEMAND, KTYPE_SUFFIX, MODALITIES, STAGES,
  15. )
  16. router = APIRouter(prefix="/api")
  17. # 各方法里【人工定义】的轴及其全部取值(实质/形式/作用来自分类树,不在此)。单一来源 = query.py。
  18. MANUAL_AXES = {
  19. "实质 × 创作阶段 × 需求": {"创作阶段": STAGES, "需求点": DEMAND},
  20. "形式 + 载体位置": {"载体位置": CARRIER_POS_GROUPED},
  21. "多轴正交组合": {"阶段": STAGES, "动作": ACTIONS, "知识类型": KTYPE_SUFFIX, "模态": MODALITIES},
  22. }
  23. @router.get("/runs")
  24. def runs() -> dict:
  25. conn = store.connect()
  26. try:
  27. return {"runs": store.list_runs(conn)}
  28. finally:
  29. conn.close()
  30. @router.get("/manual-axes")
  31. def manual_axes() -> dict:
  32. """各方法人工定义轴的全部取值(前端「查看人工定义的轴」弹窗用)。"""
  33. return {"axes": MANUAL_AXES}
  34. @router.get("/methods")
  35. def methods(table: str = Query("queries")) -> dict:
  36. conn = store.connect()
  37. try:
  38. tbl = "search_results" if table == "search" else "queries"
  39. return {"methods": store.list_methods(conn, tbl)}
  40. finally:
  41. conn.close()
  42. @router.get("/queries")
  43. def queries(method: Optional[str] = None, run_id: Optional[str] = None,
  44. page: int = 1, size: int = 30) -> dict:
  45. conn = store.connect()
  46. try:
  47. return store.list_queries(conn, method=method, run_id=run_id, page=page, size=size)
  48. finally:
  49. conn.close()
  50. @router.get("/search")
  51. def search(platform: Optional[str] = None, method: Optional[str] = None,
  52. ok: Optional[bool] = None, run_id: Optional[str] = None,
  53. query: Optional[str] = None, page: int = 1, size: int = 30) -> dict:
  54. conn = store.connect()
  55. try:
  56. return store.list_search(conn, platform=platform, method=method, ok=ok,
  57. run_id=run_id, query=query, page=page, size=size)
  58. finally:
  59. conn.close()
  60. @router.get("/search/summary")
  61. def search_summary() -> dict:
  62. """{query文本: {total, ok}}——列表页据此给每条 query 显示「搜索结果」按钮与计数。"""
  63. conn = store.connect()
  64. try:
  65. return {"summary": store.search_summary(conn)}
  66. finally:
  67. conn.close()