Website profil dan sistem manajemen anggota untuk Koperasi Agro Mulyo Lestari, Desa Giri Mulyo, Lampung Timur.
- Next.js App Router
- TypeScript
- Tailwind CSS
- Hostinger Managed Node.js
- MySQL via Prisma
- Session login lokal dengan cookie bertanda tangan
- QR generation dan scanner kamera web app
- Import/export Excel dengan
exceljs
npm install
npm run devBuka:
http://localhost:3000Portal admin dan anggota membutuhkan DATABASE_URL MySQL di .env.local.
- Admin: email + password yang sudah dibuat di database produksi.
- Anggota: NIK 16 digit + password.
- Password awal anggota = NIK dan anggota wajib mengganti password saat login pertama.
- Publik:
/,/galeri,/unit,/struktur,/pengumuman,/login,/signup - Admin:
/admin/dashboard,/admin/anggota,/admin/anggota/import,/admin/acara,/admin/galeri,/admin/laporan,/admin/audit-log,/admin/pengaturan - Anggota:
/anggota/dashboard,/anggota/profil,/anggota/acara,/anggota/riwayat-kehadiran - Presensi:
/presensi/scan
- Buat database MySQL di hPanel Hostinger.
- Isi
.env.localatau env production:
DATABASE_URL="mysql://USER:PASSWORD@HOST:3306/NAMA_DATABASE"
AUTH_SECRET="isi-string-acak-panjang"
GALLERY_UPLOAD_DIR="/home/USER/gallery-uploads" # optional
PROFILE_PHOTO_UPLOAD_DIR="/home/USER/profile-photo-uploads" # optional
SITE_ASSET_UPLOAD_DIR="/home/USER/site-assets" # optional- Generate Prisma client:
npm run prisma:generate- Buat tabel dari schema Prisma:
npx prisma db push- Pastikan admin produksi sudah tersedia dan login bisa dilakukan sebelum membuka akses pengguna.
Prisma schema ada di:
prisma/schema.prismaGenerate client:
npm run prisma:generateFormat Excel desa yang didukung:
No | Nama Anggota | No Anggota | NIK | Tempat Lahir | Tanggal Lahir | Alamat | No HPKolom Email dan Tipe/Jenis Anggota boleh ditambahkan. Jika tipe tidak ada, sistem membaca warna baris: highlight kuning = anggota lama, tanpa highlight = anggota baru. NIK tetap wajib 16 digit karena login anggota memakai NIK.
- Presensi QR wajib divalidasi server-side.
- Timestamp disimpan UTC dan ditampilkan WIB.
- Soft delete dipakai untuk anggota dan acara.
- Riwayat presensi tidak ikut terhapus.
- Admin reset password anggota mengembalikan password ke NIK.
- Nomor anggota unik per tipe anggota, bukan global.
- Export data admin menggunakan Excel
.xlsx. - Upload galeri disimpan di folder storage hosting (
GALLERY_UPLOAD_DIRjika diisi, default./storage/gallery), sedangkan MySQL hanya menyimpan metadata dan path file. - Upload foto profil anggota disimpan di folder storage hosting (
PROFILE_PHOTO_UPLOAD_DIRjika diisi, default./storage/profile-photos) dan path-nya tersimpan dimembers.photo_url. - Aset gambar bawaan website disalin dari
site-assets/ke storage hosting (SITE_ASSET_UPLOAD_DIRjika diisi, default./storage/site-assets) saat build dan disajikan lewat/api/site-assets/....
Untuk produksi di Hostinger, lakukan backup berkala:
- Export database MySQL dari hPanel/phpMyAdmin.
- Backup folder upload galeri, foto profil, dan aset site dari file manager/FTP.
- Simpan salinan di akun desa/koperasi, bukan akun pribadi mahasiswa KKN.