batch 1 update style & dahsboard for rec.nurinda.co.id
This commit is contained in:
1 parent
9107ffb158
commit
f39aa60384
18485 files changed
+843
-2881869
No files matched your search
@@ -0,0 +1,69 @@
|
||||
# Preview lokal Nurinda
|
||||
|
||||
Dari folder root project:
|
||||
|
||||
```sh
|
||||
./dev/start-local.sh
|
||||
```
|
||||
|
||||
- Dashboard: http://127.0.0.1:8086/dashboard/login.php
|
||||
- Halaman peserta: http://127.0.0.1:8086/
|
||||
- phpMyAdmin: http://127.0.0.1:8087/
|
||||
- Database: `recruitment_local`, MySQL `127.0.0.1:33317`.
|
||||
|
||||
Kredensial dashboard dan phpMyAdmin dibuat acak pada inisialisasi pertama, disimpan di `.local/credentials.json` (diabaikan Git, izin 600). Login phpMyAdmin memakai `db_user` dan `db_password`; dashboard memakai `admin_email` dan `admin_password`. Akun database hanya mendapat akses ke database recruitment lokal.
|
||||
|
||||
Tabel admin: `rec_admin` dengan `id`, `email`, `nama_de`, `nama_be`, `idkar`, `password_hash`. Hash diperlukan untuk login password. Tidak ada ketergantungan tabel karyawan proyek lain. Pada upgrade dari tabel lama, nama lama dipertahankan dalam `nama_de` dan kolom historis `created_at` tetap dipertahankan.
|
||||
|
||||
SQL recruitment diimpor sekali pada inisialisasi pertama. Menjalankan script lagi tidak mengimpor ulang atau menimpa akun yang sudah dibuat. Koneksi peserta dalam `includes/conn.php` saat ini diarahkan ke `.local/db.php`. Salinan konfigurasi server lama ada di `.local/original-conn.php` dan `.local/original-koneksi.php`. File lokal ini tidak boleh diunggah ke server produksi.
|
||||
|
||||
Untuk menghentikan layanan **dan menyimpan backup perubahan database**, jalankan:
|
||||
|
||||
```sh
|
||||
./dev/stop-local.sh
|
||||
```
|
||||
|
||||
MySQL menyimpan data kerja di `/tmp/nurinda-rec-mysql` untuk kompatibilitas instalasi MySQL mesin ini. Backup tersimpan di `.local/local-backup.sql`. Hentikan dengan script sebelum reboot agar perubahan terbaru dibackup. Jika data kerja `/tmp` sudah dibersihkan, startup memulihkan backup; jika backup belum ada, memakai ekspor SQL terbaru dari folder `DB/`. `.local/` berisi kredensial/data pribadi dan tidak ikut Git.
|
||||
|
||||
Memerlukan Python 3, PHP 8.2+, MySQL (`mysqld`, `mysql`, `mysqldump`, `mysqladmin`), dan distribusi phpMyAdmin di `/usr/share/phpmyadmin`. Semua sudah tersedia pada komputer ini. Script menyalakan proses di background hanya pada loopback, sehingga tetap dapat dipakai setelah chat selesai. Jika restart melaporkan port sudah dipakai proses lain, hentikan proses tersebut atau sesuaikan port pada script. Router development memblokir dump SQL, `.local`, Git, dan skrip internal.
|
||||
|
||||
|
||||
## Area peserta dan akun eksplorasi
|
||||
|
||||
Area peserta sudah memakai tampilan Nurinda tanpa AdminLTE/CDN: login, beranda, dan keempat fase tes. Akun lokal eksplorasi: `test@nurinda.local`, password `NurindaTest2026!`, nama `Peserta Test Nurinda`, kode `99` (demo). Akun ini dibuat oleh `php dev/create-test-participant.php`; menjalankan ulang perintah tidak mereset progres.
|
||||
|
||||
Setiap fase menyimpan set soal, deadline, dan draft pada database agar reload/login ulang tidak mereset tes. Autosave berjalan sekitar setiap tiga detik ketika koneksi tersedia; perhatikan status sinkronisasi sebelum meninggalkan halaman. Radio button dipakai untuk satu pilihan per soal kategori padanan kata/kepribadian. Penyimpanan memakai transaksi dan pemeriksaan fase untuk mencegah submit ganda. Setelah fase terakhir, akun tetap bisa login untuk melihat status selesai; email/password tidak lagi dinonaktifkan oleh submit terakhir. Deadline ditegakkan server. Setelah deadline, payload jawaban baru ditolak; server memfinalkan draft terakhir yang diterima sebelum deadline pada request peserta berikutnya atau ketika admin membuka detail hasil. Tidak ada background scheduler.
|
||||
|
||||
Validasi alur baru: akun QA sementara menyelesaikan 4 fase dengan 65 jawaban; pengacakan pada reload tetap sama dan submit berulang tidak menggandakan data. Akun eksplorasi tetap pada fase 0 untuk digunakan pengguna.
|
||||
|
||||
|
||||
## Proteksi integritas tes
|
||||
|
||||
Migrasi `dashboard/migrations/003_exam_attempts.sql` menambahkan tabel `rec_exam_attempt`, `rec_exam_event`, dan `rec_candidate_login_guard`. Sudah diterapkan di database lokal; terapkan sebelum deploy kode ini ke server lain. Startup lokal menjalankan migrasi secara idempotent.
|
||||
|
||||
- Deadline berasal dari jam server dan tidak dapat direset dengan logout, session baru, reload, atau jam perangkat.
|
||||
- Satu attempt per peserta/fase. Soal tersimpan sebagai snapshot tanpa kunci jawaban. Fase berikutnya hanya tersedia setelah fase aktif difinalkan.
|
||||
- Autosave/submit memeriksa CSRF, pemilik attempt, token tab aktif, ID soal, dan nilai pilihan. Tab/sesi yang digantikan tidak dapat menyimpan atau submit sampai dimuat ulang.
|
||||
- Deadline lewat: hanya draft sebelum deadline yang dipertahankan. Autosave gagal karena offline tidak memperpanjang waktu; peserta melihat peringatan sinkronisasi. Sesi yang kedaluwarsa difinalkan saat request tes/beranda berikutnya atau saat admin membuka detail peserta.
|
||||
- Submit memakai transaksi dan lock peserta sehingga submit berulang tidak menggandakan jawaban.
|
||||
- Aktivitas `visibilitychange`, blur, copy/cut/paste, menu konteks, login ulang, dan token tab lama dapat dicatat. Aktivitas browser bukan bukti kecurangan, tidak mengubah status seleksi, dan bisa dinonaktifkan/dipalsukan dari perangkat peserta. Catatan dibatasi maksimal 200 per attempt dengan deduplikasi dua detik; tampilan admin menampilkan 50 catatan terbaru.
|
||||
- Lima login gagal memblokir email selama 15 menit, berlaku lintas session browser. Ini bukan pembatasan berbasis IP; reverse proxy produksi tetap dapat melengkapi pembatasan trafik.
|
||||
- CSP hanya memuat aset lokal, frame embedding dilarang, session cookie HttpOnly/SameSite dan halaman sensitif tidak di-cache.
|
||||
|
||||
Tidak ada akses webcam, perekaman layar, atau deteksi perangkat lain. Mematikan JavaScript tidak meniadakan deadline maupun validasi server, tetapi menghilangkan autosave dan pelaporan aktivitas browser. Clipboard tidak diblokir agar tidak mengganggu aksesibilitas; tindakannya hanya dilaporkan.
|
||||
|
||||
Jalankan pengujian regresi lokal dengan `python3 dev/test-exam-protection.py`. Script memakai akun QA sementara dan menghapus data QA saat selesai; akun eksplorasi pengguna tidak diubah. Validasi mencakup CSRF, ID soal palsu, draft/deadline lintas login, tab lama, event log, timeout server, dan finalisasi idempotent. Empat fase / 65 jawaban serta autosave dan pemulihan setelah reload juga sudah diuji.
|
||||
|
||||
|
||||
## Satu pintu konfigurasi database
|
||||
|
||||
Peserta, dashboard, dan CLI admin semuanya menggunakan `includes/conn.php`; environment `REC_DB_*` tidak lagi memilih database. Saat ini file tersebut berisi konfigurasi server.
|
||||
|
||||
Untuk beralih ke preview lokal, simpan konfigurasi server secara pribadi, lalu ubah isi `includes/conn.php` menjadi:
|
||||
|
||||
```php
|
||||
<?php
|
||||
require __DIR__ . '/../.local/db.php';
|
||||
```
|
||||
|
||||
Setelah itu jalankan `./dev/start-local.sh`. Untuk deployment, kembalikan konfigurasi server pada file yang sama. Startup/setup lokal menolak berjalan jika `conn.php` belum diarahkan ke `.local/db.php`, agar migrasi dan pembuatan akun lokal tidak berjalan pada database server. Konfigurasi tidak diubah otomatis oleh script.
|
||||
Reference in new issue
Block a user