Handbook Praktikum Desain & Pemrograman Web

Dokumentasi terintegrasi yang merangkum arsitektur sistem, konsep materi, penjelasan kodingan penting per jobsheet, serta tanya jawab teknis pendukung praktikum.

Nama: Salbila Dwi Juniar
NIM: 254107020188
Absen: 26
Jurusan: D4 Teknik Informatika
Database: Supabase PostgreSQL (Active)
๐Ÿ“Œ

1. Ringkasan Eksekutif Proyek

Repository ini merangkum evolusi pembelajaran bertahap dari mahasiswa selama semester 3, mulai dari penyusunan struktur dokumen web murni tanpa styling hingga perancangan aplikasi manajemen salon terdistribusi (SISALON) yang berjalan secara live pada infrastruktur cloud serverless.

๐Ÿ’ก Petunjuk Eksplorasi
Kamu dapat langsung mengklik link aplikasi dari halaman Beranda (/index.html) untuk mencoba fungsionalitas web, dan membuka bab Tanya Jawab Teknis di handbook ini untuk melihat pembahasan konsep dan analisis kodingan.
๐Ÿ—๏ธ

2. Arsitektur Deployment (Vercel Serverless + Supabase)

Secara umum platform Vercel dioptimalkan untuk aplikasi frontend statis dan runtime Node.js. Agar modul backend PHP (Jobsheet 7, Jobsheet 8, dan SISALON) dapat berjalan tanpa server VPS/Apache konvensional, proyek ini mengadopsi pola arsitektur Unified Serverless Gateway.

Komponen Arsitektur:

// Potongan konfigurasi koneksi PDO ke Supabase dengan SSL (includes/koneksi.php)
$host = "aws-0-ap-southeast-1.pooler.supabase.com";
$port = "5432";
$db   = "postgres";
$user = "postgres.miqwkcgjrjvqivmrluve";
$pass = "Salbila2506";

$dsn = "pgsql:host=$host;port=$port;dbname=$db;sslmode=require";
$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
๐Ÿ“˜

3. Jobsheet 1: Fondasi HTML Semantik

Fokus utama Jobsheet 1 adalah membangun struktur dokumen berbasis standar W3C tanpa ketergantungan pada styling visual.

Konsep Kunci:

๐ŸŽจ

4. Jobsheet 2: Dasar Styling & CSS Box Model

Jobsheet 2 memperkenalkan styling dasar untuk mempercantik struktur HTML tanpa mengubah hierarki dokumen.

Konsep Kunci:

๐Ÿ“

5. Jobsheet 3: Tata Letak Modern (Flexbox & Grid)

Mengubah penataan layout tradisional (seperti float dan inline-block) ke standar CSS modern satu dimensi (Flexbox) dan dua dimensi (CSS Grid).

Analisis Kode Kunci:

/* Pengaturan summary-list dengan Flexbox fleksibel */
.summary-list {
    display: flex;
    gap: 1.5rem;
    flex-wrap: wrap;
}

.summary-card {
    flex: 1 1 250px; /* grow, shrink, basis */
    background: #ffffff;
    border-radius: 8px;
    padding: 1.25rem;
}
๐Ÿš€

6. Jobsheet 3 Bootstrap: Framework UI Responsif

Membangun ulang antarmuka SIMPUS-Mini menggunakan Bootstrap 5 melalui CDN untuk membandingkan efisiensi antara CSS manual murni vs framework berbasis komponen siap pakai.

Keunggulan Implementasi:

๐Ÿ“ฑ

7. Jobsheet 4: Wireframing & Responsivitas

Menjembatani fase perancangan ide antarmuka ke kode fungsional dengan dokumen wireframe terstruktur.

โšก

8. Jobsheet 5: Interaktivitas DOM & Validasi Klien

Menghidupkan antarmuka web menggunakan JavaScript murni (Vanilla JS) tanpa library eksternal.

Fitur & Kodingan Kunci:

// Contoh logika pencarian dinamis pada tabel
const searchInput = document.getElementById('search-input');
if (searchInput) {
    searchInput.addEventListener('input', function() {
        const query = this.value.toLowerCase();
        const rows = document.querySelectorAll('tbody tr');
        rows.forEach(row => {
            const text = row.innerText.toLowerCase();
            row.style.display = text.includes(query) ? '' : 'none';
        });
    });
}
๐Ÿ“ฆ

9. Jobsheet 6: Integrasi Data & Modularitas

Membahas pemisahan data dengan template presentasi melalui format data objek dan JSON. Mempersiapkan mahasiswa sebelum beralih ke dynamic backend di Jobsheet 7.

๐Ÿ˜

10. Jobsheet 7: Pemrograman PHP & Session State

Langkah awal memasuki ranah backend. Pada modul ini mahasiswa membangun aplikasi dinamis berbasis PHP Native tanpa database, di mana state aplikasi disimpan dalam memori sesi server.

Konsep Kunci:

๐Ÿ—„๏ธ

11. Jobsheet 8: Migrasi ke Basis Data PostgreSQL PDO

Tahap krusial: Mengganti penyimpanan sementara ($_SESSION) yang hilang saat browser ditutup menjadi penyimpanan persisten di sistem database PostgreSQL.

Perubahan Utama dari JS 7 ke JS 8:

Parameter Jobsheet 7 (Session) Jobsheet 8 (PostgreSQL PDO)
Media Penyimpanan Memori RAM server (file sesi sementara) Tabel basis data PostgreSQL persisten
Mekanisme Tambah Data $_SESSION['buku'][] = $data; INSERT INTO buku (...) VALUES (...)
Mekanisme Ambil Data Looping array foreach($_SESSION) Query SQL SELECT * FROM buku
Keamanan SQL Tidak relevan (hanya array) Menggunakan PDO Prepared Statements
๐Ÿงพ

12. Jobsheet 9: CRUD Lengkap SISALON

Jobsheet 9 melanjutkan data SISALON dari Jobsheet New. Modul layanan, pelanggan, dan karyawan memakai database PostgreSQL yang sama sehingga data awal dan perubahan tetap tersimpan.

Fitur & Kodingan Kunci:

๐Ÿ’Ž

13. Jobsheet New: SISALON

Jobsheet New adalah fondasi aplikasi SiSalon yang dilanjutkan pada Jobsheet 9. Modul ini memperkenalkan pengelolaan beberapa entitas dengan PHP dan PostgreSQL.

Fitur & Struktur Entitas:

๐Ÿ”

14. Jobsheet 10: Autentikasi & Manajemen Sesi

Jobsheet 10 melanjutkan aplikasi SISALON dari Jobsheet 9 dengan autentikasi petugas. Beranda dan halaman daftar data tetap dapat diakses publik, sedangkan operasi perubahan data membutuhkan login.

Fitur & Kodingan Kunci:

๐Ÿ›ก๏ธ

15. Jobsheet 11: Keamanan Web Dasar

Jobsheet 11 memperkuat aplikasi SISALON dari Jobsheet 10. Tujuannya adalah mencegah eksekusi skrip dari data pengguna, memastikan permintaan perubahan berasal dari form aplikasi, dan memperbarui identitas session setelah login.

Perubahan dari Jobsheet 10

Struktur berkas keamanan

BerkasTanggung jawab
includes/helpers.phpEscaping keluaran HTML melalui fungsi e().
includes/csrf.phpMembuat token sesi, mencetak field form, dan menolak token yang tidak valid.
includes/header.phpMemuat helper dan utilitas CSRF agar tersedia pada halaman aplikasi.
auth/proses_login.phpMemverifikasi kredensial dan meregenerasi ID session setelah login berhasil.
docs/security-checklist.mdChecklist audit dan pemetaan mitigasi XSS, CSRF, session fixation, serta SQL Injection.

Cara menguji keamanan

  1. Uji XSS: Masukkan judul atau nama seperti <script>alert(1)</script>. Daftar harus menampilkan karakter sebagai teks, bukan menjalankan JavaScript.
  2. Uji CSRF: Login, kirim form perubahan data tanpa field csrf_token, dan pastikan server menolak permintaan dengan HTTP 403.
  3. Uji urutan guard: Kirim permintaan ke handler yang dilindungi saat belum login. Aplikasi harus mengarahkan ke login sebelum pemeriksaan CSRF.
  4. Uji session: Login dengan akun valid dan pastikan aplikasi meregenerasi ID session; logout harus mengakhiri session.
  5. Uji SQL: Cari atau kirim teks khusus SQL; masukan harus diperlakukan sebagai nilai parameter dan tidak mengubah struktur query.

Konfigurasi dan privasi kredensial

Checklist rinci tersedia pada dokumen audit Jobsheet 11.

๐Ÿ”„

16. Jobsheet 12: Integrasi Modul Transaksi SISALON

Jobsheet 12 melanjutkan aplikasi SISALON dari Jobsheet 11 dengan mengintegrasikan data pelanggan, layanan, dan karyawan ke dalam satu transaksi layanan. Karena SISALON tidak mengelola stok buku, alur peminjaman dan pengembalian pada jobsheet referensi disesuaikan menjadi memulai dan menyelesaikan layanan.

Fitur & Kodingan Kunci:

Source code tersedia pada aplikasi Jobsheet 12 dan panduan penggunaan ada di dokumentasi Jobsheet 12.

๐Ÿš€

17. Jobsheet 13: Deployment & Dokumentasi SISALON

Jobsheet 13 adalah snapshot akhir SISALON setelah integrasi transaksi layanan. Aplikasi menggabungkan data layanan, pelanggan, karyawan, akun petugas, transaksi aktif, dan riwayat transaksi dengan deployment PHP serverless di Vercel serta PostgreSQL Supabase.

Stack dan alur data

Deployment dan verifikasi

  1. Siapkan skema database dengan menjalankan skrip SQL dalam urutan yang didokumentasikan. Jika tabel sudah tersedia di Supabase, jangan jalankan ulang seed data yang tidak diperlukan.
  2. Atur variabel SUPABASE_DB_HOST, SUPABASE_DB_PORT, SUPABASE_DB_NAME, SUPABASE_DB_USER, dan SUPABASE_DB_PASSWORD pada environment Vercel. Jangan commit berkas .env.
  3. Deploy dari root repository portal dan buka aplikasi melalui route /Jobsheet13/.
  4. Uji login, operasi data, pembuatan transaksi, penyelesaian layanan, serta riwayat setelah deployment.

Buka aplikasi Jobsheet 13, panduan deployment, atau manual pengguna. Dokumen ringkasan snapshot tersedia di Jobsheet 13.

๐ŸŽฏ

18. Tanya Jawab & Pembahasan Teknis Kodingan (Q&A)

Berikut adalah 10 pembahasan konsep teknis penting seputar implementasi kode pada proyek ini. Klik pada setiap pertanyaan untuk membuka pembahasan lengkap:

1. Mengapa memilih ekstensi PDO daripada mysqli untuk koneksi database? โ–ผ

Jawaban:

  1. Database Agnostik: PDO (PHP Data Objects) mendukung belasan jenis database (PostgreSQL, MySQL, SQLite, Oracle, dll.) hanya dengan mengganti DSN (Data Source Name). Sedangkan mysqli hanya khusus untuk MySQL. Karena di perkuliahan kita menggunakan PostgreSQL (pgsql:host=...), PDO adalah pilihan standar industri.
  2. Keamanan Bawaan: PDO mendukung Prepared Statements dengan parameter binding terpisah, yang secara efektif mencegah serangan SQL Injection.
  3. Object-Oriented API: Error handling PDO menggunakan Exception (PDOException) yang memudahkan penanganan error dengan blok try...catch.
2. Bagaimana cara kerja SQL Injection dan bagaimana kita mencegahnya di kodingan kita? โ–ผ

Jawaban:

SQL Injection terjadi ketika input pengguna digabungkan langsung (string concatenation) ke dalam query SQL, sehingga penyerang dapat menyisipkan perintah SQL berbahaya (misal: ' OR '1'='1).

Di kodingan SISALON dan JS8, pencegahan dilakukan menggunakan Prepared Statements:

// Contoh aman di proses_tambah.php
$stmt = $pdo->prepare("INSERT INTO layanan (nama_layanan, kategori, harga, durasi) VALUES (:nama, :kategori, :harga, :durasi)");
$stmt->execute([
    ':nama'     => $nama,
    ':kategori' => $kategori,
    ':harga'    => $harga,
    ':durasi'   => $durasi
]);

Mesin database akan mem-parse struktur query terlebih dahulu sebelum memasukkan nilainya sebagai data literal murni, bukan instruksi yang dapat dieksekusi.

3. Apa perbedaan mendasar antara Jobsheet 7 (Session) dan Jobsheet 8 (Database)? โ–ผ

Jawaban:

Perbedaan utamanya terletak pada Persistensi (Daya Simpan) dan Skalabilitas:

  • Session (JS 7): Data disimpan di memori/temporary file server dan terikat pada cookie sesi browser. Jika browser ditutup atau server restart, seluruh data hilang. Data juga tidak bisa diakses bersama antar pengguna.
  • Database (JS 8): Data disimpan secara permanen pada disk basis data PostgreSQL. Data bertahan selamanya, mendukung transaksi konkuren multi-user (ACID), pengindeksan, relasi foreign key, dan integritas data.
4. Bagaimana aplikasi PHP bisa di-deploy dan berjalan di Vercel? โ–ผ

Jawaban:

Vercel adalah platform Serverless yang berbasis AWS Lambda. Agar script PHP dapat berjalan, kita menggunakan custom runtime vercel-php@0.7.2 yang dikonfigurasikan di vercel.json.

Setiap ada request ke file PHP, Vercel membungkus PHP CLI/CGI di dalam container serverless function mikro, mengeksekusi script, mengembalikan respons HTTP, lalu kembali ke status idle. Hal ini membuat aplikasi sangat hemat resource karena tidak perlu server yang menyala terus menerus 24 jam.

5. Mengapa HTML semantik (header, nav, main, article) lebih baik daripada hanya memakai div? โ–ผ

Jawaban:

  1. Aksesibilitas (Accessibility / a11y): Perangkat Screen Reader tunanetra dapat membaca struktur halaman secara logis, misalnya langsung melompat ke <main> untuk membaca konten utama.
  2. SEO (Search Engine Optimization): Mesin pencari seperti Google dapat memahami bagian mana yang merupakan navigasi, artikel inti, atau catatan kaki.
  3. Maintainability: Kodingan jauh lebih mudah dibaca dan dirawat oleh sesama programmer dibanding "div soup" (tumpukan tag div tanpa arti).
6. Kapan sebaiknya menggunakan CSS Flexbox, dan kapan menggunakan CSS Grid? โ–ผ

Jawaban:

  • CSS Flexbox (Satu Dimensi): Sangat ideal untuk komponen berbasis baris atau kolom tunggal. Contoh: navigasi bar horizontal, pengelompokan tombol aksi, dan penyusunan kartu ringkasan fleksibel.
  • CSS Grid (Dua Dimensi): Ideal untuk tata letak halaman global yang mengontrol baris dan kolom secara simultan. Contoh: template dashboard dengan sidebar, header, dan konten multi-kolom yang presisi.
7. Mengapa perlu validasi di JavaScript (klien) DAN juga di PHP (server)? โ–ผ

Jawaban:

  • Validasi JavaScript (Sisi Klien): Bertujuan untuk User Experience (UX). Memberikan feedback langsung kepada pengguna jika ada form yang belum terisi tanpa perlu menunggu reload halaman (menghemat bandwidth jaringan).
  • Validasi PHP (Sisi Server): Bertujuan untuk Keamanan (Security). Validasi klien di browser sangat mudah dimatikan atau di-bypass menggunakan inspect element, Postman, atau curl. Oleh karena itu, server WAJIB memvalidasi ulang semua data sebelum disimpan ke database.
8. Mengapa koneksi database ke Supabase memerlukan opsi sslmode=require? โ–ผ

Jawaban:

Ketika aplikasi di-deploy di Vercel (cloud) dan database berada di Supabase (AWS Singapura), lalu lintas data berjalan melewati internet publik. Opsi sslmode=require menginstruksikan driver PDO PostgreSQL untuk mengenkripsi seluruh pertukaran query dan data menggunakan sertifikat TLS/SSL, sehingga kebal dari aksi penyadapan (Man-in-the-Middle Attack).

9. Bagaimana konsep Flash Message bekerja pada aplikasi SISALON? โ–ผ

Jawaban:

Flash Message adalah pesan status yang hanya tampil satu kali setelah operasi berhasil/gagal, kemudian hilang saat halaman di-refresh. Alurnya:

  1. Di proses_tambah.php: Simpan pesan ke session: $_SESSION['flash'] = ['type' => 'success', 'pesan' => 'Data berhasil disimpan!'];
  2. Redirect user ke list.php menggunakan header("Location: list.php"); exit;
  3. Di list.php: Baca pesannya, tampilkan di HTML, lalu langsung hapus dengan unset($_SESSION['flash']);
10. Mengapa digunakan CHECK constraint pada tabel layanan PostgreSQL? โ–ผ

Jawaban:

Pada DDL skema database:

harga INTEGER NOT NULL CHECK (harga >= 0),
durasi INTEGER NOT NULL CHECK (durasi > 0)

Constraint CHECK memastikan integritas data pada layer database paling dalam (Database Level Validation). Hal ini mencegah nilai negatif masuk ke database (misalnya harga minus atau durasi 0 menit), bahkan jika ada bug di level aplikasi PHP.