api-catalog.blade.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <x-filament::page>
  2. <div class="space-y-6">
  3. <x-filament::section>
  4. <div class="text-base font-semibold text-slate-800">试卷 JSON 输出案例</div>
  5. <div class="mt-2 text-xs text-slate-500">输入卷子 ID,返回与智能出卷 API 中 `exam_content` 完全一致的 JSON,可预览或导出。</div>
  6. <div class="mt-4 space-y-3">
  7. <div class="flex flex-wrap items-center gap-3">
  8. <input
  9. id="paper-json-id"
  10. type="text"
  11. class="w-80 rounded-lg border border-slate-200 px-3 py-2 text-sm"
  12. value="paper_1765788931_ce02f6a3"
  13. placeholder="请输入 paper_id"
  14. />
  15. <button
  16. type="button"
  17. class="rounded-lg bg-primary-600 px-3 py-2 text-sm font-semibold text-white"
  18. onclick="loadPaperJson()"
  19. >
  20. 获取 JSON
  21. </button>
  22. <button
  23. type="button"
  24. class="rounded-lg border border-slate-200 px-3 py-2 text-sm font-semibold text-slate-700"
  25. onclick="downloadPaperJson()"
  26. >
  27. 导出 JSON
  28. </button>
  29. </div>
  30. <pre id="paper-json-output" class="max-h-96 overflow-auto rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-700">等待输入 paper_id ...</pre>
  31. </div>
  32. </x-filament::section>
  33. @foreach ($apiGroups as $group)
  34. <x-filament::section>
  35. <div class="text-base font-semibold text-slate-800">{{ $group['name'] }}</div>
  36. <div class="mt-2 text-xs text-slate-500">自动从 routes/api.php 生成。</div>
  37. <div class="mt-4 space-y-3">
  38. @foreach ($group['items'] as $item)
  39. <details class="rounded-lg border border-slate-200 bg-white p-4">
  40. <summary class="flex cursor-pointer list-none flex-wrap items-center gap-3">
  41. <span class="text-xs font-semibold uppercase text-slate-500">{{ $item['method'] }}</span>
  42. <span class="font-mono text-sm text-slate-800">{{ $item['path'] }}</span>
  43. @if (!empty($item['tag']))
  44. <span class="rounded-full border border-amber-200 bg-amber-50 px-2 py-0.5 text-xs font-semibold text-amber-700">
  45. {{ $item['tag'] }}
  46. </span>
  47. @endif
  48. <span class="ml-auto text-xs text-slate-400">点击展开</span>
  49. </summary>
  50. <div class="mt-3 space-y-2 text-sm text-slate-600">
  51. <div>
  52. <span class="font-semibold">参数:</span>{{ $item['params'] }}
  53. </div>
  54. <div>
  55. <span class="font-semibold">响应:</span>{{ $item['response'] }}
  56. </div>
  57. @if (!empty($item['details']['description']))
  58. <div>
  59. <span class="font-semibold">说明:</span>{{ $item['details']['description'] }}
  60. </div>
  61. @endif
  62. @if (!empty($item['details']['route_name']))
  63. <div>
  64. <span class="font-semibold">路由名:</span>{{ $item['details']['route_name'] }}
  65. </div>
  66. @endif
  67. @if (!empty($item['details']['action']))
  68. <div>
  69. <span class="font-semibold">Action:</span>{{ $item['details']['action'] }}
  70. </div>
  71. @endif
  72. @if (!empty($item['details']['examples']))
  73. <div>
  74. <span class="font-semibold">示例:</span>
  75. <pre class="mt-1 rounded bg-slate-50 p-2 text-xs text-slate-700">{{ implode("\n", $item['details']['examples']) }}</pre>
  76. </div>
  77. @endif
  78. </div>
  79. </details>
  80. @endforeach
  81. </div>
  82. </x-filament::section>
  83. @endforeach
  84. </div>
  85. <script>
  86. async function loadPaperJson() {
  87. const input = document.getElementById('paper-json-id');
  88. const output = document.getElementById('paper-json-output');
  89. const paperId = (input?.value || '').trim();
  90. if (!paperId) {
  91. output.textContent = '请输入 paper_id';
  92. return;
  93. }
  94. output.textContent = '加载中...';
  95. try {
  96. const response = await fetch(`/api/papers/${encodeURIComponent(paperId)}/json`);
  97. const data = await response.json();
  98. output.textContent = JSON.stringify(data, null, 2);
  99. } catch (error) {
  100. output.textContent = `请求失败: ${error}`;
  101. }
  102. }
  103. function downloadPaperJson() {
  104. const input = document.getElementById('paper-json-id');
  105. const paperId = (input?.value || '').trim();
  106. if (!paperId) {
  107. return;
  108. }
  109. window.location.href = `/api/papers/${encodeURIComponent(paperId)}/json?download=1`;
  110. }
  111. </script>
  112. </x-filament::page>