Blue Flower

 Scarica la traccia da qui

 

Punto 1-A (non dettagliato)

 

POI_1: Punto di Interesse senza rete wi-fi (tipicamente luoghi storici come chiese, piazze, fontane, palazzi, ecc.)

POI_2: Punto di interesse con infrastruttura di rete (tipicamente musei, mostre, ecc)

 

(VEDI DISEGNO)

 

Schema rete

 

 

Punto 1-B (non dettagliato)

·         I tablet si connettono ad internet mediante la rete wi-fi del POI_2 o mediante operatore telefonico (scheda dati) nei POI_1

·         I tablet comunicano, ad intervalli regolari, la loro posizione GPS (lat. e long.) al server

·         Ogni POI è mappato sul database da 4 punti di coordinate GPS (A, B, C, D) che descivono un rettangolo che racchiude il POI (vedi disegno). Ogni coordinata è composta da due dati: latitudine e longitudine

·         I tablet hanno un'APP proprietaria che gestisce: la comunicazione delle coordinate GPS al server, l'accesso alle pagine web (mediante la pw del biglietto) i dispositivi che non hanno tale APP non possono accedere al server e quindi ai servizi.

·         I PIO_2 (con rete wi-fi): forniscono la connessione wi-fi ai tablet (pre-configurato con pw e crittografia abilitati)indirizzi IP in DHCP,  mentre sono connessi ad internet mediante appositi router e connesione  ADSL/Fibra o Linea dati dedicata (a seconda della struttura)

·         I server sono su CLOUD o su Hosting dedicato e gestiscono solo comunicazione HTTP/HTTPS.  La loro connessione a internet è garantita dal fornitore del servizio

           

Punto 1-C (non dettagliato)

 

·         Il tablet viene consegnato al cliente con l'APP Aperta e resettata (nuovo inserimento pw biglietto). Il cliente inserisce la PW ed abilita così il suo piano tariffario. Nel caso di tariffa intermedia o completa fa anche selezionare la lingua. Tale info vengono memorizzate in variabili di sessione.

·         L'APP invia al server, ad intervalli regolari, le coordinate GPS di dove si trova. Il server controlla nel database se tali coordinate sono all'interno di una zona di interesse (rettangolo di coordinate A, B, C, D). Se si invia la pagina corrispondente al POI individuato. Nel caso di tariffa intermedia chiede prima al cliente se vuole vedere, per quel POI, la "pagina avanzata". Il sistema memorizza la risposta (quindi tale richiesta apparirà solo tre volte)

  • VARIANTE: Al posto di 4 punti (A,B,C e D) è possibile memorizzare un solo punto C del GPS (lat e long del centro del POI) ed il suo raggio di validità (R=raggio in metri). In questo caso il POI è inscritto in un cerchio di raggio R

           

Punto 2. Database: modello E/R e Logico

 

(DISEGNO MOD. E/R)

Modello E/R

 

OPERATORE (E): Dati dell'operatore che emette i biglietti c/o gli info point. Contiene credenziali di accesso al sistema di gestione dei biglietti (web app).

BIGLIETTI (E): Dati del biglietto (tariffa, prezzo, password) e del cliente (nominativo, Carta Identità o carta di credito e relativi dati)

EMETTE (R): 1 operatore può emettere N biglietti. Un biglietto è emesso da un operatore.

INFOPOINT (E): contiene nome ed ubicazione dell’infopoint ed eventuali coordinate (lat-lon) per geolocalizzazione su mappa google

LAVORA (R): Un operatore può lavorare in più (N) info point (in giorni diversi). Un info point può avere più operatori che operano al suo interno (N)

POI (E): Contiene info sul punto di interesse (nome, indirizzo, breve descrizione) e la mappatura GPS del rettangolo che lo circoscrive (4 punti: A, B, C e D). Ogni punto ha due dati: Latitudine e Longitudine

MULTIMEDIA (E): Contiene info sul video/foto dei vari POI (link, nome, tipo, tariffa di appartenenza: base o intermedia/avanzata )

VISUALIZZA (R): Un POI ha N risorse multimediali. Una risorsa multimediale appartiene ad un solo POI

SELEZIONA (R): Ad un tipo di tariffa (biglietto) appartengono N risorse multimediali. Una risorsa multimediale appartiene ad un tipo di tariffa (con un piccolo accorgimento è possibile “duplicare” una risorsa multimediale i.e: foto, per farla appartenere a più tariffe. Nel caso di tariffa intermedia si può decidere che le 7 foto siano composte dalle 3 della tariffa base più altre 4 foto oppure da 7 foto diverse rispetto alla base. Uso di codici nel campo gestiti via sw)

DIDASCALIA (E): Contiene le didascalie in tutte le lingue previste per ogni singola foto delle risorse multimediali. La lingua è individuata da un codice (1=IT, 2=ING, 3=…)

HA (R): Una foto di MULTIMEDIALE ha N didascalie (una per ogni lingua). Una didascalia appartiene ad una sola foto

TABLET (E): Contiene informazioni sul mini tablet (numero di serie, marca, modello, stato: in prestito, c/o info point X, rotto,….)

PRESTATO (R): Un miniTablet può essere prestato da info point diversi (in orari e/o giorni diversi a seconda di dove viene restituito…caso carta di credito). Un info point può prestare più miniTablet. Relazione N-N

ABBINATO (R): Un biglietto è abbinato ad un tablet. Un tablet è abbinato a un solo biglietto (in un determinato momento).

 Modello Logico (semplificato):

OPERATORE (E): id, nominativo, qualifica, username, password (cifrata)

BIGLIETTI (E): id, prezzo, tariffa, password, data_emissione, nome_cliente, tipo_documento, nr_documento, data_scadenza, cvv, rilaciato_da, id_infopoint.  NOTA: i campi relativi ai dati del documento depositato sono comuni e compatibili tra loro a secondo del tipo di documento. Il SW gestirà in modo appropriato i campi a secondo del tipo_documento selezionato (CI/passaporto/carta credito). Quindi il campo assume contenuti e significati diversi indipendentemente dal nome assegnato al campo.

INFOPOINT (E): id, nome, indirizzo, gps_lat, gps_lon

LAVORA (R): id_operatore, id_infopoint, data_lavoro . NOTA: Relazione N-N … diventa una tabella.

POI (E): id, nome, descrizione, ubicazione (indirizzo), a_lon, a_lat, b_lon, b_lat, c_lon, c_lat, d_lon, d_lat. NOTE: vedi VARIANTE Punto 1-Càc_lat, c_lon, raggio dove c=centro del POI

MULTIMEDIA (E): id, nome, tipo (video/foto), tariffa, link, descrizione, id_poi, id_biglietto. NOTE: tariffa è un codice (0=base, 1=intermedia; 2=sia base che intermedia), link (percorso della risorsa che può essere un link relativo se la risorsa  è sul server o un link assoluto se la risorsa è sul web o ancora codice embedded se si decide, per i video, di incorporare la risorsa da un canale youtube dedicato)

DIDASCALIA (E): id, cod_lingua, testo, id_multimedia

TABLET (E): id, nr_serie, marca, modello, stato. NOTA: stato: codice con vari significati. Es.: 0=in prestito, >0 ==id_infopont in cui si trova al momento; -1=in manutenzione; -2=guasto… ecc.)

PRESTATO (R): id, id_infopoint_prelievo, id_infopoint_restituzione, id_tablet, id_biglietto, data_restituzione.  Relazione N-N. Diventa una tabella con campi aggiuntivi. Nota: la data del prestito coincide data_emissione presente in BIGLIETTI

 

Punto 3: Progetto pagine web

 

La pagina web viene richiamata in automatico dall’APP quando riceve le coordinate GPS che rientrano in una zona (rettangolo) di un POI.

I  dati del biglietto sono sati salvati in una variabile di sessione “biglietto” al momento dell’autentificazione (avvio dell’APP con inserimento della pw del biglietto) e una variabile “lingua” nel caso di tariffa intermedia/avanzata (dopo debita selezione) dove è memorizzato il codice della lingua scelta

Schema di principio:

1.      Invio di querystring periodica (ogni tot. secondi) al server con coordinate GPS. Esempio: www.miosito.it/search.php?gpslat=1.23456&gpslon=34.5467

2.      Lo script search.php recupera i dati dalla querystring. Interroga la tabella POI recuperando la mappatura GPS di tutti i POI ed avvia una funzione di ricerca all’interno delle singole mappature. Se il punto rientra in una mappatura viene estratto il relativo id_poi a cui appartiene e richiamato il controller di gestione del POI passando il suo ID. Esempio: …/poi/id (nel caso di framework CodeIgniter). Se la ricerca da esito negativo si viene reindirizzati ad una pagina di default (ad esempio una mappa google con la nostra posizione e la posizione di alcuni POI  vicini)

3.      Se l’esito della ricerca è positivo: Il controller POI estrae dalla variabile di sessione “biglietto” la tariffa del cliente ed interroga la tabella MULTIMEDIA in accordo alla tariffa individuata estraendo i link del video e delle foto abbinati al POI per quella tariffa. Per ogni foto interroga la tabella DIDASCALIA ed estrae i testi nella lingua prevista. Nel caso di tariffa base i codici 1=IT e 2=ING, nel caso di altre tariffe il codice estratto dalla variabile di sessione “lingua”. Estrae dalla tabella POI (mediante il suo id) le altre info come il nome, l’indirizzo e la breve descrizione. Una volta avuti tutti i dati viene chiamata la vista che presenterà la pagina al cliente.

4.      La vista genera una pagina web con i dati provenienti dal controller. (vedi disegno)

 

Codice della vista (poi_base.php) semplificato:

 

<html> <head>

<title><?php echo $titolo ?></title>

<link… vari a CSS custo e/o boostrap >

 <script src=…. Vari a JQuery o altri script necessari>

<body>

<h1><?php echo $nomePOI ?> </h1>

<h2><?php echo $indirizzo ?> </h2>

<p><?php echo $decrizioneBreve ?> </p>

<h1>Video</h1>

<video width="320" height="240" controls>
  <source src="/jm/<?php echo $videoLink ?>" type="video/mp4">
</video>

<h1><?php echo $nomeFoto[0] ?> </h1>

<img src=”<?php echo $linkFoto[0] ?>”>

<p><?php echo $didascaliaItaliano[0] ?> </p>

<p><?php echo $didascaliaInglese[0] ?> </p>

 

<h1><?php echo $nomeFoto[1] ?> </h1>

<img src=”<?php echo $linkFoto[1] ?>”>

<p><?php echo $didascaliaItaliano[1] ?> </p>

<p><?php echo $didascaliaInglese[1] ?> </p>

 

<h1><?php echo $nomeFoto[2] ?> </h1>

<img src=”<?php echo $linkFoto[2] ?>”>

<p><?php echo $didascaliaItaliano[2] ?> </p>

<p><?php echo $didascaliaInglese[2] ?> </p>

</body></html>

 

Bozza del codice del controller POI (poi_controller.php)semplificato, incompleto e non ottimizzato:

 

<?php

//La variabile $id_poi viene passata al controller dallo script search.php

Function estraeTesto($id_foto,$lingua){

include “configDB.php”;

$sql=”SELECT testo FROM didascalia WHERE id_multimedia=$id_foto AND cod_lingua=$lingua”;

$result = $conn->query($sql);

$row = $result->fetch_assoc();

return $row[‘testo’];

}

include “configDB.php”; //Dati di connessione al database

//Info POI

$sql=”SELECT * FROM poi WHERE id=$id_poi”;

$result = $conn->query($sql);

$row = $result->fetch_assoc();

$nomePOI=$row[‘nome’];

$indirizzo=$row[‘ubicazione’];

$descrizioneBreve=$row[‘descrizione’];

//info Multimedia POI

$biglietto=$_SESSION[‘biglietto’];

$tariffa=$biglietto[‘tariffa’];

$sql=”SELECT * FROM multimedia WHERE id_poi=’$id_poi’ AND tariffa=’$tariffa’”;

$result = $conn->query($sql);

$id_foto=array();

$nomeFoto=array();

$nomeLink=array();

while($row = $result->fetch_assoc()) {

if($row[‘tipo’]==’video’) $videoLink=$row[‘link’];

else {

     $id_foto[]=$row[‘id’];

$nomeFoto[] =$row[‘nome’];

$nomeLink[] =$row[‘link’];

}

}

//Estrae didascalie

$didascaliaItaliano =array();

foreach ($id_foto as $id){

$didascaliaItaliano[]=estraeTesto($id,1);

}

$didascaliaInglese=array();

foreach ($id_foto as $id){

$didascaliaInglese[]=estraeTesto($id,2);

}

 

 

Punto 4: Gestione tariffe e lingua

 

Gestione della lingua: Come già accennato quando l’utente inserisce la pw del biglietto nell’APP per il primo accesso, il processo di autenticazione controlla dalla tabella BIGLIETTI il piano tariffario. Se il piano tariffario prevede la scelta della lingua il server  invia un form che obbliga l’utente a selezionare la lingua scelta. Tale scelta sarà memorizzata in una variabile di sessione chiamata “lingua” (un numero compreso tra 1 e 7). Dove previsto dalla tariffa, le pagine visualizzate avranno un link che permetterà di richiamare il form iniziale per modificare la lingua scelta in qualunque momento aggiornando la variabile di sessione.

 

Gestione tariffe: La tariffa viene individuata quando l’utente fa il login inserendo la password del biglietto (è memorizzata nella tabella BIGLIETTI). Il record del biglietto selezionato viene registrato in una variabile di sessione chiamata “biglietto” . Il controller di login, se la tariffa memorizzata è quella intermedia, crea un’ulteriore variabile di sessione chiamata “tariffa2” inizializzata al valore 3 (nr. di POI avanzati a scelta dell’utente). Ogni volta che l’utente arriva in un POI il controller verifica l’esistenza della variabile di sessione “tariffa2” ed il suo valore. Se esiste ed è maggiore di 0 il controller POI  invia all’utente un richiesta (pop-up) se vuole visualizzare la risorsa in modalità avanzata. Se l’utente sceglie SI, il controller decrementa di uno la variabile ed eroga le risorse in modalità avanzata. Quando l’utente avrà selezionato per tre volte la modalità avanzata la richiesta non apparirà più.

 

PARTE 2 – Punto 1.

 

Integrazione base di dati. Nuova entità COMMENTI. Modello E/R

 

 

 

POI (E): Identica alla Parte 1

COMMENTI (E): id, voto, commento, id_poi

OTTIENE (R): Un POI ottiene N commenti/voti. Un commento/voto appartiene ad un solo POI

 

commenti

Colonna

Tipo

id (Primaria)

int(11)

voto

int(11)

commento

varchar(250)

id_poi

int(11)

 

La query di prova:

SELECT nome as 'Nome POI', id_poi as ID,avg(voto) as 'Media voti' FROM commenti, poi WHERE poi.id=commenti.id_poi GROUP BY `id_poi`

 

Codice in PHP (voti.php)

<?php

$conn = new mysqli('localhost', 'root', '', 'test');

$sql = "SELECT nome ,avg(voto) as media FROM commenti, poi WHERE poi.id=commenti.id_poi

GROUP BY id_poi";

$result = $conn->query($sql);

$html = "";

if ($result->num_rows > 0) {

    while ($row = $result->fetch_assoc()) {

        $html .= "<tr><td>" . implode("</td><td>", $row) . "</tr>";

    }

} else {

    $html = "<tr><td span=2>Non ci sono dati sulla media dei voti</td></tr>";

}

$conn->close();

?>

<html>

    <head><title>Voti medi per POI</title></head>

    <body>

        <h1>Tabella media dei voti per Punto di Interesse</h1>

        <table border="1">

            <tr><th>Nome POI</th><th>Voto medio</th></tr>

            <?php echo $html ?>

        </table>

    </body>

</html>

Risultato del codice

Tabella media dei voti per Punto di Interesse

Nome POI

Voto medio

Mole Antonelliana

6.7500

Museo Egizio

5.5000

 

Parte 2- Punto 2

 

Caso A: Uso limitato ai mini Tablet forniti:

Nell’ipotesi della prima parte dove l’accesso ai contenuti è gestito da un’APP proprietaria appositamente creata è sufficiente non fornire l’APP sugli store. Se per qualche ragione il cliente conoscesse l’indirizzo pubblico del server sarà sufficiente creare una pagina index (home page) vuota (l’APP accede a pagine precise e non ne rivela il nome). In tutti i casi anche se il potenziale “cliente a scrocco” conoscesse l’indirizzo di alcune pagine, l’accesso a qualunque pagina dei contenuti (escluso il login utente) è filtrato dalla sessione che deve essere attiva. La sessione è attiva solo dopo login (pw del biglietto). In più è possibile memorizzare nel database, al primo login, il nome della sessione attiva che identifica in maniera univoca un unico utente. Se un altro utente (con un mini tablet diverso) volesse accedere con la pw di un altro cliente già loggato, il sistema trovando (nel DB) la sessione già attiva ne impedirebbe l’accesso (con apposito messaggio).

 

Caso B: Uso limitato ad uno e unico dispositivo mobile del cliente.

In questo caso il cliente deve prima scaricarsi dallo store l’APP proprietaria (gratuitamente o meno a secondo delle politiche aziendali). Poi si connetterà mediante la pw del biglietto. Per evitare che più persone accedano con la pw di una persona sola, si può utilizzare lo stesso meccanismo descritto nel caso A (memorizzazione su DB della sessione…nella tabella BIGLIETTO). Se un utente ha una sessione attiva nessun altro può accedere con la medesima pw. La sessione deve rimanere attiva per il tempo previsto dalla tariffa e memorizzata nell’APP anche se si esce dall’applicazione  e poi si rientra (l’utente risulterà autenticato fino alla data di scadenza).

Per il resto valgono le stesse considerazioni fatte nel caso A

Parte 2 – Punto 3: Accesso selettivo alla base di dati.

I DBMS gestiscono l’accesso hai dati e ai comandi sulle tabelle mediante autenticazione di un utente (tipicamente mediante username e password). Nel caso di MySQL di default username=root e la pw=”” (stringa vuota).

Ad ogni utente è possibile assegnare dei privilegi, cioè che cosa può fare quell’utente sul database specifico a cui è collegato. SQL utilizza il comando GRANT per craere gli utenti ed assegnare i privilegi. Per gli esempi si fa riferimento al DBMS MySQL

 

Creazione di un utente del DB:

CREATE USER segretaria@localhost IDENTIFIED BY 'pw1';

 

Assegnazione dei privilegi:

 GRANT SELECT, UPDATE, DELETE ON scuola_xyz.alunni TO segretaria@localhost

L’utente segreteria può solo fare operazioni di select, update e delete sulla tabella alunni del database scuola_xyz

 

Quindi creando un certo numero di utenti standard (uno per ogni tipologia di impiegato) ed assegnandogli i privilegi previsti è possibile gestire e limitare l’accesso hai dati.

Nella tabella di autenticazione del singolo impiegato, oltre ai suoi dati di autenticazione (username e password individuali), saranno memorizzati altri due campi (o eventuale tabella collegata) con username e password di  accesso al database della categoria a cui appartiene (segreteria amministrativa, ufficio tecnico, docente, ecc.). Quando l’utente fa il login la connessione ai dati che potrà  gestire sarà regolata dalle credenziali di MySQL a lui assegnate.

ALTRE SOLUZIONI

Su studenti.it