├── assets ├── img │ └── favicon.ico ├── audio │ └── tingtung.mp3 └── css │ └── style.css ├── LICENSE.md ├── config └── database.php ├── pages ├── nomor │ ├── get_antrian.php │ ├── insert.php │ └── index.php └── panggilan │ ├── get_jumlah_antrian.php │ ├── get_sisa_antrian.php │ ├── update.php │ ├── get_antrian_sekarang.php │ ├── get_antrian_selanjutnya.php │ ├── get_antrian.php │ └── index.php ├── database └── db_antrian.sql ├── README.md └── index.php /assets/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pustakakoding/aplikasi-antrian-berbasis-web/HEAD/assets/img/favicon.ico -------------------------------------------------------------------------------- /assets/audio/tingtung.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pustakakoding/aplikasi-antrian-berbasis-web/HEAD/assets/audio/tingtung.mp3 -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 - Pustaka Koding - Indra Styawantoro. All rights reserved. 2 | 3 | 4 | # Permissions 5 | 6 | - Private use 7 | - Modification 8 | - Distribution 9 | 10 | 11 | # Limitations 12 | 13 | - Commercial use 14 | - Liability 15 | - Warranty 16 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | 0) { 22 | // ambil data hasil query 23 | $data = mysqli_fetch_assoc($query); 24 | // buat variabel untuk menampilkan data 25 | $no_antrian = $data['no_antrian']; 26 | 27 | // tampilkan data 28 | echo number_format($no_antrian, 0, '', '.'); 29 | } 30 | // jika data "no_antrian" tidak ada 31 | else { 32 | // tampilkan "-" 33 | echo "-"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /pages/panggilan/get_antrian_selanjutnya.php: -------------------------------------------------------------------------------- 1 | 0) { 22 | // ambil data hasil query 23 | $data = mysqli_fetch_assoc($query); 24 | // buat variabel untuk menampilkan data 25 | $no_antrian = $data['no_antrian']; 26 | 27 | // tampilkan data 28 | echo number_format($no_antrian, 0, '', '.'); 29 | } 30 | // jika data "no_antrian" tidak ada 31 | else { 32 | // tampilkan "-" 33 | echo "-"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/db_antrian.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 5.1.1 3 | -- https://www.phpmyadmin.net/ 4 | -- 5 | -- Host: localhost:3306 6 | -- Generation Time: Aug 02, 2021 at 01:42 AM 7 | -- Server version: 5.7.34 8 | -- PHP Version: 8.0.8 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | START TRANSACTION; 12 | SET time_zone = "+00:00"; 13 | 14 | 15 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 16 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 17 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 18 | /*!40101 SET NAMES utf8mb4 */; 19 | 20 | -- 21 | -- Database: `db_antrian` 22 | -- 23 | 24 | -- -------------------------------------------------------- 25 | 26 | -- 27 | -- Table structure for table `tbl_antrian` 28 | -- 29 | 30 | CREATE TABLE `tbl_antrian` ( 31 | `id` bigint(20) NOT NULL, 32 | `tanggal` date NOT NULL, 33 | `no_antrian` smallint(6) NOT NULL, 34 | `status` enum('1','0') NOT NULL DEFAULT '0', 35 | `updated_date` datetime DEFAULT NULL 36 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 37 | 38 | -- 39 | -- Indexes for dumped tables 40 | -- 41 | 42 | -- 43 | -- Indexes for table `tbl_antrian` 44 | -- 45 | ALTER TABLE `tbl_antrian` 46 | ADD PRIMARY KEY (`id`); 47 | 48 | -- 49 | -- AUTO_INCREMENT for dumped tables 50 | -- 51 | 52 | -- 53 | -- AUTO_INCREMENT for table `tbl_antrian` 54 | -- 55 | ALTER TABLE `tbl_antrian` 56 | MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT; 57 | COMMIT; 58 | 59 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 60 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 61 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aplikasi Antrian Berbasis Web 2 | 3 | ![pustakakoding-aplikasi-antrian-berbasis-web](https://user-images.githubusercontent.com/88012593/127802854-a89aeb33-34e1-47ad-8bbf-6a8cecc45ef9.jpg) 4 | 5 | Aplikasi Antrian merupakan sistem manajemen yang digunakan untuk mengelola antrian pengunjung pada suatu perusahaan atau instansi. Aplikasi antrian dapat digunakan sebagai sarana untuk mencapai kinerja efektif dan efisien bagi perusahaan atau instansi dalam melayani pengunjung. 6 | 7 | **Aplikasi ini dibangun dengan :** 8 | - Menggunakan bahasa pemrograman **PHP 8**. 9 | - Menggunakan database management system **MySQL** atau **MariaDB**. 10 | - Menggunakan **MySQLi Extension** untuk berkomunikasi dengan database. 11 | - Menggunakan framework CSS **Bootstrap 5** untuk membuat desain tampilan aplikasi. 12 | - Menggunakan **jQuery AJAX** untuk proses CRUD. 13 | - Menggunakan API teks berbicara dalam bahasa Indonesia dari **ResponsiveVoice.JS** untuk suara panggilan antrian. 14 | 15 | # Fitur Apilkasi 16 | Aplikasi Antrian ini terdiri dari 2 interface, yaitu **Nomor Antrian**, dan **Panggilan Antrian**. 17 | 18 | ### 1. Nomor Antrian 19 | Halaman Nomor Antrian digunakan pengunjung untuk mengambil nomor antrian. Fitur ini bisa Kamu kembangkan lagi dengan menambahkan fungsi cetak nomor antrian secara langsung ke printer, atau memberikan nomor antrian secara online. 20 | 21 | ### 2. Panggilan Antrian 22 | Halaman Panggilan Antrian digunakan petugas loket untuk memanggil antrian pengunjung. Halaman ini menampilkan informasi jumlah antrian, nomor antrian yang sedang dipanggil nomor antrian selanjutnya yang akan dipanggil, sisa antrian yang belum dipanggil. Petugas loket dapat menekan tombol panggilan antrian pada layar untuk memanggil antrian dengan menggunakan suara yang bisa dihubungkan dengan alat pengeras suara. 23 | -------------------------------------------------------------------------------- /pages/nomor/insert.php: -------------------------------------------------------------------------------- 1 | 0) { 21 | // ambil data hasil query 22 | $data = mysqli_fetch_assoc($query); 23 | // "no_antrian" = "no_antrian" yang terakhir + 1 24 | $no_antrian = $data['nomor'] + 1; 25 | } 26 | // jika "no_antrian" belum ada 27 | else { 28 | // "no_antrian" = 1 29 | $no_antrian = 1; 30 | } 31 | 32 | // sql statement untuk insert data ke tabel "tbl_antrian" 33 | $insert = mysqli_query($mysqli, "INSERT INTO tbl_antrian(tanggal, no_antrian) 34 | VALUES('$tanggal', '$no_antrian')") 35 | or die('Ada kesalahan pada query insert : ' . mysqli_error($mysqli)); 36 | // cek query 37 | // jika proses insert berhasil 38 | if ($insert) { 39 | // tampilkan pesan sukses insert data 40 | echo "Sukses"; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /pages/panggilan/get_antrian.php: -------------------------------------------------------------------------------- 1 | 0) { 20 | $response = array(); 21 | $response["data"] = array(); 22 | 23 | // ambil data hasil query 24 | while ($row = mysqli_fetch_assoc($query)) { 25 | $data['id'] = $row["id"]; 26 | $data['no_antrian'] = $row["no_antrian"]; 27 | $data['status'] = $row["status"]; 28 | 29 | array_push($response["data"], $data); 30 | } 31 | 32 | // tampilkan data 33 | echo json_encode($response); 34 | } 35 | // jika data tidak ada 36 | else { 37 | $response = array(); 38 | $response["data"] = array(); 39 | 40 | // buat data kosong untuk ditampilkan 41 | $data['id'] = ""; 42 | $data['no_antrian'] = "-"; 43 | $data['status'] = ""; 44 | 45 | array_push($response["data"], $data); 46 | 47 | // tampilkan data 48 | echo json_encode($response); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Raleway, sans-serif; 3 | background-color: #f6f8fd; 4 | } 5 | 6 | .p-45 { 7 | padding: 2rem !important; 8 | } 9 | 10 | .bg-success { 11 | background-color: #00aa9d !important; 12 | } 13 | 14 | .text-brand { 15 | color: #ee5050 !important; 16 | } 17 | 18 | .text-success { 19 | color: #00aa9d !important; 20 | } 21 | 22 | .btn-success { 23 | color: #fff; 24 | background-color: #00aa9d; 25 | border-color: #00aa9d; 26 | } 27 | 28 | .btn-success:hover { 29 | color: #fff; 30 | background-color: #00a189; 31 | border-color: #00a491; 32 | } 33 | 34 | .btn-check:focus + .btn-success, 35 | .btn-success:focus { 36 | color: #fff; 37 | background-color: #00a189; 38 | border-color: #00a491; 39 | box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); 40 | } 41 | 42 | .btn-check:checked + .btn-success, 43 | .btn-check:active + .btn-success, 44 | .btn-success:active, 45 | .btn-success.active, 46 | .show > .btn-success.dropdown-toggle { 47 | color: #fff; 48 | background-color: #00a491; 49 | border-color: #00a189; 50 | } 51 | 52 | .btn-check:checked + .btn-success:focus, 53 | .btn-check:active + .btn-success:focus, 54 | .btn-success:active:focus, 55 | .btn-success.active:focus, 56 | .show > .btn-success.dropdown-toggle:focus { 57 | box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); 58 | } 59 | 60 | .btn-success:disabled, 61 | .btn-success.disabled { 62 | color: #fff; 63 | background-color: #00aa9d; 64 | border-color: #00aa9d; 65 | } 66 | 67 | .border-success { 68 | border-color: #00aa9d !important; 69 | } 70 | 71 | .card { 72 | border-radius: 1rem; 73 | } 74 | 75 | .rounded-2 { 76 | border-radius: 1rem !important; 77 | } 78 | 79 | .feature-icon-1 { 80 | display: inline-flex; 81 | align-items: center; 82 | justify-content: center; 83 | width: 5rem; 84 | height: 5rem; 85 | font-size: 3rem; 86 | color: #fff; 87 | border-radius: 100%; 88 | } 89 | 90 | .feature-icon-2 { 91 | display: inline-flex; 92 | align-items: center; 93 | justify-content: center; 94 | width: 7rem; 95 | height: 7rem; 96 | font-size: 4rem; 97 | color: #fff; 98 | border-radius: 100%; 99 | } 100 | 101 | .feature-icon-3 { 102 | display: inline-flex; 103 | align-items: center; 104 | justify-content: center; 105 | width: 5rem; 106 | height: 5rem; 107 | font-size: 3.5rem; 108 | color: #fff; 109 | border-radius: 100%; 110 | } 111 | 112 | .breadcrumb { 113 | font-size: 15px; 114 | } 115 | 116 | .table { 117 | --bs-table-striped-bg: #f9f9f9; 118 | vertical-align: middle; 119 | } 120 | 121 | .table > :not(:last-child) > :last-child > * { 122 | border-bottom-color: #dee2e6; 123 | } 124 | 125 | tbody, 126 | td, 127 | tfoot, 128 | th, 129 | thead, 130 | tr { 131 | border-color: #ebedf2 !important; 132 | } 133 | 134 | div.dataTables_wrapper div.dataTables_paginate ul.pagination { 135 | margin: 20px 0 2px; 136 | white-space: nowrap; 137 | justify-content: flex-end; 138 | } 139 | 140 | div.dataTables_wrapper div.dataTables_info { 141 | padding-top: 1.8em; 142 | } 143 | 144 | table.table-bordered.dataTable th { 145 | border-bottom-width: 2px; 146 | font-weight: 600; 147 | } 148 | 149 | .page-link { 150 | position: relative; 151 | display: block; 152 | color: #00aa9d; 153 | text-decoration: none; 154 | background-color: #fff; 155 | border: 1px solid #dee2e6; 156 | transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, 157 | border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; 158 | } 159 | 160 | .page-link:hover { 161 | z-index: 2; 162 | color: #00a189; 163 | background-color: #e9ecef; 164 | border-color: #dee2e6; 165 | } 166 | 167 | .page-link:focus { 168 | z-index: 3; 169 | color: #00a189; 170 | background-color: #e9ecef; 171 | outline: 0; 172 | box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); 173 | } 174 | 175 | .page-item.active .page-link { 176 | z-index: 3; 177 | color: #fff; 178 | background-color: #00aa9d; 179 | border-color: #00aa9d; 180 | } 181 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Aplikasi Antrian Berbasis Web 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 |
44 | 45 | 51 | 52 |
53 | 54 |
55 |
56 |
57 |
58 | 59 |
60 |

Nomor Antrian

61 |

Halaman Nomor Antrian digunakan pengunjung untuk mengambil nomor antrian.

62 | 63 | Tampilkan 64 | 65 |
66 |
67 |
68 | 69 |
70 |
71 |
72 |
73 | 74 |
75 |

Panggilan Antrian

76 |

Halaman Panggilan Antrian digunakan petugas loket untuk memanggil antrian pengunjung.

77 | 78 | Tampilkan 79 | 80 |
81 |
82 |
83 |
84 |
85 |
86 | 87 | 88 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /pages/nomor/index.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Aplikasi Antrian Berbasis Web 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 |
44 |
45 |
46 |
47 | 48 |
49 | 50 |

Nomor Antrian

51 |
52 |
53 | 54 |
55 |
56 |
57 |

ANTRIAN

58 | 59 |

60 |
61 | 62 | 63 | Ambil Nomor 64 | 65 |
66 |
67 |
68 |
69 |
70 |
71 | 72 | 73 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /pages/panggilan/index.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Aplikasi Antrian Berbasis Web 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 |
47 |
48 | 49 |
50 | 51 |

Panggilan Antrian

52 |
53 | 54 |
55 | 62 |
63 |
64 | 65 |
66 | 67 |
68 |
69 |
70 |
71 |
72 | 73 |
74 |
75 |

76 |

Jumlah Antrian

77 |
78 |
79 |
80 |
81 |
82 | 83 |
84 |
85 |
86 |
87 |
88 | 89 |
90 |
91 |

92 |

Antrian Sekarang

93 |
94 |
95 |
96 |
97 |
98 | 99 |
100 |
101 |
102 |
103 |
104 | 105 |
106 |
107 |

108 |

Antrian Selanjutnya

109 |
110 |
111 |
112 |
113 |
114 | 115 |
116 |
117 |
118 |
119 |
120 | 121 |
122 |
123 |

124 |

Sisa Antrian

125 |
126 |
127 |
128 |
129 |
130 |
131 | 132 |
133 |
134 |
135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
Nomor AntrianStatusPanggil
144 |
145 |
146 |
147 |
148 |
149 | 150 | 151 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 278 | 279 | 280 | --------------------------------------------------------------------------------