Ein modernes und sicheres Raumbuchungssystem, entwickelt mit Spring Boot, im Rahmen des Programmierpraktikum 2 an der Heinrich-Heine-Universität Düsseldorf. Diese Anwendung ermöglicht es Benutzern, sich unkompliziert über ihr GitHub-Konto (OAuth2) anzumelden und gezielt Sitzplätze in verschiedenen Räumen für bestimmte Zeitslots zu buchen. Administratoren können die Räume und Plätze dynamisch verwalten.
- Sicherer Login: Authentifizierung via GitHub (OAuth2).
- Rollenbasiertes System: Strikte Trennung zwischen normalen Nutzern (
USER) und Administratoren (ADMIN). - Buchungssystem: Übersichtliche Buchung von Zeitslots für spezifische Sitzplätze und Räume.
- Admin-Dashboard: Räume und Plätze dynamisch hinzufügen, bearbeiten oder löschen.
- Responsive UI: Modernes Frontend mit Thymeleaf und Bootstrap.
- Datenbanksicherheit: Versteckte Credentials (Umgebungsvariablen) und automatische Tabellen-Migration mit Flyway.
- Backend: Java 21, Spring Boot 3.x, Spring Security (OAuth2), Spring Data JPA
- Frontend: Thymeleaf, Bootstrap, HTML5/CSS3
- Datenbank: PostgreSQL (gesteuert über Flyway)
- Build-Tool: Gradle
- Testing: JUnit 5, Mockito, Spring Boot Test (WebMvcTest)
- Infrastruktur: Docker & Docker Compose
Dieses Projekt wurde nach modernen Software-Engineering-Prinzipien entwickelt, um hohe Wartbarkeit, Testbarkeit und eine saubere Code-Struktur zu gewährleisten:
- Onion Architecture (Layered Architecture): Strikte Trennung der Verantwortlichkeiten in Web-Schicht (Controller), Geschäftslogik (Services) und Infrastruktur/Datenzugriff (DB).
- Domain-Driven Design (DDD) Ansätze:
- Das Herzstück der Anwendung bildet die isolierte
domain-Schicht mit den fachlichen Entitäten (Aggregates wieRoom,Platz,Zeitslot). - Repository Pattern: Die Geschäftslogik kommuniziert ausschließlich über Interfaces (
domain.repository). Die konkrete Datenbank-Anbindung (db) ist davon entkoppelt, was einen einfachen Austausch der Datenbanktechnologie ermöglicht.
- Das Herzstück der Anwendung bildet die isolierte
- Objektorientierte Programmierung (OOP): Konsequente Kapselung von Zuständen innerhalb der Entitäten und Nutzung von Dependency Injection (Inversion of Control) durch das Spring Framework, um Klassen lose gekoppelt und optimal testbar zu machen.
Um das Projekt lokal auf deinem Rechner laufen zu lassen, hast du zwei Möglichkeiten für die Datenbank:
Du musst PostgreSQL nicht lokal installieren. Wenn du Docker installiert hast, starte die Datenbank einfach mit einem Befehl:
docker-compose up -d(Die Datenbank läuft nun isoliert auf Port 5433 mit dem User user und Passwort iamgroot)
Option B: Lokale PostgreSQL Installation
Falls du kein Docker nutzt, stelle sicher, dass PostgreSQL lokal läuft und eine leere Datenbank namens postgres auf Port 5433 erreichbar ist.
Bevor du die App startest, musst du folgende Umgebungsvariablen (Environment Variables) in deiner IDE (z.B. in den "Run Configurations" von IntelliJ) oder in deinem Terminal setzen:
# Datenbank-Zugang (Bei Docker-Nutzung: user / iamgroot)
DB_USER=dein_postgres_benutzername
DB_PASSWORD=dein_postgres_passwort
# GitHub OAuth2 Login-Daten
CLIENT_ID=deine_github_oauth_client_id
CLIENT_SECRET=deine_github_oauth_client_secretDas Projekt nutzt den Gradle Wrapper, du musst Gradle also nicht einmal global installiert haben. Starte die App direkt über deine IDE oder im Terminal mit folgendem Befehl:
Windows:
gradlew bootRunMac/Linux:
./gradlew bootRunSobald der Server hochgefahren ist, erreichst du die Anwendung in deinem Browser unter: http://localhost:8080
Das Projekt verfügt über Unit- und Integrationstests (inkl. Mockito und WebMvcTest), um die Geschäftslogik und Security-Regeln zu verifizieren. Starte die Tests mit:
./gradlew test