本项目采用组件化设计,将OCR试卷分析页面拆分为独立的、可复用的组件,提高代码的可维护性和可读性。
app/View/Components/ExamAnalysis/
├── Header.php # 头部组件类
├── QuickStats.php # 快速统计组件类
├── LearningAnalysis.php # 学习分析组件类
├── QuestionDetails.php # 题目详情组件类
├── Recommendations.php # 学习建议组件类
└── Loading.php # 加载状态组件类
resources/views/components/
├── exam-analysis/
│ ├── header.blade.php # 头部模板
│ ├── quick-stats.blade.php # 快速统计模板
│ ├── learning-analysis.blade.php # 学习分析模板
│ ├── question-details.blade.php # 题目详情模板
│ └── recommendations.blade.php # 学习建议模板
└── loading.blade.php # 加载状态模板
resources/views/filament/pages/
├── exam-analysis-compact.blade.php # OCR记录紧凑布局
└── exam-analysis-standard.blade.php # 系统生成卷子标准布局
┌─────────────────────────────────────────────┐
│ 页面布局 │
│ ┌─────────────────────────────────────┐ │
│ │ 头部组件 Header │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ 快速统计组件 QuickStats │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ 学习分析组件 LearningAnalysis │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ 题目详情组件 QuestionDetails │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ 学习建议组件 Recommendations │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
app/View/Components/ExamAnalysis/Header.phpresources/views/components/exam-analysis/header.blade.phprecordData (array) - 记录数据title (string|null) - 可选标题app/View/Components/ExamAnalysis/Loading.phpresources/views/components/loading.blade.phpmessage (string|null) - 可选加载提示文字app/View/Components/ExamAnalysis/QuickStats.phpresources/views/components/exam-analysis/quick-stats.blade.phprecordData (array) - 记录数据app/View/Components/ExamAnalysis/LearningAnalysis.phpresources/views/components/exam-analysis/learning-analysis.blade.phpanalysisData (array) - 分析数据app/View/Components/ExamAnalysis/QuestionDetails.phpresources/views/components/exam-analysis/question-details.blade.phpquestions (array) - 题目数组app/View/Components/ExamAnalysis/Recommendations.phpresources/views/components/exam-analysis/recommendations.blade.phprecommendations (array) - 建议数组适用场景: OCR记录页面 特点:
使用示例:
<x-exam-analysis.header :recordData="$recordData" title="📊 OCR试卷分析" />
<x-exam-analysis.quick-stats :recordData="$recordData" />
<x-exam-analysis.learning-analysis :analysisData="$analysisData" />
<x-exam-analysis.question-details :questions="$recordData['questions'] ?? []" />
<x-exam-analysis.recommendations :recommendations="$analysisData['recommendations']" />
适用场景: 系统生成卷子 特点:
使用示例:
<x-exam-analysis.header :recordData="$recordData" title="📊 试卷分析报告" />
<x-exam-analysis.learning-analysis :analysisData="$analysisData" />
<x-exam-analysis.question-details :questions="$recordData['questions'] ?? []" />
<x-exam-analysis.recommendations :recommendations="$analysisData['recommendations']" />
// ExamAnalysis.php 控制器
public function mount()
{
$this->loadAnalysisData(); // 加载数据
}
// 在视图中传递数据
<x-exam-analysis.header :recordData="$recordData" />
<x-exam-analysis.quick-stats :recordData="$recordData" />
<x-exam-analysis.question-details :questions="$recordData['questions'] ?? []" />
高可复用性
高可维护性
高可读性
高扩展性
一致性
创建组件类
// app/View/Components/ExamAnalysis/NewComponent.php
<?php
namespace App\View\Components\ExamAnalysis;
use Illuminate\View\Component;
class NewComponent extends Component
{
public function __construct(
public array $data
) {}
public function render()
{
return view('components.exam-analysis.new-component');
}
}
创建模板文件
<!-- resources/views/components/exam-analysis/new-component.blade.php -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 p-4">
<!-- 组件内容 -->
</div>
在页面中使用
<x-exam-analysis.new-component :data="$data" />
运行组件测试:
php artisan tinker --execute="
\$classes = [
'App\\View\\Components\\ExamAnalysis\\Header',
'App\\View\\Components\\ExamAnalysis\\QuickStats',
'App\\View\\Components\\ExamAnalysis\\LearningAnalysis',
'App\\View\\Components\\ExamAnalysis\\QuestionDetails',
'App\\View\\Components\\ExamAnalysis\\Recommendations',
'App\\View\\Components\\ExamAnalysis\\Loading'
];
foreach (\$classes as \$class) {
echo class_exists(\$class) ? \"✓ \$class\" . PHP_EOL : \"✗ \$class\" . PHP_EOL;
}
"
php artisan view:cache 缓存视图MIT License