# V2-Cockpit + Login — 2026-05-18 Großer Brocken durch. V2 ist jetzt eine **vollständige Mini-Anwendung** mit Login, Schüler-Cockpit, Lehrperson-Cockpit, Admin-Config — und der ganzen API-Schicht dahinter. ## Was du jetzt hast ### Login - [v2-platform/login.html](v2-platform/login.html) — Login mit Tab-Wechsel Lehrperson / Schüler*in - JWT-Token wird in localStorage gespeichert (Key `ggs_v2_session`) - Bei Token-Ablauf: Auto-Redirect zur Login-Seite - [auth-client.js](v2-platform/assets/js/auth-client.js) als zentraler Fetch-Wrapper für alle Cockpit-Seiten ### Schüler-Cockpit ([schueler.html](v2-platform/schueler.html)) - Profil-Header mit Avatar - Sektion „📌 Aktuelle Aufträge" — Module die die Lehrperson zugewiesen hat (mit fixer Difficulty) - Sektion „🎯 Freies Arbeiten" — generell freigegebene Module (Schüler*in wählt Difficulty aus `levelUnlocks`) - Klick auf Modul-Card → öffnet Modul mit Token-URL-Param + Mode (`teacher_started` vs `free`) - A11y-Profil-Settings werden auf `
` gespiegelt (`data-high-contrast`, `data-reduced-motion`, `data-text-scale`) ### Lehrperson-Cockpit ([teacher.html](v2-platform/teacher.html)) 4 Tabs: - **📡 Live** — Polling-Dashboard alle 3s, Karten pro Schüler*in mit Phase / Score-Bar / Stuck-Indikator / Nachteilsausgleich-Markierung - **👥 Schüler*innen** — Tabelle mit Avatar, Name, Toggle-Boxen für Easy-Sprache, Hoher Kontrast, Reduced Motion, Screen-Reader, **Nachteilsausgleich** — Auto-Save bei Klick - **📌 Aufträge** — bestehende Aufträge mit „Beenden"-Button + „+ Neuer Auftrag"-Modal (Modul + Difficulty wählen) - **📊 Auswertung** — Placeholder, „kommt in späterer V2-Iteration" ### Admin-Config ([admin-config.html](v2-platform/admin-config.html)) - Nur für `role=admin` (Lehrperson mit `teachers.is_admin = 1`) - Tuning-Inputs für Plattform-Werte: Heartbeat-Intervall (min/max), Stuck-Schwellwert, Token-TTL, Refresh-Fenster - Auto-Save bei Eingabe (mit 800ms-Debounce) - Range-Check serverseitig ## Neue API-Endpoints | Endpoint | Methode | Zweck | |---|---|---| | `/api/auth/login` | POST | Login Lehrperson + Schüler*in | | `/api/auth/refresh` | POST | Token erneuern | | `/api/auth/logout` | POST | activity_log, sonst stateless | | `/api/modules/available` | GET | Schüler*in: Aufträge + freie Module | | `/api/modules/all` | GET | Liste aller V2-Module für Auftrags-Dropdown | | `/api/teacher/classes` | GET | Klassen der Lehrperson | | `/api/teacher/students` | GET / PATCH | Schüler-Liste + Toggle-Updates | | `/api/teacher/assignments` | GET / POST / DELETE | Aufträge verwalten | | `/api/teacher/live-status` | GET | Polling-Endpoint für Live-Dashboard | | `/api/admin/platform-config` | GET / PATCH | Plattform-Tuning | Alle Endpoints haben Mock-Pendants in `v2-platform/mock/api/...`. ## Test (lokal) **Voraussetzung**: DB-Migration einspielen (war bisher nur als File da): ```bash mysql -u root geograsim < v2-platform/db/init.sql ``` Dann gegen die **echte API**: - `http://localhost/geograsim/v2-platform/` → Login mit deinen V1-Lehrperson-Credentials - Schüler-Login mit Klassencode + username + passwort aus V1 Oder gegen die **Mock-API** (DB-frei): - `http://localhost/geograsim/v2-platform/login.html` mit: - Lehrperson: `lehrer@mock` / `geheim` - Schüler*in: classCode `MOCK99`, username `lena|yusuf|sofia`, password `kind` - Achtung: Mock erkennt sich aus `/mock/`-Pfad — die Standard-`login.html` geht gegen die echte API. Für reinen Mock-Test wäre `mock/login.html` nötig (TODO). ## Was NICHT da ist - **Klasse / Schüler*in anlegen** im Cockpit (heute nur sehen/editieren) - **Auswertung-Tab** — Placeholder - **CSV-Export** — TODO - **Lehrperson-Registrierung** (V1-Pattern weiter nutzen, V2-Variante später) - **Passwort-Reset-Flow** (V1-Endpunkt weiter nutzen, V2-Variante später) ## Was du beachten musst - **Token im localStorage**: bei XSS-Angriff kompromittierbar. Plattform-Code ist sauber, kein eval, keine dangerouslySetInnerHTML — aber langfristig HttpOnly-Cookie sicherer (kann später eingeführt werden) - **Polling alle 3s**: bei 25 parallelen Lehrperson-Sessions = 8 Req/s. Verkraftbar, aber wenn die Last hoch wird → SSE oder WebSocket-Upgrade - **Modul-URL-Pfad** `../v2-modules/