web.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. use App\Http\Controllers\ImportStreamController;
  3. use App\Http\Controllers\MenuVisibilityController;
  4. use App\Http\Controllers\NotificationController;
  5. use App\Services\KatexRenderer;
  6. use App\Services\KnowledgeExplanationService;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Route;
  9. use Livewire\Mechanisms\FrontendAssets\FrontendAssets;
  10. /*
  11. | Livewire v4 脚本走 /livewire-{hash}/livewire.min.js;部分 CDN/浏览器仍请求 v2/v3 旧路径
  12. | /livewire/livewire.min.js,导致 404。此处注册兼容路由,返回与官方脚本路由相同的文件。
  13. */
  14. Route::middleware('web')->group(function () {
  15. Route::get('livewire/livewire.min.js', [FrontendAssets::class, 'returnJavaScriptAsFile']);
  16. Route::get('livewire/livewire.js', [FrontendAssets::class, 'returnJavaScriptAsFile']);
  17. });
  18. Route::get('/', function () {
  19. return redirect()->route('filament.admin.pages.dashboard');
  20. });
  21. Route::get('/test-math', function () {
  22. return view('test-math');
  23. });
  24. Route::get('/test-case', function () {
  25. return view('test-case');
  26. });
  27. Route::view('/knowledge-mindmap-public', 'public.knowledge-mindmap');
  28. Route::get('/admin/intelligent-exam/pdf/{paper_id}', [\App\Http\Controllers\ExamPdfController::class, 'show'])->name('filament.admin.auth.intelligent-exam.pdf');
  29. Route::get('/admin/intelligent-exam/grading/{paper_id}', [\App\Http\Controllers\ExamPdfController::class, 'showGrading'])->name('filament.admin.auth.intelligent-exam.grading');
  30. Route::get('/admin/intelligent-exam/knowledge-explanation/{paper_id}', [\App\Http\Controllers\ExamPdfController::class, 'showKnowledgeExplanation'])->name('filament.admin.auth.intelligent-exam.knowledge-explanation');
  31. // 服务端渲染预览(与 PDF 生成效果一致,用于调试)
  32. Route::get('/preview/exam/pdf-server/{paper_id}', [\App\Http\Controllers\ExamPdfController::class, 'showServerRendered'])->name('preview.exam.pdf-server');
  33. Route::get('/preview/exam/grading-server/{paper_id}', [\App\Http\Controllers\ExamPdfController::class, 'showGradingServerRendered'])->name('preview.exam.grading-server');
  34. Route::get('/admin/exam-analysis/pdf', [\App\Http\Controllers\ExamAnalysisPdfController::class, 'show'])->name('filament.admin.auth.exam-analysis.pdf');
  35. // 检查通知的路由
  36. Route::get('/admin/question-management/check-notifications', [NotificationController::class, 'checkNotifications']);
  37. // 菜单可见性切换路由
  38. Route::post('/admin/toggle-menu-visibility', [MenuVisibilityController::class, 'toggle'])
  39. ->name('filament.admin.auth.toggle-menu-visibility');
  40. // Livewire测试路由
  41. Route::get('/test-livewire', function () {
  42. return view('test-livewire');
  43. })->name('test.livewire');
  44. // 教材删除路由 - 通过URL参数传递ID,完全绕过Filament的$record传递问题
  45. // 使用GET方法避免CSRF问题
  46. Route::get('/admin/textbooks/{id}/delete', [\App\Http\Controllers\TextbookController::class, 'delete'])
  47. ->name('filament.admin.resources.textbooks.delete');
  48. Route::get('/admin/markdown-imports/stream', [ImportStreamController::class, 'stream'])
  49. ->name('filament.admin.markdown-imports.stream');
  50. // 题目预览验证工具(公开访问,无需登录)
  51. Route::get('/tools/question-preview', [\App\Http\Controllers\QuestionPreviewController::class, 'index'])
  52. ->name('tools.question-preview');
  53. Route::post('/tools/question-preview/pdf', [\App\Http\Controllers\QuestionPreviewController::class, 'generatePdf'])
  54. ->name('tools.question-preview.pdf');
  55. // 知识点讲解模板本地预览(仅本地环境,避免影响线上)
  56. Route::get('/tools/knowledge-explanation-preview', function (Request $request, KnowledgeExplanationService $knowledgeExplanationService, KatexRenderer $katexRenderer) {
  57. abort_unless(app()->environment('local'), 404);
  58. $kpCodes = (string) $request->query('kp_codes', 'M04A');
  59. $payload = [
  60. 'kp_codes' => array_values(array_filter(array_map('trim', explode(',', $kpCodes)))),
  61. 'student_id' => (string) $request->query('student_id', '1764913911'),
  62. 'teacher_id' => (string) $request->query('teacher_id', '45'),
  63. 'difficulty_category' => $request->query('difficulty_category') !== null
  64. ? (int) $request->query('difficulty_category')
  65. : null,
  66. ];
  67. $prepared = $knowledgeExplanationService->previewKnowledgeExplanation($payload);
  68. $knowledgeId = (string) ($prepared['knowledge_id'] ?? '');
  69. $displayCode = (string) preg_replace('/^(knowledge_|paper_)/', '', $knowledgeId);
  70. $html = view('pdf.knowledge-explanation-standalone', [
  71. 'knowledgeId' => $knowledgeId,
  72. 'knowledgePoints' => (array) ($prepared['knowledge_points'] ?? []),
  73. 'studentName' => (string) ($prepared['student_id'] ?? ''),
  74. 'teacherName' => (string) ($prepared['teacher_id'] ?? ''),
  75. 'generateDateTime' => now()->format('Y年m月d日 H:i:s'),
  76. 'pdfMeta' => ['header_title' => $displayCode !== '' ? $displayCode : $knowledgeId],
  77. 'examCode' => $displayCode !== '' ? $displayCode : $knowledgeId,
  78. ])->render();
  79. // 与 PDF 生成链路一致:服务端 KaTeX 预渲染,避免预览页出现原始 $...$ 公式
  80. $html = $katexRenderer->renderHtml($html);
  81. return response($html);
  82. })->name('tools.knowledge-explanation-preview');