api.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // 后端取数:全部走 /api/*(dev 由 vite 代理到 uvicorn,线上同源)。
  2. // 失败不抛飞页面,返回空集,让 UI 显示「暂无数据」。
  3. async function getJSON(url) {
  4. const r = await fetch(url)
  5. if (!r.ok) throw new Error(`${r.status} ${url}`)
  6. return r.json()
  7. }
  8. function qs(params) {
  9. const p = new URLSearchParams()
  10. for (const [k, v] of Object.entries(params)) {
  11. if (v !== undefined && v !== null && v !== '') p.set(k, v)
  12. }
  13. const s = p.toString()
  14. return s ? `?${s}` : ''
  15. }
  16. export async function fetchRuns() {
  17. try { return (await getJSON('/api/runs')).runs || [] } catch { return [] }
  18. }
  19. export async function fetchMethods(table) {
  20. try { return (await getJSON(`/api/methods${qs({ table })}`)).methods || [] } catch { return [] }
  21. }
  22. const EMPTY = { total: 0, page: 1, size: 30, items: [] }
  23. export async function fetchQueries({ method, run_id, page, size } = {}) {
  24. try { return await getJSON(`/api/queries${qs({ method, run_id, page, size })}`) } catch { return EMPTY }
  25. }
  26. export async function fetchSearch({ platform, method, ok, run_id, query, page, size } = {}) {
  27. try { return await getJSON(`/api/search${qs({ platform, method, ok, run_id, query, page, size })}`) } catch { return EMPTY }
  28. }
  29. // {query文本: {total, ok}} —— 列表页给每条 query 决定「搜索结果」按钮是否可点、显示几个
  30. export async function fetchSearchSummary() {
  31. try { return (await getJSON('/api/search/summary')).summary || {} } catch { return {} }
  32. }