# 修复报告:选择已有试卷评分显示"暂无题目数据"问题
## 问题描述
在 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` - 上传试卷页面视图
## 备注
此修复确保了:
- ✅ 组件正确接收参数
- ✅ 数据自动加载
- ✅ 响应式更新
- ✅ 错误处理(空数据时显示友好提示)
修复后,用户可以正常查看和评分已存在的试卷。