MIF_E31231623/website/wisata_web/docs/admin-panel.md

4.1 KiB

Explore Lumajang Admin Panel

Struktur Utama

  • app/Models/Kategori.php dan app/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 JSON success, message, dan data.
  • 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 middleware auth + 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 jika model_path tersedia.
  • Air Terjun Tumpak Sewu: wisata video, video player aktif jika is_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
}