diff --git a/README.md b/README.md index b21725c..e0f1dd9 100644 --- a/README.md +++ b/README.md @@ -1 +1,142 @@ -# Biblioteca \ No newline at end of file +# Biblioteca +INTRODUZIONE +Creazione di un’applicazione di gestione di una biblioteca on line. Gli utenti avranno la possibilità di vedere l’elenco dei libri (distinguere tra cartaceo e digitale), prenotarli per un certo periodo pagando il noleggio, restituirli entro il periodo impostato pena aumento del noleggio. La biblioteca contiene libri e documenti di ogni tipo, dall’informazione alla storia dallo sport alla geografia e via dicendo. La biblioteca gestisce anche i film e documentari in formato digitale. + +LE PARTI JAVASCRIPT DOVRANNO ESSERE SVILUPPATE IN JQUERY! + +UTENTI +Gli utenti devono sempre essere assegnati ad una persona e devono avere dei ruoli/diritti sull’applicazione. Questi vengono assegnati dall’utente amministratore (ossia il creatore dell’applicazione). Vediamo i diversi utenti: + + +Utente Admin: gestisce l’intera applicazione. Inserisce l’utente bibliotecario. + + +Utente Bibliotecario: Inserisce, modifica e cancella i libri all’interno della biblioteca. Gestisce le consegne e le restituzioni dei libri. Gestisce le penali in caso di mancata consegna. Questo utente non può effettuare prenotazioni. Altre eventuali … + + +Utente generico: si registra all’applicazione con la propria mail. Inserisce, modifica e cancella le proprie prenotazioni. Effettua il pagamento on line del noleggio. Inserisce una recensione sul libro/film noleggiato che sarà visibile agli altri utenti quando lo consulteranno. +L’utente potrà effettuare la prenotazione solo dopo l’avvenuta registrazione. +L’utente non registrato può solo visualizzare le entità contenute all’interno dell’applicazione. + + +Altri eventuali … + + + +PRENOTAZIONI +Le prenotazioni hanno un loro codice e si gestiscono attraverso i seguenti stati: +Prenotazione In attesa +Prenotazione Pagata +Prenotazione Consegnata +Prenotazione Restituita +Restituzione Verificata + +Il Codice della prenotazione sarà una stringa composta da utente + il periodo di prenotazione(formato aaaammgg) + il codice del libro/film. Esempio: + +UTENTE@MAIL.COM2025010120250131L001 + +si effettuano con i seguenti dati: +Utente + Persona +Selezione del libro/film +Scelta del periodo di noleggio con data inizio e data fine (gli orari si intendono come 00.00 per la data di inizio e 23.59 per la data di fine). +Una volta salvato il periodo il libro/film scelto non sarà disponibile agli altri utenti nel periodo selezionato (si deve pertanto gestire l’errore in caso di prenotazione “accavallata” da parte di un altro utente). +L’utente può prenotare e noleggiare al massimo 5 libri. Raggiunto questo numero non può prenotarne altri se non effettua almeno una restituzione. +L’utente bibliotecario effettuerà l’avvenuta consegna del libro/film noleggiato all’utente e di conseguenza la verifica dell’avvenuta restituzione +L’utente bibliotecario gestisce il pagamento che deve essere effettuato prima della consegna all’utente (di conseguenza non è possibile fare la consegna se il noleggio non ha lo stato “pagato”). +La cancellazione della prenotazione deve avvenire prima della consegna e annulla il pagamento. +La consegna del noleggio da parte dell’utente obbliga questo ad inserire una recensione che sarà visibile agli altri utenti + +altre eventuali … + + +LIBRI, FILM e DOCUMENTARI +Si deve gestire l’ elenco delle entità noleggiabili con i seguenti dati: + +Immagine della copertina o locandina +Codice dell’entità +Tipo (libro, film, documentario, .. ) +Titolo +Autore o Regista +Breve descrizione +Costo del noleggio (le entità inserite dal bibliotecario nell’anno corrente costeranno piu’ di quelle degli anni passati). +Argomento di appartenenza (sport, storia, cultura generale, geografia, scienze …. ) +Data di inserimento all’interno dell’applicazione + +Questi dati saranno selezionati dall’utente bibliotecario quando inserirà il libro/film all’interno dell’applicazione. + +L’utente avrà a disposizione questi dati quando effettuerà la ricerca dell’entità che interessa oltre alla possibilità di visualizzarne le recensioni. + +LE RECENSIONI +Può essere inserita una sola recensione per utente e libro/film. +La recensione viene inserita nella funzionalità di restituzione ed è facoltativa (l’utente può decidere di non inserire nessuna recensione). L’utente che scrive la recensione può effettuarne la cancellazione FISICA dalla base dati. +Gli altri utenti possono mettere sulla recensione un “OK” o “KO” a seconda se in accordo o meno su quanto c’è scritto sulla recensione. OK e KO devono essere rappresentati da un’icona/emoji a piacere. +Il bibliotecario e solo lui può decidere di cancellare la recensione (cambiando lo stato da inserita a cancellata) se non la ritiene opportuna. In questo caso al posto della recensione comparirà un messaggio “Recensione Cancellata da Amministrazione”. +L’entità recensione contiene i seguenti campi: + +utente +data +descrizione +stato (inserita, cancellata) +id del libro/film a cui è riferita + + +MENU di NAVIGAZIONE +Ogni tipologia di utente ha il suo menù di navigazione per accedere alle maschere che deve utilizzare. + +ADMIN: vede tutta l’applicazione e può fare qualsiasi cosa. + +BIBLIOTECARIO: +ELENCO LIBRI con funzionalità di inserimento modifica e cancellazione +ELENCO FILM (idem sopra) +ELENCO DOCUMENTARI (idem sopra) +ELENCO PRENOTAZIONI con relativa gestione descritta sopra +ELENCO UTENTI REGISTRATI con possibilità di vedere le relative prenotazioni e pagamenti +altre eventuali … + +UTENTE SEMPLICE: +ELENCO LIBRI con selezione per la prenotazione +ELENCO PROPRIE PRENOTAZIONI con possibilità di modificare/cancellare +altre eventuali … + + +PAGAMENTI +L’utente può scegliere attraverso un’opzione dell’applicazione se pagare in contanti, con bonifico o con carta di credito. Serve quindi un'entità PAGAMENTI per la loro selezione con i seguenti campi: + +ID_PAGAMENTO +TIPO +DESCRIZIONE + +Quando l’utente conferma la prenotazione avrà la possibilità di selezionare il tipo di pagamento dall’entità impostata. + +7.1 PAGAMENTO CON CARTA DI CREDITO +Questo tipo di pagamento è alquanto diffuso per gli acquisti online. Creare quindi una maschera che contenga i seguenti campi (ovviamente da salvare su DB): +Nome e Cognome dell’intestatario della carta +Numero della carta +Mese/Anno scadenza della carta +Codice di sicurezza del retro della carta + +I dati inseriti dall’utente vanno salvati nella tabella relativa al primo inserimento. I successivi salvataggi dovranno confrontare i dati inseriti negli appositi campi con il dato salvato nella base dati. Il dato salvato non deve essere duplicato ma rimane dato univoco di confronto con i successivi inserimenti. Esempio: + +Al primo acquisto l’utente inserisce i dati di cui sopra che vengono salvati. +Al secondo acquisto l’utente inserisce nuovamente i dati di cui sopra ma al salvataggio l’applicazione confronterà questi con quelli salvati al punto 1. +In caso di corrispondenza fallita si deve restituire un messaggio di errore. Altrimenti si procede con la conclusione del noleggio. + +Facoltativo: Quando l’utente salva i dati al punto 1. deve utilizzare un PIN di 4 cifre. Nei tentativi successivi prima di salvare il noleggio con carta di credito si deve proporre la maschera per il controllo del PIN. Ovviamente l’applicazione dovrà verificare che il PIN inserito le volte successive corrisponda con quello salvato al primo acquisto. + + + +BREVE DESCRIZIONE DEL PROCESSO + +L’utente semplice quando accede all’applicazione ha la possibilità di navigare all’interno di questa anche se non è registrato. In questo caso pero’ non potrà effettuare la prenotazione. +Invece una volta registrato potrà visualizzare ed effettuare le sue prenotazioni con il controllo che non siano piu’ di 5 in totale. Se prova ad effettuare una prenotazione in un periodo in cui non c’è disponibilità l’applicazione deve restituire un messaggio di errore. +L’utente per la prenotazione vedrà inizialmente l’elenco di tutti i libri/film presenti all’interno della base dati con possibilità di filtrare la ricerca per tipo, titolo, autore. +l’elenco visualizzerà in ordine copertina, titolo, descrizione, costo del noleggio, link alla maschera della prenotazione e link alla maschera delle recensioni. +La maschera della prenotazione deve permettere di inserire i dati di cui al paragrafo 3 e 7. + +Bibliotecario ha accesso all’elenco delle entità dell’applicazione. può decidere di inserire nuove entità, modificarle o di cancellarle. Nel caso un’entità abbia dei noleggi abbinati non sarà cancellata fisicamente ma solo logicamente (cambio stato). L’entità cancellata non sarà visibile all’utente semplice ma solo al bibliotecario e amministratore. +Avendo accesso alle prenotazioni può cambiarne lo stato come descritto al paragrafo 3. +Inoltre può cancellare le recensioni che ritiene non adeguate. +Non può inserire prenotazioni come bibliotecario. + +Amministratore accede a tutto quanto, può modificare cancellare o inserire. Accede alla pagina degli utenti che può eventualmente cancellare se non hanno effettuato alcun noleggio. Gestisce inserimento, modifica e cancellazione dell’utente bibliotecario. Ovviamente l’utente bibliotecario può essere piu’ di uno. + diff --git a/index.php b/index.php index fd8f699..1362568 100644 --- a/index.php +++ b/index.php @@ -1,12 +1,134 @@ + - - - - - Biblioteca | I5AI6 - - + + + + Biblioteca | Home + + + + + - + +
+
+
+

Benvenuto nella Biblioteca Online

+

Esplora libri, film e documentari. Prenota facilmente e gestisci le tue recensioni. In base al tuo ruolo vedrai azioni diverse.

+
+ Sfoglia Catalogo + + + +
+
+
+

Cosa puoi fare

+
    +
  • Utente: prenotare e gestire le tue prenotazioni
  • +
  • Bibliotecario: gestire catalogo, prenotazioni e recensioni
  • +
  • Admin: gestire utenti, ruoli e permessi
  • +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/php/auth/login.php b/php/auth/login.php index 0370492..f07fc11 100644 --- a/php/auth/login.php +++ b/php/auth/login.php @@ -1,8 +1,69 @@ 'error', 'message' => 'Inserire username e password']; + echo json_encode($resp); + exit; +} + +// Autenticazione: descrizione = username/email, password = plain text +// Recupera anche l'ultimo ruolo assegnato (permission) se presente +$sql = "SELECT u.user_id, u.descrizione, r.id AS role_id, r.name AS role_name + FROM `user` u + LEFT JOIN `permission` p ON p.user_id = u.user_id + LEFT JOIN `role` r ON r.id = p.role + WHERE u.descrizione = ? AND u.password = ? + ORDER BY p.data DESC LIMIT 1"; + +if ($stmt = mysqli_prepare($conn, $sql)) { + mysqli_stmt_bind_param($stmt, 'ss', $username, $password); + mysqli_stmt_execute($stmt); + $result = mysqli_stmt_get_result($stmt); + + if ($result && mysqli_num_rows($result) > 0) { + $row = mysqli_fetch_assoc($result); + $roleId = $row['role_id'] ?? null; + $roleName = $row['role_name'] ?? null; + + // Se non c'è permission, default a utente + if (!$roleId || !$roleName) { + $roleId = 3; // utente + $roleName = 'utente'; + } + + $_SESSION['user_id'] = (int)$row['user_id']; + $_SESSION['username'] = $row['descrizione']; + $_SESSION['role_id'] = (int)$roleId; + $_SESSION['role_name'] = $roleName; + + $resp = ['status' => 'ok', 'role' => $roleName]; + echo json_encode($resp); + } else { + $resp = ['status' => 'error', 'message' => 'Credenziali non valide']; + echo json_encode($resp); + } + + mysqli_stmt_close($stmt); +} else { + $resp = ['status' => 'error', 'message' => 'Errore interno']; + echo json_encode($resp); +} + +// Per richieste non AJAX, effettua redirect (compatibilità) +if (!$isAjax) { + if (isset($_SESSION['user_id'])) { + header('Location: ../../index.php'); + } else { + header('Location: ../../index.php?login=failed'); + } +} diff --git a/php/auth/logout.php b/php/auth/logout.php new file mode 100644 index 0000000..13ce2ab --- /dev/null +++ b/php/auth/logout.php @@ -0,0 +1,6 @@ +