# Abiturkorrektur-System - Entwicklerdokumentation **WICHTIG: Diese Datei wird bei jedem Compacting gelesen. Alle Implementierungsdetails hier dokumentieren!** --- ## 1. Projektziel Entwicklung eines KI-gestützten Korrektur-Systems für Deutsch-Abiturklausuren: - **Zielgruppe**: Lehrer in Niedersachsen (Pilot), später alle Bundesländer - **Kernproblem**: Erstkorrektur dauert 6 Stunden pro Arbeit - **Lösung**: KI schlägt Bewertungen vor, Lehrer bestätigt/korrigiert --- ## 2. Architektur-Übersicht ``` ┌─────────────────────────────────────────────────────────────┐ │ Frontend (Next.js) │ │ /website/app/admin/klausur-korrektur/ │ │ - page.tsx (Klausur-Liste) │ │ - [klausurId]/page.tsx (Studenten-Liste) │ │ - [klausurId]/[studentId]/page.tsx (Korrektur-Workspace) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ klausur-service (FastAPI) │ │ Port 8086 - /klausur-service/backend/main.py │ │ - Klausur CRUD (/api/v1/klausuren) │ │ - Student Work (/api/v1/students) │ │ - Annotations (/api/v1/annotations) [NEU] │ │ - Gutachten Generation │ │ - Fairness Analysis │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Infrastruktur │ │ - Qdrant (Vektor-DB für RAG) │ │ - MinIO (Datei-Storage) │ │ - PostgreSQL (Metadaten) │ │ - Embedding-Service (Port 8087) │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 3. Bestehende Backend-Komponenten (NUTZEN!) ### 3.1 Klausur-Service API (main.py) ```python # Bereits implementiert: GET/POST /api/v1/klausuren # Klausur CRUD GET /api/v1/klausuren/{id} # Klausur Details POST /api/v1/klausuren/{id}/students # Student Work hochladen GET /api/v1/klausuren/{id}/students # Studenten-Liste PUT /api/v1/students/{id}/criteria # Kriterien bewerten PUT /api/v1/students/{id}/gutachten # Gutachten speichern POST /api/v1/students/{id}/gutachten/generate # Gutachten generieren (KI) GET /api/v1/klausuren/{id}/fairness # Fairness-Analyse GET /api/v1/grade-info # Notensystem-Info ``` ### 3.2 Datenmodelle (main.py) ```python @dataclass class Klausur: id: str title: str subject: str = "Deutsch" year: int = 2025 semester: str = "Abitur" modus: str = "abitur" # oder "vorabitur" eh_id: Optional[str] = None # Erwartungshorizont-Referenz @dataclass class StudentKlausur: id: str klausur_id: str anonym_id: str file_path: str ocr_text: str = "" criteria_scores: Dict[str, int] = field(default_factory=dict) gutachten: str = "" status: str = "UPLOADED" raw_points: int = 0 grade_points: int = 0 # Status-Workflow: # UPLOADED → OCR_PROCESSING → OCR_COMPLETE → ANALYZING → # FIRST_EXAMINER → SECOND_EXAMINER → COMPLETED ``` ### 3.3 Notensystem (15-Punkte) ```python GRADE_THRESHOLDS = { 15: 95, 14: 90, 13: 85, 12: 80, 11: 75, 10: 70, 9: 65, 8: 60, 7: 55, 6: 50, 5: 45, 4: 40, 3: 33, 2: 27, 1: 20, 0: 0 } DEFAULT_CRITERIA = { "rechtschreibung": {"name": "Rechtschreibung", "weight": 15}, "grammatik": {"name": "Grammatik", "weight": 15}, "inhalt": {"name": "Inhalt", "weight": 40}, "struktur": {"name": "Struktur", "weight": 15}, "stil": {"name": "Stil", "weight": 15} } ``` --- ## 4. NEU ZU IMPLEMENTIEREN ### Phase 1: Korrektur-Workspace MVP #### 4.1 Frontend-Struktur ``` /website/app/admin/klausur-korrektur/ ├── page.tsx # Klausur-Übersicht (Liste aller Klausuren) ├── types.ts # TypeScript Interfaces ├── [klausurId]/ │ ├── page.tsx # Studenten-Liste einer Klausur │ └── [studentId]/ │ └── page.tsx # Korrektur-Workspace (2/3-1/3) └── components/ ├── KlausurCard.tsx # Klausur in Liste ├── StudentList.tsx # Studenten-Übersicht ├── DocumentViewer.tsx # PDF/Bild-Anzeige (links, 2/3) ├── AnnotationLayer.tsx # SVG-Overlay für Markierungen ├── AnnotationToolbar.tsx # Werkzeuge ├── CorrectionPanel.tsx # Bewertungs-Panel (rechts, 1/3) ├── CriteriaScoreCard.tsx # Einzelnes Kriterium ├── EHSuggestionPanel.tsx # EH-Vorschläge via RAG ├── GutachtenEditor.tsx # Gutachten bearbeiten └── StudentNavigation.tsx # Prev/Next Navigation ``` #### 4.2 Annotations-Backend (NEU in main.py) ```python # Neues Datenmodell: @dataclass class Annotation: id: str student_work_id: str page: int position: dict # {x, y, width, height} in % (0-100) type: str # 'rechtschreibung' | 'grammatik' | 'inhalt' | 'struktur' | 'stil' | 'comment' text: str # Kommentar-Text severity: str # 'minor' | 'major' | 'critical' suggestion: str # Korrekturvorschlag (bei RS/Gram) created_by: str # User-ID (EK oder ZK) created_at: datetime role: str # 'first_examiner' | 'second_examiner' linked_criterion: Optional[str] # Verknüpfung zu Kriterium # Neue Endpoints: POST /api/v1/students/{id}/annotations # Erstellen GET /api/v1/students/{id}/annotations # Abrufen PUT /api/v1/annotations/{id} # Ändern DELETE /api/v1/annotations/{id} # Löschen ``` #### 4.3 UI-Layout Spezifikation ``` ┌──────────────────────────────────────────────────────────────────────┐ │ Header: Klausur-Titel | Student: Anonym-123 | [← Prev] [5/24] [Next →]│ ├─────────────────────────────────────────┬────────────────────────────┤ │ │ Tabs: [Kriterien] [Gutachten]│ │ ┌─────────────────────────────────┐ │ │ │ │ │ │ ▼ Rechtschreibung (15%) │ │ │ Dokument-Anzeige │ │ [====|====] 70/100 │ │ │ (PDF/Bild mit Zoom) │ │ 12 Fehler markiert │ │ │ │ │ │ │ │ + Annotation-Overlay │ │ ▼ Grammatik (15%) │ │ │ (SVG Layer) │ │ [====|====] 80/100 │ │ │ │ │ │ │ │ │ │ ▼ Inhalt (40%) │ │ │ │ │ [====|====] 65/100 │ │ │ │ │ EH-Vorschläge: [Laden] │ │ └─────────────────────────────────┘ │ │ │ │ ▼ Struktur (15%) │ │ Toolbar: [RS] [Gram] [Kommentar] │ [====|====] 75/100 │ │ [Zoom+] [Zoom-] [Fit] │ │ │ │ ▼ Stil (15%) │ │ Seiten: [1] [2] [3] [4] [5] │ [====|====] 70/100 │ │ │ │ │ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │ │ Gesamtnote: 10 Punkte (2-) │ │ │ [Gutachten generieren] │ │ │ [Speichern] [Abschließen] │ ├─────────────────────────────────────────┴────────────────────────────┤ │ 2/3 Breite │ 1/3 Breite │ └──────────────────────────────────────────────────────────────────────┘ ``` --- ## 5. Implementierungs-Reihenfolge ### Phase 1.1: Grundgerüst (AKTUELL) 1. ✅ Dokumentation erstellen 2. [ ] `/website/app/admin/klausur-korrektur/page.tsx` - Klausur-Liste 3. [ ] `/website/app/admin/klausur-korrektur/types.ts` - TypeScript Types 4. [ ] Navigation in AdminLayout.tsx hinzufügen 5. [ ] Deploy + Test ### Phase 1.2: Korrektur-Workspace 1. [ ] `[klausurId]/page.tsx` - Studenten-Liste 2. [ ] `[klausurId]/[studentId]/page.tsx` - Workspace 3. [ ] `components/DocumentViewer.tsx` - Bild/PDF Anzeige 4. [ ] `components/CorrectionPanel.tsx` - Bewertungs-Panel 5. [ ] Deploy + Test mit Lehrer ### Phase 1.3: Annotations-System 1. [ ] Backend: Annotations-Endpoints in main.py 2. [ ] `components/AnnotationLayer.tsx` - SVG Overlay 3. [ ] `components/AnnotationToolbar.tsx` - Werkzeuge 4. [ ] Farbkodierung: RS=rot, Gram=blau, Inhalt=grün 5. [ ] Deploy + Test ### Phase 1.4: EH-Integration 1. [ ] `components/EHSuggestionPanel.tsx` 2. [ ] Backend: `/api/v1/students/{id}/eh-suggestions` 3. [ ] RAG-Query mit Student-Text 4. [ ] Deploy + Test ### Phase 1.5: Gutachten-Editor 1. [ ] `components/GutachtenEditor.tsx` 2. [ ] Beleg-Verlinkung zu Annotations 3. [ ] Gutachten-Generierung Button 4. [ ] Deploy + Test --- ## 6. API-Konfiguration ```typescript // Frontend API Base URLs const KLAUSUR_SERVICE = process.env.NEXT_PUBLIC_KLAUSUR_SERVICE_URL || 'http://localhost:8086' // Endpoints: // Klausuren GET ${KLAUSUR_SERVICE}/api/v1/klausuren POST ${KLAUSUR_SERVICE}/api/v1/klausuren GET ${KLAUSUR_SERVICE}/api/v1/klausuren/{id} GET ${KLAUSUR_SERVICE}/api/v1/klausuren/{id}/students // Studenten GET ${KLAUSUR_SERVICE}/api/v1/students/{id} GET ${KLAUSUR_SERVICE}/api/v1/students/{id}/file // Dokument-Download PUT ${KLAUSUR_SERVICE}/api/v1/students/{id}/criteria PUT ${KLAUSUR_SERVICE}/api/v1/students/{id}/gutachten POST ${KLAUSUR_SERVICE}/api/v1/students/{id}/gutachten/generate // Annotations (NEU) GET ${KLAUSUR_SERVICE}/api/v1/students/{id}/annotations POST ${KLAUSUR_SERVICE}/api/v1/students/{id}/annotations PUT ${KLAUSUR_SERVICE}/api/v1/annotations/{id} DELETE ${KLAUSUR_SERVICE}/api/v1/annotations/{id} // System GET ${KLAUSUR_SERVICE}/api/v1/grade-info ``` --- ## 7. Deployment-Prozess ```bash # 1. Dateien auf Mac Mini synchronisieren rsync -avz --delete \ --exclude 'node_modules' --exclude '.next' --exclude '.git' \ /Users/benjaminadmin/Projekte/breakpilot-pwa/website/ \ macmini:/Users/benjaminadmin/Projekte/breakpilot-pwa/website/ # 2. Website-Container neu bauen ssh macmini "/usr/local/bin/docker compose \ -f /Users/benjaminadmin/Projekte/breakpilot-pwa/docker-compose.yml \ build --no-cache website" # 3. Container neu starten ssh macmini "/usr/local/bin/docker compose \ -f /Users/benjaminadmin/Projekte/breakpilot-pwa/docker-compose.yml \ up -d website" # 4. Testen unter: # http://macmini:3000/admin/klausur-korrektur ``` --- ## 8. Bundesland-Spezifika (Niedersachsen Pilot) ```json // /klausur-service/backend/policies/bundeslaender.json { "NI": { "name": "Niedersachsen", "grading_mode": "points_15", "requires_gutachten": true, "zk_visibility": "full", // ZK sieht EK-Korrektur "third_correction_threshold": 4, // Ab 4 Punkte Diff "colors": { "first_examiner": "#dc2626", // Rot "second_examiner": "#16a34a" // Grün }, "criteria_weights": { "rechtschreibung": 15, "grammatik": 15, "inhalt": 40, "struktur": 15, "stil": 15 } } } ``` --- ## 9. Wichtige Dateien (Referenz) | Datei | Beschreibung | |-------|--------------| | `/klausur-service/backend/main.py` | Haupt-API, alle Endpoints | | `/klausur-service/backend/eh_pipeline.py` | BYOEH Verarbeitung | | `/klausur-service/backend/qdrant_service.py` | RAG Vector-Suche | | `/klausur-service/backend/hybrid_search.py` | Hybrid Search | | `/website/components/admin/AdminLayout.tsx` | Admin Navigation | | `/website/app/admin/ocr-labeling/page.tsx` | Referenz für 2/3-1/3 Layout | --- ## 10. Testing-Checkliste ### Nach jeder Phase: - [ ] Seite lädt ohne Fehler - [ ] API-Calls funktionieren (DevTools Network) - [ ] Responsives Layout korrekt - [ ] Lehrer kann Workflow durchführen ### Lehrer-Test-Szenarien: 1. Klausur erstellen 2. 3+ Studentenarbeiten hochladen 3. Erste Arbeit korrigieren (alle Kriterien) 4. Annotations setzen 5. Gutachten generieren 6. Zur nächsten Arbeit navigieren 7. Fairness-Check nach allen Arbeiten --- ## 11. Phase 2: Zweitkorrektur-System (NEU) ### 11.1 Neue Backend-Endpoints (main.py) ```python # Zweitkorrektur Workflow POST /api/v1/students/{id}/start-zweitkorrektur # ZK starten (nach EK) POST /api/v1/students/{id}/submit-zweitkorrektur # ZK-Ergebnis abgeben # Einigung (bei Diff 3 Punkte) POST /api/v1/students/{id}/einigung # Einigung einreichen # Drittkorrektur (bei Diff >= 4 Punkte) POST /api/v1/students/{id}/assign-drittkorrektor # DK zuweisen POST /api/v1/students/{id}/submit-drittkorrektur # DK-Ergebnis (final) # Workflow-Status & Visibility-Filtering GET /api/v1/students/{id}/examiner-workflow # Workflow-Status abrufen GET /api/v1/students/{id}/annotations-filtered # Policy-gefilterte Annotations ``` ### 11.2 Workflow-Status ```python class ExaminerWorkflowStatus(str, Enum): NOT_STARTED = "not_started" EK_IN_PROGRESS = "ek_in_progress" EK_COMPLETED = "ek_completed" ZK_ASSIGNED = "zk_assigned" ZK_IN_PROGRESS = "zk_in_progress" ZK_COMPLETED = "zk_completed" EINIGUNG_REQUIRED = "einigung_required" EINIGUNG_COMPLETED = "einigung_completed" DRITTKORREKTUR_REQUIRED = "drittkorrektur_required" DRITTKORREKTUR_ASSIGNED = "drittkorrektur_assigned" DRITTKORREKTUR_IN_PROGRESS = "drittkorrektur_in_progress" COMPLETED = "completed" ``` ### 11.3 Visibility-Regeln (aus bundeslaender.json) | Modus | ZK sieht EK-Annotations | ZK sieht EK-Note | ZK sieht EK-Gutachten | |-------|-------------------------|------------------|----------------------| | `blind` | Nein | Nein | Nein | | `semi` (Bayern) | Ja | Nein | Nein | | `full` (NI, Default) | Ja | Ja | Ja | ### 11.4 Konsens-Regeln | Differenz EK-ZK | Aktion | |-----------------|--------| | 0-2 Punkte | Auto-Konsens (Durchschnitt) | | 3 Punkte | Einigung erforderlich | | >= 4 Punkte | Drittkorrektur erforderlich | --- ## 12. Aktueller Stand **Datum**: 2026-01-21 **Phase**: Alle Phasen abgeschlossen **Status**: MVP komplett - bereit fuer Produktionstest ### Abgeschlossen: - [x] Phase 1: Korrektur-Workspace MVP - [x] Phase 1.1: Grundgerüst (Klausur-Liste, Studenten-Liste) - [x] Phase 1.2: Annotations-System - [x] Phase 1.3: RS/Grammatik Overlays - [x] Phase 1.4: EH-Vorschläge via RAG - [x] Phase 2.1 Backend: Zweitkorrektur-Endpoints - [x] Phase 2.2 Backend: Einigung-Endpoint - [x] Phase 2.3 Backend: Drittkorrektur-Trigger - [x] Phase 2.1 Frontend: ZK-Modus UI - [x] Phase 2.2 Frontend: Einigung-Screen - [x] Phase 3.1: Fairness-Dashboard Frontend - [x] Phase 3.2: Ausreißer-Liste mit Quick-Adjust - [x] Phase 3.3: Noten-Histogramm & Heatmap - [x] Phase 4.1: PDF-Export Backend (reportlab) - [x] Phase 4.2: PDF-Export Frontend - [x] Phase 4.3: Vorabitur-Modus mit EH-Templates ### URLs: - Klausur-Korrektur: `/admin/klausur-korrektur` - Fairness-Dashboard: `/admin/klausur-korrektur/[klausurId]/fairness` ### PDF-Export Endpoints: - `GET /api/v1/students/{id}/export/gutachten` - Einzelnes Gutachten als PDF - `GET /api/v1/students/{id}/export/annotations` - Anmerkungen als PDF - `GET /api/v1/klausuren/{id}/export/overview` - Notenübersicht als PDF - `GET /api/v1/klausuren/{id}/export/all-gutachten` - Alle Gutachten als PDF ### Vorabitur-Modus Endpoints: - `GET /api/v1/vorabitur/templates` - Liste aller EH-Templates - `GET /api/v1/vorabitur/templates/{aufgabentyp}` - Template-Details - `POST /api/v1/klausuren/{id}/vorabitur-eh` - Custom EH erstellen - `GET /api/v1/klausuren/{id}/vorabitur-eh` - Verknuepften EH abrufen - `PUT /api/v1/klausuren/{id}/vorabitur-eh` - EH aktualisieren ### Verfuegbare Aufgabentypen: - `textanalyse_pragmatisch` - Sachtexte, Reden, Kommentare - `gedichtanalyse` - Lyrik/Gedichte - `prosaanalyse` - Romane, Kurzgeschichten - `dramenanalyse` - Dramatische Texte - `eroerterung_textgebunden` - Textgebundene Eroerterung --- ## 13. Lehrer-Anleitung (Schritt-fuer-Schritt) ### 13.1 Zugang zum System **Weg 1: Ueber das Haupt-Dashboard** 1. Oeffnen Sie `http://macmini:8000/app` im Browser 2. Klicken Sie auf die Kachel "Abiturklausuren" 3. Sie werden automatisch zur Korrektur-Oberflaeche weitergeleitet **Weg 2: Direkter Zugang** 1. Oeffnen Sie direkt `http://macmini:3000/admin/klausur-korrektur` ### 13.2 Zwei Einstiegs-Optionen Beim ersten Besuch sehen Sie die Willkommens-Seite mit zwei Optionen: #### Option A: Schnellstart (Direkt hochladen) - Ideal wenn Sie sofort loslegen moechten - Keine manuelle Klausur-Erstellung erforderlich - System erstellt automatisch eine Klausur im Hintergrund **Schritte:** 1. Klicken Sie auf "Schnellstart - Direkt hochladen" 2. **Schritt 1**: Ziehen Sie Ihre eingescannten Arbeiten (PDF/JPG/PNG) in den Upload-Bereich 3. **Schritt 2**: Optional - Waehlen Sie den Aufgabentyp und beschreiben Sie die Aufgabenstellung 4. **Schritt 3**: Pruefen Sie die Zusammenfassung und klicken "Korrektur starten" 5. Sie werden automatisch zur Korrektur-Ansicht weitergeleitet #### Option B: Neue Klausur erstellen (Standard) - Empfohlen fuer regelmaessige Nutzung - Volle Metadaten (Fach, Jahr, Kurs, Modus) - Unterstuetzt Zweitkorrektur-Workflow **Schritte:** 1. Klicken Sie auf "Neue Klausur erstellen" 2. Geben Sie Titel, Fach, Jahr und Semester ein 3. Waehlen Sie den Modus: - **Abitur**: Fuer offizielle Abitur-Pruefungen mit NiBiS-EH - **Vorabitur**: Fuer Uebungsklausuren mit eigenem EH 4. Bei Vorabitur: Waehlen Sie Aufgabentyp und beschreiben Sie die Aufgabenstellung 5. Klicken Sie "Klausur erstellen" ### 13.3 Arbeiten hochladen Nach Erstellung der Klausur: 1. Oeffnen Sie die Klausur aus der Liste 2. Klicken Sie "Arbeiten hochladen" 3. Waehlen Sie die eingescannten Dateien (PDF oder Bilder) 4. Geben Sie optional anonyme IDs (z.B. "Arbeit-1", "Arbeit-2") 5. Das System startet automatisch die OCR-Erkennung ### 13.4 Korrigieren **Korrektur-Workspace (2/3-1/3 Layout):** - Links (2/3): Das Originaldokument mit Zoom-Funktion - Rechts (1/3): Bewertungspanel mit Kriterien **Schritt fuer Schritt:** 1. Oeffnen Sie eine Arbeit durch Klick auf "Korrigieren" 2. Lesen Sie die Arbeit im linken Bereich (Zoom mit +/-) 3. Setzen Sie Anmerkungen durch Klick auf das Dokument 4. Waehlen Sie den Anmerkungstyp: - **RS** (rot): Rechtschreibfehler - **Gram** (blau): Grammatikfehler - **Inhalt** (gruen): Inhaltliche Anmerkungen - **Kommentar**: Allgemeine Bemerkungen 5. Bewerten Sie die 5 Kriterien im rechten Panel: - Rechtschreibung (15%) - Grammatik (15%) - Inhalt (40%) - Struktur (15%) - Stil (15%) 6. Klicken Sie "EH-Vorschlaege laden" fuer KI-Unterstuetzung 7. Klicken Sie "Gutachten generieren" fuer einen KI-Vorschlag 8. Bearbeiten Sie das Gutachten nach Bedarf 9. Klicken Sie "Speichern" und dann "Naechste Arbeit" ### 13.5 Fairness-Analyse Nach Korrektur mehrerer Arbeiten: 1. Klicken Sie auf "Fairness-Dashboard" in der Klausur-Ansicht 2. Pruefen Sie: - **Noten-Histogramm**: Ist die Verteilung realistisch? - **Ausreisser**: Gibt es ungewoehnlich hohe/niedrige Noten? - **Kriterien-Heatmap**: Sind Kriterien konsistent bewertet? 3. Nutzen Sie "Quick-Adjust" um Anpassungen vorzunehmen ### 13.6 PDF-Export 1. In der Klausur-Ansicht klicken Sie "PDF-Export" 2. Waehlen Sie: - **Einzelgutachten**: PDF fuer einen Schueler - **Alle Gutachten**: Gesamtes PDF fuer alle Arbeiten - **Notenuebersicht**: Uebersicht aller Noten - **Anmerkungen**: Alle Annotationen als PDF ### 13.7 Zweitkorrektur (Optional) Fuer offizielle Abitur-Klausuren: 1. Erstkorrektur abschliessen (Status: "Abgeschlossen") 2. Klicken Sie "Zweitkorrektur starten" 3. Der Zweitkorrektor bewertet unabhaengig 4. Bei Differenz >= 3 Punkte: Einigung erforderlich 5. Bei Differenz >= 4 Punkte: Drittkorrektur wird automatisch ausgeloest ### 13.8 Haeufige Fragen **F: Kann ich eine Korrektur unterbrechen und spaeter fortsetzen?** A: Ja, alle Aenderungen werden automatisch gespeichert. **F: Was passiert mit meinen Daten?** A: Alle Daten werden lokal auf dem Schulserver gespeichert. Keine Cloud-Speicherung. **F: Kann ich den KI-Vorschlag komplett ueberschreiben?** A: Ja, das Gutachten ist frei editierbar. Der KI-Vorschlag ist nur ein Startpunkt. **F: Wie funktioniert die OCR-Erkennung?** A: Das System erkennt Handschrift automatisch. Bei schlechter Lesbarkeit koennen Sie manuell nachbessern. --- ## 14. Integration Dashboard (Port 8000) ### 14.1 Aenderungen in dashboard.py Die Funktion `openKlausurService()` wurde aktualisiert: ```javascript // Alte Version: Oeffnete Port 8086 (Backend) // Neue Version: Oeffnet Port 3000 (Next.js Frontend) function openKlausurService() { let baseUrl; if (window.location.hostname === 'macmini') { baseUrl = 'http://macmini:3000'; } else { baseUrl = 'http://localhost:3000'; } window.open(baseUrl + '/admin/klausur-korrektur', '_blank'); } ``` ### 14.2 Neue Frontend-Features - **Willkommens-Tab**: Erster Tab fuer neue Benutzer mit Workflow-Erklaerung - **Direktupload-Wizard**: 3-Schritt-Wizard fuer Schnellstart - **Drag & Drop**: Arbeiten per Drag & Drop hochladen - **localStorage-Persistenz**: System merkt sich wiederkehrende Benutzer