🛠️ Technische Dokumentation
Turnierplaner der Fasnet Gilde Markgröningen
v2.8.0 · 2026-05-24 · Generiert: 24.05.2026 14:50
1 · Überblick
| Eigenschaft | Wert |
|---|---|
| Frontend | Single-Page-App in einer HTML-Datei, Vanilla JavaScript |
| Backend | PHP (api.php als Router, auth.php für Authentifizierung) |
| Datenhaltung | JSON-Dateien im Ordner Data/ (kein DBMS) |
| Authentifizierung | Token-basiert (sessions.json) |
| SMTP | mxe87b.netcup.net:465 |
| Version | v2.8.0 (2026-05-24) |
| Hosting | Synology NAS, nginx, Document-Root = web/turnierplaner |
2 · Architektur
3 · Dateien auf dem Server
| Datei | Größe | Geändert |
|---|---|---|
Turnierplaner.html | 586.4 KB | 22.05.2026 13:35 |
api.php | 44.8 KB | 24.05.2026 14:50 |
api_license.php | 2.5 KB | 23.05.2026 18:52 |
api_v1.php | 105.2 KB | 22.05.2026 06:58 |
auth.php | 24.2 KB | 24.05.2026 14:50 |
check_browser.html | 3.8 KB | 23.05.2026 22:05 |
check_permissions.php | 5.9 KB | 23.05.2026 22:05 |
debug_api.php | 6.5 KB | 23.05.2026 22:05 |
deploy.php | 35.5 KB | 24.05.2026 02:24 |
dev_check.php | 10 KB | 22.05.2026 13:48 |
doku.html | 26.5 KB | 24.05.2026 02:24 |
doku_generator.php | 62.2 KB | 24.05.2026 14:50 |
export.php | 33.2 KB | 24.05.2026 01:11 |
export_test.php | 10 KB | 22.05.2026 13:48 |
features.html | 21.3 KB | 24.05.2026 02:24 |
handlers_auth.php | 23.1 KB | 24.05.2026 14:50 |
handlers_contact.php | 20.4 KB | 23.05.2026 17:26 |
handlers_system.php | 21.3 KB | 24.05.2026 02:24 |
handlers_turnier.php | 5.5 KB | 23.05.2026 17:26 |
handlers_users.php | 18.7 KB | 24.05.2026 14:50 |
hilfe.html | 14.9 KB | 24.05.2026 14:50 |
import_vorlage.php | 19.9 KB | 24.05.2026 01:11 |
index.html | 691.7 KB | 24.05.2026 14:50 |
index.php | 1.7 KB | 22.05.2026 13:48 |
index_v1.html | 613.6 KB | 22.05.2026 13:48 |
maintenance.php | 14.2 KB | 23.05.2026 22:05 |
notify.php | 13.7 KB | 22.05.2026 13:48 |
reset_admin.php | 4 KB | 22.05.2026 13:48 |
reset_emergency.php | 4.4 KB | 22.05.2026 13:48 |
smtp.php | 12.1 KB | 22.05.2026 13:48 |
test_backup.html | 4 KB | 23.05.2026 22:05 |
test_suite.php | 75.7 KB | 24.05.2026 14:50 |
test_suite_V1.php | 26.3 KB | 22.05.2026 13:35 |
test_suite_V3.php | 56.4 KB | 22.05.2026 06:58 |
test_suite_v2.php | 53 KB | 22.05.2026 13:35 |
test_update_marker.php | 0 KB | 23.05.2026 18:52 |
test_version.php | 1 KB | 22.05.2026 13:35 |
test_version_1.php | 1.7 KB | 22.05.2026 13:35 |
tools.php | 7.5 KB | 23.05.2026 22:05 |
tpl_head.php | 1.1 KB | 23.05.2026 22:05 |
tpl_toolnav.php | 3.6 KB | 23.05.2026 22:05 |
xlsx.full.min.js | 861.1 KB | 22.05.2026 13:35 |
Daten-Ordner: /home/claude/prod_check/TurnierplanerZip/Data
4 · Datenmodell
Data mit großem D. Alle PHP-Dateien nutzen DATA_DIR = __DIR__ . '/Data'.| Datei | Inhalt |
|---|---|
users.json | Benutzer (users[]) + Rollen (roles[]). Benutzer referenzieren Rollen via roleIds[]. Rollen enthalten visibleAnmeldestatus für Turniersichtbarkeit. |
config.json | SMTP, Absender, Kontakt-Themen/Empfänger (contactTopics, contactTopicConfig), Gast-Sichtbarkeit (guestTurnierStatus). |
turnierplaner.json | Alle Turniere (turniere[]), App-Einstellungen, Archiv. Wird beim Laden nach Rollen-/Gast-Filter serverseitig gefiltert. |
sessions.json | Aktive Token mit Ablaufzeit. |
audit.json | Änderungsprotokoll (wer, wann, was). |
doku_backups/ | Backups generierter Dokumentationen. |
system_backups/ | App-Sicherungen (je Backup ein Ordner + _manifest.json mit Versions-Tag). |
5 · API-Endpunkte
Alle Requests an api.php. GET via ?action=…, POST via Header X-Action. Antwort immer JSON {ok:true|false,…}.
} geschlossen sein. Ein offener if-Block ohne } verschluckt alle nachfolgenden Endpunkte (→ nginx 404). Test-Suite prüft diesen Fall.api.php?v=... filtert Turniere anhand von guestTurnierStatus (Gäste) oder visibleAnmeldestatus der Benutzer-Rollen vor dem Zurückgeben.| Methode | Aktion |
|---|---|
| GET | status |
| GET | ping |
| GET | getLegal |
| GET | getLogo |
| GET | updateBackups |
| GET | loadConfig |
| GET | diagnose |
| GET | users |
| GET | audit |
| GET | getRoles |
| GET | getContactData |
| GET | getFunktionen |
| GET | getMailTemplates |
| GET | getBackupLog |
| GET | update |
| GET | rollback |
| GET | deleteUpdateBackup |
6 · Authentifizierung
au_verifyToken() prüft das Token in dieser Reihenfolge:
- PHP-Session (
$_SESSION['tpl_token']) - Header
X-Token - Header
Authorization: Bearer … - Cookie
tpl_token - POST-Body-Feld
_token
Token werden in sessions.json gespeichert. Frontend legt Token in localStorage + Cookie ab (beide mit try/catch für Safari Private Mode).
Cache-Control: no-cache, no-store, must-revalidate — verhindert Browser-Caching bei status- und Daten-Requests.7 · Berechtigungen
Definiert als PERMISSIONS-Konstante in auth.php. au_hasPermission() prüft alle Rollen des Users; role-admin mit isAdmin=true hat Vollzugriff.
| Schlüssel | Bezeichnung |
|---|---|
turniere.view | Turniere anzeigen (Übersicht) |
turniere.create | Turnier anlegen |
turniere.edit.basis | Basisinformationen bearbeiten |
turniere.edit.ort | Veranstaltungsort bearbeiten |
turniere.edit.kat | Kategorie & Anmeldung bearbeiten |
turniere.edit.fristen | Termine & Fristen bearbeiten |
turniere.edit.garde | Garde & Solisten bearbeiten |
turniere.edit.zusatz | Zusatzinformationen bearbeiten |
turniere.edit.ergebnisse | Ergebnisse & Platzierungen bearbeiten |
turniere.delete | Turnier löschen |
ergebnisse.erfassen | Ergebnisse & Platzierungen erfassen |
saison.abschliessen | Saison / Kampagne abschließen |
import | Excel-Import durchführen |
einstellungen | Einstellungen verwalten (alle — Rückwärtskompatibilität) |
einstellungen.design | Design & Erscheinungsbild ändern |
einstellungen.gast | Gast-Sichtbarkeit konfigurieren |
einstellungen.turnier | Turnier-Einstellungen (Kategorien, Garde, Typen, Solisten) |
kampagne.edit | Kampagne-Name ändern |
verein.name.add | Vereinsname anlegen |
verein.name.change | Vereinsname ändern |
verein.name.delete | Vereinsname löschen / zurücksetzen |
verein.name.edit | Vereinsname ändern (Sammelrecht) |
verein.logo.add | Vereinslogo hochladen |
verein.logo.change | Vereinslogo austauschen |
verein.logo.delete | Vereinslogo löschen / zurücksetzen |
verein.logo.upload | Vereinslogo hochladen / austauschen (Sammelrecht) |
verein.logo.reset | Vereinslogo zurücksetzen auf Standard |
system.logo | Vereinslogo verwalten (Rückwärtskompatibilität) |
system.license | Lizenz verwalten & aktivieren |
users.manage | Benutzer & Rollen verwalten (Sammelrecht) |
users.create | Benutzer anlegen |
users.edit | Benutzer bearbeiten |
users.delete | Benutzer löschen |
users.resetpw | Passwort-Reset-Link an Benutzer senden |
users.forcepassword | Benutzer zum Passwort-Wechsel beim nächsten Login zwingen |
roles.create | Rollen anlegen |
roles.edit | Rollen bearbeiten |
roles.delete | Rollen löschen |
users.report | Benutzer-Auswertung anzeigen & exportieren |
bezeichnung.edit | Bezeichnung (Kampagne/Saison) bearbeiten |
bezeichnung.change | Bezeichnung umbenennen (Label ändern) |
bezeichnung.delete | Bezeichnung zurücksetzen |
users.export | Benutzerdaten exportieren (JSON) |
users.import | Benutzerdaten importieren (JSON) |
passwortrichtlinie | Passwort-Richtlinie verwalten |
funktionen.manage | Funktionen verwalten (hinzufügen / löschen) |
funktionen.approve | Neue Funktionen von Registrierungen genehmigen |
audit.view | Änderungsprotokoll anzeigen |
audit.delete | Änderungsprotokoll löschen |
audit.export | Änderungsprotokoll exportieren |
audit.archive | Änderungsprotokoll archivieren |
backup.create | Sicherung erstellen / herunterladen |
backup.restore | Sicherung einspielen / wiederherstellen |
backup.schedule | Automatisches Backup konfigurieren |
mails.smtp | E-Mail / SMTP-Einstellungen ändern |
mails.edit | E-Mail-Vorlagen bearbeiten |
mails.send | E-Mails manuell versenden (Test & Benachrichtigung) |
kontakt.view | Kontaktformular-Einsendungen einsehen |
kontakt.manage | Kontaktformular Themen & Empfänger verwalten |
themen.add | Kontakt-Themen hinzufügen (Rückwärtskompatibilität) |
themen.edit | Kontakt-Themen bearbeiten (Rückwärtskompatibilität) |
themen.delete | Kontakt-Themen löschen (Rückwärtskompatibilität) |
system.update | System-Update einspielen |
system.diagnose | Diagnose- & Test-Werkzeuge benutzen |
system.wartung | Wartung & Speicher-Bereinigung ausführen |
cleanup.execute | Daten-Aufräum-Tool benutzen (Rückwärtskompatibilität) |
berichte.view | Berichte & Statistiken anzeigen |
berichte.export | Berichte & Statistiken exportieren |
doku.hilfe.view | Anwender-Hilfe anzeigen / öffnen |
doku.hilfe.create | Anwender-Hilfe neu generieren |
doku.hilfe.backup | Anwender-Hilfe Backup erstellen / einspielen |
doku.hilfe.delete | Anwender-Hilfe Backup löschen |
doku.technisch.view | Technische Dokumentation anzeigen / öffnen |
doku.technisch.create | Technische Dokumentation neu generieren |
doku.technisch.backup | Technische Dokumentation Backup erstellen / einspielen |
doku.technisch.delete | Technische Dokumentation Backup löschen |
doku.features.view | Feature-Übersicht anzeigen / öffnen |
doku.features.create | Feature-Übersicht neu generieren |
doku.features.backup | Feature-Übersicht Backup erstellen / einspielen |
doku.features.delete | Feature-Übersicht Backup löschen |
8 · Kontaktformular
sendContact liegt vor dem Auth-Gate → öffentlich für Gäste. Einstellungen erfordern einstellungen-Berechtigung.
Themenspezifische Empfänger in config.json unter contactTopicConfig: {"Thema":{"roles":[...],"emails":"a;b"}}. Fallback: globale contactNotifyRoles/contactExtraEmails.
9 · Datensicherung
Manifest (_manifest.json) enthält seit v2.0.0 auch appVersion und appBuild — sichtbar im Backup-Protokoll als blaues Badge.
10 · Deployment
- Server: Synology NAS, nginx, Document-Root =
web/turnierplaner - Dateien direkt per File Station hochladen
- Nach Upload: Strg+Umschalt+R
- Update-ZIP: genau eine Ordnerebene als Prefix (
TurnierplanerZip/datei)