← Zurück

🛠️ Technische Dokumentation

Turnierplaner der Fasnet Gilde Markgröningen e.V.

v3.106.0 · Version vom 2026-08-20 · Generiert: 20.08.2026 13:43

1 · Überblick

EigenschaftWert
FrontendSingle-Page-App in einer HTML-Datei, Vanilla JavaScript
BackendPHP (api.php als Router, auth.php für Authentifizierung)
DatenhaltungJSON-Dateien im Ordner Data/ (kein DBMS)
AuthentifizierungToken-basiert (sessions.json)
SMTPmxe87b.netcup.net:465
Versionv3.106.0 (2026-08-20)
HostingSynology NAS, nginx, Document-Root = web/turnierplaner

2 · Architektur

Browser index.html (SPA) JavaScript + CSS localStorage fetch() PHP-Backend api.php – Router auth.php – Token/Rechte smtp / export / notify r/w JSON Data/ turnierplaner.db (SQLite) users.json config.json sessions / audit Alle Turnier-Anfragen: Browser → fetch(api.php?v=...) → PHP filtert nach Rolle/Gast-Status → JSON zurück Kein DBMS · Kein Framework · Kein CDN (alles lokal) · Server-seitiger Rollen-Filter in der Turnierliste
Abb. 1 – System-Architektur

3 · Dateien auf dem Server

DateiGrößeGeändert
ANWENDER_RELEASE_NOTES.html16.3 KB28.06.2026 15:16
GUTACHTEN_MARKTWERT.html22.4 KB28.06.2026 15:16
RELEASE_NOTES.html44.8 KB28.06.2026 15:16
TECHNISCHE_RELEASE_NOTES.html28.8 KB28.06.2026 15:16
abmeldung.html8.3 KB11.08.2026 19:42
admin_tools.php50 KB03.06.2026 23:14
anmeldung.html16.1 KB11.08.2026 19:42
api.php102.5 KB20.08.2026 13:42
api_license.php3.7 KB03.06.2026 23:14
api_v1.php107.4 KB07.08.2026 19:00
app.js803 KB20.08.2026 08:05
auth.php32.9 KB15.08.2026 21:55
check_browser.html3.6 KB28.06.2026 15:16
check_permissions.php5.9 KB03.06.2026 23:14
cleanup.php37.8 KB06.08.2026 00:37
db.php45.2 KB15.08.2026 21:55
debug_api.php6.3 KB22.05.2026 09:39
dev_check.php10 KB22.05.2026 10:13
doku.html36 KB20.08.2026 08:59
doku_generator.php82.6 KB20.08.2026 13:42
exceljs.min.js925.5 KB01.07.2026 14:15
export.php33.9 KB28.06.2026 15:16
export_test.php10 KB03.06.2026 23:14
features.html30.4 KB20.08.2026 08:59
handlers_auth.php38 KB18.08.2026 18:47
handlers_contact.php23.8 KB12.08.2026 11:48
handlers_system.php29.8 KB01.07.2026 14:16
handlers_turnier.php9.8 KB30.07.2026 07:30
handlers_users.php9.1 KB12.08.2026 11:48
hilfe.html24.7 KB20.08.2026 13:43
import_vorlage.php21.8 KB11.08.2026 12:24
index.html293.8 KB20.08.2026 13:42
index.php1.7 KB28.06.2026 15:16
maintenance.php16.8 KB28.06.2026 15:16
migrate.php11.3 KB28.06.2026 15:16
notify.php13.7 KB07.08.2026 19:25
phpinfo_test.php0.7 KB28.06.2026 15:16
relnotes_generator.php33.6 KB14.08.2026 08:26
relnotes_lib.php28.1 KB19.08.2026 11:58
reset_admin.php4 KB28.06.2026 15:16
reset_emergency.php4.4 KB22.05.2026 09:39
smtp.php12.2 KB31.07.2026 12:36
test_backup.html3.8 KB22.05.2026 09:39
test_suite.php3.5 KB28.06.2026 15:16
test_suite_real.php77.2 KB14.08.2026 00:32
test_suite_stub.php3.5 KB14.08.2026 14:17
test_version.php1 KB03.06.2026 23:14
test_version_1.php1.7 KB03.06.2026 23:14
tools.php7.9 KB28.06.2026 15:16
tpl_head.php1.1 KB28.06.2026 15:16
tpl_toolnav.php3.7 KB28.06.2026 15:16
turnierplaner.spec.js69.2 KB03.06.2026 23:14
veranstaltungen.html5.6 KB03.08.2026 16:05
xlsx-js-style.js415.1 KB02.08.2026 18:56
xlsx.full.min.js861.1 KB03.06.2026 23:14

Daten-Ordner: /volume1/web/FGM/FGM-Turnierplaner-Dev/Turnierplaner/Data

4 · Datenmodell

⚠️ Ordner heißt Data mit großem D. Alle PHP-Dateien nutzen DATA_DIR = __DIR__ . '/Data'.
DateiInhalt
users.jsonBenutzer (users[]) + Rollen (roles[]). Benutzer referenzieren Rollen via roleIds[]. Rollen enthalten visibleAnmeldestatus für Turniersichtbarkeit.
config.jsonSMTP, Absender, Kontakt-Themen/Empfänger (contactTopics, contactTopicConfig), Gast-Sichtbarkeit (guestTurnierStatus).
Data/turnierplaner.dbSQLite-Datenbank (WAL-Modus): Tabelle termine (Turniere + Veranstaltungen, unterschieden per terminArt), App-Einstellungen (DB::getConfig()), Archiv. Wird beim Laden nach Rollen-/Gast-Filter serverseitig gefiltert.
sessions.jsonAktive 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,…}.

⚠️ Jeder Endpunkt-Block muss mit } geschlossen sein. Ein offener if-Block ohne } verschluckt alle nachfolgenden Endpunkte (→ nginx 404). Test-Suite prüft diesen Fall.
ℹ️ Serverseitiger Turnier-Filter: api.php?v=... filtert Turniere anhand von guestTurnierStatus (Gäste) oder visibleAnmeldestatus der Benutzer-Rollen vor dem Zurückgeben.
MethodeAktion
GETstatus
GETping
GETgetLegal
GETgetLogo
GETupdateBackups
GETloadConfig
GETgetTurnier
GETappInfo
GEToeffentlicheVeranstaltung
GEToeffentlicheGruppe
GEToeffentlicheVeranstaltungen
GETabmeldungInfo
GETgetAnmeldungen
GETgetGruppen
GETdiagnose
GETusers
GETaudit
GETgetRoles
GETgetContactData
GETgetFunktionen
GETgetMailTemplates
GETgetBackupLog
GETabmeldungDurchfuehren
GETanmeldungHinzufuegen
GETanmeldungBearbeiten
GETanmeldungenZusammenfuehren
GETsaveGruppe
GETdeleteGruppe
GETanmeldungAbmelden
GETanmeldungLinkErneut
GETanmeldungAbsenden
GETgruppenAnmeldungAbsenden
GETupdate
GETrollback
GETdeleteUpdateBackup

6 · Authentifizierung

au_verifyToken() prüft das Token in dieser Reihenfolge:

  1. PHP-Session ($_SESSION['tpl_token'])
  2. Header X-Token
  3. Header Authorization: Bearer …
  4. Cookie tpl_token
  5. 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).

ℹ️ api.php sendet 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üsselBezeichnung
turniere.viewTurniere anzeigen (Übersicht)
turniere.createTurnier anlegen
turniere.edit.basisBasisinformationen bearbeiten
turniere.edit.ortVeranstaltungsort bearbeiten
turniere.edit.katKategorie & Anmeldung bearbeiten
turniere.edit.fristenTermine & Fristen bearbeiten
turniere.edit.gardeGarde & Solisten bearbeiten
turniere.edit.zusatzZusatzinformationen bearbeiten
turniere.edit.ergebnisseErgebnisse & Platzierungen bearbeiten
turniere.begleitung.viewBegleitung (Trainer/Betreuer/Trainees) ansehen
turniere.begleitung.editBegleitung eintragen & bearbeiten
turniere.begleitung.deleteBegleitung zurücksetzen / löschen
turniere.begleitung.auswertungKartenbestellung-Auswertung & Export anzeigen
turniere.status.viewAnmeldestatus ansehen
turniere.status.editAnmeldestatus eintragen & ändern
turniere.status.deleteAnmeldestatus zurücksetzen / löschen
turniere.deleteTurnier löschen
turniere.auswertungTurnier-Auswertung & Statistiken anzeigen
ergebnisse.erfassenErgebnisse & Platzierungen erfassen
saison.abschliessenSaison / Kampagne abschließen
importExcel-Import durchführen
veranstaltungen.createVeranstaltung anlegen
veranstaltungen.editVeranstaltung bearbeiten
veranstaltungen.deleteVeranstaltung löschen
veranstaltungen.anmeldungen.viewAnmeldungen einsehen (Verwalterliste, Export)
veranstaltungen.anmeldungen.manageAnmeldungen verwalten (abmelden, Link erneut senden)
veranstaltungen.hinweistext.editHinweistext für geschlossene Anmeldung pflegen
einstellungenEinstellungen verwalten (alle — Rückwärtskompatibilität)
einstellungen.designDesign & Erscheinungsbild ändern
einstellungen.gastGast-Sichtbarkeit konfigurieren
einstellungen.turnierTurnier-Einstellungen (Kategorien, Garde, Typen, Solisten)
einstellungen.verein.addEinladende Vereine: hinzufügen
einstellungen.verein.editEinladende Vereine: ändern
einstellungen.verein.deleteEinladende Vereine: löschen
einstellungen.anmeldeart.addAnmeldearten: hinzufügen
einstellungen.anmeldeart.editAnmeldearten: ändern
einstellungen.anmeldeart.deleteAnmeldearten: löschen
einstellungen.veranstaltungsart.addVeranstaltungsarten: hinzufügen
einstellungen.veranstaltungsart.editVeranstaltungsarten: ändern
einstellungen.veranstaltungsart.deleteVeranstaltungsarten: löschen
einstellungen.turniertyp.addTurnier-Typen: hinzufügen
einstellungen.turniertyp.editTurnier-Typen: ändern
einstellungen.turniertyp.deleteTurnier-Typen: löschen
einstellungen.garde.addGarden: hinzufügen
einstellungen.garde.editGarden: ändern
einstellungen.garde.deleteGarden: löschen
einstellungen.solist.addSolisten: hinzufügen
einstellungen.solist.editSolisten: ändern
einstellungen.solist.deleteSolisten: löschen
einstellungen.kategorie.addKategorien: hinzufügen
einstellungen.kategorie.editKategorien: ändern
einstellungen.kategorie.deleteKategorien: löschen
kampagne.editKampagne-Name ändern
verein.name.addVereinsname anlegen
verein.name.changeVereinsname ändern
verein.name.deleteVereinsname löschen / zurücksetzen
verein.name.editVereinsname ändern (Sammelrecht)
verein.logo.addVereinslogo hochladen
verein.logo.changeVereinslogo austauschen
verein.logo.deleteVereinslogo löschen / zurücksetzen
verein.logo.uploadVereinslogo hochladen / austauschen (Sammelrecht)
verein.logo.resetVereinslogo zurücksetzen auf Standard
system.logoVereinslogo verwalten (Rückwärtskompatibilität)
system.licenseLizenz verwalten & aktivieren
users.manageBenutzer & Rollen verwalten (Sammelrecht)
users.createBenutzer anlegen
users.editBenutzer bearbeiten
users.deleteBenutzer löschen
users.resetpwPasswort-Reset-Link an Benutzer senden
users.forcepasswordBenutzer zum Passwort-Wechsel beim nächsten Login zwingen
roles.createRollen anlegen
roles.editRollen bearbeiten
roles.deleteRollen löschen
users.reportBenutzer-Auswertung anzeigen & exportieren
bezeichnung.editBezeichnung (Kampagne/Saison) bearbeiten
bezeichnung.changeBezeichnung umbenennen (Label ändern)
bezeichnung.deleteBezeichnung zurücksetzen
users.exportBenutzerdaten exportieren (JSON)
users.importBenutzerdaten importieren (JSON)
passwortrichtliniePasswort-Richtlinie verwalten
funktionen.manageFunktionen verwalten (Sammelrecht, Fallback)
einstellungen.funktion.addFunktionen: hinzufügen
einstellungen.funktion.editFunktionen: umbenennen
einstellungen.funktion.deleteFunktionen: löschen
funktionen.approveNeue Funktionen von Registrierungen genehmigen
audit.viewÄnderungsprotokoll anzeigen
audit.deleteÄnderungsprotokoll löschen
audit.exportÄnderungsprotokoll exportieren
audit.archiveÄnderungsprotokoll archivieren
backup.createSicherung erstellen / herunterladen
backup.restoreSicherung einspielen / wiederherstellen
backup.scheduleAutomatisches Backup konfigurieren
mails.smtpE-Mail / SMTP-Einstellungen ändern
mails.editE-Mail-Vorlagen bearbeiten
mails.sendE-Mails manuell versenden (Test & Benachrichtigung)
kontakt.viewKontaktformular-Einsendungen einsehen
kontakt.manageKontaktformular Themen & Empfänger verwalten
themen.addKontakt-Themen hinzufügen (Rückwärtskompatibilität)
themen.editKontakt-Themen bearbeiten (Rückwärtskompatibilität)
themen.deleteKontakt-Themen löschen (Rückwärtskompatibilität)
system.updateSystem-Update einspielen
system.diagnoseDiagnose- & Test-Werkzeuge benutzen
system.wartungWartung & Speicher-Bereinigung ausführen
cleanup.executeDaten-Aufräum-Tool benutzen (Rückwärtskompatibilität)
berichte.viewBerichte & Statistiken anzeigen
berichte.exportBerichte & Statistiken exportieren
doku.hilfe.viewAnwender-Hilfe anzeigen / öffnen
doku.hilfe.createAnwender-Hilfe neu generieren
doku.hilfe.backupAnwender-Hilfe Backup erstellen / einspielen
doku.hilfe.deleteAnwender-Hilfe Backup löschen
doku.technisch.viewTechnische Dokumentation anzeigen / öffnen
doku.technisch.createTechnische Dokumentation neu generieren
doku.technisch.backupTechnische Dokumentation Backup erstellen / einspielen
doku.technisch.deleteTechnische Dokumentation Backup löschen
doku.features.viewFeature-Übersicht anzeigen / öffnen
doku.features.createFeature-Übersicht neu generieren
doku.features.backupFeature-Übersicht Backup erstellen / einspielen
doku.features.deleteFeature-Übersicht Backup löschen
doku.relnotes.anwender.viewAnwender Release Notes anzeigen
doku.relnotes.anwender.generateAnwender Release Notes generieren
doku.relnotes.anwender.backupAnwender Release Notes Sicherung erstellen
doku.relnotes.anwender.manageAnwender Release Notes Sicherungen verwalten/löschen
doku.relnotes.technisch.viewTechnische Release Notes anzeigen
doku.relnotes.technisch.generateTechnische Release Notes generieren
doku.relnotes.technisch.backupTechnische Release Notes Sicherung erstellen
doku.relnotes.technisch.manageTechnische Release Notes Sicherungen verwalten/löschen
doku.relnotes.gutachten.viewMarktwert-Gutachten anzeigen
doku.relnotes.gutachten.generateMarktwert-Gutachten generieren
doku.relnotes.gutachten.backupMarktwert-Gutachten Sicherung erstellen
doku.relnotes.gutachten.manageMarktwert-Gutachten Sicherungen verwalten/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)