ARCHITECTURE.md 8.8 KB

试卷分析组件架构

项目概述

本项目采用组件化设计,将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       │  │
│  └─────────────────────────────────────┘  │
└─────────────────────────────────────────────┘

组件清单

1. Header 组件

  • 类文件: app/View/Components/ExamAnalysis/Header.php
  • 模板文件: resources/views/components/exam-analysis/header.blade.php
  • 功能: 显示页面标题、记录ID、状态信息
  • 属性:
    • recordData (array) - 记录数据
    • title (string|null) - 可选标题

2. Loading 组件

  • 类文件: app/View/Components/ExamAnalysis/Loading.php
  • 模板文件: resources/views/components/loading.blade.php
  • 功能: 显示加载动画和提示信息
  • 属性:
    • message (string|null) - 可选加载提示文字

3. QuickStats 组件

  • 类文件: app/View/Components/ExamAnalysis/QuickStats.php
  • 模板文件: resources/views/components/exam-analysis/quick-stats.blade.php
  • 功能: 显示关键指标的迷你卡片
  • 属性:
    • recordData (array) - 记录数据

4. LearningAnalysis 组件

  • 类文件: app/View/Components/ExamAnalysis/LearningAnalysis.php
  • 模板文件: resources/views/components/exam-analysis/learning-analysis.blade.php
  • 功能: 显示掌握度、进度条、知识点统计
  • 属性:
    • analysisData (array) - 分析数据

5. QuestionDetails 组件

  • 类文件: app/View/Components/ExamAnalysis/QuestionDetails.php
  • 模板文件: resources/views/components/exam-analysis/question-details.blade.php
  • 功能: 显示题目详情、AI分析结果
  • 属性:
    • questions (array) - 题目数组

6. Recommendations 组件

  • 类文件: app/View/Components/ExamAnalysis/Recommendations.php
  • 模板文件: resources/views/components/exam-analysis/recommendations.blade.php
  • 功能: 显示学习建议列表
  • 属性:
    • recommendations (array) - 建议数组

布局模板

1. 紧凑布局 (exam-analysis-compact.blade.php)

适用场景: OCR记录页面 特点:

  • 页面高度紧凑,节省空间
  • 快速统计卡片展示关键指标
  • 题目详情分析区块详细展示AI分析

使用示例:

<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']" />

2. 标准布局 (exam-analysis-standard.blade.php)

适用场景: 系统生成卷子 特点:

  • 详细的统计概览卡片
  • 完整的知识点掌握情况
  • 更大的视觉展示空间

使用示例:

<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']" />

数据流

1. 数据来源

  • recordData: 从数据库获取的试卷记录数据
  • analysisData: 从API获取的学习分析数据
  • questions: 包含题目内容、学生答案、AI分析结果
  • recommendations: 根据分析数据生成的学习建议

2. 数据传递

// 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'] ?? []" />

优势

  1. 高可复用性

    • 每个组件可以在不同页面中重复使用
    • 支持多种布局方式
  2. 高可维护性

    • 组件独立开发和测试
    • 修改一个组件不影响其他组件
  3. 高可读性

    • 模板文件更简洁(紧凑布局从200+行减少到25行)
    • 组件职责单一
  4. 高扩展性

    • 新功能只需添加新组件
    • 支持多种主题和样式
  5. 一致性

    • 所有页面使用相同的组件
    • 统一的视觉风格和交互

扩展指南

添加新组件

  1. 创建组件类

    // 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');
    }
    }
    
  2. 创建模板文件

    <!-- resources/views/components/exam-analysis/new-component.blade.php -->
    <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-4">
    <!-- 组件内容 -->
    </div>
    
  3. 在页面中使用

    <x-exam-analysis.new-component :data="$data" />
    

修改现有组件

  1. 找到组件类文件
  2. 修改类属性
  3. 更新模板内容
  4. 重新构建前端

测试

运行组件测试:

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;
}
"

性能优化

  1. 组件缓存: Laravel会自动缓存组件类
  2. 模板缓存: 使用 php artisan view:cache 缓存视图
  3. 懒加载: 只在需要时渲染组件
  4. 数据缓存: 缓存API数据减少请求

许可证

MIT License