You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Platform ujian digital terintegrasi AI untuk institusi pendidikan modern.
ExamHub adalah platform manajemen ujian full-stack yang menggabungkan kecerdasan buatan Google Gemini untuk pembuatan soal otomatis, monitoring kecurangan real-time via WebSocket, dan portal multi-role (Guru, Siswa, Admin) — semuanya dalam satu aplikasi monolitik yang mudah di-deploy.
Monolith Architecture — Frontend (Vite + React) dan Backend (Express) dijalankan dalam satu proses Node.js. Pada development, Vite berjalan sebagai middleware. Pada produksi, frontend di-build menjadi static files yang dilayani oleh Express.
# 1. Clone dan masuk ke direktori project
git clone <repository-url>cd examhub-portal-pendidik
# 2. Install dependensi
npm install
# 3. Salin file konfigurasi environment
cp .env.example .env
# Edit .env dan sesuaikan DATABASE_URL serta secret keys# 4. Generate Prisma Client
npm run db:generate
# 5. Push schema ke database PostgreSQL
npm run db:push
# 6. Seed data demo (akun guru, siswa, ujian contoh)
npm run db:seed
# 7. Jalankan development server
npm run dev
Salin .env.example menjadi .env dan sesuaikan nilainya:
# --- AI (Google Gemini) ---# Opsional — tanpa API key, sistem akan menggunakan fallback simulasiGEMINI_API_KEY="your_gemini_api_key_here"APP_URL="http://localhost:3000"# --- DATABASE (PostgreSQL) ---DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"# --- AUTH (JWT + Cookie) ---JWT_SECRET="minimal_64_karakter_secret_key_yang_aman_untuk_produksi"JWT_EXPIRES_IN="7d"COOKIE_SECRET="minimal_32_karakter_cookie_secret"# --- APP ---NODE_ENV="development"PORT=3000
Variable
Wajib
Deskripsi
GEMINI_API_KEY
❌
API key Google Gemini. Tanpa ini, fitur AI menggunakan fallback simulasi
DATABASE_URL
✅
Connection string PostgreSQL
JWT_SECRET
✅
Secret key untuk signing JWT token (min. 64 karakter)
JWT_EXPIRES_IN
❌
Masa berlaku token (default: 7d)
COOKIE_SECRET
✅
Secret key untuk signed cookies (min. 32 karakter)
PORT
❌
Port server (default: 3000)
NODE_ENV
❌
development atau production
🗄️ Database
Entity-Relationship Diagram
erDiagram
User ||--o{ Exam : creates
User ||--o{ ExamSession : takes
User ||--o{ CheatLog : triggers
User ||--o{ ActivityLog : generates
Exam ||--o{ Question : contains
Exam ||--o{ ExamClass : "available to"
Exam ||--o{ ExamEligibility : "restricts"
Exam ||--o{ ExamSession : hosts
Exam ||--o{ ActivityLog : "logged in"
ExamSession ||--o{ StudentAnswer : records
ExamSession ||--o{ CheatLog : detects
Question ||--o{ StudentAnswer : "answered by"
User {
string id PK
string email UK
string name
enum role "TEACHER | STUDENT | ADMIN"
string nisn UK
string className
}
Exam {
string id PK
string title
string subject
enum status "DRAF | TERJADWAL | BERLANGSUNG | SELESAI"
int durationMinutes
datetime startTime
datetime endTime
boolean shuffleQuestions
boolean detectTabSwitch
boolean requireCamera
}
Question {
string id PK
string questionText
json options
string correctOption
int orderIndex
}
ExamSession {
string id PK
int score
int warningsCount
boolean examLocked
enum status "NORMAL | WARNING | CHEAT | SELESAI"
json questionOrder
json choiceOrders
}
Loading
Model Database
Model
Deskripsi
User
Akun pengguna (guru, siswa, admin) dengan role-based access
Exam
Data ujian lengkap: judul, jadwal, durasi, konfigurasi anti-cheat
Question
Soal pilihan ganda (4 opsi A-D) terkait exam
ExamClass
Relasi exam ↔ kelas yang berhak mengikuti
ExamEligibility
Kontrol akses per-siswa untuk ujian tertentu
ExamSession
Sesi pengerjaan siswa: skor, progress, status curang
StudentAnswer
Jawaban siswa per-soal (auto-graded)
CheatLog
Log pelanggaran: tab-switch, copy-paste, dll.
ActivityLog
Riwayat aktivitas untuk audit trail
🧪 Akun Demo
Setelah menjalankan npm run db:seed, akun-akun berikut tersedia:
Role
Email
Password
Catatan
🔑 Admin
admin@examhub.id
admin
Akses penuh
👨🏫 Guru
budi@examhub.id
admin
Budi Santoso, M.Pd
👩🏫 Guru
sari@examhub.id
admin
Sari Wulandari, S.Pd
👨🎓 Siswa
siswa1@examhub.id
siswa
Ahmad Rizqi (Kelas 12 MIPA 1)
👨🎓 Siswa
siswa2@examhub.id — siswa10@examhub.id
examhub123
9 siswa tambahan
Data demo mencakup 6 ujian (1 berlangsung, 3 terjadwal, 1 selesai, 1 draf) dengan soal lengkap di beberapa mata pelajaran.
Semua endpoint berada di prefix /api. Autentikasi menggunakan HTTP-only cookie (examhub_token).
🔐 Auth (/api/auth)
Method
Endpoint
Deskripsi
Auth
POST
/api/auth/login
Login guru/siswa → set cookie
❌
POST
/api/auth/logout
Logout → clear cookie
✅
GET
/api/auth/me
Ambil data user yang sedang login
✅
📝 Exams (/api/exams)
Method
Endpoint
Deskripsi
Auth
GET
/api/exams
List semua ujian milik guru
✅
GET
/api/exams/:id
Detail ujian beserta soal
✅
POST
/api/exams
Buat ujian baru (+ soal inline)
✅
PUT
/api/exams/:id
Update ujian
✅
DELETE
/api/exams/:id
Hapus ujian
✅
POST
/api/exams/:id/publish
Publikasi draf → terjadwal
✅
POST
/api/exams/:id/start
Mulai ujian → berlangsung
✅
POST
/api/exams/:id/stop
Hentikan ujian → selesai
✅
POST
/api/exams/:id/clone
Duplikat ujian
✅
❓ Questions (/api/exams/:examId/questions)
Method
Endpoint
Deskripsi
Auth
GET
/api/exams/:examId/questions
List soal pada ujian
✅
POST
/api/exams/:examId/questions
Tambah satu soal
✅
POST
/api/exams/:examId/questions/bulk
Bulk import soal
✅
PUT
/api/exams/:examId/questions/:qid
Update soal
✅
DELETE
/api/exams/:examId/questions/:qid
Hapus soal
✅
👨🎓 Student Portal (/api/student)
Method
Endpoint
Deskripsi
Auth
GET
/api/student/exams
Ujian yang tersedia untuk siswa
✅
POST
/api/student/exams/:id/verify
Verifikasi password ujian
✅
POST
/api/student/exams/:id/start
Mulai mengerjakan ujian
✅
POST
/api/student/exams/:id/answer
Kirim jawaban soal
✅
POST
/api/student/exams/:id/submit
Submit ujian → auto-grade
✅
POST
/api/student/exams/:id/warning
Laporkan pelanggaran dari client
✅
POST
/api/student/exams/:id/heartbeat
Heartbeat status aktif
✅
📊 Monitor (/api/monitor)
Method
Endpoint
Deskripsi
Auth
GET
/api/monitor/:examId/students
List siswa aktif dalam ujian
✅
POST
/api/monitor/:examId/lock/:studentId
Kunci ujian siswa (curang)
✅
POST
/api/monitor/:examId/unlock/:studentId
Buka kunci ujian siswa
✅
POST
/api/monitor/:examId/broadcast
Broadcast pesan ke semua siswa
✅
📈 Reports (/api/reports)
Method
Endpoint
Deskripsi
Auth
GET
/api/reports/exams/:examId
Ringkasan laporan ujian
✅
GET
/api/reports/exams/:examId/students
Daftar siswa + nilai
✅
GET
/api/reports/exams/:examId/students/:studentId
Detail jawaban siswa
✅
📊 Stats & Others
Method
Endpoint
Deskripsi
Auth
GET
/api/stats/dashboard
Statistik dashboard guru
✅
GET
/api/stats/distribution
Distribusi nilai per ujian/mapel
✅
GET
/api/stats/student
Statistik siswa personal
✅
GET
/api/activities
Feed aktivitas terkini
✅
PUT
/api/profile
Update profil user
✅
POST
/api/profile/password
Ganti password
✅
GET
/api/users
List user (admin/guru)
✅
POST
/api/users
Buat user baru
✅
PUT
/api/users/:id
Update user
✅
DELETE
/api/users/:id
Hapus user
✅
GET
/api/users/classes
List kelas yang terdaftar
✅
GET
/api/health
Health check server
❌
🤖 Fitur AI (Gemini)
ExamHub mengintegrasikan Google Gemini 3.5 Flash untuk dua fitur utama:
1. AI ExamMaker — Generate Soal Otomatis
POST /api/generate-questions
{
"promptText": "Revolusi Industri di Inggris abad ke-18",
"numQuestions": 5,
"mode": "ultimate",
"difficulty": "HOTS"
}
Mode
Deskripsi
pro
Analisis dokumen/teks yang diunggah → generate soal dari konten
ultimate
Generate soal dari topik bebas dengan tingkat kesulitan terkontrol
Difficulty
Level
Mudah
Teori mendasar, ingatan fakta langsung
Sedang
Analitis konsep, sebab-akibat sederhana
Sulit
Penalaran kritis, multi-variabel
HOTS
Evaluasi, sintesis, logika kompleks
2. AI Question Polish — Sempurnakan Soal
POST /api/polish-question
Menyempurnakan tata bahasa, menghilangkan ambiguitas, dan meningkatkan kualitas opsi pengecoh agar lebih meyakinkan namun tetap memiliki satu kunci jawaban yang pasti benar.
Catatan: Jika GEMINI_API_KEY tidak dikonfigurasi, sistem secara otomatis menggunakan fallback simulasi dengan soal-soal berkualitas tinggi yang sudah terstruktur (Sejarah, Fisika, Biologi).
🛡️ Sistem Anti-Kecurangan
ExamHub menyediakan 9 parameter proteksi yang dapat dikonfigurasi secara independen per-ujian:
Parameter
Deskripsi
Default
shuffleQuestions
Acak urutan soal per-siswa
❌
shuffleChoices
Acak urutan opsi jawaban per-soal
❌
requireFullscreen
Paksa mode fullscreen saat ujian
❌
detectTabSwitch
Deteksi dan catat perpindahan tab/window
✅
blockRightClickAndCopy
Blokir klik kanan dan salin teks
✅
requireCamera
Wajibkan akses kamera selama ujian
❌
blockKeyboardShortcuts
Blokir shortcut keyboard (Ctrl+C, dll.)
❌
blockPaste
Blokir operasi paste
❌
blockSearchSelection
Blokir seleksi teks untuk pencarian
❌
Alur Deteksi Kecurangan
Siswa melanggar aturan
↓
Client mengirim POST /api/student/exams/:id/warning
↓
Server mencatat CheatLog + increment warningsCount
↓
Socket.io emit event ke monitor guru (real-time)
↓
Guru dapat LOCK ujian siswa dari Live Monitor
↓
Siswa yang di-lock tidak bisa melanjutkan ujian
📡 Real-time WebSocket
ExamHub menggunakan Socket.io untuk komunikasi real-time antara guru dan siswa:
Events
Event
Arah
Deskripsi
monitor_join
Client → Server
Guru bergabung ke room monitoring ujian
monitor_leave
Client → Server
Guru meninggalkan room monitoring
student_join_exam
Client → Server
Siswa mulai mengerjakan ujian
student_leave_exam
Client → Server
Siswa keluar dari ujian
student_update
Server → Client
Update status siswa (progres, pelanggaran)
exam_locked
Server → Client
Notifikasi ujian siswa dikunci
broadcast_message
Server → Client
Pesan dari guru ke semua siswa
Room System
exam:{examId} — Semua peserta (guru + siswa) dalam satu ujian
monitor:{examId} — Hanya guru yang memantau ujian
student:{userId} — Channel pribadi per-siswa
🏗️ Build & Deploy Produksi
Build
# Build frontend (Vite) + backend (esbuild)
npm run build
feat: Fitur baru
fix: Perbaikan bug
docs: Perubahan dokumentasi
style: Formatting (tanpa perubahan kode)
refactor: Refactoring kode
test: Menambah/memperbaiki test
chore: Maintenance (build, deps, dll.)
ExamHub — Dibuat dengan ❤️ untuk pendidikan Indonesia yang lebih baik.
Powered by React, Express, PostgreSQL, Prisma, Socket.io & Google Gemini AI
About
ExamHub adalah platform manajemen ujian full-stack yang menggabungkan kecerdasan buatan Google Gemini untuk pembuatan soal otomatis, monitoring kecurangan real-time via WebSocket, dan portal multi-role (Guru, Siswa, Admin) — semuanya dalam satu aplikasi monolitik yang mudah di-deploy.