Sistema di gestione biglietti per eventi gasanti CFLM basato su QR Code, realizzato con Java Spring Boot e H2 Database (configurabile per PostgreSQL). Offre funzionalità complete per la generazione, visualizzazione e verifica dei biglietti, rendendolo ideale per eventi, conferenze o qualsiasi scenario che richieda un sistema di ingresso con validazione.
- ✅ Generazione Biglietti Unici con ID UUID
- 🔲 QR Code Dinamici per ogni biglietto
- 📱 Scanner QR Code via webcam per la reception
- ✔️ Validazione Biglietti con prevenzione duplicati
- 📊 API REST documentate con OpenAPI/Swagger
- 🔒 Validazione Input con Bean Validation
- 🚨 Gestione Errori Centralizzata
- 📝 Logging Strutturato
- 🧪 Test Coverage Completo - 66 test con JUnit 5, Mockito e AssertJ
- 🎨 UI Responsive con Thymeleaf e poster SVG personalizzato
- 🎯 Architettura Pulita con pattern DTO, Mapper e Service Layer
Il progetto segue un'architettura a livelli ben strutturata:
📦 qr-ticket-system
├── 🎯 controller/ # REST Controllers & Web Controllers
├── 🔧 service/ # Business Logic Layer
├── 💾 repository/ # Data Access Layer (Spring Data JPA)
├── 📋 model/ # JPA Entities
├── 📤 dto/ # Data Transfer Objects
├── ⚠️ exception/ # Custom Exceptions & Global Handler
├── ⚙️ config/ # Configuration Classes
└── 🛠️ util/ # Utility Classes
- Java 21
- Spring Boot 3.5.7
- Spring Web
- Spring Data JPA
- Spring Validation
- Spring Security
- Lombok - Riduzione boilerplate
- ZXing - Generazione QR Code
- H2 Database - Database in memoria (dev)
- BCrypt - Password encoding
- Thymeleaf - Template engine
- HTML5/CSS3 - Struttura e stile
- JavaScript - Interattività
- HTML5-QRCode - Scanner QR lato browser
- JUnit 5 Jupiter - Testing framework
- Mockito - Mocking framework con @MockBean
- AssertJ - Fluent assertions
- Spring Boot Test - Testing utilities (@WebMvcTest, @DataJpaTest)
- Spring Security Test -
@AutoConfigureMockMvc(addFilters = false)per test senza filtri security - Jakarta Bean Validation - DTO validation testing
- SpringDoc OpenAPI - Documentazione API automatica
- Java Development Kit (JDK): versione 17 o superiore
- Apache Maven: 3.6+ per la gestione delle dipendenze
- Un IDE: (IntelliJ IDEA, Eclipse, VS Code con estensioni Java)
git clone https://github.com/alfdagos/CFLM_QRTicketSystem.git
cd CFLM_QRTicketSystemmvn clean installmvn testmvn spring-boot:runL'applicazione sarà disponibile su http://localhost:8080
Questa repository include spring-boot-devtools come dipendenza di sviluppo (scope runtime, optional=true) per abilitare il riavvio automatico dell'applicazione e funzionalità di live reload durante lo sviluppo.
Come usarlo in locale:
- Avvia l'app usando il wrapper Maven generato nel progetto (consigliato):
.\mvnw.cmd spring-boot:run- Oppure avvia con Maven installato globalmente:
mvn spring-boot:runComportamento utile offerto da DevTools:
- Riavvio automatico dell'app al salvataggio delle classi Java o delle risorse (classpath restart).
- Livereload opzionale del browser (se installi un client LiveReload o estensione browser).
- Caricamento delle proprietà di sviluppo separate (se presenti).
Proprietà utili (es. in src/main/resources/application.yml o application.properties):
# Disabilita il restart se vuoi (default=true)
spring.devtools.restart.enabled=true
# Abilita LiveReload server integrato (browser extension necessaria per ricaricare automaticamente)
spring.devtools.livereload.enabled=true
# Esempio: disabilitare cache template Thymeleaf in sviluppo
spring.thymeleaf.cache=falseNote importanti:
- DevTools è pensato SOLO per lo sviluppo: rimane in
runtimee conoptional=truenelpom.xml, quindi non sarà incluso come dipendenza transitiva in ambienti di produzione. - Se usi un IDE (IntelliJ/VS Code/Eclipse), salva i file per innescare il riavvio; alcuni IDE richiedono la compilazione automatica abilitata.
- Se non vuoi che il restart venga eseguito (ad es. durante debug approfondito), puoi disabilitarlo tramite la proprietà
spring.devtools.restart.enabled=false.
Per ulteriori dettagli vedi la documentazione ufficiale: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools
- Vai su
http://localhost:8080/ - Compila il form con:
- Nome Evento
- Nome Partecipante
- Clicca su "Genera Biglietto"
- Visualizza il biglietto con il QR Code generato
Nota: L'accesso alla reception ora richiede autenticazione.
- Vai su
http://localhost:8080/reception - Effettua il login con:
- Username:
reception(oadmin) - Password:
reception123(oadmin123)
- Username:
- Autorizza l'accesso alla webcam
- Scansiona il QR Code del biglietto
- Visualizza il risultato della validazione
- Usa il pulsante "🔓 Logout" per uscire
POST /api/tickets
Content-Type: application/json
{
"eventName": "CFLM 2025 Party",
"userName": "Mario Rossi",
"userEmail": "mario.rossi@example.com"
}Nota: Quando si effettuano richieste tramite JavaScript fetch o AJAX, è necessario includere il token CSRF negli header:
fetch('/api/tickets', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken // Token ottenuto da Thymeleaf
},
body: JSON.stringify(ticketData)
});POST /reception/verify/{ticketId}
X-CSRF-TOKEN: <token>GET /qrcode/{ticketId}Accedi alla documentazione Swagger: http://localhost:8080/swagger-ui.html
Per visualizzare il database in memoria:
- URL:
http://localhost:8080/h2-console - JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password: (lascia vuoto)
Il progetto include una suite completa di 66 test che coprono tutti i livelli dell'applicazione.
mvn test- ✅ Rendering pagina index
- ✅ Creazione biglietto (form e API REST)
- ✅ Visualizzazione dettaglio biglietto
- ✅ Download immagine QR Code
- ✅ Pagina scanner reception
- ✅ Verifica biglietto (valido, già usato, non trovato)
- ✅ Validazione input (errori 400)
- ✅ Creazione biglietto con generazione QR Code
- ✅ Recupero biglietto per ID
- ✅ Validazione biglietto valido
- ✅ Gestione biglietto già utilizzato
- ✅ Gestione biglietto non trovato
- ✅ Operazioni CRUD complete (save, findById, update, delete)
- ✅ Query personalizzate (findByQrCodeData)
- ✅ Generazione UUID automatica
- ✅ Persistenza immagini QR Code (BLOB)
- ✅ Case sensitivity nelle ricerche
- ✅ Conversione DTO → Entity
- ✅ Conversione Entity → DTO
- ✅ Gestione valori null
- ✅ Round-trip conversion (integrità dati)
- ✅ Valori di default corretti
- ✅ Getters e Setters
- ✅ Gestione null values
- ✅ Toggle stato validità
- ✅ Array byte per QR Code (fino a 1000 bytes)
- ✅ Formattazione UUID
- ✅ LocalDateTime precision
- ✅ Limiti VARCHAR(255)
- ✅ Email con caratteri speciali
- ✅ Validazione @NotBlank per tutti i campi
- ✅ Validazione @Email per userEmail
- ✅ Validazione @Size per lunghezze min/max
- ✅ Gestione campi null
- ✅ Gestione whitespace-only
- ✅ Email complesse (subdomain, plus addressing)
- ✅ Supporto caratteri Unicode
- ✅ TicketNotFoundException → 404
- ✅ TicketAlreadyUsedException → 409
- ✅ QRCodeGenerationException → 500
- ✅ Validation errors → 400 con dettagli
- ✅ Generic exceptions → 500
- ✅ Caricamento proprietà QR Code (width, height, format)
- ✅ Validazione valori positivi
- ✅ Spring Boot context loading
- ✅ Application context loads successfully
✅ Total Tests: 66
✅ Failures: 0
✅ Errors: 0
✅ Skipped: 0
✅ Success Rate: 100%
# Solo test del controller
mvn test -Dtest=TicketControllerTest
# Solo test del service
mvn test -Dtest=TicketServiceTest
# Solo test di validazione
mvn test -Dtest=TicketDTOValidationTestsrc/
├── main/
│ ├── java/it/cflm/qrticketsystem/
│ │ ├── QrTicketSystemApplication.java
│ │ ├── config/
│ │ │ ├── OpenApiConfig.java
│ │ │ ├── QRCodeConfig.java
│ │ │ └── SecurityConfig.java # Spring Security Configuration
│ │ ├── controller/
│ │ │ └── TicketController.java
│ │ ├── dto/
│ │ │ ├── TicketRequestDTO.java
│ │ │ ├── TicketResponseDTO.java
│ │ │ └── TicketValidationResponseDTO.java
│ │ ├── exception/
│ │ │ ├── GlobalExceptionHandler.java
│ │ │ ├── QRCodeGenerationException.java
│ │ │ ├── TicketAlreadyUsedException.java
│ │ │ └── TicketNotFoundException.java
│ │ ├── model/
│ │ │ └── Ticket.java
│ │ ├── repository/
│ │ │ └── TicketRepository.java
│ │ ├── service/
│ │ │ └── TicketService.java
│ │ └── util/
│ │ └── TicketMapper.java
│ └── resources/
│ ├── application.properties
│ ├── static/
│ │ ├── css/
│ │ │ └── style.css
│ │ ├── js/
│ │ │ └── scanner.js
│ │ └── img/
│ │ └── poster.svg # Poster evento personalizzato
│ └── templates/
│ ├── index.html
│ ├── login.html # Pagina login Spring Security
│ ├── reception_scanner.html
│ ├── ticket_detail.html
│ └── ticket_not_found.html
└── test/
└── java/it/cflm/qrticketsystem/
├── config/
│ └── QRCodeConfigTest.java
├── controller/
│ └── TicketControllerTest.java
├── dto/
│ └── TicketDTOValidationTest.java
├── exception/
│ └── GlobalExceptionHandlerTest.java
├── model/
│ └── TicketTest.java
├── repository/
│ └── TicketRepositoryTest.java
├── service/
│ └── TicketServiceTest.java
├── util/
│ └── TicketMapperTest.java
└── QrticketsystemApplicationTests.java
# Database H2
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=update
# QR Code Settings
qrcode.width=300
qrcode.height=300
qrcode.format=PNG
# Logging
logging.level.it.cflm.qrticketsystem=DEBUG- Decommenta la dipendenza PostgreSQL in
pom.xml - Aggiorna
application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/qr_ticket_db
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect- 🔐 Spring Security per autenticazione/autorizzazione
- 👥 Role-Based Access Control (ADMIN, RECEPTION, USER)
- 🔑 BCrypt Password Encoding
- 🔒 Form-Based Login con sessioni sicure
- ✅ Validazione input con Bean Validation
- 🚨 Gestione sicura delle eccezioni
- 📝 Logging degli accessi
- 🛡️ Protezione SQL Injection (JPA)
- 🔐 CSRF Protection per form
- Admin:
admin/admin123(accesso completo) - Reception:
reception/reception123(solo verifica biglietti) - User:
user/user123(funzionalità limitate)
� Vedi SECURITY.md per dettagli completi sulla configurazione di sicurezza.
- 🔑 JWT per l'API REST
- � Database Users (al posto di in-memory)
- 📧 Email Verification
- 🔒 HTTPS obbligatorio
- 🚦 Rate Limiting
- 🔐 2FA (Two-Factor Authentication)
- 🔒 Password Reset via email
- 66 test che coprono tutti i livelli dell'applicazione
- Test di integrazione con @WebMvcTest e @DataJpaTest
- Copertura completa di controller, service, repository, mapper, model, DTOs
- Test di validazione Jakarta Bean Validation
- Test di gestione eccezioni centralizzata
- Banner orizzontale ottimizzato (1200x400px) per visualizzazione web
- Design moderno con gradiente arcobaleno e effetti neon
- Animazioni sulle stelle pulsanti
- Poster SVG personalizzato con tema party (cocktail, note musicali, icone emoji)
- Layout responsive con
object-fit: containper visualizzazione completa - Effetti spotlight radiali per maggiore profondità
- Decorazioni bilanciate su entrambi i lati
- 🎯 DTO Pattern per separazione API/Model
- 🚨 Global Exception Handler centralizzato
- ✔️ Bean Validation su tutti gli input
- 📝 Logging SLF4J strutturato
- 💉 Constructor Injection con Lombok
- 🔄 @Transactional per consistenza dati
- 🧰 Mapper Utility per conversioni DTO/Entity
- 📖 OpenAPI/Swagger documentation
- 🔐 Spring Security per autenticazione/autorizzazione
- Role-Based Access Control (RBAC)
- BCrypt password encoding
- Form-based login con sessioni sicure
- CSRF protection su tutti i form e richieste POST
- Token CSRF automaticamente incluso nelle richieste via Thymeleaf
- Protezione endpoint sensibili
- Test disabilitano filtri Spring Security con
@AutoConfigureMockMvc(addFilters = false)
- AAA Pattern (Arrange-Act-Assert)
- Given-When-Then per BDD-style tests
- MockBean per isolation testing
- TestEntityManager per JPA testing
- MockMvc per integration testing
- Fluent Assertions con AssertJ