diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..a1d9fb4 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,139 @@ + + +
+

Dashboard

+
+ +
+
+
+
+
+
Total Menu
+

+
+
🍱
+
+
+
+
+
+
+
+
Kategori
+

+
+
πŸ“
+
+
+
+
+
+
+
+
Total Pesanan
+

+
+
πŸ›’
+
+
+
+
+
+
+
+
Pesanan Baru
+

+
+
πŸ””
+
+
+
+
+ +
+
+
+
+
Pesanan Terbaru
+ Lihat Semua +
+
+
+ + + + + + + + + + + + 0): ?> + + + + + + + + + + + + + + + +
IDPelangganWAStatusWaktu
# + 'bg-info', + 'Proses' => 'bg-warning', + 'Selesai' => 'bg-success', + 'Batal' => 'bg-danger' + ]; + ?> + + + +
Belum ada pesanan masuk.
+
+
+
+
+ +
+ + diff --git a/admin/login.php b/admin/login.php new file mode 100644 index 0000000..f08f667 --- /dev/null +++ b/admin/login.php @@ -0,0 +1,68 @@ + + + + + + + Login Admin - Masakan Nusantara Ibu Tini + + + + + + + diff --git a/admin/logout.php b/admin/logout.php new file mode 100644 index 0000000..37bc5ab --- /dev/null +++ b/admin/logout.php @@ -0,0 +1,5 @@ +prepare("DELETE FROM menu WHERE id = ?"); + $stmt->execute([$id]); + header('Location: menu.php?msg=Menu berhasil dihapus'); + exit; +} + + // Handle Form Submit (Add/Edit) +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $nama_menu = $_POST['nama_menu']; + $kategori_id = $_POST['kategori_id']; + $deskripsi = $_POST['deskripsi']; + $harga = $_POST['harga']; + $is_rekomendasi = isset($_POST['is_rekomendasi']) ? 1 : 0; + + $foto = $_POST['old_foto'] ?? ''; + + // Handle Upload Foto + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $tmp_name = $_FILES['foto']['tmp_name']; + $name = basename($_FILES['foto']['name']); + $ext = pathinfo($name, PATHINFO_EXTENSION); + $new_name = uniqid() . '.' . $ext; + $target = "../assets/uploads/" . $new_name; + + if (move_uploaded_file($tmp_name, $target)) { + // Delete old file if exists + if ($foto && file_exists("../assets/uploads/" . $foto)) { + unlink("../assets/uploads/" . $foto); + } + $foto = $new_name; + } + } + + if ($id) { + // Edit + $stmt = db()->prepare("UPDATE menu SET nama_menu=?, kategori_id=?, deskripsi=?, harga=?, is_rekomendasi=?, foto=? WHERE id=?"); + $stmt->execute([$nama_menu, $kategori_id, $deskripsi, $harga, $is_rekomendasi, $foto, $id]); + $msg = "Menu berhasil diperbarui"; + } else { + // Add + $stmt = db()->prepare("INSERT INTO menu (nama_menu, kategori_id, deskripsi, harga, is_rekomendasi, foto) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$nama_menu, $kategori_id, $deskripsi, $harga, $is_rekomendasi, $foto]); + $msg = "Menu berhasil ditambahkan"; + } + header('Location: menu.php?msg=' . $msg); + exit; +} + + +// Fetch data for form +$edit_data = null; +if (($action === 'edit' || $action === 'tambah') && $id) { + $edit_data = fetch_one("SELECT * FROM menu WHERE id = ?", [$id]); +} + +$kategori_list = fetch_all("SELECT * FROM kategori_menu ORDER BY nama_kategori"); +$menu_list = fetch_all("SELECT m.*, k.nama_kategori FROM menu m JOIN kategori_menu k ON m.kategori_id = k.id ORDER BY m.id DESC"); +?> + +
+

Kelola Menu

+ + Tambah Menu Baru + + Kembali ke Daftar + +
+ + +
+ + + +
+
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ Foto saat ini:
+ +
+ +
+
+
+ > + +
+
+
+ + +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
FotoNama MenuKategoriHargaRekomendasiAksi
+ + + + + + + + Ya + + Tidak + + + Edit + Hapus +
+
+
+
+ + + diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..8369d16 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,243 @@ +/* Custom Styles */ + +.hero { + padding: 6rem 0; + background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url('https://images.pexels.com/photos/1640777/pexels-photo-1640777.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'); + background-size: cover; + background-position: center; + color: white; + text-align: center; +} + +.hero-badge { + display: inline-block; + padding: 0.5rem 1rem; + background: rgba(217, 119, 6, 0.9); + border-radius: 2rem; + font-size: 0.875rem; + font-weight: 600; + margin-bottom: 1.5rem; +} + +.hero h1 { + font-size: 3.5rem; + font-weight: 800; + margin-bottom: 1rem; + letter-spacing: -0.025em; +} + +.hero-tagline { + font-size: 1.5rem; + font-weight: 500; + margin-bottom: 2rem; + opacity: 0.9; +} + +.hero-desc { + max-width: 700px; + margin: 0 auto 2.5rem; + font-size: 1.125rem; + opacity: 0.8; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + padding: 0.75rem 2rem; + font-weight: 600; + border-radius: var(--border-radius); +} + +.btn-primary:hover { + background-color: #B45309; + border-color: #B45309; +} + +.btn-outline { + border: 2px solid white; + color: white; + padding: 0.75rem 2rem; + font-weight: 600; + border-radius: var(--border-radius); + text-decoration: none; + transition: all 0.3s; +} + +.btn-outline:hover { + background: white; + color: var(--text-color); +} + +.section { + padding: 5rem 0; +} + +.section-header { + text-align: center; + margin-bottom: 4rem; +} + +.section-header h2 { + font-weight: 700; + font-size: 2.25rem; + margin-bottom: 1rem; +} + +.section-header p { + color: #6B7280; + font-size: 1.125rem; +} + +.kategori-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; +} + +.kategori-card { + background: white; + padding: 2.5rem 1.5rem; + text-align: center; + border-radius: var(--border-radius); + text-decoration: none; + color: inherit; + transition: transform 0.3s, box-shadow 0.3s; + border: 1px solid #E5E7EB; +} + +.kategori-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + color: var(--primary-color); +} + +.kategori-icon { + font-size: 3rem; + margin-bottom: 1.5rem; +} + +.kategori-card h3 { + font-size: 1.25rem; + font-weight: 700; + margin-bottom: 0.5rem; +} + +.kategori-card p { + font-size: 0.875rem; + color: #6B7280; + margin-bottom: 0; +} + +.menu-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; +} + +.menu-card { + background: white; + border-radius: var(--border-radius); + overflow: hidden; + border: 1px solid #E5E7EB; + transition: box-shadow 0.3s; +} + +.menu-card:hover { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); +} + +.menu-card-img { + height: 200px; + position: relative; +} + +.menu-card-img img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.menu-badge { + position: absolute; + top: 1rem; + right: 1rem; + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.75rem; + font-weight: 600; +} + +.rekomendasi { + background: var(--primary-color); + color: white; +} + +.menu-card-body { + padding: 1.5rem; +} + +.menu-kategori { + font-size: 0.75rem; + font-weight: 600; + color: var(--primary-color); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: 0.5rem; + display: block; +} + +.menu-card h3 { + font-size: 1.25rem; + font-weight: 700; + margin-bottom: 0.75rem; +} + +.menu-card p { + font-size: 0.875rem; + color: #6B7280; + margin-bottom: 1.5rem; +} + +.menu-harga { + display: flex; + justify-content: space-between; + align-items: center; +} + +.harga { + font-weight: 700; + font-size: 1.125rem; + color: var(--text-color); +} + +.btn-whatsapp { + background-color: #25D366; + color: white; + border: none; +} + +.btn-whatsapp:hover { + background-color: #128C7E; + color: white; +} + +.keunggulan-item { + display: flex; + gap: 1.5rem; + margin-bottom: 2rem; +} + +.keunggulan-icon { + font-size: 2rem; + flex-shrink: 0; +} + +.keunggulan-item h4 { + font-weight: 700; + margin-bottom: 0.5rem; +} + +.keunggulan-item p { + color: #6B7280; + margin-bottom: 0; +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..d7fa557 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,17 @@ +// Main Interactivity +document.addEventListener('DOMContentLoaded', function() { + console.log('Masakan Nusantara Ibu Tini - Ready'); + + // Smooth scroll for anchor links + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth' + }); + } + }); + }); +}); diff --git a/db/migrations/001_initial_schema.sql b/db/migrations/001_initial_schema.sql new file mode 100644 index 0000000..b3010ba --- /dev/null +++ b/db/migrations/001_initial_schema.sql @@ -0,0 +1,56 @@ +CREATE TABLE IF NOT EXISTS profil_usaha ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_usaha VARCHAR(255) NOT NULL, + tagline VARCHAR(255), + deskripsi TEXT, + alamat TEXT, + whatsapp VARCHAR(20), + email VARCHAR(100), + instagram VARCHAR(100), + logo VARCHAR(255) +); + +CREATE TABLE IF NOT EXISTS kategori_menu ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_kategori VARCHAR(100) NOT NULL, + slug VARCHAR(100) NOT NULL UNIQUE, + deskripsi TEXT, + urutan INT DEFAULT 0, + status TINYINT(1) DEFAULT 1 +); + +CREATE TABLE IF NOT EXISTS menu ( + id INT AUTO_INCREMENT PRIMARY KEY, + kategori_id INT, + nama_menu VARCHAR(255) NOT NULL, + deskripsi TEXT, + harga DECIMAL(10, 2) NOT NULL, + harga_diskon DECIMAL(10, 2), + foto VARCHAR(255), + is_rekomendasi TINYINT(1) DEFAULT 0, + status TINYINT(1) DEFAULT 1, + FOREIGN KEY (kategori_id) REFERENCES kategori_menu(id) +); + +CREATE TABLE IF NOT EXISTS galeri ( + id INT AUTO_INCREMENT PRIMARY KEY, + judul VARCHAR(255), + foto VARCHAR(255), + status TINYINT(1) DEFAULT 1 +); + +-- Seed Data +INSERT INTO profil_usaha (nama_usaha, tagline, deskripsi, whatsapp) +VALUES ('MASAKAN NUSANTARA IBU TINI', 'Melayani Catering Harian, Acara, Nasi Box & Snack Box', 'Nikmati cita rasa autentik masakan Nusantara dengan bahan-bahan segar dan bumbu tradisional.', '6285714955640'); + +INSERT INTO kategori_menu (nama_kategori, slug, deskripsi, urutan) VALUES +('Nasi Box', 'nasi-box', 'Paket nasi lengkap dalam kemasan praktis.', 1), +('Prasmanan', 'prasmanan', 'Layanan prasmanan untuk acara besar.', 2), +('Tumpeng', 'tumpeng', 'Tumpeng nasi kuning/putih untuk syukuran.', 3), +('Snack Box', 'snack-box', 'Aneka kue dan jajanan pasar.', 4), +('Menu Harian', 'menu-harian', 'Katering harian untuk rumah dan kantor.', 5); + +INSERT INTO menu (kategori_id, nama_menu, deskripsi, harga, is_rekomendasi) VALUES +(1, 'Nasi Ayam Bakar Madu', 'Nasi putih, ayam bakar madu, sambal, lalapan, tahu & tempe.', 25000, 1), +(1, 'Nasi Rendang Padang', 'Nasi putih, rendang daging sapi, sayur nangka, sambal ijo.', 30000, 1), +(4, 'Paket Snack Manis', 'Kue sus, risoles, lemper ayam.', 15000, 1); diff --git a/db/migrations/002_admin_and_orders.sql b/db/migrations/002_admin_and_orders.sql new file mode 100644 index 0000000..a5b0314 --- /dev/null +++ b/db/migrations/002_admin_and_orders.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS admins ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + nama_lengkap VARCHAR(100), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS pesanan ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_pelanggan VARCHAR(100) NOT NULL, + whatsapp VARCHAR(20) NOT NULL, + alamat_pengiriman TEXT, + tanggal_kirim DATE, + total_harga DECIMAL(10, 2), + status ENUM('Baru', 'Proses', 'Selesai', 'Batal') DEFAULT 'Baru', + catatan TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS pesanan_item ( + id INT AUTO_INCREMENT PRIMARY KEY, + pesanan_id INT, + menu_id INT, + qty INT NOT NULL, + harga_saat_pesan DECIMAL(10, 2) NOT NULL, + FOREIGN KEY (pesanan_id) REFERENCES pesanan(id) ON DELETE CASCADE, + FOREIGN KEY (menu_id) REFERENCES menu(id) +); + +-- Default Admin: admin / admin123 +INSERT INTO admins (username, password, nama_lengkap) +VALUES ('admin', '$2y$10$2WEIuzHnD1ZJYg4WzJ9Wt.kfha4lyP3APX/LRki9OhnYf1T5yixjq', 'Administrator Ibu Tini'); diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000..2de66c0 --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,46 @@ +
+
+
+
+
Masakan Nusantara Ibu Tini
+

Nikmati cita rasa autentik masakan Nusantara dengan bahan-bahan segar dan bumbu tradisional. Cocok untuk berbagai acara Anda.

+
+
+
Tautan
+ +
+
+
Layanan
+
    +
  • Nasi Box
  • +
  • Prasmanan
  • +
  • Tumpeng
  • +
  • Snack Box
  • +
+
+
+
Kontak
+
    +
  • Jakarta, Indonesia
  • +
  • +62 857 1495 5640
  • +
+
+
+
+
+ © Masakan Nusantara Ibu Tini. All rights reserved. + +
+
+
+ + + + + diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..416a6c5 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,66 @@ + + + + + + <?php echo isset($page_title) ? $page_title . " - " : ""; ?>Masakan Nusantara Ibu Tini + + + + + + + + + + + + + + + + + + + + diff --git a/includes/koneksi.php b/includes/koneksi.php new file mode 100644 index 0000000..deb6898 --- /dev/null +++ b/includes/koneksi.php @@ -0,0 +1,18 @@ +prepare($sql); + $stmt->execute($params); + return $stmt->fetch(); +} + +function fetch_all($sql, $params = []) { + $stmt = db()->prepare($sql); + $stmt->execute($params); + return $stmt->fetchAll(); +} + +function rupiah($angka) { + return "Rp " . number_format($angka, 0, ',', '.'); +} diff --git a/index.php b/index.php index 7205f3d..d54603b 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,187 @@ - - - - - - New Style - - - - - - - - - - - - - - - - - - - - - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP β€” UTC

+ + +
+
+
+ ✨ Catering Masakan Rumahan +

+

+

+ +

+ +
-
-
- Page updated: (UTC) -
- - + + + +
+ +
+ + + + + +
+
+
+

Mengapa Memilih Kami?

+

Keunggulan layanan catering MASAKAN NUSANTARA IBU TINI

+
+ +
+
+ Catering Service +
+
+
+
+
πŸ₯˜
+
+

Rasa Autentik Nusantara

+

Masakan dibuat dengan resep tradisional turun-temurun yang menjaga cita rasa asli Indonesia.

+
+
+ +
+
πŸ₯¬
+
+

Bahan Segar Berkualitas

+

Kami hanya menggunakan bahan-bahan segar dan berkualitas untuk setiap hidangan.

+
+
+ +
+
✨
+
+

Higienis & Bersih

+

Proses pengolahan makanan mengikuti standar kebersihan yang ketat untuk kesehatan Anda.

+
+
+ +
+
🚚
+
+

Pengiriman Tepat Waktu

+

Kami menjamin pesanan Anda sampai di lokasi tepat waktu untuk menjaga kesegaran hidangan.

+
+
+
+
+
+
+
+ +