Nella parte precedente di questa serie di tutorial, abbiamo implementato la funzionalità richiesta per un utente che ha effettuato l'accesso per aggiungere un desiderio. Abbiamo anche visto come visualizzare i desideri inseriti da un utente nella home page dell'utente.
In questa parte implementeremo la funzionalità per la modifica e l'eliminazione dei desideri inseriti da un utente.
Per iniziare
Iniziamo clonando la parte precedente del tutorial da GitHub.
git clone https://github.com/jay3dec/PythonFlaskMySQLApp_Part3.git
Una volta clonato il codice sorgente, vai alla directory del progetto e avvia il server web.
cd PythonFlaskMySQLApp_Part3 python app.py
Punta il browser su http://localhost:5002/ e dovresti avere l'applicazione in esecuzione.
Modificare la lista dei desideri
Passaggio 1:mostra l'icona di modifica
Stiamo già legando i dati ricevuti usando jQuery al nostro HTML. Modificheremo quel codice e utilizzeremo i modelli jQuery per semplificare l'associazione dei dati. Aggiungeremo anche una edit
icon al nostro HTML per fornire un modo per aggiornare il desiderio. Apri userHome.html
e includi un riferimento ai modelli jQuery.
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"></script>
Rimuovi il list-group
esistente div e sostituirlo con il seguente codice HTML:
<div class="row"> <div class="col-md-12"> <div class="panel-body"> <ul id="ulist" class="list-group"> </ul> </div> </div> </div>
All'interno del UL
con la classe list-group
collegheremo i nostri dati. Definisci un listTemplate
come mostrato nel corpo dell'HTML:
<script id="listTemplate" type="text/x-jQuery-tmpl"> <li class="list-group-item"> <div class="checkbox"> <label> ${Title} </label> </div> <div class="pull-right action-buttons"> <a data-toggle="modal" data-target="#editModal"><span class="glyphicon glyphicon-pencil"></span></a> </div> </li> </script>
Modifica il jQuery
Richiamata riuscita AJAX per associare i dati a listTemplate
.
<script> $(function() { $.ajax({ url: '/getWish', type: 'GET', success: function(res) { // Parse the JSON response var wishObj = JSON.parse(res); // Append to the template $('#listTemplate').tmpl(wishObj).appendTo('#ulist'); }, error: function(error) { console.log(error); } }); }); </script>
Inoltre, includi alcuni stili in userHome.html
:
<style> .trash { color: rgb(209, 91, 71); } .panel-body .checkbox { display: inline-block; margin: 0px; } .list-group { margin-bottom: 0px; } </style>
Salva tutte le modifiche e riavvia il server. Punta il browser su http://localhost:5002 e accedi utilizzando un indirizzo e-mail e una password validi. Una volta effettuato l'accesso, dovresti essere in grado di vedere i desideri creati dall'utente.
Fase 2:visualizza il popup di modifica
Useremo Bootstrap per mostrare un popup per fornire un'interfaccia per modificare i desideri. Includi un riferimento a Bootstrap in userHome.html
.
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
Una volta incluso il riferimento, aggiungi il seguente codice HTML a userHome.html
.
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="editModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> <h4 class="modal-title" id="editModalLabel">Update Wish</h4> </div> <div class="modal-body"> <form role="form"> <div class="form-group"> <label for="recipient-name" class="control-label">Title:</label> <input type="text" class="form-control" id="editTitle"> </div> <div class="form-group"> <label for="message-text" class="control-label">Description:</label> <textarea class="form-control" id="editDescription"></textarea> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" id="btnUpdate" class="btn btn-primary">Update</button> </div> </div> </div> </div>
L'HTML sopra fungerà da popup. Quando l'utente fa clic su edit
icona che il popup mostrerà. Abbiamo già aggiunto gli attributi data-target
e data-toggle
che attiverà il popup modale.
<a data-toggle="modal" data-target="#editModal"><span class="glyphicon glyphicon-pencil"></span></a>
Salva le modifiche precedenti e riavvia l'app. Una volta effettuato l'accesso all'applicazione, fare clic su edit
icona e dovresti essere in grado di visualizzare il popup.
Fase 3:popola il popup di modifica
Quando l'utente fa clic sull'icona di modifica, mostreremo il popup di aggiornamento con il title
e description
aggiornare. Per iniziare, per prima cosa abbiamo bisogno dell'ID del desiderio per recuperare i dettagli del desiderio particolare una volta che l'utente fa clic sull'icona di modifica. Quindi modifica il codice del modello jQuery per includere un attributo extra data-id
sull'elemento di ancoraggio di modifica.
<a data-id=${Id} onclick="Edit(this)" ><span class="glyphicon glyphicon-pencil"></span></a>
Abbiamo anche allegato un onclick
evento per chiamare il metodo Edit
. All'interno della funzione Modifica, faremo una chiamata AJAX a un metodo python chiamato getWishById
che restituirà i dettagli del desiderio.
function Edit(elm) { $.ajax({ url: '/getWishById', data: { id: $(elm).attr('data-id') }, type: 'POST', success: function(res) { console.log(res); }, error: function(error) { console.log(error); } }); }
Quindi, apri app.py
e crea un metodo chiamato getWishById
. Usando questo metodo, otterremo i dettagli del desiderio particolare dal database.
@app.route('/getWishById',methods=['POST']) def getWishById(): try: if session.get('user'): _id = request.form['id'] _user = session.get('user') conn = mysql.connect() cursor = conn.cursor() cursor.callproc('sp_GetWishById',(_id,_user)) result = cursor.fetchall() wish = [] wish.append({'Id':result[0][0],'Title':result[0][1],'Description':result[0][2]}) return json.dumps(wish) else: return render_template('error.html', error = 'Unauthorized Access') except Exception as e: return render_template('error.html',error = str(e))
Come puoi vedere nel metodo sopra, abbiamo passato l'ID desiderio a questo metodo e ottiene i dati dal database usando l'user ID
e wish ID
. Una volta che i dati sono stati recuperati, li converte in un elenco e poi li restituisce come JSON
dati.
Quindi, creiamo la stored procedure MySQL richiesta per recuperare i dati dal database.
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_GetWishById`( IN p_wish_id bigint, In p_user_id bigint ) BEGIN select * from tbl_wish where wish_id = p_wish_id and wish_user_id = p_user_id; END
Il codice mostrato sopra è la procedura memorizzata per ottenere dettagli sui desideri particolari utilizzando il wish ID
e user ID
.
Salva le modifiche e riavvia il server. Una volta effettuato l'accesso all'applicazione, fare clic su edit
icona e dovresti avere i dettagli registrati nella console del tuo browser.
Per associare i dati ricevuti al popup HTML, rimuovere prima il data-target
e data-toggle
attributi dal tag di ancoraggio dell'icona di modifica. Quindi aggiungi il seguente codice a Edit
Richiamata riuscita della funzione JavaScript per popolare il popup e attivarlo.
// Parse the received JSON string var data = JSON.parse(res); //Populate the Pop up $('#editTitle').val(data[0]['Title']); $('#editDescription').val(data[0]['Description']); // Trigger the Pop Up $('#editModal').modal();
Salva le modifiche e riavvia il server. Una volta effettuato l'accesso all'applicazione, prova a fare clic sull'icona di modifica e dovresti visualizzare il popup con il titolo e la descrizione.
Fase 4:aggiorna i dettagli dei desideri
Per implementare la funzionalità di aggiornamento, creiamo prima una stored procedure MySQL.
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_updateWish`( IN p_title varchar(45), IN p_description varchar(1000), IN p_wish_id bigint, In p_user_id bigint ) BEGIN update tbl_wish set wish_title = p_title,wish_description = p_description where wish_id = p_wish_id and wish_user_id = p_user_id; END$$ DELIMITER ;
Come visto nella procedura memorizzata sopra, passeremo il title
modificato e description
insieme al ID
del desiderio e l'utente di aggiornare i dettagli nel database.
Quindi, creiamo un nuovo metodo chiamato updateWish
per aggiornare i dettagli. Ecco il updateWish
metodo:
@app.route('/updateWish', methods=['POST']) def updateWish(): try: if session.get('user'): _user = session.get('user') _title = request.form['title'] _description = request.form['description'] _wish_id = request.form['id'] conn = mysql.connect() cursor = conn.cursor() cursor.callproc('sp_updateWish',(_title,_description,_wish_id,_user)) data = cursor.fetchall() if len(data) is 0: conn.commit() return json.dumps({'status':'OK'}) else: return json.dumps({'status':'ERROR'}) except Exception as e: return json.dumps({'status':'Unauthorized access'}) finally: cursor.close() conn.close()
Come visto nel codice sopra, dopo aver convalidato una sessione valida, abbiamo raccolto i dati pubblicati e chiamato la stored procedure sp_updateWish
per aggiornare i dettagli.
Per chiamare il updateWish
metodo, dobbiamo allegare un evento su Update
fare clic sul pulsante. Quindi, dai un nome al pulsante di aggiornamento btnUpdate
e allega un onclick
evento come mostrato:
$('#btnUpdate').click(function() { $.ajax({ url: '/updateWish', data: { title: $('#editTitle').val(), description: $('#editDescription').val(), id: localStorage.getItem('editId') }, type: 'POST', success: function(res) { $('#editModal').modal('hide'); // Re populate the grid }, error: function(error) { console.log(error); } }) });
Come visto nel codice sopra, abbiamo raccolto il editId
da localStorage
, quindi all'interno di Edit
funzione salva il ID
in localStorage
.
localStorage.setItem('editId',$(elm).attr('data-id'));
Concludi getWish
Chiamata AJAX in una funzione, in modo da poterla richiamare di nuovo una volta che i dati sono stati aggiornati.
function GetWishes() { $.ajax({ url: '/getWish', type: 'GET', success: function(res) { var wishObj = JSON.parse(res); $('#ulist').empty(); $('#listTemplate').tmpl(wishObj).appendTo('#ulist'); }, error: function(error) { console.log(error); } }); }
Chiama il GetWishes
funzione nella richiamata di successo dell'update
Chiamata AJAX.
$('#btnUpdate').click(function() { $.ajax({ url: '/updateWish', data: { title: $('#editTitle').val(), description: $('#editDescription').val(), id: localStorage.getItem('editId') }, type: 'POST', success: function(res) { $('#editModal').modal('hide'); // Re populate the grid GetWishes(); }, error: function(error) { console.log(error); } }) });
Salva tutte le modifiche e riavvia il server. Una volta effettuato l'accesso all'applicazione, prova a modificare i desideri disponibili creati dall'utente.
Eliminazione di un desiderio
Passaggio 1:mostra un popup di conferma
Aggiungi il seguente codice HTML a userHome.html
.
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header" style="text-align:center;"> <h4 class="modal-title" style="color:red;" id="deleteModalLabel">You are going to Delete this forever !!</h4> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> <button type="button" class="btn btn-primary">Delete</button> </div> </div> </div> </div>
Aggiungi un'icona di eliminazione all'interno di listTemplate
aggiungendo il seguente codice HTML:
<a data-id=${Id} onclick="ConfirmDelete(this)" ><span class="glyphicon glyphicon-trash"></span></a>
Facendo clic sull'icona di eliminazione sopra, chiameremo una funzione JavaScript chiamata ConfirmDelete
dove attiveremo il popup di conferma.
function ConfirmDelete(elem) { localStorage.setItem('deleteId', $(elem).attr('data-id')); $('#deleteModal').modal(); }
Salva le modifiche e riavvia il server. Una volta effettuato l'accesso, fai clic sull'icona di eliminazione nella lista dei desideri e dovresti essere in grado di vedere il popup di conferma.
Fase 2:elimina un desiderio
Per implementare la funzionalità Delete wish, prima creiamo la stored procedure MySQL da eliminare.
DELIMITER $$ USE `BucketList`$$ CREATE PROCEDURE `sp_deleteWish` ( IN p_wish_id bigint, IN p_user_id bigint ) BEGIN delete from tbl_wish where wish_id = p_wish_id and wish_user_id = p_user_id; END$$ DELIMITER ;
La procedura precedente prende l'ID desiderio e l'ID utente e cancella il desiderio corrispondente dal database.
Quindi, creiamo un metodo all'interno di app.py
per chiamare la procedura sp_deleteWish
.
Creeremo un metodo chiamato deleteWish
per la cancellazione dei desideri.
@app.route('/deleteWish',methods=['POST']) def deleteWish(): try: if session.get('user'): _id = request.form['id'] _user = session.get('user') conn = mysql.connect() cursor = conn.cursor() cursor.callproc('sp_deleteWish',(_id,_user)) result = cursor.fetchall() if len(result) is 0: conn.commit() return json.dumps({'status':'OK'}) else: return json.dumps({'status':'An Error occured'}) else: return render_template('error.html',error = 'Unauthorized Access') except Exception as e: return json.dumps({'status':str(e)}) finally: cursor.close() conn.close()
Nel metodo sopra, abbiamo prima convalidato la sessione. Una volta validata la sessione utente, utilizzando il wish ID e lo user ID abbiamo chiamato la stored procedure sp_deleteWish
.
Per chiamare il metodo sopra deleteWish
, aggiungi un onclick
evento al pulsante Elimina nel popup di conferma dell'eliminazione.
<button type="button" class="btn btn-primary" onclick="Delete()">Delete</button>
Crea una funzione JavaScript chiamata Delete
e all'interno di Elimina effettua una chiamata AJAX al metodo python deleteWish
.
function Delete() { $.ajax({ url: '/deleteWish', data: { id: localStorage.getItem('deleteId') }, type: 'POST', success: function(res) { var result = JSON.parse(res); if (result.status == 'OK') { $('#deleteModal').modal('hide'); GetWishes(); } else { alert(result.status); } }, error: function(error) { console.log(error); } }); }
Al successo della richiamata di Delete
sopra funzione, verificheremo lo stato restituito e, se è OK, nasconderemo il popup modale e ricarichiamo i desideri.
Salva le modifiche e riavvia il server. Una volta effettuato l'accesso all'applicazione, prova a eliminare un desiderio dalla home page dell'utente.