Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)
Pada bagian sebelumnya dari seri tutorial ini, kita mengisi halaman dashboard pada aplikasi kita dengan butir keinginan yang dibuat oleh berbagai user. Kita juga menambahkan tombol like pada setiap butir keinginan agar seorang user bisa menyukai sebuah keinginan.
Pada tutorial kali ini, kita akan lihat bagaimana untuk menampilkan toggle like/unlike dan menampilkan jumlah total like yang diterima sebuah butir keinginan.
Memulai
Kita mulai dengan membuat klon dari tutorial sebelumnya dari GitHub.
1 |
git clone https://github.com/jay3dec/PythonFlaskMySQLApp_Part7.git |
Setelah source code di klon, masuk ke direktori proyek dan jalankan web server.
1 |
cd PythonFlaskMySQLApp_Part7
|
2 |
python app.py |
Arahkan browser ke http://localhost:5002/ dan aplikasi akan berjalan.
Menambahkan Jumlah Like
Kita mulai dengan mengimplementasi fitur untuk menamplikan jumlah like yang didapat sebuah butir keinginan. Saat sebuah keinginan baru ditambahkan, kita buat sebuah entri pada tabel tbl_likes
. Jadi ubah stored procedure sp_addWish
untuk membuat entri pada tabel tbl_likes
.
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_addWish`( |
3 |
IN p_title varchar(45), |
4 |
IN p_description varchar(1000), |
5 |
IN p_user_id bigint, |
6 |
IN p_file_path varchar(200), |
7 |
IN p_is_private int, |
8 |
IN p_is_done int |
9 |
)
|
10 |
BEGIN
|
11 |
insert into tbl_wish( |
12 |
wish_title, |
13 |
wish_description, |
14 |
wish_user_id, |
15 |
wish_date, |
16 |
wish_file_path, |
17 |
wish_private, |
18 |
wish_accomplished
|
19 |
)
|
20 |
values
|
21 |
(
|
22 |
p_title, |
23 |
p_description, |
24 |
p_user_id, |
25 |
NOW(), |
26 |
p_file_path, |
27 |
p_is_private, |
28 |
p_is_done
|
29 |
);
|
30 |
|
31 |
SET @last_id = LAST_INSERT_ID(); |
32 |
insert into tbl_likes( |
33 |
wish_id, |
34 |
user_id, |
35 |
wish_like
|
36 |
)
|
37 |
values( |
38 |
@last_id, |
39 |
p_user_id, |
40 |
0
|
41 |
);
|
42 |
|
43 |
|
44 |
END$$ |
45 |
DELIMITER ; |
Seperti yang kita lihat pada kode stored procedure di atas, setelah memasukkan keinginan ke tabel tbl_wish
, kita mengambil ID
yang terakhir dibuat dan memasukkan data tersebut ke tabel tbl_likes
.
Lalu kita ubah stored procedure sp_GetAllWishes
untuk mencakup jumlah like yang didapat setiap keinginan. Kita gunakan fungsi MySQL untuk mendapatkan jumlah total keinginan kita. Buat fungsi bernama getSum
yang menerima ID
keinginan dan mengembalikan jumlah like keinginan tersebut.
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` FUNCTION `getSum`( |
3 |
p_wish_id int |
4 |
) RETURNS int(11) |
5 |
BEGIN
|
6 |
select sum(wish_like) into @sm from tbl_likes where wish_id = p_wish_id; |
7 |
RETURN @sm; |
8 |
END$$ |
9 |
DELIMITER ; |
Sekarang panggil fungsi getSum
pada stored procedure sp_GetAllWishes
untuk mendapatkan jumlah like untuk setiap keinginan.
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_GetAllWishes`() |
3 |
BEGIN
|
4 |
select wish_id,wish_title,wish_description,wish_file_path,getSum(wish_id) |
5 |
from tbl_wish where wish_private = 0; |
6 |
END$$ |
7 |
DELIMITER ; |
Ubah fungsi Python getAllWishes
untuk menambahkan jumlah like. Sambil mengiterasi hasil yang dikembalikan dari stored procedure MySQL, tambahkan field like sebagai berikut:
1 |
for wish in result: |
2 |
wish_dict = { |
3 |
'Id': wish[0], |
4 |
'Title': wish[1], |
5 |
'Description': wish[2], |
6 |
'FilePath': wish[3], |
7 |
'Like':wish[4]} |
8 |
wishes_dict.append(wish_dict) |
Ubah fungsi JavaScript CreateThumb
untuk membuat span tambahan yang akan kita gunakan untuk menampilkan jumlah like.
1 |
var likeSpan = $('<span>').attr('aria-hidden','true').html(' '+like+' like(s)'); |
Tambahkan likeSpan
ke paragraf orang tua p
. Berikut adalah fungsi JavaScript CreateThumb
yang sudah diperbarui.
1 |
function CreateThumb(id, title, desc, filepath, like) { |
2 |
var mainDiv = $('<div>').attr('class', 'col-sm-4 col-md-4'); |
3 |
var thumbNail = $('<div>').attr('class', 'thumbnail'); |
4 |
var img = $('<img>').attr({ |
5 |
'src': filepath, |
6 |
'data-holder-rendered': true, |
7 |
'style': 'height: 150px; width: 150px; display: block' |
8 |
});
|
9 |
var caption = $('<div>').attr('class', 'caption'); |
10 |
var title = $('<h3>').text(title); |
11 |
var desc = $('<p>').text(desc); |
12 |
|
13 |
|
14 |
var p = $('<p>'); |
15 |
var btn = $('<button>').attr({ |
16 |
'id': 'btn_' + id, |
17 |
'type': 'button', |
18 |
'class': 'btn btn-danger btn-sm' |
19 |
});
|
20 |
var span = $('<span>').attr({ |
21 |
'class': 'glyphicon glyphicon-thumbs-up', |
22 |
'aria-hidden': 'true' |
23 |
});
|
24 |
|
25 |
var likeSpan = $('<span>').attr('aria-hidden', 'true').html(' ' + like + ' like(s)'); |
26 |
|
27 |
p.append(btn.append(span)); |
28 |
p.append(likeSpan); |
29 |
|
30 |
|
31 |
caption.append(title); |
32 |
caption.append(desc); |
33 |
caption.append(p); |
34 |
|
35 |
thumbNail.append(img); |
36 |
thumbNail.append(caption); |
37 |
mainDiv.append(thumbNail); |
38 |
return mainDiv; |
39 |
|
40 |
|
41 |
}
|
Masukkan parameter like
saat memanggil fungsi JavaScript CreateThumb
dari kondisi sukses pemanggilan jQuery AJAX untuk /getAllWishes
.
1 |
CreateThumb(data[i].Id,data[i].Title,data[i].Description,data[i].FilePath,data[i].Like) |
Simpan perubahan dan restart server. Setelah masuk ke aplikasi kamu akan lihat jumlah like pada setiap butir keinginan.



Perlihatkan jika Butir Keinginan disukai
Walau sudah ada jumlah like di setiap butir keinginan, tidak jelals apakah user yang sudah log in menyukai butir keinginan tersebut atau tidak. Kita tampilkan pesan yang sesuai seperti Kamu dan 20 orang lain
. Untuk mengimplementasi fitur tersebut, kita perlu ubah fungsi sp_GetAllWishes
untuk mencakup sedikit kode yang menandakan apakah user yang log in menyukai sebuah butir keinginan atau tidak. Untuk memeriksa apakah sebuah keinginan sudah disukai, kita buat pemanggilan fungsi. Buat fungsi hasLiked
yang menerima ID
user dan ID
keinginan sebagai parameter dan mengembalikan apakah keinginan tersebut disukai oleh user atau tidak.
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` FUNCTION `hasLiked`( |
3 |
p_wish int, |
4 |
p_user int |
5 |
) RETURNS int(11) |
6 |
BEGIN
|
7 |
|
8 |
select wish_like into @myval from tbl_likes where wish_id = p_wish and user_id = p_user; |
9 |
RETURN @myval; |
10 |
END$$ |
11 |
DELIMITER ; |
Panggil fungsi MySQL hasLiked
di dalam sp_GetAllWishes
untuk mengembalikan field ekstra pada data yang dikembalikan untuk menandai status menyukai dari user.
1 |
DELIMITER $$ |
2 |
|
3 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_GetAllWishes`( |
4 |
p_user int |
5 |
)
|
6 |
BEGIN
|
7 |
select wish_id,wish_title,wish_description,wish_file_path,getSum(wish_id),hasLiked(wish_id,p_user) |
8 |
from tbl_wish where wish_private = 0; |
9 |
END
|
Buka app.py
dan ubah pemanggilan stored procedure MySQL sp_GetAllWishes
untuk mencakup ID
user sebagai parameter.
1 |
_user = session.get('user') |
2 |
conn = mysql.connect() |
3 |
cursor = conn.cursor() |
4 |
cursor.callproc('sp_GetAllWishes',(_user,)) |
Sekarang ubah fungsi getAllWishes
untuk mencakup status like user untuk sebuah butir keinginan. Ubah kode tersebut untuk mencakup HasLiked
pada dictionary yang dibuat.
1 |
for wish in result: |
2 |
wish_dict = { |
3 |
'Id': wish[0], |
4 |
'Title': wish[1], |
5 |
'Description': wish[2], |
6 |
'FilePath': wish[3], |
7 |
'Like':wish[4], |
8 |
'HasLiked':wish[5]} |
9 |
wishes_dict.append(wish_dict) |
Di dalam fungsi JavaScript CreateThumb
, kita periksa HasLiked
dan tambahkan HTML yang seuai.
1 |
if (hasLiked == "1") { |
2 |
likeSpan.html(' You & ' + (Number(like) - 1) + ' Others'); |
3 |
} else { |
4 |
likeSpan.html(' ' + like + ' like(s)'); |
5 |
}
|
Seperti terlihat pada kode di atas, kita menampilkan jumlah like jika user belum menyukai butir keinginan yang terkait. Jika user menyukai butir keinginan tersebut, kita tampilkan pesan yang lebih jelas.



Memperbarui Jumlah Like
Saat kita menekan tombol like, status like diperbarui di database, tapi tidak berubah pada dashboard. Kita perbarui pada kondisi sukses pemanggilan AJAX pada penekanan tombol like
.
Kita mulai dengan mengubah stored procedure MySQL sp_AddUpdateLikes
. Sebelumnya kita mengirim status like, 1 untuk like dan 0 untuk unlike. Mari kita ubah dan toggle like/unlike pada stored procedure. Buka sp_AddUpdateLikes
dan simpan status like ke sebuah variabel ldan periksa status variabel tersebut. Jika variabel status adalah like, kita update status jadi unlike dan sebaliknya. Berikut adalah stored procedure sp_AddUpdateLikes
yang sudah diperbarui.
1 |
-- --------------------------------------------------------------------------------
|
2 |
-- Routine DDL
|
3 |
-- Note: comments before and after the routine body will not be stored by the server
|
4 |
-- --------------------------------------------------------------------------------
|
5 |
DELIMITER $$ |
6 |
|
7 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_AddUpdateLikes`( |
8 |
p_wish_id int, |
9 |
p_user_id int, |
10 |
p_like int |
11 |
)
|
12 |
BEGIN
|
13 |
|
14 |
if (select exists (select 1 from tbl_likes where wish_id = p_wish_id and user_id = p_user_id)) then |
15 |
|
16 |
|
17 |
select wish_like into @currentVal from tbl_likes where wish_id = p_wish_id and user_id = p_user_id; |
18 |
|
19 |
if @currentVal = 0 then |
20 |
update tbl_likes set wish_like = 1 where wish_id = p_wish_id and user_id = p_user_id; |
21 |
else
|
22 |
update tbl_likes set wish_like = 0 where wish_id = p_wish_id and user_id = p_user_id; |
23 |
end if; |
24 |
|
25 |
else
|
26 |
|
27 |
insert into tbl_likes( |
28 |
wish_id, |
29 |
user_id, |
30 |
wish_like
|
31 |
)
|
32 |
values( |
33 |
p_wish_id, |
34 |
p_user_id, |
35 |
p_like
|
36 |
);
|
37 |
|
38 |
|
39 |
end if; |
40 |
END
|
Pada fungsi JavaScript CreateThumb
, tugaskan ID
untuk likeSpan
yang kita buat sebelumnya, agar kita bisa perbarui status sesuai kebutuhan.
1 |
var likeSpan = $('<span>').attr({'aria-hidden':'true','id':'span_'+id}); |
Buka app.py
. Di dalam fungsi addUpdateLike
, begitu data sukses diperbarui, kita akan ambil jumlah like keinginan dan status menggunakan pemanggilan stored procedure lain. Buat stored procedure MySQL bernama sp_getLikeStatus
. Di dalam sp_getLikeStatus
kita akan panggil fungsi MySQL getSum
dan hasLiked
untuk mendapat status yang bersangkutan.
1 |
DELIMITER $$ |
2 |
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_getLikeStatus`( |
3 |
IN p_wish_id int, |
4 |
IN p_user_id int |
5 |
)
|
6 |
BEGIN
|
7 |
select getSum(p_wish_id),hasLiked(p_wish_id,p_user_id); |
8 |
END$$ |
9 |
DELIMITER ; |
Setelah kita panggil sp_AddUpdateLikes
dari fungsi Python addUpdateLike
, tutup kursor dan koneksi.
1 |
if len(data) is 0: |
2 |
conn.commit() |
3 |
cursor.close() |
4 |
conn.close() |
Sekarang panggil stored procedure sp_getLikeStatus
.
1 |
conn = mysql.connect() |
2 |
cursor = conn.cursor() |
3 |
cursor.callproc('sp_getLikeStatus',(_wishId,_user)) |
4 |
result = cursor.fetchall() |
Kembalikan jumlah like dan status like bersama respon.
1 |
return json.dumps({'status':'OK','total':result[0][0],'likeStatus':result[0][1]}) |
Pada dashboard.html
, pada kondsi sukses pemanggilan AJAX ke fungsi addUpdateLike
, urai respon yang didapat dan berdasarkan status like tampilkan jumlah like.
1 |
success: function(response) { |
2 |
|
3 |
var obj = JSON.parse(response); |
4 |
|
5 |
if (obj.likeStatus == "1") { |
6 |
$('#span_' + spId).html(' You & ' + (Number(obj.total) - 1) + ' Others'); |
7 |
} else { |
8 |
$('#span_' + spId).html(' ' + obj.total + ' like(s)'); |
9 |
}
|
10 |
|
11 |
}
|
Simpan perubahan, restart server, dan masuk menggunakan kredential yang sah. Saat di halaman dashboard, cobalah sukai suatu butir keinginan, dan lihat status like diperbarui dengan benar.
Penutup
Pada tutorial ini, kita mengimplementasi fitur like/unlike untuk butir keinginan yang ditampilkan pada halaman dashboard. Pada bagian berikutnya dari seri tutorial ini, kita akan implementasi beberapa fitur baru untuk aplikasi ini dan memperbaiki beberapa fitur yang sudah kita buat.
Beri tahu kami pendapat dan masukan, atau koreksimu di komentar di bawah. Source code tutorial ini tersedia di GitHub.