4.1 KiB
Explore Lumajang Admin Panel
Struktur Utama
app/Models/Kategori.phpdanapp/Models/Wisata.php: model relasi kategori dan destinasi.app/Http/Controllers/Admin: controller dashboard, login, CRUD wisata, CRUD kategori, dan user aplikasi.app/Http/Controllers/API: API auth, destinations, dan kategori untuk Flutter.app/Http/Resources: format JSONsuccess,message, dandata.resources/views/admin: Blade admin panel Bootstrap 5.storage/app/public/images: penyimpanan gambar wisata.storage/app/public/videos: penyimpanan video wisata.storage/app/public/models: penyimpanan model GLB/GLTF wisata AR.routes/web.php: route admin berbasis session dan middlewareauth+admin.routes/api.php: endpoint JSON untuk aplikasi Flutter.
Instalasi
cd website/wisata_web
composer install
cp .env.example .env
php artisan key:generate
Atur database MySQL di .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=explore_lumajang_ar
DB_USERNAME=root
DB_PASSWORD=
Jalankan migrasi, seeder admin awal, dan storage link:
php artisan migrate --seed
php artisan storage:link
php artisan serve
Admin panel tersedia di:
http://127.0.0.1:8000/admin/login
Akun admin awal:
Email: admin@explorelumajang.test
Password: password
Ganti password ini sebelum digunakan untuk produksi.
Seeder juga membuat contoh data demo:
Ranu Pani: wisata normal.Puncak B29: wisata AR, tombol AR aktif jikamodel_pathtersedia.Air Terjun Tumpak Sewu: wisata video, video player aktif jikais_video = true.
Endpoint API Flutter
Base URL lokal Android emulator:
http://10.0.2.2:8000/api
Base URL perangkat fisik:
http://IP_LAPTOP_KAMU:8000/api
Endpoint publik:
GET /health
POST /register
POST /login
POST /forgot-password
GET /kategori
GET /destinations
GET /destinations/{id}
Endpoint dengan token Bearer:
GET /profile
POST /logout
POST /wisata/{id}/gambar
Contoh response login:
{
"success": true,
"message": "Success",
"data": {
"token_type": "Bearer",
"token": "plain-token",
"user": {
"id": 1,
"name": "User",
"email": "user@example.com",
"role": "user",
"created_at": "2026-05-20T10:00:00.000000Z"
}
}
}
Contoh response wisata:
{
"success": true,
"message": "Success",
"data": {
"id": 1,
"title": "Ranu Pani",
"category": {
"id": 1,
"name": "Wisata Alam",
"slug": "wisata-alam"
},
"location": "Senduro, Lumajang",
"image": "http://IP_LAPTOP:8000/storage/images/file.jpg",
"rating": 4.8,
"distance": "48 km dari pusat kota",
"elevation": "2.100 mdpl",
"model_path": "http://IP_LAPTOP:8000/storage/models/file.glb",
"video_path": "http://IP_LAPTOP:8000/storage/videos/file.mp4",
"is_video": false,
"type": "normal",
"show_ar_button": false,
"show_video_player": false,
"latitude": -8.0092,
"longitude": 112.9446,
"google_maps_url": "https://www.google.com/maps?q=-8.0092000,112.9446000"
}
}
Integrasi Flutter
Simpan base URL di auth_service.dart atau konfigurasi environment Flutter. Untuk perangkat fisik gunakan IP laptop, bukan localhost:
const String baseUrl = 'http://IP_LAPTOP:8000/api';
Untuk Android emulator boleh memakai:
const String baseUrl = 'http://10.0.2.2:8000/api';
Untuk request login/register gunakan POST. Setelah login, simpan token dari data.token, lalu kirim pada endpoint protected:
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer $token',
}
Untuk memuat destinasi:
GET $baseUrl/wisata
GET $baseUrl/destinations
GET $baseUrl/destinations/{id}
GET $baseUrl/kategori
Field URL image, model_path, dan video_path sudah dikirim sebagai URL publik dari Laravel storage sehingga bisa langsung digunakan di Flutter.
Logic Flutter:
if (destination['show_ar_button'] == true) {
// tampilkan tombol AR dan buka model_path
}
if (destination['show_video_player'] == true) {
// tampilkan video player dari video_path
}