--- type: konzept-modul projekt: 3d.lehrstun.de stand: 2026-05-24 tags: [konzept, admin, dashboard] --- # Lehrer-Dashboard mit Drill-Down > **V5 aus der Reality-Check-Analyse** ([[../decisions#E-020]]). Schließt eine > bekannte Lücke des Arduino-Kurses, wo Herb manuell in jedes Gruppen-Cockpit > schauen muss, um zu sehen, wer wo steht. Route: `/admin/dashboard`. Berechtigung: `@admin_required`. Vom Cockpit nicht zu verwechseln — das ist der **Lehrer-Arbeitsplatz**. ## Layout-Skizze ``` ┌─ Admin-Dashboard ──────────────────────────────────────────────┐ │ │ │ ┌─ Wer ist heute hier (basiert auf check_in von HEUTE) ───┐ │ │ │ 🦊 Mia "Schlüsselanhänger weitermachen" → [→] │ │ │ │ 🦦 Tom "neues Projekt: Wasserrakete" → [→] │ │ │ │ 🐧 Lara "L2 fertig machen" → [→] │ │ │ │ 3 SuS heute eingeloggt │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌─ Wartet auf Lehrer-Reaktion ─────────────────── [3] ─────┐ │ │ │ 🟡 Mia — "Schlüsselanhänger" zur Freigabe (2 Tage) │ │ │ │ 🟡 Tom — "Drohnenrahmen" zur Freigabe (heute) │ │ │ │ 🔵 Lara — Rückfrage offen seit 5 Tagen │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌─ Drucker-Status (live) ─────────────────────────────────┐ │ │ │ 🟢 P1S #1 drucken "Schlüsselanhänger Mia" 43% │ │ │ │ 🟢 P1S #2 idle │ │ │ │ 🟡 X1C drucken "Drohnenrahmen Tom" 89% │ │ │ │ 🔴 A1 mini offline (Status veraltet >5min) │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌─ Wer hängt fest (>2 Wochen kein Fortschritt) ───────────┐ │ │ │ 🐝 Anna — letzter Check-In vor 3 Wochen │ │ │ │ → [Erinnerungs-Notiz im Cockpit hinterlassen] │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ## Sektion 1: Wer ist heute hier **Datenquelle:** `check_in` mit `besuch_datum = TODAY`. **Inhalt pro Zeile:** - Tier-Icon + Vorname (Klick → Profil-Detail) - Modus aus Check-In (z.B. „weiter wie bisher", „neues Projekt", „onboarding", „helfen") - Optionaler Freitext aus Check-In (falls vorhanden, in kursiv) - Link zum aktuellen Projekt (falls vorhanden) - Quick-Action: „Notiz hinterlassen" → schreibt Lehrer-Notiz ins SuS-Cockpit **Zweck:** In den ersten 5 Minuten der AG-Stunde weiß der Lehrer ohne Rumfragen, was läuft. ## Sektion 2: Wartet auf Lehrer-Reaktion **Datenquelle:** Zwei Untergruppen: 1. **Projekte mit `freigabe_status = 'wartet_auf_freigabe'`** — sortiert nach Wartezeit, älteste oben. 2. **Rückfragen** mit `status = 'offen'`, die schon länger als 3 Tage warten — der SuS hat möglicherweise vergessen, nachzubessern. **Badge im Header:** Anzahl der zu reviewen Projekte. Sichtbar auch in der Navigation (klein, rote Zahl neben „Admin"). **Quick-Action:** Klick auf Eintrag → `/admin/projekt-freigabe/` öffnet Detail-Review mit Three.js-Vorschau, allen Files, Edit-Möglichkeit, Freigeben-/Rückfrage-/Löschen-Buttons. **Zweck:** Review-Last sichtbar machen, damit nichts liegen bleibt. ## Sektion 3: Drucker-Status (live) **Datenquelle:** `drucker_status` (vom Bambu-Cloud-Polling befüllt — siehe [[druckerapi]]). **Inhalt pro Drucker:** - Status-Ampel (🟢 druckt/idle, 🟡 pausiert/Wartung, 🔴 offline/failed) - Drucker-Name + Modell - Aktueller Job-Name (wenn drucken) - Fortschritt + Restzeit - Quick-Action bei roter Ampel: „Manueller Status setzen" (Override) **Zweck:** Der Lehrer sieht beim Reinkommen in den Druckraum sofort, welche Drucker frei sind, welche fertig zur Abholung sind, welche Probleme haben. ## Sektion 4: Wer hängt fest **Datenquelle:** SuS, die in den letzten 2 Wochen weder einen `check_in` gemacht haben noch ein Projekt abgeschlossen haben. **Zweck:** Stille Aussteiger erkennen. Wer 3 Wochen nicht da war, ist möglicherweise nicht mehr dabei — oder braucht eine kurze Nachricht. **Quick-Action:** „Erinnerungs-Notiz im Cockpit hinterlassen" — beim nächsten Login sieht der SuS ein grünes Banner („Hey, lange nicht gesehen — alles okay?"). ## Performance-Hinweise Das Dashboard macht 4 Queries: - `SELECT` aus `check_in WHERE besuch_datum = TODAY` + JOIN `profil` + LEFT JOIN aktives `projekt` - `SELECT` aus `projekt WHERE freigabe_status IN ('wartet_auf_freigabe')` + JOIN `profil` - `SELECT` aus `drucker_status` (4 Zeilen) - Subquery für „hängt fest"-Liste Alle Indexes setzen: `idx_projekt_freigabe`, FK-Index auf `check_in.besuch_datum`. Bei 8-10 SuS und ~50 Projekten/Jahr ist Performance kein Thema. ## Quick-Action-Mechanik: „Notiz im Cockpit hinterlassen" Tabelle `lehrer_notiz` (neu): ```sql CREATE TABLE lehrer_notiz ( id INTEGER PRIMARY KEY AUTOINCREMENT, profil_id INTEGER NOT NULL, -- Adressat von_profil_id INTEGER, -- Lehrer (NULL = System) text TEXT NOT NULL, erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP, gelesen_am DATETIME, -- NULL = ungelesen typ TEXT DEFAULT 'info', -- 'info'|'rueckfrage'|'erinnerung' FOREIGN KEY (profil_id) REFERENCES profil(id) ON DELETE CASCADE ); ``` Wird im Cockpit als gelbes Banner gerendert (analog zur Rückfrage-Mechanik V6). SuS kann jede Notiz mit „verstanden" wegklicken → `gelesen_am` wird gesetzt. ## Was das Dashboard NICHT zeigt - Keine Aggregate über die ganze AG-Historie (das wäre Statistik, gehört in `/admin/statistik` als optionaler späterer Bereich). - Keine Daten anderer Lehrkräfte (es gibt nur Herb + Herr Rechmann, gleiche Sicht). - Kein Eingriff in laufende Druckjobs — das macht weiterhin die Bambu Handy App. ## Inline-Edit-Berechtigungen für Lehrer Aus [[routen#inline-edit-whitelist]]: - Lektionen: titel, aufgabe_md, tipp_md, extern_link — **immer**. - Software-Seiten: titel, inhalt_md, url, quickstart_md — **immer**. - Projekte: titel, beschreibung_md, tags — **nur während Review** (Status `wartet_auf_freigabe` oder `rueckfrage`). - Einstellungen: wert — **immer**. Jede Inline-Edit-Aktion landet in `aenderung_log` mit Lehrer-Profil-ID. So bleibt nachvollziehbar, wer was wann geändert hat. ## Querverweise - Routen: [[routen#admin-routesadminpy--herb--markus]] - Selbstlern-Loop (das Dashboard zeigt dessen Status): [[selbstlern-loop]] - Drucker-Anbindung: [[druckerapi]] - Datenmodell: [[datenmodell]] - Entscheidung V5: [[../decisions#E-020]] - Rückfrage-Mechanik V6: [[../decisions#E-020]]