Aplikasi Mobile Perlindungan dan Pelaporan Kekerasan
SecureMe adalah aplikasi mobile berbasis Flutter yang dirancang untuk membantu korban atau saksi kekerasan fisik, seksual, maupun kekerasan dalam rumah tangga (KDRT) agar dapat melaporkan kejadian secara cepat, aman, dan mudah. Aplikasi ini dilengkapi dengan fitur Panic Button yang dapat mengirimkan lokasi GPS pengguna secara real-time kepada pihak berwajib, serta dashboard admin untuk memantau dan mengelola laporan yang masuk.
- Fitur Utama
- Teknologi yang Digunakan
- Struktur Proyek
- Prasyarat
- Cara Instalasi dan Menjalankan
- Konfigurasi Database Supabase
- Konfigurasi CI/CD
- Penggunaan Aplikasi
- API Endpoints
- Kontribusi
- Panic Button β Tombol darurat yang mengirimkan sinyal beserta lokasi GPS pengguna secara real-time ke database. Lokasi dikonversi menjadi nama alamat lengkap menggunakan Nominatim API (OpenStreetMap) tanpa memerlukan API key berbayar.
- Form Laporan β Formulir pelaporan kejadian kekerasan yang mencakup jenis kekerasan, lokasi kejadian, deskripsi, lampiran bukti berupa foto atau video, serta opsi pengiriman secara anonim.
- Riwayat Laporan β Halaman yang menampilkan seluruh laporan yang pernah dibuat beserta status penanganannya secara real-time.
- Pusat Edukasi β Konten informatif mengenai jenis-jenis kekerasan, langkah hukum yang dapat ditempuh, layanan konseling gratis, dan hak-hak korban berdasarkan perundang-undangan Indonesia.
- Kontak Darurat β Daftar nomor kontak penting seperti Polisi (110), Ambulans (118), Komnas Perempuan, LBH APIK, dan SAPA Indonesia yang dapat dihubungi kapan saja.
- Dashboard Admin β Halaman pemantauan seluruh laporan dari semua pengguna yang dilengkapi dengan statistik jumlah laporan per status.
- Filter Laporan β Kemampuan memfilter laporan berdasarkan status penanganan: Belum Ditangani, Sedang Ditangani, dan Sudah Ditangani.
- Detail Laporan β Tampilan detail lengkap setiap laporan termasuk jenis kekerasan, lokasi, identitas pelapor, dan deskripsi kejadian.
- Update Status β Admin dapat memperbarui status penanganan setiap laporan secara langsung dari aplikasi.
- Login Admin β Sistem autentikasi khusus admin yang terpisah dari pengguna biasa. Akun admin hanya dapat dibuat melalui query database Supabase.
| Teknologi | Versi | Kegunaan |
|---|---|---|
| Flutter | 3.22.0+ | Framework utama aplikasi mobile dan web |
| Dart | 3.0.0+ | Bahasa pemrograman frontend |
| Supabase Flutter | 2.3.0+ | Koneksi langsung ke database Supabase |
| Geolocator | 11.0.0+ | Mengambil koordinat GPS perangkat |
| HTTP | 1.2.0+ | HTTP request untuk reverse geocoding |
| Image Picker | 1.1.2+ | Memilih foto/video dari galeri |
| Shared Preferences | 2.2.2+ | Menyimpan session ID pengguna secara lokal |
| Flutter Secure Storage | 9.0.0+ | Menyimpan token autentikasi secara aman |
| Teknologi | Versi | Kegunaan |
|---|---|---|
| NestJS | 10.0+ | Framework backend REST API |
| TypeScript | 5.0+ | Bahasa pemrograman backend |
| Supabase JS | 2.39.0+ | Koneksi backend ke database |
| JWT | β | Autentikasi dan otorisasi |
| Axios | 1.6.0+ | HTTP request untuk reverse geocoding |
| Class Validator | 0.14.0+ | Validasi input data |
| Teknologi | Kegunaan |
|---|---|
| Supabase (PostgreSQL) | Database utama aplikasi berbasis cloud |
| GitHub Actions | CI/CD pipeline otomatis |
| GitHub Pages | Hosting Flutter Web |
| Nominatim API | Reverse geocoding gratis berbasis OpenStreetMap |
secureme/
βββ .github/
β βββ workflows/
β βββ backend.yml # CI/CD pipeline backend
β βββ frontend.yml # CI/CD pipeline frontend
β
βββ frontend/ # Flutter Application
β βββ pubspec.yaml
β βββ android/
β β βββ app/
β β βββ build.gradle.kts
β βββ assets/
β β βββ images/
β β βββ logo.png # Logo aplikasi (tambahkan sendiri)
β βββ lib/
β βββ main.dart
β βββ app.dart
β βββ core/
β β βββ constants/
β β β βββ app_colors.dart
β β β βββ app_strings.dart
β β βββ services/
β β β βββ supabase_service.dart
β β β βββ location_service.dart
β β β βββ api_service.dart
β β βββ utils/
β β βββ validators.dart
β βββ features/
β β βββ portal/
β β β βββ portal_page.dart
β β βββ admin/
β β β βββ admin_login_page.dart
β β β βββ admin_home_page.dart
β β βββ panic/
β β β βββ panic_page.dart
β β βββ report/
β β β βββ report_page.dart
β β β βββ history_page.dart
β β βββ education/
β β β βββ education_page.dart
β β βββ contacts/
β β β βββ contacts_page.dart
β β βββ home/
β β βββ home_shell.dart
β βββ widgets/
β βββ custom_button.dart
β βββ status_badge.dart
β
βββ backend/ # NestJS Application
βββ package.json
βββ tsconfig.json
βββ Procfile
βββ .env.example
βββ src/
βββ main.ts
βββ app.module.ts
βββ supabase/
β βββ supabase.module.ts
β βββ supabase.service.ts
βββ auth/
β βββ auth.module.ts
β βββ auth.controller.ts
β βββ auth.service.ts
β βββ dto/
β βββ login.dto.ts
β βββ register.dto.ts
βββ reports/
β βββ reports.module.ts
β βββ reports.controller.ts
β βββ reports.service.ts
β βββ dto/
β βββ create-report.dto.ts
βββ panic/
β βββ panic.module.ts
β βββ panic.controller.ts
β βββ panic.service.ts
βββ common/
βββ jwt.guard.ts
Pastikan perangkat pengembangan kamu telah menginstal:
- Flutter SDK versi 3.22.0 atau lebih baru β flutter.dev
- Node.js versi 20 atau lebih baru β nodejs.org
- Git β git-scm.com
- Android Studio atau VS Code dengan ekstensi Flutter
- Akun Supabase β supabase.com
git clone https://github.com/USERNAME/SecureMe.git
cd SecureMecd backend
npm install
cp .env.example .envIsi file .env dengan nilai yang sesuai:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_KEY=your-service-role-key
JWT_SECRET=your-random-secret-key-min-32-chars
PORT=3000Jalankan backend:
npm run start:devBackend akan berjalan di http://localhost:3000
cd frontend
flutter pub getBuka file lib/main.dart dan isi dengan kredensial Supabase kamu:
await Supabase.initialize(
url: 'https://your-project.supabase.co',
anonKey: 'your-anon-public-key',
);Jalankan aplikasi:
# Untuk menjalankan di emulator atau device fisik
flutter run
# Untuk menjalankan di browser (web)
flutter run -d chrome
# Untuk build APK
flutter build apk --release --split-per-abi- Buka supabase.com dan buat project baru
- Pergi ke SQL Editor dan jalankan script berikut
-- Tabel profil user
create table public.users (
id uuid primary key,
full_name text not null,
email text not null,
phone text,
created_at timestamp with time zone default now()
);
-- Tabel laporan
create table public.reports (
id uuid primary key default gen_random_uuid(),
user_id text,
type text not null,
location text not null,
description text not null,
is_anonymous boolean default false,
source text default 'Form Laporan',
status text default 'Belum Ditangani',
evidence_url text,
latitude double precision,
longitude double precision,
reported_by text default 'Identitas Terlampir',
created_at timestamp with time zone default now()
);
-- Tabel tracking lokasi real-time
create table public.location_tracking (
id uuid primary key default gen_random_uuid(),
user_id text,
report_id uuid,
latitude double precision not null,
longitude double precision not null,
recorded_at timestamp with time zone default now()
);
-- Tabel admin
create table public.admins (
id uuid primary key default gen_random_uuid(),
email text not null unique,
password_hash text not null,
full_name text not null,
created_at timestamp with time zone default now()
);
-- Matikan RLS untuk semua tabel
alter table public.users disable row level security;
alter table public.reports disable row level security;
alter table public.location_tracking disable row level security;
alter table public.admins disable row level security;
-- Insert akun admin default
insert into public.admins (email, password_hash, full_name)
values ('admin@secureme.com', 'Admin@123', 'Administrator');- Buka Authentication β Providers
- Cari Anonymous dan aktifkan toggle Enable anonymous sign-ins
- Klik Save
Repository ini menggunakan GitHub Actions untuk CI/CD otomatis. Setiap push ke branch master akan memicu:
- Backend pipeline β Melakukan TypeScript compilation check
- Frontend pipeline β Melakukan Flutter analyze, build APK, dan deploy Flutter Web ke GitHub Pages
Tambahkan secrets berikut di GitHub β Settings β Secrets and variables β Actions:
| Secret | Nilai |
|---|---|
SUPABASE_URL |
URL project Supabase kamu |
SUPABASE_SERVICE_KEY |
Service role key Supabase |
SUPABASE_ANON_KEY |
Anon/public key Supabase |
JWT_SECRET |
JWT secret yang sama dengan .env |
BACKEND_URL |
URL backend yang sudah di-deploy |
- Buka Settings β Pages
- Pilih Source: Deploy from a branch
- Pilih branch gh-pages dan folder / (root)
- Klik Save
Aplikasi web akan tersedia di:
https://USERNAME.github.io/SecureMe/
1. Menggunakan Panic Button
- Buka aplikasi dan pilih Pengguna di halaman awal
- Pastikan GPS aktif di perangkat
- Tekan tombol PANIK berwarna merah
- Aplikasi akan mengambil koordinat GPS dan mengirimkan sinyal darurat ke database
- Lokasi akan dikonversi menjadi nama alamat lengkap secara otomatis
2. Membuat Laporan
- Pilih tab Lapor di navigation bar bawah
- Pilih jenis kekerasan yang sesuai
- Isi lokasi kejadian dan deskripsi detail
- Lampirkan bukti foto atau video jika ada
- Aktifkan toggle anonim jika tidak ingin identitas ditampilkan
- Tekan Kirim Laporan
3. Melihat Riwayat Laporan
- Pilih tab Riwayat untuk melihat semua laporan yang pernah dibuat
- Setiap laporan menampilkan status terkini yang diperbarui oleh admin
- Lakukan pull-to-refresh untuk memperbarui data
1. Login Admin
- Pilih Admin di halaman awal
- Masukkan email dan password admin
- Email default:
admin@secureme.com - Password default:
Admin@123
2. Mengelola Laporan
- Dashboard menampilkan statistik laporan di bagian atas
- Gunakan filter chip untuk menyaring laporan berdasarkan status
- Tekan kartu laporan untuk melihat detail lengkap
- Pilih status baru dan tekan Simpan Perubahan untuk memperbarui status
3. Menambahkan Admin Baru
Jalankan query berikut di Supabase SQL Editor:
insert into public.admins (email, password_hash, full_name)
values ('email_baru@domain.com', 'password_baru', 'Nama Admin');Backend NestJS menyediakan endpoints berikut:
| Method | Endpoint | Deskripsi |
|---|---|---|
| POST | /auth/register |
Registrasi pengguna baru |
| POST | /auth/login |
Login pengguna |
| Method | Endpoint | Deskripsi | Auth |
|---|---|---|---|
| POST | /reports |
Membuat laporan baru | Required |
| GET | /reports/my |
Mengambil laporan milik user | Required |
| GET | /reports/all |
Mengambil semua laporan (admin) | Required |
| PATCH | /reports/:id/status |
Memperbarui status laporan | Required |
| DELETE | /reports/:id |
Menghapus laporan | Required |
| Method | Endpoint | Deskripsi | Auth |
|---|---|---|---|
| POST | /panic/trigger |
Mengirim sinyal darurat + lokasi GPS | Required |
| POST | /panic/update-location |
Memperbarui lokasi real-time | Required |
Login:
POST /auth/login
{
"email": "user@example.com",
"password": "password123"
}Trigger Panic:
POST /panic/trigger
Authorization: Bearer <token>
{
"latitude": -6.21462,
"longitude": 106.84513
}Create Report:
POST /reports
Authorization: Bearer <token>
{
"type": "Kekerasan Fisik",
"location": "Halte Bus Blok M",
"description": "Deskripsi kejadian...",
"isAnonymous": false
}Untuk mengganti placeholder logo dengan logo kamu sendiri:
- Siapkan file gambar logo dalam format
.png - Rename file menjadi
logo.png - Letakkan file di folder
frontend/assets/images/logo.png - Aplikasi akan otomatis menampilkan logo tersebut
| Nama | Nomor |
|---|---|
| Polisi | 110 |
| Ambulans | 118 |
| Komnas Perempuan | 021-3903963 |
| LBH APIK Jakarta | 021-8779-0146 |
| SAPA Indonesia | 1500-454 |
Kelompok 7 Stawin Revano-2802437114 Calvin Dywen-2802421002 Nabil Rafif Utomo - 2802435260 Gilbert Nicholin - 2802436925 Williams - 2802438136