Un'applicazione Laravel 11 per la segnalazione di problemi stradali.
- PHP 8.2+
- Composer 2.x
- SQLite (modulo
pdo_sqliteper PHP) - Estensioni PHP:
pdo,mbstring,tokenizer,fileinfo,intl,json
Questo progetto è pensato per comuni, città e province. Configura il tuo comune (ad esempio Bugliano) modificando config/city.php.
-
Clona il repository
git clone <repository-url> cd segnalabuche
-
Installa le dipendenze
composer install
-
Configura il file environment
cp .env.example .env php artisan key:generate
-
Configura il database SQLite in
.env:DB_CONNECTION=sqlite DB_DATABASE=database/database.sqlite -
Crea il database e avvia le migrazioni:
touch database/database.sqlite php artisan migrate
-
Configura la directory storage per i file upload:
php artisan storage:link
-
Avvia il server di sviluppo:
// config/city.php
return ['name' => env('CITY_NAME', 'Bugliano')];php artisan serveL'applicazione sarà disponibile all'indirizzo http://localhost:8000
Per la configurazione dettagliata (email, template, IMAP, etc.), consulta il file SETUP.md.
La configurazione principale include:
- Nome città: Modifica
config/city.php - Email guasti: Configura
config/guasto_mail.phpcon destinatari per ogni tipologia
- Invio segnalazioni di problemi stradali
- Tipologie di guasti: perdita d'acqua, tombino attappato, buca stradale, illuminazione pubblica, altro
- Geolocalizzazione tramite API del browser
- Supporto anonimo (nessun account richiesto)
- Pannello di approvazione segnalazioni
- Filtri per stato (pendente, approvato, rifiutato)
- Visualizzazione coordinate e foto
- Invio email di notifica all'approvazione
- Tracking delle email inviate con multirecipient (email primarie + cc)
- Registrazione delle risposte alle email inviate
- Relazione tra email inviate e rispostericevute tramite Reply-To
- Tabella
email_response_messagesper memorizzare invii e ricevimenti
- Rate limiting per IP
- Honeypot field invisibile
- Verifica duplicati entro 100 metri
- Massimo 3 foto per segnalazione
- Formati supportati: JPEG, PNG
- Dimensione massima per foto: 8MB
- Ridimensionamento automatico a 1200px max
- Visualizzazione Leaflet.js
- Filtri per stato e tipologia
- Marker interattivi
- URL di accesso:
/admin/segnalazioni - Lista segnalazioni: Visualizza segnalazioni in stato
pending. - Bottoni:
Approva/Rifiutaper ogni segnalazione. - Modal di conferma: Richiede conferma prima di eseguire l'azione.
- Email automatica: Invia email ai destinatari configurati (multipli + cc) con tracking delle risposte
Per accedere al pannello admin è necessario un utente con ruolo amministratore.
Esegui il comando per creare l'utente admin. Per sviluppo, le credenziali predefinite sono admin/admin:
php artisan admin:createPer personalizzare le credenziali:
php artisan admin:create "Nome Admin" "admin@comune.bugliano.it" "la_tua_password"Esegui il seeder che crea l'utente admin predefinito:
php artisan db:seed --class=CreateAdminUserSeederL'utente creato avrà:
- Nome: Admin
- Email: admin@comune.bugliano.it
- Password: admin
Se non puoi eseguire php artisan admin:create (ad esempio su un server di produzione senza accesso SSH per gli sviluppatori), puoi creare l'utente admin direttamente nel database:
- Accedi al database SQLite:
sqlite3 database/database.sqlite- Esegui il comando SQL:
INSERT INTO users (name, email, password, created_at, updated_at)
VALUES ('Admin', 'admin@comune.bugliano.it', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', datetime('now'), datetime('now'));- Esci da SQLite:
.quitAttenzione: La password
adminè hashata con bcrypt. Il hash utilizzato è$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi. Per motivi di sicurezza, in produzione modifica la password non appena effettuato il primo accesso.
- Andare all'URL:
http://localhost:8000/admin/segnalazioni - Effettuare l'accesso con le credenziali admin
- Visualizzare la lista delle segnalazioni in stato
pending - Approvare o rifiutare le segnalazioni
Nota di sicurezza: In produzione, usare sempre password complesse e implementare un sistema di ruoli proper (es. Laravel Spatie Permissions).
Per ricevere le risposte alle email inviate:
-
Configura le credenziali IMAP in
.env:IMAP_HOST=imap.gmail.com IMAP_PORT=993 IMAP_ENCRYPTION=ssl IMAP_USERNAME=il_tuo_email@dominio.com IMAP_PASSWORD=la_tua_password_app
-
Esegui periodicamente il listener per recuperare le risposte:
php artisan tinker --execute="(new App\Listeners\ProcessEmailResponses)->handle();" -
Le risposte vengono salvate nella tabella
email_response_messagescon:- Relazione alla segnalazione originale
- Corpo del messaggio
- Metadata (from, to, date)
- Timestamp di ricezione
Modificare direttamente i template in resources/views/mail/ causa conflitti di versionamento con git quando si lavora in team o su ambienti multipli.
Creare una cartella resources/views/mail/guasto_custom/ per i template modificabili che non va in versionamento.
resources/views/mail/
├── guasto_custom/ # ← TUTTI I TUOI TEMPLATE CUSTOM QUI
│ ├── perdita_acqua.blade.php
│ ├── tombino.blade.php
│ └── ...
├── approval_request.blade.php # Template di default (versionato)
└── approved_notification.blade.php # Template di default (versionato)
Il file config/guasto_mail.php supporta sia template di default che custom:
return [
'name' => 'Bugliano',
];Logica di caricamento:
- Se
resources/views/mail/guasto_custom/xxx.blade.phpesiste → usa quello - Altrimenti usa
resources/views/mail/xxx.blade.php(template di default)
###流程 per personalizzare un template
- Copiare il template di default:
cp resources/views/mail/approval_request.blade.php \
resources/views/mail/guasto_custom/perdita_acqua.blade.php- Modificare il copia:
vi resources/views/mail/guasto_custom/perdita_acqua.blade.php
# Fare le modifiche necessarie- Aggiornare la configurazione in
config/guasto_mail.php:
'perdita d\'acqua' => [
'emails' => ['acqua@comune.bugliano.it'],
'template' => 'mail.guasto_custom.perdita_acqua', // ← nota _custom
],approval_request.blade.php→ Invio all'admin per approvazioneapproved_notification.blade.php→ Notifica al comune quando approvata
- NON aggiungere file in
guasto_custom/al repository git - Usa questa cartella SOLO per personalizzazioni locali
- Per contribuire al project, fai PR solo su template di default in
resources/views/mail/
Questo pannello amministrativo si riferisce al comune configurato, ad esempio Bugliano
- Aprire
config/guasto_mail.php. - Aggiungere una nuova chiave con il nome della tipologia e le impostazioni email:
return [
// ... altre tipologie
'nuova_tipologia' => [
'emails' => ['nuova@comune.bugliano.it'],
'template' => 'mail.guasto.nuova_tipologia', // Opzionale
],
];- (Opzionale) Creare un template Blade specifico in
resources/views/mail/o inresources/views/mail/guasto_custom/per personalizzare l'email.
Le segnalazioni sono anonime; nessun dato personale dell'utente è memorizzato. Le email inviate contengono solo le informazioni della segnalazione e l'indirizzo del comune destinatario.
GPLv3 - vedi il file LICENSE per i dettagli.