Einfaches Corona Eventticketing

Komplettes Projekt unter https://github.com/coffeefan/caticket

Wie es zum Corona Eventticketing kam

Stell dir vor, eine Kirche muss Leute nach Hause schicken, weil sie kein Platz mehr hat. Okey, dies ist natürlich den aktuellen Corona-Massnahmen geschuldet. Trotzdem doch eigentlich ein schönes Problem, zu viele Leute zu haben? Dem verantwortlichen des Schutzkonzepts war es peinlich und für die betroffenen Leute mühsam. Auch, wenn sie den Gottesdienst im Livestream erleben konnten. Das E-Mail Formular der Kirche hat die Grenze nicht einhalten können. Natürlich wollte man dringend (bis zum nächsten Sonntag) eine Wiederholung der Überbuchungen verhindern und so kam ich ins Spiel. Eigentlich sollte ich eine entsprechende Software finden und habe dann aber gleich was entwickelt.

Herausforderung: Eventticketing innerhalb von 4 Tagen entwickeln

So jetzt hat der Projektleiter wieder einmal ein Privatprojekt. Vorteil: Es wird nicht lange gehen. Nachteil: Ich habe extrem Druck und es muss funktionieren.

Kleine Anfoderungsanalyse

Bevor ich mich ins Geschehen stürze, schlägt dann doch noch mein Projektleiterherz und ich muss mir bewusst werden, was die Anforderungen / Use Cases an das Tools sind:

Use Cases erstellt mit yuml.me

Skriptsprache und Frameworks

Als Projektleiter komm ich nicht mehr so viel zum Programmieren wie früher. Ich halte mich an einem Grundsatz fest: Jeweils nur ein Element komplett lernen pro Projekt. Insbesondere, wenn man hier ja nur paar Tage neben der Arbeit Zeit hat, fehlt es definitiv. Die Website der Kirche läuft auf einem klassischen LAMP-Hosting (Linux, Apache, MySQL und PHP) Auch wenn ich gerne mal was mit Python gemacht hätte, bleiben wir also bei PHP. Ich war etwas hin und her gerissen, die Umsetzung mit dem neuen Laravel 8 oder einem PHP-Microframework umzusetzen. Zu Gunsten von weniger Balast und mir statt Laravel 8 VUEJS beizubringen habe ich mich für das PHP Microframework PHPFlight entschieden.

NameZweck
Flight PHPPHP Microframework für API
PHP MailerPHP E-Mail Libary
PhpSpreadsheetPHP Excel Libary
Vue.jsJavaScript-Webframework zum Erstellen von Single-Page-Webanwendungen
Bootstrap /
BootstrapVue
Frontend-CSS-Framework. BootstrapVue ist die direkte Integration in Vue.js

Applikationsaufbau

Client Server Aufbau gezeichnet mit draw.io

Wie bereits im vorherigen Abschnitt an getönt, habe ich mich für eine REST Architektur mit Client Server Applikation entschieden. Dieser Aufbau hilft es mir, klar zwischen Frontend (Vue.Js Applikation) und Backend (PHP API) zu separieren und die jeweiligen Anforderungen umzusetzen.

Und los geht’s

ERD

Ich habe das Informatik Handwerk bei einem Datenbankspezialisten gelernt. Deshalb mache oder generieren (via ORM Mapper) ich immer zuerst die Datenbank. Seid ihr da anders?
Wir haben events, die haben einen start, ende und einen Namen. Die Kapazität des Events ist zentral. Dann gibt es Teilnehmer mit ihren Personalien. Um den Sitz ab Beginn zu blockieren, sollte ich einen fast leeren Datensatz erstellen und referenziere können. Daher das reservationkey Feld. Sobald die Reservation abgeschlossen ist, werde ich die restlichen Daten anpassen und setze den Status. Die User Tabelle beinhaltet die Eventmanager Zugänge.

Grafische Umsetzung

Die VueJS Componenten sind mit dem Bootstrap Framework und ein paar individuellen CSS-Styles gestaltet worden:

Umsetzung geglückt?

Am Dienstagabend habe ich gemerkt, dass es ziemlich schwierig wird am Mittwoch den Testabend durchzuführen und so rechtzeitig fertig zu werden. Ich habe bereits eine E-Mail verfasst um auf die Verzögerung hinzuweisen als mir auffiel, dass ich ja nicht den Managerteil von Anfang an fertig haben muss sondern nur der Teil für die Teilnehmer. So habe ich rechtzeitig für den Testabend den Teilnehmerteil umgesetzt. Der Managerteil konnnt dann auch noch bis zum Sonntag fertiggestellt werden. Die Applikation hat noch Updates gekriegt und läuft stabil. Das Leute nach Haus geschickt werden gehört nun der Vergangenheit an.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.