- JavaScript 83.1%
- CSS 16.2%
- HTML 0.4%
- Shell 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Stand der Demo-Webapp, wie sie unter jgg-w.schuelerinfo.de läuft, dazu der bisher gemeinsam erarbeitete Plan für das produktionsreife Backend (Docker, Sicherheit, Performance), die Code-Erklärung und Arbeitsnotizen, damit auf einem anderen Rechner nahtlos weitergearbeitet werden kann. Zugangsdaten und das Sicherheitsaudit bleiben außerhalb des Repos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| deploy | ||
| docs | ||
| public | ||
| seed | ||
| .gitignore | ||
| CLAUDE.md | ||
| mail.js | ||
| README.md | ||
| schulfrei.js | ||
| server.js | ||
| webpush.js | ||
JGG Schülerinfo – Webapp (jgg-w.schuelerinfo.de)
Installierbare Webapp im Stil der iOS-App: Stundenplan, Vertretungsplan, Hausaufgabenheft, Verfassungsviertelstunde (Padlet je Klasse und Tag), Aktionstag-Wahl mit Platzgrenzen, Schülerzeitung (JGG-Bladl) und Notenrechner.
server.js– Node ohne Abhängigkeiten: liefertpublic/aus und eine JSON-API unter/api/.seed/schule.json– Schulinhalte (Raster, Pläne, Räume, Vertretungen, Aktionstage, Zeitung). Wird bei jedem Start gelesen.seed/start.json– Startdaten für Padlet und Wahlen, nur beim allerersten Start kopiert.- Laufende Daten:
/var/lib/jgg-webapp/daten.jsonauf dem Server (nicht im Deploy). - Konten: Kürzel + Passwort (scrypt), freiwillig E-Mail für „Passwort vergessen" (
mail.js, SMTP über STARTTLS, KonfigurationSMTP_*/MAIL_FROMin/etc/jgg-webapp.env). Erstes Konto „verwaltung" mitADMIN_CODEals Startpasswort; Verwaltung legt Schülerkonten in der App an (Mehr → Schülerkonten). Freiwilliger Vorname (Mehr → Konto, auch durch die Verwaltung) für die Begrüßung „Hallo, …!"; ohne ihn das Kürzel. - Hausaufgaben: lokal zuerst, Abgleich mit dem Konto (
/api/hausaufgaben/abgleich, jüngere Änderung gewinnt). - Noten: wie die Hausaufgaben lokal zuerst und mit dem Konto abgeglichen (
/api/noten/abgleich, Datensätzeeinst/fach/note, jüngere Änderung gewinnt). Aufbau wie Notus: Fach → Noten mit Art, Halbjahr, Gewicht, Ziel. Fächer kommen automatisch aus dem Stundenplan der Klasse (jedes nur einmal, gelöschte bleiben weg). Q-Klassen: Punkte 0–15 und vier Semester 12/1–13/2 (hj1–4); Gesamt = Mittel der Semesterschnitte. Alte Gerätenoten (noten_faecher) werden beim ersten Start einmalig ins Konto übernommen. - Einführungen (
TUTORIALSin app.js): kurze App-Einführung beim ersten Start, eigene je Bereich (Plan, Hausaufgaben, Viertelstunde, Aktionstage, Noten) beim ersten Öffnen; alle unter Mehr → Einführungen. - Gewählte Klasse liegt nur im Browser (localStorage).
Betrieb
Server: Hetzner, SSH-Alias jgg-server (IP im Passwort-Manager), pm2-Prozess jgg-w, Port 3400, nginx-vhost
/etc/nginx/sites-available/jgg-w (Certbot-TLS). Geheimnisse in /etc/jgg-webapp.env
(ACCESS_CODE, ADMIN_CODE, SESSION_SECRET). DNS: A-Record jgg-w bei IONOS.
Ausliefern: ./deploy/deploy.sh. Versionen laufen automatisch: Der Server bildet beim
Start einen Fingerabdruck aller Dateien in public/ und setzt ihn als __VERSION__ in
index.html und sw.js ein. Nichts von Hand hochzählen.
Offline und Updates
- Service Worker (
public/sw.js): App-Hülle cache-first, Daten erst Netz und nach 2,5 s (oder bei 5xx) der gespeicherte Stand – nicht in den 30 s nach einer eigenen Änderung. Zeitungs-PDFs und Titelbilder cache-first unter?v=<Stand>, damit getauschte Dateien ankommen. Nach dem Login lädt die App alles Nötige vor. Abmelden, Anmelden und abgelaufene Sitzungen leeren den Daten-Cache. - Abgleich: Der Client schickt seinen ganzen Bestand (Limit 1 MB) und räumt lokal mit denselben Fristen auf wie der Server (Grabsteine 60 Tage, Erledigtes 120 Tage).
- Die App fragt
/api/versionbeim Start, beim Zurückkehren in den Vordergrund, wenn wieder Netz da ist, und alle 15 Minuten ab. Bei neuer Version: neuen Worker laden, aktivieren, neu laden. Dauert es länger als 0,8 s, erscheint „Neue Version wird geladen …". Ein offenes Formular wird nicht unterbrochen. - Konnte die App 10 Tage lang nicht prüfen, erscheint ein wegklickbarer Hinweis (nach 24 h wieder).
Lokal: siehe docs/NOTIZEN.md.
Plan für den Neuaufbau: docs/PLAN-NEUAUFBAU.md.