%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
# Portal PPID Kabupaten Mamuju Tengah
Aplikasi web layanan informasi publik (PPID) Pemerintah Kabupaten Mamuju Tengah, dibangun dengan **PHP Native**, **Tailwind CSS (CDN)**, dan **MySQL**. Terdiri dari portal publik dan panel admin/CMS.
> Hasil refactor dari mockup `index.html` (sisi client) dan `admin/index.html` (CMS admin) menjadi aplikasi dinamis yang fungsional.
---
## ✨ Fitur
### Portal Publik (tanpa perlu membuat akun)
- **Beranda** — hero + pencarian, kartu 4 kategori informasi (dinamis), alur permohonan, dokumen terbaru.
- **Layanan Informasi** — daftar dokumen per kategori (Berkala, Serta Merta, Setiap Saat, Dikecualikan) dengan filter, pencarian, & paginasi.
- **Detail & Unduh Dokumen** — beserta penghitung dilihat/diunduh.
- **Regulasi & Peraturan** — daftar dasar hukum & SOP.
- **Profil PPID** — tentang, visi, misi, tugas & fungsi.
- **Ajukan Permohonan Informasi** — formulir online, menghasilkan **Nomor Resi** sebagai bukti.
- **Lacak Permohonan** — cek status & tanggapan berdasarkan Nomor Resi (timeline status).
- **Ajukan Keberatan** — atas layanan informasi yang diterima.
### Panel Admin / CMS
- **Login** aman (password ter-hash bcrypt, proteksi CSRF).
- **Dasbor** — statistik permohonan, dokumen, keberatan, tingkat penyelesaian.
- **Permohonan Masuk** — daftar + filter status, detail, proses (ubah status, tulis tanggapan, lampirkan dokumen).
- **Pengajuan Keberatan** — kelola & tanggapi keberatan.
- **Kelola Dokumen** — CRUD dokumen per kategori (unggah berkas, edit, hapus, terbit/draf).
---
## 🛠️ Persyaratan
- PHP **8.0+** (disarankan 8.1/8.2) dengan ekstensi `pdo_mysql`, `fileinfo`.
- MySQL **5.7+** / MariaDB **10.3+**.
- Web server Apache (XAMPP / Laragon / WAMP) atau bawaan PHP.
---
## 🚀 Instalasi (XAMPP / Laragon)
1. **Salin folder** project ke direktori web server, mis. `C:\xampp\htdocs\ppidmateng`.
2. **Sesuaikan koneksi database** di [`config/database.php`](config/database.php):
```php
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'ppid_mateng');
define('DB_USER', 'root');
define('DB_PASS', ''); // isi password MySQL Anda
```
3. **Sesuaikan Base URL** di [`config/config.php`](config/config.php) sesuai lokasi akses:
```php
define('BASE_URL', '/ppidmateng'); // jika diakses di http://localhost/ppidmateng
// define('BASE_URL', ''); // jika di root domain
```
4. **Jalankan installer** di browser:
```
http://localhost/ppidmateng/install.php
```
Klik **"Mulai Instalasi"**. Installer otomatis membuat database, tabel, data contoh, dan akun admin.
5. **Hapus `install.php`** setelah berhasil (penting demi keamanan).
6. Buka situs:
- Portal publik: `http://localhost/ppidmateng/`
- Panel admin: `http://localhost/ppidmateng/admin/login.php`
### Alternatif: impor manual via phpMyAdmin
Impor file [`database/ppid_mateng.sql`](database/ppid_mateng.sql), lalu tetap jalankan `install.php` **satu kali** untuk membuat akun admin (password ter-hash).
---
## 🔑 Akun Admin Default
| Username | Password |
|----------|------------|
| `admin` | `admin123` |
> **Segera ganti password** setelah login pertama (lihat catatan keamanan di bawah).
---
## 📁 Struktur Folder
```
ppidmateng/
├── config/ # Konfigurasi & koneksi DB (akses langsung ditolak)
│ ├── config.php
│ └── database.php
├── includes/ # Helper bersama (akses langsung ditolak)
│ ├── functions.php # escape, format tanggal/ukuran, badge status, dll
│ ├── auth.php # autentikasi admin
│ ├── csrf.php # proteksi CSRF
│ ├── queries.php # query yang dipakai ulang
│ ├── upload.php # validasi & simpan file
│ └── session.php
├── partials/ # Komponen tampilan publik (head, navbar, footer, flash)
├── assets/ # Logo & aset statis
├── uploads/ # Berkas unggahan (dokumen, tanggapan, avatar)
├── database/
│ └── ppid_mateng.sql # Skema + data contoh
├── admin/ # Panel CMS
│ ├── partials/ # head, sidebar, topbar, flash, foot
│ ├── login.php / logout.php
│ ├── index.php # dasbor
│ ├── permohonan.php / permohonan-detail.php
│ ├── keberatan.php / keberatan-detail.php
│ └── dokumen.php / dokumen-form.php / dokumen-hapus.php
├── index.php # Beranda publik
├── informasi.php # Daftar & pencarian dokumen
├── dokumen.php # Detail dokumen
├── regulasi.php · profil.php
├── permohonan.php · cek-status.php · keberatan.php
├── unduh.php · unduh-tanggapan.php
└── install.php # Installer (HAPUS setelah instalasi)
```
---
## 🔒 Keamanan yang Diterapkan
- **Prepared statements (PDO)** di seluruh query → mencegah SQL Injection.
- **`htmlspecialchars` (`e()`)** pada output → mencegah XSS.
- **Token CSRF** pada semua form POST.
- **Password hashing** `password_hash()`/`password_verify()` (bcrypt) + auto-rehash.
- **Validasi upload** berlapis (ekstensi, MIME asli via `finfo`, ukuran) + nama file acak.
- **`.htaccess`** menolak akses langsung ke `config/`, `includes/`, `database/`, dan mematikan eksekusi skrip di `uploads/`.
- **Session** `HttpOnly` + `SameSite=Lax`, regenerasi ID saat login.
---
## 🏭 Catatan Produksi
- Set `APP_ENV` ke `'production'` di `config/config.php` (menyembunyikan error).
- Aktifkan **HTTPS** lalu set cookie `secure => true` di `includes/session.php`.
- Ganti password admin & buat user admin baru via database.
- **Tailwind CDN** praktis untuk pengembangan. Untuk produksi yang lebih ringan, pertimbangkan meng-compile Tailwind (Tailwind CLI) menjadi satu file CSS dan ganti tag `<script src="cdn.tailwindcss.com">` dengan `<link>` ke CSS hasil build.
- Lakukan backup database & folder `uploads/` secara berkala.
---
© 2026 Diskominfo & PPID Kabupaten Mamuju Tengah.