# 修复报告:选择已有试卷评分显示"暂无题目数据"问题 ## 问题描述 在 FilamentAdmin 管理后台的 `http://fa.test/admin/upload-exam-paper` 页面: - ✅ 在【最近试卷记录】中能正常查看吴同学的试卷详情 - ❌ 在【选择已有试卷评分】选择试卷后,评分面板显示"暂无题目数据" ## 根本原因 ### 1. Livewire 组件参数传递问题 `grading-panel` 组件虽然在父视图中有以下调用: ```blade ``` 但是**没有传递 `selectedPaperId` 参数**,导致组件无法知道要加载哪份试卷的题目。 ### 2. 组件初始化逻辑缺失 `GradingPanel.php` 组件虽然声明了相关属性: ```php public ?string $teacherId = null; public ?string $studentId = null; public ?string $selectedPaperId = null; ``` 但是**没有 `mount()` 方法**来接收从父组件传递的参数,因此这些属性始终为 null。 ### 3. 缺少响应式更新机制 当 `selectedPaperId` 发生变化时(例如用户切换试卷),组件**没有自动重新加载**题目数据。 ## 修复方案 ### 修改 1:GradingPanel.php #### 1.1 添加 `mount()` 方法接收参数 ```php public function mount(?string $teacherId = null, ?string $studentId = null, ?string $selectedPaperId = null): void { $this->teacherId = $teacherId; $this->studentId = $studentId; // 如果传入了 selectedPaperId,则直接加载题目 if (!empty($selectedPaperId)) { $this->selectedPaperId = $selectedPaperId; $this->loadPaperQuestions(); } } ``` #### 1.2 添加 `updatedSelectedPaperId()` 响应式更新 ```php public function updatedSelectedPaperId($value): void { // 当 selectedPaperId 更新时,自动重新加载题目 if (!empty($value)) { $this->loadPaperQuestions(); } else { // 清空数据 $this->questions = []; $this->gradingData = []; } } ``` #### 1.3 优化 `loadPaper()` 方法签名 ```php #[On('loadPaper')] public function loadPaper(string $paperId, string $teacherId, string $studentId): void { $this->selectedPaperId = $paperId; $this->teacherId = $teacherId; $this->studentId = $studentId; $this->loadPaperQuestions(); } ``` ### 修改 2:upload-exam-paper.blade.php 在渲染 `grading-panel` 组件时传递 `selectedPaperId` 参数: ```blade {{-- 评分面板组件 --}} @if(!empty($selectedPaperId)) @endif ``` ## 数据流程(修复后) ``` 用户选择试卷 ↓ 父组件 selectedPaperId 更新 ↓ 父组件重新渲染 grading-panel 组件 ↓ grading-panel 组件 mount() 方法被调用 ↓ 接收到 selectedPaperId 参数 ↓ 调用 loadPaperQuestions() 加载题目 ↓ 查询 Paper 模型和关联的 PaperQuestion 数据 ↓ 从题库 API 获取正确答案(如果需要) ↓ 设置 $questions 数组 ↓ 视图渲染题目列表 ``` ## 验证方法 ### 1. 清理缓存 ```bash cd FilamentAdmin php artisan view:clear ``` ### 2. 访问测试页面 打开浏览器,访问:`http://fa.test/admin/upload-exam-paper` ### 3. 执行测试步骤 1. 点击【选择已有试卷评分】 2. 选择老师(例如:默认老师) 3. 选择学生(例如:吴同学) 4. 选择试卷(最新的一份试卷) 5. **预期结果**:评分面板应该显示试卷的题目列表,而不是"暂无题目数据" ### 4. 验证数据完整性 - 题目数量应该与试卷列表中显示的数量一致 - 每道题目应该显示: - 题目内容 - 题目类型 - 分值 - 参考答案(如果从题库获取到) ## 数据库查询验证 通过 tinker 可以验证数据确实存在: ```php $paper = \App\Models\Paper::where('paper_name', 'like', '%吴%')->latest()->first(); $paper->questions()->count(); // 应该返回题目数量,例如 6 ``` ## 涉及的文件 1. `/app/Livewire/UploadExam/GradingPanel.php` - 评分面板组件 2. `/resources/views/filament/pages/upload-exam-paper.blade.php` - 上传试卷页面视图 ## 备注 此修复确保了: - ✅ 组件正确接收参数 - ✅ 数据自动加载 - ✅ 响应式更新 - ✅ 错误处理(空数据时显示友好提示) 修复后,用户可以正常查看和评分已存在的试卷。