Compare commits

..

4 Commits

Author SHA1 Message Date
c06fb26cf3 Edit index.php via Editor 2025-11-03 06:59:26 +00:00
5a0f2b98db Edit index.php via Editor 2025-11-03 06:52:42 +00:00
Flatlogic Bot
d51486c0fb 2.1a 2025-11-03 03:42:58 +00:00
Flatlogic Bot
c8641b65f7 Juanda Rent&Tour 2025-11-03 02:49:15 +00:00
13 changed files with 709 additions and 143 deletions

368
admin.php Normal file
View File

@ -0,0 +1,368 @@
<?php
session_start();
require_once 'db/config.php';
// If user is not logged in, redirect to login page
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header('Location: login.php');
exit;
}
$message = '';
$pdo = db();
// --- State Variables ---
$edit_mode_paket = false;
$paket_to_edit = null;
$edit_mode_kendaraan = false;
$kendaraan_to_edit = null;
// --- DATABASE SCHEMA SETUP ---
try {
// Paket Wisata Table
$pdo->exec("CREATE TABLE IF NOT EXISTS paket_wisata (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(255) NOT NULL,
deskripsi TEXT,
durasi VARCHAR(100),
harga INT NOT NULL,
gambar VARCHAR(255)
)");
// Kendaraan Table
$pdo->exec("CREATE TABLE IF NOT EXISTS kendaraan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(255) NOT NULL,
jenis VARCHAR(100),
transmisi VARCHAR(50),
harga INT NOT NULL,
status VARCHAR(50) DEFAULT 'Tersedia',
gambar VARCHAR(255)
)");
} catch (PDOException $e) {
die("Error creating table: " . $e->getMessage());
}
// --- HANDLE ACTIONS (DELETE & EDIT) ---
if (isset($_GET['action'])) {
$action = $_GET['action'];
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
// Paket Wisata Actions
if ($action == 'delete_paket' && $id > 0) {
$stmt = $pdo->prepare("SELECT gambar FROM paket_wisata WHERE id = ?");
$stmt->execute([$id]);
$item = $stmt->fetch();
if ($item && !empty($item['gambar']) && file_exists($item['gambar'])) {
unlink($item['gambar']);
}
$stmt = $pdo->prepare("DELETE FROM paket_wisata WHERE id = ?");
if ($stmt->execute([$id])) {
$message .= '<div class="alert alert-success">Paket wisata berhasil dihapus.</div>';
}
} elseif ($action == 'edit_paket' && $id > 0) {
$stmt = $pdo->prepare("SELECT * FROM paket_wisata WHERE id = ?");
$stmt->execute([$id]);
$paket_to_edit = $stmt->fetch();
if ($paket_to_edit) $edit_mode_paket = true;
}
// Kendaraan Actions
if ($action == 'delete_kendaraan' && $id > 0) {
$stmt = $pdo->prepare("SELECT gambar FROM kendaraan WHERE id = ?");
$stmt->execute([$id]);
$item = $stmt->fetch();
if ($item && !empty($item['gambar']) && file_exists($item['gambar'])) {
unlink($item['gambar']);
}
$stmt = $pdo->prepare("DELETE FROM kendaraan WHERE id = ?");
if ($stmt->execute([$id])) {
$message .= '<div class="alert alert-success">Kendaraan berhasil dihapus.</div>';
}
} elseif ($action == 'edit_kendaraan' && $id > 0) {
$stmt = $pdo->prepare("SELECT * FROM kendaraan WHERE id = ?");
$stmt->execute([$id]);
$kendaraan_to_edit = $stmt->fetch();
if ($kendaraan_to_edit) $edit_mode_kendaraan = true;
}
}
// --- FORM PROCESSING (ADD, UPDATE, LOGO) ---
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$upload_dir = 'assets/images/';
$allowed_types = ['image/png', 'image/jpeg', 'image/gif', 'image/x-icon'];
$action = $_POST['action'] ?? '';
// Handle Logo Upload
if ($action == 'upload_logo') {
if (isset($_FILES['main_logo']) && $_FILES['main_logo']['error'] == 0) {
if (in_array($_FILES['main_logo']['type'], $allowed_types)) {
if (move_uploaded_file($_FILES['main_logo']['tmp_name'], $upload_dir . 'logo.png')) {
$message .= '<div class="alert alert-success">Logo utama berhasil diunggah.</div>';
}
}
}
if (isset($_FILES['logo_icon']) && $_FILES['logo_icon']['error'] == 0) {
if (in_array($_FILES['logo_icon']['type'], $allowed_types)) {
if (move_uploaded_file($_FILES['logo_icon']['tmp_name'], $upload_dir . 'favicon.png')) {
$message .= '<div class="alert alert-success">Ikon logo berhasil diunggah.</div>';
}
}
}
}
// Handle Add/Update Tour Package
if (in_array($action, ['add_paket', 'update_paket'])) {
$nama = $_POST['nama'] ?? '';
$harga = $_POST['harga'] ?? 0;
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
if (!empty($nama) && $harga > 0) {
$deskripsi = $_POST['deskripsi'] ?? '';
$durasi = $_POST['durasi'] ?? '';
$gambar = $_POST['gambar_existing'] ?? '';
if (isset($_FILES['gambar']) && $_FILES['gambar']['error'] == 0) {
if ($id > 0 && !empty($gambar) && file_exists($gambar)) unlink($gambar);
$img_name = time() . '_' . basename($_FILES['gambar']['name']);
$img_path = $upload_dir . $img_name;
if (move_uploaded_file($_FILES['gambar']['tmp_name'], $img_path)) $gambar = $img_path;
}
if ($action == 'add_paket') {
$stmt = $pdo->prepare("INSERT INTO paket_wisata (nama, deskripsi, durasi, harga, gambar) VALUES (?, ?, ?, ?, ?)");
if ($stmt->execute([$nama, $deskripsi, $durasi, $harga, $gambar])) $message .= '<div class="alert alert-success">Paket wisata berhasil ditambahkan.</div>';
} elseif ($action == 'update_paket' && $id > 0) {
$stmt = $pdo->prepare("UPDATE paket_wisata SET nama = ?, deskripsi = ?, durasi = ?, harga = ?, gambar = ? WHERE id = ?");
if ($stmt->execute([$nama, $deskripsi, $durasi, $harga, $gambar, $id])) $message .= '<div class="alert alert-success">Paket wisata berhasil diperbarui.</div>';
}
} else {
$message .= '<div class="alert alert-warning">Nama dan Harga wajib diisi.</div>';
}
}
// Handle Add/Update Kendaraan
if (in_array($action, ['add_kendaraan', 'update_kendaraan'])) {
$nama = $_POST['nama_kendaraan'] ?? '';
$harga = $_POST['harga_kendaraan'] ?? 0;
$id = isset($_POST['id_kendaraan']) ? (int)$_POST['id_kendaraan'] : 0;
if (!empty($nama) && $harga > 0) {
$jenis = $_POST['jenis_kendaraan'] ?? '';
$transmisi = $_POST['transmisi_kendaraan'] ?? '';
$status = $_POST['status_kendaraan'] ?? 'Tersedia';
$gambar = $_POST['gambar_kendaraan_existing'] ?? '';
if (isset($_FILES['gambar_kendaraan']) && $_FILES['gambar_kendaraan']['error'] == 0) {
if ($id > 0 && !empty($gambar) && file_exists($gambar)) unlink($gambar);
$img_name = 'kendaraan_' . time() . '_' . basename($_FILES['gambar_kendaraan']['name']);
$img_path = $upload_dir . $img_name;
if (move_uploaded_file($_FILES['gambar_kendaraan']['tmp_name'], $img_path)) $gambar = $img_path;
}
if ($action == 'add_kendaraan') {
$stmt = $pdo->prepare("INSERT INTO kendaraan (nama, jenis, transmisi, harga, status, gambar) VALUES (?, ?, ?, ?, ?, ?)");
if ($stmt->execute([$nama, $jenis, $transmisi, $harga, $status, $gambar])) $message .= '<div class="alert alert-success">Kendaraan berhasil ditambahkan.</div>';
} elseif ($action == 'update_kendaraan' && $id > 0) {
$stmt = $pdo->prepare("UPDATE kendaraan SET nama = ?, jenis = ?, transmisi = ?, harga = ?, status = ?, gambar = ? WHERE id = ?");
if ($stmt->execute([$nama, $jenis, $transmisi, $harga, $status, $gambar, $id])) $message .= '<div class="alert alert-success">Kendaraan berhasil diperbarui.</div>';
}
} else {
$message .= '<div class="alert alert-warning">Nama dan Harga Kendaraan wajib diisi.</div>';
}
}
// To prevent re-submission on refresh, we redirect.
if ($_SERVER["REQUEST_METHOD"] == "POST") {
header("Location: admin.php");
exit;
}
}
// Fetch all data
$paket_wisata = $pdo->query("SELECT * FROM paket_wisata ORDER BY id DESC")->fetchAll();
$kendaraan = $pdo->query("SELECT * FROM kendaraan ORDER BY id DESC")->fetchAll();
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Dashboard - JatimTour</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css">
<?php if (file_exists('assets/images/favicon.png')): ?>
<link rel="icon" href="assets/images/favicon.png?v=<?php echo time(); ?>">
<?php endif; ?>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark sticky-top">
<div class="container">
<a class="navbar-brand" href="admin.php">
<?php if (file_exists('assets/images/logo.png')): ?>
<img src="assets/images/logo.png?v=<?php echo time(); ?>" alt="Logo" style="height: 30px;">
<?php else: ?>
Admin Dashboard
<?php endif; ?>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><span class="navbar-text me-3">Selamat datang, <strong><?php echo htmlspecialchars($_SESSION['username']); ?></strong></span></li>
<li class="nav-item"><a class="btn btn-danger" href="logout.php">Logout</a></li>
</ul>
</div>
</div>
</nav>
<div class="container py-5">
<?php echo $message; ?>
<div class="row g-5">
<!-- Main Content -->
<div class="col-lg-8">
<!-- Manajemen Paket Wisata -->
<div class="mb-5" id="manajemen-paket">
<h2 class="mb-4">Manajemen Paket Wisata</h2>
<div class="card mb-4">
<div class="card-header"><h5 class="card-title mb-0"><?php echo $edit_mode_paket ? 'Edit Paket Wisata' : 'Tambah Paket Wisata Baru'; ?></h5></div>
<div class="card-body">
<form action="admin.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="action" value="<?php echo $edit_mode_paket ? 'update_paket' : 'add_paket'; ?>">
<?php if ($edit_mode_paket): ?>
<input type="hidden" name="id" value="<?php echo $paket_to_edit['id']; ?>">
<input type="hidden" name="gambar_existing" value="<?php echo htmlspecialchars($paket_to_edit['gambar']); ?>">
<?php endif; ?>
<div class="row g-3">
<div class="col-md-6"><label for="nama" class="form-label">Nama Paket</label><input type="text" class="form-control" id="nama" name="nama" value="<?php echo $edit_mode_paket ? htmlspecialchars($paket_to_edit['nama']) : ''; ?>" required></div>
<div class="col-md-6"><label for="harga" class="form-label">Harga (IDR)</label><input type="number" class="form-control" id="harga" name="harga" value="<?php echo $edit_mode_paket ? $paket_to_edit['harga'] : ''; ?>" required></div>
<div class="col-12"><label for="deskripsi" class="form-label">Deskripsi</label><textarea class="form-control" id="deskripsi" name="deskripsi" rows="3"><?php echo $edit_mode_paket ? htmlspecialchars($paket_to_edit['deskripsi']) : ''; ?></textarea></div>
<div class="col-md-6"><label for="durasi" class="form-label">Durasi</label><input type="text" class="form-control" id="durasi" name="durasi" value="<?php echo $edit_mode_paket ? htmlspecialchars($paket_to_edit['durasi']) : ''; ?>"></div>
<div class="col-md-6"><label for="gambar" class="form-label">Gambar <?php echo $edit_mode_paket ? '(Opsional)' : ''; ?></label><input class="form-control" type="file" id="gambar" name="gambar" accept="image/png, image/jpeg"></div>
<div class="col-12"><button type="submit" class="btn btn-primary"><?php echo $edit_mode_paket ? 'Update Paket' : 'Tambah Paket'; ?></button>
<?php if ($edit_mode_paket): ?><a href="admin.php" class="btn btn-secondary">Batal</a><?php endif; ?></div>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-header"><h5 class="card-title mb-0">Daftar Paket Wisata</h5></div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped align-middle">
<thead><tr><th>Gambar</th><th>Nama</th><th>Harga</th><th>Durasi</th><th>Aksi</th></tr></thead>
<tbody>
<?php if (empty($paket_wisata)): ?>
<tr><td colspan="5" class="text-center">Belum ada paket wisata.</td></tr>
<?php else: foreach ($paket_wisata as $paket): ?>
<tr>
<td><img src="<?php echo htmlspecialchars($paket['gambar']); ?>?v=<?php echo time(); ?>" style="width: 100px;"></td>
<td><?php echo htmlspecialchars($paket['nama']); ?></td>
<td>Rp <?php echo number_format($paket['harga'], 0, ',', '.'); ?></td>
<td><?php echo htmlspecialchars($paket['durasi']); ?></td>
<td>
<a href="admin.php?action=edit_paket&id=<?php echo $paket['id']; ?>#manajemen-paket" class="btn btn-sm btn-warning">Edit</a>
<a href="admin.php?action=delete_paket&id=<?php echo $paket['id']; ?>" class="btn btn-sm btn-danger" onclick="return confirm('Yakin hapus paket ini?');">Hapus</a>
</td>
</tr>
<?php endforeach; endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Manajemen Kendaraan -->
<div id="manajemen-kendaraan">
<h2 class="mb-4">Manajemen Kendaraan</h2>
<div class="card mb-4">
<div class="card-header"><h5 class="card-title mb-0"><?php echo $edit_mode_kendaraan ? 'Edit Kendaraan' : 'Tambah Kendaraan Baru'; ?></h5></div>
<div class="card-body">
<form action="admin.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="action" value="<?php echo $edit_mode_kendaraan ? 'update_kendaraan' : 'add_kendaraan'; ?>">
<?php if ($edit_mode_kendaraan): ?>
<input type="hidden" name="id_kendaraan" value="<?php echo $kendaraan_to_edit['id']; ?>">
<input type="hidden" name="gambar_kendaraan_existing" value="<?php echo htmlspecialchars($kendaraan_to_edit['gambar']); ?>">
<?php endif; ?>
<div class="row g-3">
<div class="col-md-6"><label for="nama_kendaraan" class="form-label">Nama Kendaraan</label><input type="text" class="form-control" id="nama_kendaraan" name="nama_kendaraan" value="<?php echo $edit_mode_kendaraan ? htmlspecialchars($kendaraan_to_edit['nama']) : ''; ?>" required></div>
<div class="col-md-6"><label for="harga_kendaraan" class="form-label">Harga / Hari (IDR)</label><input type="number" class="form-control" id="harga_kendaraan" name="harga_kendaraan" value="<?php echo $edit_mode_kendaraan ? $kendaraan_to_edit['harga'] : ''; ?>" required></div>
<div class="col-md-6"><label for="jenis_kendaraan" class="form-label">Jenis (e.g., MPV, SUV)</label><input type="text" class="form-control" id="jenis_kendaraan" name="jenis_kendaraan" value="<?php echo $edit_mode_kendaraan ? htmlspecialchars($kendaraan_to_edit['jenis']) : ''; ?>"></div>
<div class="col-md-6"><label for="transmisi_kendaraan" class="form-label">Transmisi</label>
<select class="form-select" id="transmisi_kendaraan" name="transmisi_kendaraan">
<option <?php if($edit_mode_kendaraan && $kendaraan_to_edit['transmisi'] == 'Manual') echo 'selected'; ?>>Manual</option>
<option <?php if($edit_mode_kendaraan && $kendaraan_to_edit['transmisi'] == 'Matic') echo 'selected'; ?>>Matic</option>
</select>
</div>
<div class="col-md-6"><label for="status_kendaraan" class="form-label">Status</label>
<select class="form-select" id="status_kendaraan" name="status_kendaraan">
<option <?php if($edit_mode_kendaraan && $kendaraan_to_edit['status'] == 'Tersedia') echo 'selected'; ?>>Tersedia</option>
<option <?php if($edit_mode_kendaraan && $kendaraan_to_edit['status'] == 'Disewa') echo 'selected'; ?>>Disewa</option>
</select>
</div>
<div class="col-md-6"><label for="gambar_kendaraan" class="form-label">Gambar <?php echo $edit_mode_kendaraan ? '(Opsional)' : ''; ?></label><input class="form-control" type="file" id="gambar_kendaraan" name="gambar_kendaraan" accept="image/png, image/jpeg"></div>
<div class="col-12">
<button type="submit" class="btn btn-primary"><?php echo $edit_mode_kendaraan ? 'Update Kendaraan' : 'Tambah Kendaraan'; ?></button>
<?php if ($edit_mode_kendaraan): ?><a href="admin.php#manajemen-kendaraan" class="btn btn-secondary">Batal</a><?php endif; ?>
</div>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-header"><h5 class="card-title mb-0">Daftar Kendaraan</h5></div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped align-middle">
<thead><tr><th>Gambar</th><th>Nama</th><th>Jenis</th><th>Harga/Hari</th><th>Status</th><th>Aksi</th></tr></thead>
<tbody>
<?php if (empty($kendaraan)): ?>
<tr><td colspan="6" class="text-center">Belum ada kendaraan.</td></tr>
<?php else: foreach ($kendaraan as $mobil): ?>
<tr>
<td><img src="<?php echo htmlspecialchars($mobil['gambar']); ?>?v=<?php echo time(); ?>" style="width: 100px;"></td>
<td><?php echo htmlspecialchars($mobil['nama']); ?></td>
<td><?php echo htmlspecialchars($mobil['jenis']); ?></td>
<td>Rp <?php echo number_format($mobil['harga'], 0, ',', '.'); ?></td>
<td><span class="badge bg-<?php echo $mobil['status'] == 'Tersedia' ? 'success' : 'warning'; ?>"><?php echo htmlspecialchars($mobil['status']); ?></span></td>
<td>
<a href="admin.php?action=edit_kendaraan&id=<?php echo $mobil['id']; ?>#manajemen-kendaraan" class="btn btn-sm btn-warning">Edit</a>
<a href="admin.php?action=delete_kendaraan&id=<?php echo $mobil['id']; ?>" class="btn btn-sm btn-danger" onclick="return confirm('Anda yakin ingin menghapus kendaraan ini?');">Hapus</a>
</td>
</tr>
<?php endforeach; endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="col-lg-4">
<div class="card">
<div class="card-header"><h5 class="card-title mb-0">Pengaturan Logo</h5></div>
<div class="card-body">
<form action="admin.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="action" value="upload_logo">
<div class="mb-3"><label for="main_logo" class="form-label">Logo Utama</label><input class="form-control" type="file" id="main_logo" name="main_logo" accept="image/png, image/jpeg"></div>
<div class="mb-3"><label for="logo_icon" class="form-label">Favicon</label><input class="form-control" type="file" id="logo_icon" name="logo_icon" accept="image/png, image/x-icon"></div>
<button type="submit" class="btn btn-primary w-100">Simpan Logo</button>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

56
assets/css/custom.css Normal file
View File

@ -0,0 +1,56 @@
/* Custom CSS for JatimTour */
body {
font-family: 'Open Sans', sans-serif;
padding-top: 70px; /* Offset for fixed navbar */
background-color: #F8F9FA;
}
h1, h2, h3, h4, h5, h6, .navbar-brand {
font-family: 'Poppins', sans-serif;
}
/* Hero Section */
.hero-section {
background: linear-gradient(135deg, rgba(13, 110, 253, 0.85), rgba(13, 110, 253, 0.6)), url('../images/hero-bg.jpg');
background-size: cover;
background-position: center;
min-height: 60vh;
position: relative;
}
/* Card styles */
.tour-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
border-radius: 0.75rem; /* Softer corners */
}
.tour-card:hover {
transform: translateY(-10px);
box-shadow: 0 1rem 3rem rgba(0,0,0,.175)!important;
}
.tour-card .card-img-top {
height: 200px;
object-fit: cover;
border-top-left-radius: 0.75rem;
border-top-right-radius: 0.75rem;
}
/* Navbar */
.navbar-nav .nav-link {
transition: color 0.2s ease;
}
.navbar-nav .nav-link:hover, .navbar-nav .nav-link.active {
color: #0D6EFD !important;
}
.navbar-brand {
font-size: 1.5rem;
}
.btn-primary {
padding: 0.5rem 1.25rem;
border-radius: 50rem; /* Pill shape */
}

BIN
assets/images/avanza.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
assets/images/bromo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
assets/images/bus.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
assets/images/hero-bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
assets/images/hiace.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
assets/images/ijen.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
assets/images/malang.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

17
assets/js/main.js Normal file
View File

@ -0,0 +1,17 @@
// Custom JS for JatimTour
document.addEventListener('DOMContentLoaded', function () {
// Smooth scrolling for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
let target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth'
});
}
});
});
});

304
index.php
View File

@ -1,150 +1,168 @@
<?php <?php
declare(strict_types=1); require_once 'db/config.php';
@ini_set('display_errors', '1');
@error_reporting(E_ALL);
@date_default_timezone_set('UTC');
$phpVersion = PHP_VERSION; // --- Data Fetching ---
$now = date('Y-m-d H:i:s'); $pdo = db();
// Fetch Tour Packages from DB
$tour_packages = $pdo->query("SELECT * FROM paket_wisata ORDER BY id DESC")->fetchAll();
// Fetch Vehicles from DB
$rental_vehicles = $pdo->query("SELECT * FROM kendaraan WHERE status = 'Tersedia' ORDER BY id DESC")->fetchAll();
// Ganti nomor WhatsApp di bawah ini dengan nomor Admin/Operator Anda.
$admin_whatsapp_number = '6281234567890'; // Format internasional tanpa '+' atau '0' di depan
// --- Helper Function ---
function generate_whatsapp_link($number, $product_name) {
$text = "Halo, saya tertarik untuk memesan " . $product_name . ". Mohon informasinya.";
return "https://api.whatsapp.com/send?phone=" . $number . "&text=" . urlencode($text);
}
?> ?>
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="id">
<head> <head>
<meta charset="utf-8" /> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>New Style</title> <title>JatimTour - Rental Transport & Paket Wisata Jawa Timur</title>
<?php <meta name="description" content="JatimTour menyediakan layanan rental mobil, sewa bus pariwisata, dan paket wisata terbaik di Jawa Timur. Jelajahi Bromo, Ijen, Malang, dan lainnya bersama kami.">
// Read project preview data from environment <meta name="keywords" content="rental mobil jawa timur, sewa mobil surabaya, paket wisata bromo, tour travel malang, sewa bus pariwisata, travel jawa timur, wisata kawah ijen, flatlogic">
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? ''; <meta property="og:title" content="JatimTour - Rental Transport & Paket Wisata Jawa Timur">
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; <meta property="og:description" content="Layanan profesional untuk rental kendaraan dan paket wisata di seluruh Jawa Timur.">
?> <meta property="og:image" content="<?php echo htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? ''); ?>">
<?php if ($projectDescription): ?> <meta name="twitter:card" content="summary_large_image">
<!-- Meta description --> <meta name="twitter:image" content="<?php echo htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? ''); ?>">
<meta name="description" content='<?= htmlspecialchars($projectDescription) ?>' /> <?php if (file_exists('assets/images/favicon.png')): ?>
<!-- Open Graph meta tags --> <link rel="icon" href="assets/images/favicon.png?v=<?php echo time(); ?>">
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" /> <?php endif; ?>
<!-- Twitter meta tags -->
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" /> <!-- Fonts -->
<?php endif; ?> <link rel="preconnect" href="https://fonts.googleapis.com">
<?php if ($projectImageUrl): ?> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Open Graph image --> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&family=Open+Sans:wght@400;600&display=swap" rel="stylesheet">
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<!-- Twitter image --> <!-- Bootstrap CSS -->
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<?php endif; ?> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <!-- Custom CSS -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
<style>
:root {
--bg-color-start: #6a11cb;
--bg-color-end: #2575fc;
--text-color: #ffffff;
--card-bg-color: rgba(255, 255, 255, 0.01);
--card-border-color: rgba(255, 255, 255, 0.1);
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M-10 10L110 10M10 -10L10 110" stroke-width="1" stroke="rgba(255,255,255,0.05)"/></svg>');
animation: bg-pan 20s linear infinite;
z-index: -1;
}
@keyframes bg-pan {
0% { background-position: 0% 0%; }
100% { background-position: 100% 100%; }
}
main {
padding: 2rem;
}
.card {
background: var(--card-bg-color);
border: 1px solid var(--card-border-color);
border-radius: 16px;
padding: 2rem;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1);
}
.loader {
margin: 1.25rem auto 1.25rem;
width: 48px;
height: 48px;
border: 3px solid rgba(255, 255, 255, 0.25);
border-top-color: #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.hint {
opacity: 0.9;
}
.sr-only {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap; border: 0;
}
h1 {
font-size: 3rem;
font-weight: 700;
margin: 0 0 1rem;
letter-spacing: -1px;
}
p {
margin: 0.5rem 0;
font-size: 1.1rem;
}
code {
background: rgba(0,0,0,0.2);
padding: 2px 6px;
border-radius: 4px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
footer {
position: absolute;
bottom: 1rem;
font-size: 0.8rem;
opacity: 0.7;
}
</style>
</head> </head>
<body> <body>
<main>
<div class="card"> <!-- Header -->
<h1>Analyzing your requirements and generating your website…</h1> <nav class="navbar navbar-expand-lg navbar-light bg-white fixed-top shadow-sm">
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes"> <div class="container">
<span class="sr-only">Loading…</span> <a class="navbar-brand fw-bold text-primary" href="#">
</div> <?php if (file_exists('assets/images/logo.png')): ?>
<p class="hint"><?= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.</p> <img src="assets/images/logo.png?v=<?php echo time(); ?>" alt="JatimTour Logo" style="height: 70px;">
<p class="hint">This page will update automatically as the plan is implemented.</p> <?php else: ?>
<p>Runtime: PHP <code><?= htmlspecialchars($phpVersion) ?></code> — UTC <code><?= htmlspecialchars($now) ?></code></p> aaaaaaaaaaaaaaaaa
</div> <?php endif; ?>
</main> </a>
<footer> <a><bold>Juanda Transport Rental & Tour Travel</bold></a>
Page updated: <?= htmlspecialchars($now) ?> (UTC) <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
</footer> <span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#hero">Beranda</a></li>
<li class="nav-item"><a class="nav-link" href="#tours">Paket Wisata</a></li>
<li class="nav-item"><a class="nav-link" href="#rentals">Rental Kendaraan</a></li>
<li class="nav-item"><a class="nav-link" href="login.php">Admin Login</a></li>
<li class="nav-item"><a class="nav-link btn btn-primary text-white ms-lg-2" href="<?php echo generate_whatsapp_link($admin_whatsapp_number, 'layanan JatimTour'); ?>">Hubungi Kami</a></li>
</ul>
</div>
</div>
</nav>
<!-- Hero Section -->
<section id="hero" class="hero-section text-white text-center d-flex align-items-center">
<div class="container">
<h1 class="display-4 fw-bold">Jelajahi Keindahan Jawa Timur</h1>
<p class="lead my-3">Pengalaman wisata dan transportasi terbaik dengan layanan profesional kami.</p>
<a href="#tours" class="btn btn-lg btn-light text-primary fw-bold">Lihat Paket Wisata</a>
</div>
</section>
<main class="container my-5">
<!-- Paket Wisata Section -->
<section id="tours" class="py-5">
<h2 class="text-center fw-bold mb-4">Paket Wisata Populer</h2>
<div class="row g-4">
<?php if (empty($tour_packages)): ?>
<div class="col-12 text-center">
<p>Saat ini belum ada paket wisata yang tersedia. Silakan cek kembali nanti.</p>
</div>
<?php else: ?>
<?php foreach ($tour_packages as $package): ?>
<div class="col-lg-4 col-md-6">
<div class="card h-100 shadow-sm border-0 tour-card">
<?php
$image_path = !empty($package['gambar']) && file_exists($package['gambar'])
? htmlspecialchars($package['gambar'])
: 'https://via.placeholder.com/400x300.png?text=JatimTour'; // Fallback image
?>
<img src="<?php echo $image_path; ?>" class="card-img-top" alt="<?php echo htmlspecialchars($package['nama']); ?>">
<div class="card-body d-flex flex-column">
<h5 class="card-title fw-bold"><?php echo htmlspecialchars($package['nama']); ?></h5>
<p class="card-text flex-grow-1"><?php echo nl2br(htmlspecialchars($package['deskripsi'])); ?></p>
<p class="card-text fw-bold text-primary">Rp <?php echo number_format($package['harga'], 0, ',', '.'); ?> / orang</p>
<p class="card-text"><small class="text-muted"><?php echo htmlspecialchars($package['durasi']); ?></small></p>
<a href="<?php echo generate_whatsapp_link($admin_whatsapp_number, $package['nama']); ?>" class="btn btn-success mt-auto w-100"><i class="bi bi-whatsapp me-2"></i>Pesan via WhatsApp</a>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</section>
<!-- Rental Kendaraan Section -->
<section id="rentals" class="py-5 bg-light rounded-3">
<h2 class="text-center fw-bold mb-4">Pilihan Kendaraan</h2>
<div class="row g-4">
<?php if (empty($rental_vehicles)): ?>
<div class="col-12 text-center">
<p>Saat ini belum ada kendaraan yang tersedia untuk disewa.</p>
</div>
<?php else: ?>
<?php foreach ($rental_vehicles as $vehicle): ?>
<div class="col-lg-4 col-md-6">
<div class="card h-100 shadow-sm border-0 tour-card">
<?php
$image_path = !empty($vehicle['gambar']) && file_exists($vehicle['gambar'])
? htmlspecialchars($vehicle['gambar'])
: 'https://via.placeholder.com/400x300.png?text=JatimTour'; // Fallback image
?>
<img src="<?php echo $image_path; ?>" class="card-img-top" alt="<?php echo htmlspecialchars($vehicle['nama']); ?>">
<div class="card-body d-flex flex-column">
<h5 class="card-title fw-bold"><?php echo htmlspecialchars($vehicle['nama']); ?></h5>
<div class="d-flex justify-content-between text-muted small mb-2">
<span><i class="bi bi-car-front-fill me-1"></i> <?php echo htmlspecialchars($vehicle['jenis']); ?></span>
<span><i class="bi bi-gear-fill me-1"></i> <?php echo htmlspecialchars($vehicle['transmisi']); ?></span>
</div>
<p class="card-text fw-bold text-primary fs-5">Rp <?php echo number_format($vehicle['harga'], 0, ',', '.'); ?> / hari</p>
<a href="<?php echo generate_whatsapp_link($admin_whatsapp_number, 'Rental ' . $vehicle['nama']); ?>" class="btn btn-success mt-auto w-100"><i class="bi bi-whatsapp me-2"></i>Pesan via WhatsApp</a>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</section>
</main>
<!-- Footer -->
<footer class="bg-dark text-white text-center py-4">
<div class="container">
<p class="mb-0">&copy; <?php echo date("Y"); ?> JatimTour. Dibuat dengan <i class="bi bi-heart-fill text-danger"></i> oleh Flatlogic.</p>
</div>
</footer>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- Custom JS -->
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
</body> </body>
</html> </html>

87
login.php Normal file
View File

@ -0,0 +1,87 @@
<?php
session_start();
// Hardcoded credentials for simplicity
define('ADMIN_USERNAME', 'admin');
define('ADMIN_PASSWORD', 'password');
$error_message = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if ($username === ADMIN_USERNAME && $password === ADMIN_PASSWORD) {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
header('Location: admin.php');
exit;
} else {
$error_message = 'Username atau password salah.';
}
}
// If user is already logged in, redirect to admin page
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
header('Location: admin.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Admin - Juanda Rent & Tour</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css">
<style>
body {
background-color: #f8f9fa;
}
.login-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.login-card {
max-width: 400px;
width: 100%;
padding: 2rem;
border: none;
border-radius: 0.75rem;
box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="login-container">
<div class="card login-card">
<div class="card-body">
<h3 class="card-title text-center mb-4">Admin Login</h3>
<?php if ($error_message): ?>
<div class="alert alert-danger"><?php echo htmlspecialchars($error_message); ?></div>
<?php endif; ?>
<form action="login.php" method="POST">
<div class="mb-3">
<label for="username" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">Login</button>
</div>
</form>
<div class="text-center mt-3">
<a href="index.php">Kembali ke Halaman Utama</a>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

20
logout.php Normal file
View File

@ -0,0 +1,20 @@
<?php
session_start();
// Unset all of the session variables
$_SESSION = [];
// Destroy the session.
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
// Redirect to login page
header('Location: login.php');
exit;
?>