Advertisement
  1. Code
  2. Python

Membuat Aplikasi Web dari Awal dengan Python Flask dan MySQL: Bagian 8

Scroll to top
Read Time: 8 min
This post is part of a series called Creating a Web App From Scratch Using Python Flask and MySQL.
Creating a Web App From Scratch Using Python Flask and MySQL: Part 7

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('&nbsp;'+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('&nbsp;' + 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.

Dashboard With LikeDashboard With LikeDashboard With Like

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('&nbsp;You & ' + (Number(like) - 1) + ' Others');
3
} else {
4
    likeSpan.html('&nbsp;' + 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.

Dashboard With Like StatusDashboard With Like StatusDashboard With Like Status

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('&nbsp;You & ' + (Number(obj.total) - 1) + ' Others');
7
    } else {
8
        $('#span_' + spId).html('&nbsp;' + 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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.