Display-Seiten: Gäste holen sich den Zugang selbst
Für Empfang, Lobby oder Tagungsraum lässt sich je Site eine öffentliche Seite anlegen (kiosk.php), die auf einem Bildschirm oder Tablet läuft: ein großer Knopf, ein Klick, ein Zugangscode mit QR-Code. Nach einer einstellbaren Anzeigedauer springt der Bildschirm zurück, damit der nächste Gast nicht den Code seines Vorgängers sieht. Verwaltung unter Administration → Display-Seiten: - Site und optionales Voucher-Profil (bestimmt Laufzeit, Geräte, QoS) - eigene Überschrift und Text für den Bildschirm - Codes pro Tag, Wartezeit zwischen zwei Codes, Anzeigedauer - geheimer Link zum Kopieren, als QR-Code anzeigbar und jederzeit erneuerbar (der alte Link gilt dann sofort nicht mehr) Absicherung: der Link ist der Zugang, deshalb Tageslimit und Wartezeit je Display, CSRF-Token am Formular, `noindex` im Kopf und ein Eintrag im Audit-Log für jeden ausgegebenen Code. Webhooks werden für Kiosk-Codes bewusst nicht ausgelöst – ein Empfangsdisplay würde den Kanal fluten. Technik: - neue Tabelle `kiosks`, `vouchers.kiosk_id` hält die Herkunft fest (Migration 0005, database.sql nachgezogen) - includes/Kiosk.php kapselt Token, Limits und Profil-Auflösung - includes/VoucherService.php bündelt die Voucher-Erstellung, die vorher in index.php lag und für den Kiosk ein zweites Mal nötig gewesen wäre - Startbildschirm zeigt zusätzlich einen QR auf sich selbst, damit Gäste die Seite am eigenen Handy öffnen können Tests: 9 neue Fälle für Token-Prüfung, Wartezeit, Tageslimit und Profil-Auflösung (38 Tests gesamt), PHPStan deckt Kiosk.php mit ab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
5d72febadc
commit
61810eb050
30 changed files with 1360 additions and 29 deletions
27
database.sql
27
database.sql
|
|
@ -66,6 +66,29 @@ CREATE TABLE IF NOT EXISTS `voucher_templates` (
|
|||
FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `kiosks` (
|
||||
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`site_id` INT NOT NULL,
|
||||
`template_id` INT NULL,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`token` VARCHAR(64) NOT NULL,
|
||||
`headline` VARCHAR(255) NULL,
|
||||
`subline` VARCHAR(500) NULL,
|
||||
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`daily_limit` INT NOT NULL DEFAULT 100,
|
||||
`cooldown_seconds` INT NOT NULL DEFAULT 20,
|
||||
`display_seconds` INT NOT NULL DEFAULT 90,
|
||||
`last_used_at` TIMESTAMP NULL,
|
||||
`created_by` INT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY `uniq_token` (`token`),
|
||||
INDEX `idx_site` (`site_id`),
|
||||
FOREIGN KEY (`site_id`) REFERENCES `sites`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`template_id`) REFERENCES `voucher_templates`(`id`) ON DELETE SET NULL,
|
||||
FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `api_keys` (
|
||||
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
|
|
@ -93,6 +116,7 @@ CREATE TABLE IF NOT EXISTS `vouchers` (
|
|||
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`site_id` INT NOT NULL,
|
||||
`user_id` INT,
|
||||
`kiosk_id` INT NULL,
|
||||
`voucher_code` VARCHAR(50) NOT NULL,
|
||||
`voucher_name` VARCHAR(255) NOT NULL,
|
||||
`max_uses` INT NOT NULL,
|
||||
|
|
@ -109,7 +133,8 @@ CREATE TABLE IF NOT EXISTS `vouchers` (
|
|||
INDEX `idx_site` (`site_id`),
|
||||
INDEX `idx_created` (`created_at`),
|
||||
INDEX `idx_unifi_id` (`unifi_voucher_id`),
|
||||
INDEX `idx_status` (`status`)
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_kiosk` (`kiosk_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `sessions` (
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue