Sistema completo per la gestione del processo di recruiting sviluppato con Spring Boot. Permette di gestire posizioni lavorative, candidati, requisiti strutturati e valutazioni pesate per identificare il miglior candidato per ogni posizione.
- Caratteristiche Principali
- Tecnologie Utilizzate
- Prerequisiti
- Installazione e Configurazione
- Avvio dell'Applicazione
- Struttura del Progetto
- Entità del Database
- Funzionalità Implementate
- Credenziali di Default
- URL e Endpoint
- Sicurezza
- Sviluppo e Best Practices
- Sistema di login con Spring Security
- Gestione ruoli: ADMIN, USER, CANDIDATE
- Password crittografate con BCrypt
- Protezione delle route basata sui ruoli
- Form di registrazione pubblica (crea utenti con ruolo USER)
- CRUD completo per i candidati
- Creazione automatica di utenti con ruolo CANDIDATE quando un admin aggiunge manualmente un candidato
- Associazione candidati a posizioni lavorative
- Filtri per stato (PENDING, REVIEWING, ACCEPTED, REJECTED)
- Visualizzazione dettagliata con posizioni associate
- Creazione e modifica di posizioni lavorative
- Requisiti strutturati con peso (1-10) e categoria
- Requisiti in testo libero per compatibilità
- Informazioni complete: dipartimento, località, tipo di lavoro, stipendio, benefici
- Filtri per stato (OPEN, CLOSED, ON_HOLD)
- Tabella di valutazione interattiva per valutare tutti i candidati su tutti i requisiti
- Sistema di punteggio pesato:
somma(score × peso) / somma(pesi) - Valutazione da 0 a 10 per ogni requisito
- Note aggiuntive per ogni valutazione
- Salvataggio multiplo delle valutazioni
- Calcolo automatico del punteggio totale per ogni candidato
- Identificazione del miglior candidato (punteggio più alto)
- Visualizzazione del numero di requisiti valutati vs totali
- Ordinamento automatico per punteggio decrescente
- Java 17 - Linguaggio di programmazione
- Spring Boot 3.2.0 - Framework principale
- Spring Security - Autenticazione e autorizzazione
- Spring Data JPA - Persistenza dei dati
- MySQL - Database relazionale
- Thymeleaf - Template engine per le viste
- Maven - Gestione dipendenze e build
- BCrypt - Crittografia password
- Hibernate - ORM per JPA
- Java 17 o superiore
- Maven 3.6+ (o Maven Daemon - mvnd)
- MySQL 8.0+ installato e configurato
- IDE (IntelliJ IDEA, Eclipse, VS Code) - opzionale
git clone <repository-url>
cd LunaExampleCreare un database MySQL:
CREATE DATABASE luna_recruiting CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Il file src/main/resources/application.properties contiene già la configurazione per MySQL. Verificare che le credenziali corrispondano al tuo ambiente:
spring.datasource.url=jdbc:mysql://localhost:3306/luna_recruiting
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver$env:JAVA_HOME = "C:\Program Files\Java\jdk-25"
$env:MAVEN_HOME = "C:\Program Files\maven-mvnd-1.0.3-windows-amd64"
$env:PATH = "$env:MAVEN_HOME\bin;$env:PATH"mvnd spring-boot:runmvn clean install
mvn spring-boot:runEseguire la classe principale: com.example.luna.LunaExampleApplication
L'applicazione sarà disponibile su: http://localhost:8080
src/
├── main/
│ ├── java/com/example/luna/
│ │ ├── LunaExampleApplication.java # Classe principale
│ │ ├── config/
│ │ │ ├── SecurityConfig.java # Configurazione Spring Security
│ │ │ └── DataInitializer.java # Inizializzazione dati di default
│ │ ├── controller/
│ │ │ ├── LoginController.java # Gestione login/home
│ │ │ ├── SignupController.java # Registrazione utenti
│ │ │ ├── CandidateController.java # CRUD candidati
│ │ │ ├── JobPositionController.java # CRUD posizioni lavorative
│ │ │ ├── EvaluationController.java # Gestione valutazioni
│ │ │ └── CandidateJobPositionController.java # Associazioni candidato-posizione
│ │ ├── service/
│ │ │ ├── UserService.java # Logica utenti
│ │ │ ├── CandidateService.java # Logica candidati
│ │ │ ├── JobPositionService.java # Logica posizioni
│ │ │ ├── EvaluationService.java # Logica valutazioni
│ │ │ ├── CandidateJobPositionService.java # Logica associazioni
│ │ │ └── CustomUserDetailsService.java # UserDetailsService personalizzato
│ │ ├── repository/
│ │ │ ├── UserRepository.java
│ │ │ ├── RoleRepository.java
│ │ │ ├── CandidateRepository.java
│ │ │ ├── JobPositionRepository.java
│ │ │ ├── RequirementRepository.java
│ │ │ ├── EvaluationRepository.java
│ │ │ └── CandidateJobPositionRepository.java
│ │ ├── model/entity/
│ │ │ ├── User.java # Entità utente
│ │ │ ├── Role.java # Entità ruolo
│ │ │ ├── Candidate.java # Entità candidato
│ │ │ ├── JobPosition.java # Entità posizione lavorativa
│ │ │ ├── Requirement.java # Entità requisito
│ │ │ ├── Evaluation.java # Entità valutazione
│ │ │ └── CandidateJobPosition.java # Entità associazione
│ │ └── dto/
│ │ ├── SignupRequest.java # DTO registrazione
│ │ ├── CandidateRequest.java # DTO candidato
│ │ ├── JobPositionRequest.java # DTO posizione
│ │ ├── EvaluationRequest.java # DTO valutazione
│ │ └── CandidateScoreDTO.java # DTO punteggio candidato
│ └── resources/
│ ├── application.properties # Configurazione applicazione
│ └── templates/ # Template Thymeleaf
│ ├── login.html
│ ├── signup.html
│ ├── home.html
│ ├── candidates/
│ │ ├── list.html
│ │ ├── view.html
│ │ ├── form.html
│ │ └── evaluate.html
│ └── job-positions/
│ ├── list.html
│ ├── view.html
│ └── form.html
└── test/
└── java/com/example/luna/ # Test (da implementare)
- Gestisce gli utenti del sistema
- Implementa
UserDetailsper Spring Security - Relazione Many-to-Many con Role
- ADMIN: Accesso completo al sistema
- USER: Utente registrato (diventa automaticamente candidato)
- CANDIDATE: Candidato aggiunto manualmente da admin
- Informazioni personali (nome, cognome, email, telefono, indirizzo)
- CV/Resume
- Stato (PENDING, REVIEWING, ACCEPTED, REJECTED)
- Note aggiuntive
- Titolo, descrizione, dipartimento, località
- Tipo di lavoro (FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP)
- Stato (OPEN, CLOSED, ON_HOLD)
- Stipendio minimo/massimo
- Benefici
- Relazione Many-to-Many con Requirement
- Nome e descrizione
- Categoria (TECHNICAL, SOFT_SKILLS, EDUCATION, EXPERIENCE, CERTIFICATION)
- Peso (1-10) per il calcolo del punteggio pesato
- Associa Candidato, Posizione Lavorativa e Requisito
- Score (0-10)
- Note aggiuntive
- Data e autore della valutazione
- Associa un Candidato a una Posizione Lavorativa
- Stato dell'applicazione (APPLIED, SHORTLISTED, INTERVIEWED, OFFERED, REJECTED)
- Note aggiuntive
- Data di applicazione
- ✅ Pagina di login con form-based authentication
- ✅ Form di registrazione pubblica
- ✅ Creazione automatica di Candidate quando un USER si registra
- ✅ Dashboard personalizzata per ruolo ADMIN
- ✅ Lista candidati con filtri per stato
- ✅ Creazione nuovo candidato (crea anche User con ruolo CANDIDATE)
- ✅ Visualizzazione dettagli candidato
- ✅ Associazione candidato a posizioni lavorative
- ✅ Visualizzazione posizioni associate
- ✅ Lista posizioni con filtri per stato
- ✅ Creazione posizione con requisiti strutturati dinamici
- ✅ Modifica posizione esistente
- ✅ Visualizzazione dettagli con requisiti e peso
- ✅ Gestione candidati associati direttamente dalla pagina posizione
- ✅ Tabella interattiva per valutare tutti i candidati su tutti i requisiti
- ✅ Input score (0-10) e note per ogni combinazione candidato-requisito
- ✅ Salvataggio multiplo di tutte le valutazioni
- ✅ Calcolo automatico punteggio pesato:
Σ(score × peso) / Σ(pesi) - ✅ Visualizzazione valutazioni esistenti precompilate
- ✅ Sezione recap con punteggio totale per ogni candidato
- ✅ Identificazione automatica del miglior candidato
- ✅ Visualizzazione numero requisiti valutati vs totali
- ✅ Ordinamento automatico per punteggio decrescente
- ✅ Badge visivi per il miglior candidato
All'avvio dell'applicazione vengono creati automaticamente:
- Username:
admin - Password:
admin123 - Ruolo: ADMIN
- Username:
user - Password:
user123 - Ruolo: USER
- Login: http://localhost:8080/login
- Registrazione: http://localhost:8080/signup
- Dashboard Home: http://localhost:8080/home
- Lista Candidati: http://localhost:8080/candidates
- Lista Posizioni: http://localhost:8080/job-positions
- Visualizza Posizione: http://localhost:8080/job-positions/{id}
- Modifica Posizione: http://localhost:8080/job-positions/{id}/edit
- Hello:
GET /api/hello- Endpoint di test - Test Database:
GET /api/test/database- Test connessione database
- Tutti gli endpoint di gestione candidati (
/candidates/**) - Tutti gli endpoint di gestione posizioni (
/job-positions/**) - Endpoint di valutazione (
/evaluations/**) - Endpoint di associazione (
/candidate-job-positions/**)
- Spring Security configurato con form-based authentication
- BCrypt per hash delle password
- Protezione CSRF abilitata
- Autorizzazione basata su ruoli con
@PreAuthorize - UserDetailsService personalizzato per autenticazione database-backed
- Session management configurato
/login- Pagina di login/signup- Registrazione utenti/api/test/**- Endpoint di test/api/db/**- Endpoint di test database
/home- Dashboard (richiede autenticazione)/candidates/**- Gestione candidati (richiede ruolo ADMIN)/job-positions/**- Gestione posizioni (richiede ruolo ADMIN)/evaluations/**- Valutazioni (richiede ruolo ADMIN)
# Compilare il progetto
mvnd clean compile
# Eseguire i test
mvnd test
# Creare il JAR
mvnd clean package
# Avviare l'applicazione
mvnd spring-boot:runIMPORTANTE: Dopo ogni modifica a file HTML/Template/Thymeleaf, è necessario riavviare il server:
# 1. Ferma il processo sulla porta 8080
netstat -ano | findstr :8080 | Select-Object -First 1 | ForEach-Object { $_.Split()[-1] } | ForEach-Object { taskkill /PID $_ /F }
# 2. Attendi qualche secondo
Start-Sleep -Seconds 3
# 3. Riavvia l'applicazione
mvnd spring-boot:run- Controller: Gestiscono le richieste HTTP e restituiscono viste o JSON
- Service: Contengono la logica di business
- Repository: Interfacce Spring Data JPA per accesso ai dati
- Entity: Modelli JPA per le tabelle del database
- DTO: Data Transfer Objects per trasferire dati tra layer
- Config: Classi di configurazione (Security, Data initialization)
- Naming: PascalCase per classi, camelCase per metodi e variabili
- Package: Struttura gerarchica per organizzazione logica
- Validazione: Uso di
@Valide annotazioni Bean Validation - Transazioni:
@Transactionalper operazioni database - Sicurezza:
@PreAuthorizeper controllo accesso a livello metodo
- Database: Il sistema usa MySQL. Assicurarsi che il database sia creato prima dell'avvio.
- Migrazione: Le tabelle vengono create automaticamente con
spring.jpa.hibernate.ddl-auto=update - Password: Le password vengono hashate con BCrypt prima del salvataggio
- Ruoli: I ruoli vengono inizializzati automaticamente all'avvio
- Candidati: Quando un USER si registra, viene creato automaticamente un Candidate associato
- Export valutazioni in PDF/Excel
- Notifiche email per candidati
- Dashboard con statistiche avanzate
- Ricerca avanzata candidati e posizioni
- Upload e gestione CV/Resume
- Sistema di commenti e note temporali
- API REST complete per integrazione esterna
- Test unitari e di integrazione
- Logging avanzato e monitoring
- Supporto multi-lingua
Questo progetto è stato sviluppato per scopi educativi e dimostrativi.
Sviluppato con Spring Boot 3.2.0 e Java 17.
LunaRecruiting - Sistema completo per la gestione del processo di recruiting 🚀