e-Surat Desa adalah aplikasi web untuk membantu proses pengajuan surat keterangan warga secara online. Melalui aplikasi ini, warga dapat membuat akun, login, mengajukan surat, mengunggah lampiran KTP dan KK, melihat status permohonan, serta mengunduh surat PDF jika sudah disetujui admin.
Admin desa/RT/RW dapat melihat permohonan warga, memeriksa lampiran, memberi catatan, menyetujui atau menolak permohonan, dan menerbitkan surat secara otomatis dalam bentuk PDF.
- Registrasi akun warga.
- Login warga.
- Mengajukan permohonan surat.
- Memilih jenis surat yang tersedia.
- Mengisi keterangan sesuai jenis surat.
- Upload lampiran KTP dan KK.
- Melihat daftar riwayat permohonan.
- Melihat detail status permohonan.
- Melihat status verifikasi lampiran.
- Mengunduh PDF surat jika sudah disetujui admin.
- Login admin.
- Melihat dashboard ringkasan data.
- Melihat daftar permohonan warga.
- Membuka detail permohonan.
- Melihat dan preview lampiran KTP/KK.
- Memverifikasi lampiran dengan status:
pendingvalidtidak_valid
- Menyetujui permohonan.
- Menolak permohonan dengan catatan.
- Generate nomor surat otomatis.
- Generate PDF surat otomatis.
- Melihat arsip surat selesai.
- Mengelola template/jenis surat.
- Upload tanda tangan digital admin.
Aplikasi menyediakan beberapa jenis surat default:
-
Surat Keterangan Domisili
- Nomor KK
- Tujuan Instansi/Pihak
-
Surat Keterangan Tidak Mampu
- Nomor KK
- Tujuan Penggunaan Surat
- Ringkasan Kondisi Ekonomi
-
Surat Keterangan Usaha
- Nomor KK
- Nama Usaha
- Jenis Usaha
- Alamat Usaha
- Tahun Berdiri
Data NIK warga tidak diisi ulang saat pengajuan karena NIK sudah tersimpan pada akun warga.
- Node.js
- Express.js
- MySQL
- MySQL2
- JWT untuk autentikasi
- Bcrypt untuk enkripsi password
- Multer untuk upload file
- Puppeteer untuk generate PDF
- React
- Vite
- Tailwind CSS
- Axios
- React Router
surat-warga/
├── backend/
│ ├── app.js
│ ├── server.js
│ ├── config/
│ │ └── db.js
│ ├── database/
│ │ └── schema.sql
│ ├── middleware/
│ │ └── auth.js
│ ├── models/
│ │ ├── Admin.js
│ │ ├── Warga.js
│ │ ├── TemplateSurat.js
│ │ ├── PermohonanSurat.js
│ │ ├── NomorSurat.js
│ │ └── index.js
│ ├── routes/
│ │ ├── auth.js
│ │ ├── surat.js
│ │ └── admin.js
│ ├── services/
│ │ └── pdfGenerator.js
│ ├── templates/
│ │ ├── domisili.html
│ │ ├── tidak_mampu.html
│ │ └── usaha.html
│ ├── uploads/
│ │ ├── persyaratan/
│ │ ├── surat/
│ │ └── ttd/
│ └── utils/
│ ├── jwt.js
│ └── nomorSurat.js
│
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── context/
│ │ ├── pages/
│ │ │ ├── admin/
│ │ │ └── warga/
│ │ ├── services/
│ │ ├── App.jsx
│ │ └── main.jsx
│ └── package.json
│
├── docs/
├── e-surat.md
└── README.mdDatabase memakai desain Hybrid:
- Field dinamis disimpan dalam JSON agar form bisa fleksibel.
- Lampiran KTP/KK tetap kolom eksplisit supaya bisa diverifikasi per file.
Tabel utama:
admin
warga
template_surat
permohonan_surat
nomor_suratMenyimpan data akun warga, seperti:
- nama lengkap
- NIK
- password
- tempat lahir
- tanggal lahir
- alamat
- pekerjaan
- nomor HP
Menyimpan data akun admin, seperti:
- nama lengkap
- password
- jabatan
- tanda tangan digital
- status aktif
Menyimpan jenis surat yang tersedia, misalnya:
- DOMISILI
- TIDAK_MAMPU
- USAHA
Kolom penting:
fields(JSON) untuk definisi form dinamis (name, label, type, required).
Menyimpan data pengajuan surat warga, seperti:
- warga yang mengajukan
- jenis surat
- keperluan
data_form(JSON) berisi isian form dinamis sesuai template- file KTP
- file KK
- status verifikasi KTP
- status verifikasi KK
- status permohonan
- catatan admin
- nomor surat
- file PDF
Menyimpan nomor urut surat berdasarkan bulan dan tahun agar nomor surat otomatis tidak bentrok.
Warga membuka aplikasi, lalu memilih menu daftar akun. Warga mengisi data seperti nama, NIK, email, password, dan data profil lainnya.
Setelah berhasil registrasi, warga dapat login menggunakan email dan password tersebut.
Warga login melalui halaman login utama. Sistem akan memeriksa email dan password. Jika cocok, warga masuk ke dashboard warga.
Warga membuka menu Ajukan Surat, lalu:
- memilih jenis surat,
- mengisi keperluan,
- mengisi keterangan sesuai jenis surat,
- mengunggah KTP,
- mengunggah KK,
- mengirim permohonan.
Setelah berhasil dikirim, status permohonan awal adalah:
menungguWarga dapat membuka menu riwayat permohonan untuk melihat daftar surat yang pernah diajukan.
Status permohonan yang dapat muncul:
menunggu
diproses
selesai
ditolakWarga hanya dapat melihat permohonan miliknya sendiri karena data difilter berdasarkan akun yang sedang login.
Admin login menggunakan akun admin default atau akun admin lain yang sudah dibuat.
Akun admin default:
Email : atmin@rtrw.local
Password : atmin123Setelah login, admin masuk ke dashboard admin.
Admin membuka daftar permohonan, lalu memilih salah satu permohonan warga.
Pada halaman detail, admin dapat melihat:
- data warga,
- jenis surat,
- keperluan,
- keterangan surat,
- lampiran KTP,
- lampiran KK,
- status permohonan.
Admin juga dapat membuka preview gambar lampiran KTP/KK.
Sebelum permohonan disetujui, admin harus memverifikasi lampiran KTP dan KK.
Status verifikasi lampiran:
pending
valid
tidak_validPermohonan tidak bisa disetujui jika KTP atau KK belum berstatus valid.
Jika data dan lampiran sudah benar, admin dapat klik tombol approve. Sistem akan:
- membuat nomor surat otomatis,
- mengubah status menjadi
selesai, - membuat file PDF surat,
- menyimpan path PDF ke database.
Jika permohonan tidak sesuai, admin dapat menolak permohonan dan memberikan catatan alasan penolakan.
Jika permohonan sudah selesai, warga dapat membuka detail permohonan dan mengunduh file PDF surat.
Endpoint download surat:
GET /api/surat/saya/:id/downloadEndpoint ini mengecek:
- permohonan harus milik warga yang sedang login,
- status harus
selesai, - file PDF harus tersedia,
- file PDF harus ada di server.
Jika semua sesuai, file dikirim ke pengguna.
Pastikan sudah terinstall:
- Node.js
- npm
- MySQL atau MariaDB
Masuk ke folder backend:
cd backendImport database:
mysql -u root -p < database/schema.sqlJika MySQL root tidak memakai password, bisa gunakan:
mysql -u root < database/schema.sqlMasuk ke folder backend:
cd backendInstall dependency:
npm installSalin file environment:
cp .env.example .envSesuaikan isi .env, contoh:
PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=
DB_NAME=surat_warga
JWT_SECRET=secret_key_kamu
FRONTEND_URL=http://localhost:3001Jalankan backend:
npm run devBackend berjalan di:
http://localhost:3000Buka terminal baru, masuk ke folder frontend:
cd frontendInstall dependency:
npm installSalin file environment:
cp .env.example .envPastikan isi .env frontend:
VITE_API_URL=http://localhost:3000/apiJalankan frontend:
npm run devFrontend berjalan di:
http://localhost:3001Gunakan akun default:
Email : atmin@rtrw.local
Password : atmin123Warga harus daftar terlebih dahulu melalui halaman register, lalu login menggunakan email dan password yang dibuat.
POST /api/auth/warga/register
POST /api/auth/login
GET /api/auth/me
PUT /api/auth/profilGET /api/surat/template
GET /api/surat/template/:kode
POST /api/surat/ajukan
GET /api/surat/saya
GET /api/surat/saya/:id
GET /api/surat/saya/:id/downloadGET /api/admin/stats
GET /api/admin/permohonan
GET /api/admin/permohonan/:id
PATCH /api/admin/permohonan/:id/lampiran/:index/verifikasi
PATCH /api/admin/permohonan/:id/approve
PATCH /api/admin/permohonan/:id/tolak
GET /api/admin/arsip
GET /api/admin/template
POST /api/admin/template
PUT /api/admin/template/:id
PATCH /api/admin/template/:id/toggle
DELETE /api/admin/template/:idFile upload disimpan di folder berikut:
backend/uploads/persyaratan # file KTP dan KK
backend/uploads/ttd # tanda tangan admin
backend/uploads/surat # file PDF surat- Backend berjalan di port
3000. - Frontend berjalan di port
3001. - Database menggunakan file
backend/database/schema.sql. - Project menggunakan
models, tetapi tidak memakai Sequelize. - Query database menggunakan MySQL2.
- Password disimpan dalam bentuk hash menggunakan bcrypt.
- Autentikasi menggunakan JWT.
- File KTP dan KK hanya disimpan sebagai path file di database.
- Validasi ukuran file dilakukan di program, bukan disimpan di database.
Untuk mencoba aplikasi dari awal sampai akhir:
- Jalankan backend dan frontend.
- Login admin menggunakan akun default.
- Register akun warga baru.
- Login sebagai warga.
- Ajukan surat dan upload KTP/KK.
- Login kembali sebagai admin.
- Buka detail permohonan.
- Preview lampiran KTP/KK.
- Verifikasi KTP dan KK.
- Approve permohonan.
- Login kembali sebagai warga.
- Buka detail permohonan.
- Download PDF surat.
MIT