(Cloudflare D1 · Migrasi GitHub JSON · Struktur Data · API Workers · Backup Google Drive)
Backend Rapor & Mutaba’ah Tahfidz Digital dirancang agar ringan, aman, dan hemat biaya, tanpa mengorbankan fleksibilitas. Di bawah ini penjelasan lengkap arsitektur data, alur migrasi, struktur JSON, endpoint API, hingga otomasi backup ke Google Drive.
1) Penyimpanan Data di Cloudflare D1 (Free 5 GB)
Kenapa D1?
- Gratis 5 GB cukup untuk data kelas, absensi, dan ringkasan hafalan multi-tahun.
- Dekat dengan CDN (Cloudflare) → latensi rendah untuk request dari browser.
- SQL (SQLite-compatible) → mudah dimigrasikan/diinspeksi.
Tip operasional:
- Gunakan indeks pada kolom kunci (mis.
kelas,tanggal,nis) untuk query cepat. - Simpan “ringkasan siap pakai” (snapshot) agar dashboard tidak menghitung ulang data historis tiap kali terbuka.
- Pisahkan tabel transaksi (harian) dan agregasi (bulanan/semesteran) supaya laporan ringan.
2) Migrasi dari GitHub JSON
(skema lama: “kelas per tanggal” → skema baru: “per kelas”)
Sebelumnya data disimpan per-hari/per-tanggal (mis. kelas_012526_2025-09-10.json). Skema baru mengonsolidasikan data per kelas agar:
- Query lintas tanggal lebih efisien (cukup filter
tanggal), - Sinkronisasi lebih stabil (tidak membuat ratusan file kecil),
- Integritas lebih terjaga (mengurangi konflik saat banyak update).
Alur migrasi ringkas:
- Ekstrak semua file JSON lama.
- Mapping ke struktur baru per kelas (gabungkan seluruh tanggal).
- Normalisasi field (pastikan konsisten:
nis,tanggal,statusHadir,markNilai, dsb.). - Import batch ke D1 (tabel transaksi + snapshot).
- Verifikasi sampling (cek 3–5 kelas acak; bandingkan total per bulan sebelum/sesudah).
Hasil: akses data jadi serba per kelas (logis untuk tampilan guru), sementara filter tanggal/semester tetap tersedia via query.
3) Struktur Data JSON (records, meta, marks, buttonCell)
Aplikasi tetap memakai JSON sebagai “bahasa antar-layer” (UI ↔ API). Empat grup kunci yang umum:
meta
Informasi konteks:kelas,semesterAktif,jenjang,tanggal,pencatat,versiSkema.
Manfaat: audit trail & kompatibilitas antar-versi.records
Baris-baris data utama. Contoh untuk absensi:{ "nis": "110234", "nama": "Ahmad", "tanggal": "2025-10-12", "sesi": { "1":"Hadir","2":"Hadir","3":"Izin","4":"Hadir","5":"Hadir","6":"Alpha" }, "catatan": "Izin ke dokter di sesi 3" }Untuk hafalan,recordsmemuat rentang surah/ayat/halaman, status (Setoran Baru / Murajaah / Ulang / Target Khusus), dan skor.marks
Representasi nilai & warna siap tampil:{ "huruf": "A", "predikat": "Jayyid Jiddan", "skor": 85, "warna": "hijau" }buttonCell
Aksi cepat pada UI (reset nilai, catatan, toggle tampilkan detail, ekspor baris).
Tujuan: memetakan elemen interaktif tabel ke logika API tanpa “logika terselip” di UI.
Catatan penting:
- Konsistenkan nama field agar query/agregasi mudah (snake_case atau camelCase—pilih satu).
- Simpan ID deterministik (mis.
kelas|tanggal|nis) untuk idempotensi saat re-import.
4) API Berbasis Cloudflare Pages/Workers
API bersifat stateless, cepat, dan aman menggunakan environment bindings. Empat endpoint utama:
a) /api/getUsers
Mengambil daftar user + peran (Admin, User Kelas/Halaqoh, User NIS).
Contoh respons ringkas:
{
"meta": { "count": 12, "generatedAt": "2025-10-31T08:30:00Z" },
"records": [
{ "username":"admin01","role":"Admin","kelas":[] },
{ "username":"guru9a","role":"UserKelas","kelas":["9A"] },
{ "username":"wali110234","role":"UserNIS","nis":["110234"] }
]
}
Kegunaan: otorisasi tampilan (filter kelas/NIS sesuai role).
b) /api/ambilSantri
Mengambil daftar santri + profil ringkas (kelas aktif, NIS, jenjang).
Query umum: ?kelas=9A atau ?nis=110234
Contoh respons ringkas:
{
"meta": { "kelas":"9A", "count": 32 },
"records": [
{ "nis":"110234","nama":"Ahmad","jenjang":"SMP","semester":5 },
{ "nis":"110235","nama":"Aisyah","jenjang":"SMP","semester":5 }
]
}
Kegunaan: memuat daftar awal untuk absensi/penilaian.
c) /api/getAbsensiRange
Mengambil absensi rentang tanggal (harian → mingguan → bulanan).
Query: ?kelas=9A&from=2025-10-01&to=2025-10-31
Catatan: gunakan indeks (kelas, tanggal) di D1 agar cepat.
Contoh respons ringkas:
{
"meta": { "kelas":"9A","from":"2025-10-01","to":"2025-10-31" },
"records": [
{ "tanggal":"2025-10-01","nis":"110234","sesi":{"1":"Hadir","2":"Hadir",...} },
...
],
"agg": {
"hadirPctKelas": 92.5,
"topAlpha": ["110245","110251"]
}
}
d) /api/pindahKelasMulaiTanggal
Memindahkan santri ke kelas baru dengan batas tanggal agar riwayat tetap utuh.
Payload ringkas:
{
"nis": "110234",
"kelasBaru": "9B",
"mulaiTanggal": "2025-11-01"
}
Perilaku:
- Data sebelum
mulaiTanggaltetap di kelas lama. - Data sesudah
mulaiTanggalpindah ke kelas baru. - Cocok saat kenaikan rombel di tengah semester.
Keamanan & praktik baik untuk semua endpoint:
- Validasi role (Admin/UserKelas/UserNIS) pada setiap request.
- Simpan
requestId+timestampuntuk audit. - Batasi payload (pagination/limit) untuk mencegah fetch berlebihan di jaringan lemah.
5) Backup Otomatis ke Google Drive (CSV, 15 GB)
Setiap bulan, sistem membuat backup .csv ke Google Drive (kuota gratis 15 GB):
- Jenis berkas:
absensi_YYYY-MM.csv(kelas, nis, tanggal, sesi1..sesi6, total_hadir, pencatat)hafalan_YYYY-MM.csv(kelas, nis, surah, ayatFrom, ayatTo, halaman, status, skor)rekap_kelas_YYYY-MM.csv(indikator per kelas/jenjang)
- Penamaan folder:
rapor-tahfiz/backup/2025/10/agar mudah ditelusuri. - Checksum opsional (MD5/SHA) untuk memastikan integritas file.
- Retensi: simpan 12–24 bulan lalu, hapus yang lebih lama (kebijakan lembaga).
Keuntungan:
- Akses cepat untuk pelaporan offline.
- Bukti historis saat audit atau akreditasi.
- Recovery mudah jika terjadi perubahan tak diinginkan.
Arsitektur Ringkas (Alur Data)
- UI (index.html) → kirim permintaan (ambil santri, simpan absensi/hafalan).
- API Workers → validasi role, proses query/commit ke D1.
- D1 → simpan transaksi + attendance_snapshot (rekap siap pakai).
- Jobs bulanan → ekspor CSV → upload ke Google Drive.
- Dashboard → tampilkan agregasi per kelas/semester dari snapshot agar cepat dan hemat kuota.
Best Practice Implementasi
- Skema D1 jelas sejak awal: tabel
santri,absensi,hafalan,attendance_snapshot, indeks kunci, dan foreign key (jika perlu). - Pisahkan write vs read: endpoint penulisan (insert/update) dan pembacaan (report) agar mudah diskalakan.
- Idempotensi: pakai
natural key(mis.kelas|tanggal|nis|sesi) saat menyimpan absensi supaya tidak duplikat. - Versioning skema: simpan
versiSkemadimetauntuk kompatibilitas saat update. - Rate limit & pagination: batasi respons (mis. 200–500 baris/halaman) untuk performa di jaringan mobile.
Aplikasi Rapor Tahfiz mendukung berbagai bahasa dunia, termasuk mode RTL (Right-to-Left) untuk bahasa Arab:
Bahasa siap pakai / siap konfigurasi:
- Indonesia, English, العربية (Arabic, RTL), Bahasa Melayu
- Türkçe (Turki), اردو (Urdu, RTL), فارسی (Persia, RTL)
- हिन्दी (Hindi), বাংলা (Bengali)
- Español (Spanyol), Français (Prancis), Português (Portugis), Deutsch (Jerman)
Teknis singkat i18n:
- Label & teks UI berada di berkas kamus (JSON) → mudah menambah/ubah terjemahan.
- Auto-RTL untuk bahasa Arab/Urdu/Persia (arah teks, alignment tabel, dan urutan kolom sensitif).
- Format tanggal/angka bisa disesuaikan per lokal (DD/MM/YYYY, digit Arab, dsb.).
- Mushaf & penomoran ayat tetap terjaga; overlay murajaah 3 sesi, penilaian warna, ekspor PDF/Excel mendukung bahasa pilihan.
- Per lembaga bisa pakai multi-bahasa sekaligus (mis.: antarmuka guru bahasa Indonesia, wali bahasa Arab/Inggris).
Cocok untuk: SD/MI, SMP/MTs, SMA/MA, Rumah Tahfidz, dan Pesantren.
Paket & Harga (contoh—silakan sesuaikan)
Cara Pemesanan (3 langkah cepat)
Hubungi kami
- WhatsApp: [+628996830011]
- Email: [raportahfiz@gmail.com]
Estimasi waktu implementasi: 1–3 hari kerja (tergantung jumlah kelas & import data).
Apa yang Anda Dapatkan
- Template index.html siap pakai (ringan & cepat).
- Skema database Cloudflare D1 + contoh data.
- Panduan admin video tutorial.
- Dukungan via WA/Email (jam kerja).
- Update minor (bugfix & perbaikan kecil).
Metode Pembayaran
- Transfer bank lokal (BCA)
- Shopee Pay
- Paypal
- Payoneer
Garansi & Kebijakan
- Garansi instalasi sampai aplikasi berjalan stabil di domain Anda.
- Perjanjian Pemeliharaan opsional untuk pembaruan berkala & prioritas dukungan.
- Kebijakan privasi & keamanan mengikuti praktik terbaik (role-based access, token via Secrets/Bindings, snapshot D1, opsi repo privat untuk audio).

Tinggalkan komentar