feat: complete modern PHP tire showcase, calculator, comparison, guide and admin platform
This commit is contained in:
+328
@@ -0,0 +1,328 @@
|
||||
<?php
|
||||
// admin/index.php
|
||||
require_once __DIR__ . '/../includes/db.php';
|
||||
|
||||
$message = '';
|
||||
$error = '';
|
||||
|
||||
// Handle add / update tire
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$action = $_POST['admin_action'] ?? '';
|
||||
|
||||
if ($action === 'add_tire') {
|
||||
$id = 'TR-' . (count(TireStore::getTires()) + 101);
|
||||
$name = trim($_POST['name'] ?? '');
|
||||
$brand = trim($_POST['brand'] ?? '');
|
||||
$country = trim($_POST['country'] ?? '');
|
||||
$category = trim($_POST['category'] ?? 'سواری');
|
||||
$width = intval($_POST['width'] ?? 185);
|
||||
$aspect = intval($_POST['aspect_ratio'] ?? 65);
|
||||
$rim = intval($_POST['rim'] ?? 14);
|
||||
$speed = trim($_POST['speed_index'] ?? 'H');
|
||||
$load = trim($_POST['load_index'] ?? '86');
|
||||
$price = intval($_POST['price'] ?? 0);
|
||||
$stock = intval($_POST['stock'] ?? 10);
|
||||
$warranty = intval($_POST['warranty_months'] ?? 36);
|
||||
$vehicles = array_filter(array_map('trim', explode(',', $_POST['vehicles'] ?? '')));
|
||||
$desc = trim($_POST['description'] ?? '');
|
||||
|
||||
if ($name && $brand && $price > 0) {
|
||||
$newTire = [
|
||||
"id" => $id,
|
||||
"name" => $name,
|
||||
"brand" => $brand,
|
||||
"country" => $country,
|
||||
"category" => $category,
|
||||
"width" => $width,
|
||||
"aspect_ratio" => $aspect,
|
||||
"rim" => $rim,
|
||||
"size_str" => "{$width}/{$aspect}R{$rim}",
|
||||
"speed_index" => $speed,
|
||||
"load_index" => $load,
|
||||
"season" => "four_season",
|
||||
"season_fa" => "چهار فصل",
|
||||
"warranty_months" => $warranty,
|
||||
"production_year" => "2026",
|
||||
"fuel_efficiency" => "B",
|
||||
"wet_grip" => "A",
|
||||
"noise_level" => "69 dB",
|
||||
"price" => $price,
|
||||
"discount_percent" => 0,
|
||||
"stock" => $stock,
|
||||
"rating" => 5.0,
|
||||
"reviews_count" => 1,
|
||||
"vehicles" => $vehicles,
|
||||
"description" => $desc,
|
||||
"features" => ["تولید سال ۲۰۲۶ با گارانتی شرکتی", "ترکیب سیلیکایی با دوام بالا"],
|
||||
"image" => "assets/images/tire_barez_p648.svg",
|
||||
"is_featured" => false,
|
||||
"is_best_seller" => false
|
||||
];
|
||||
TireStore::addTire($newTire);
|
||||
$message = 'تایر جدید با موفقیت به انبار و کاتالوگ اضافه گردید.';
|
||||
} else {
|
||||
$error = 'لطفاً تمامی فیلدهای الزامی را پر کنید.';
|
||||
}
|
||||
}
|
||||
|
||||
if ($action === 'delete_tire') {
|
||||
$delId = $_POST['tire_id'] ?? '';
|
||||
if ($delId) {
|
||||
TireStore::deleteTire($delId);
|
||||
$message = "تایر با شناسه {$delId} حذف گردید.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$tires = TireStore::getTires();
|
||||
$consultations = TireStore::getConsultations();
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="fa" dir="rtl" class="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>پنل مدیریت و انبارداری | تایر قاسمی</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;600;700;900&display=swap" rel="stylesheet">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script src="https://unpkg.com/lucide@latest"></script>
|
||||
<style>
|
||||
* { font-family: 'Vazirmatn', sans-serif; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-[#0b0f17] text-slate-100 min-h-screen">
|
||||
|
||||
<!-- Top Admin Bar -->
|
||||
<header class="border-b border-slate-800 bg-slate-900/80 sticky top-0 z-40 backdrop-blur">
|
||||
<div class="max-w-7xl mx-auto px-4 py-4 flex items-center justify-between">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-9 h-9 rounded-xl bg-brand-600 flex items-center justify-center text-white">
|
||||
<i data-lucide="shield" class="w-5 h-5"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h1 class="text-base font-black text-white">داشبورد مدیریت تایر قاسمی</h1>
|
||||
<p class="text-[10px] text-slate-400">انبارداری، استعلامها و کاتالوگ محصولات</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-3">
|
||||
<a href="../index.php" class="px-3.5 py-1.5 rounded-xl bg-slate-800 hover:bg-slate-700 text-xs font-bold text-slate-300 flex items-center gap-1.5">
|
||||
<i data-lucide="external-link" class="w-3.5 h-3.5"></i>
|
||||
مشاهده سایت
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="max-w-7xl mx-auto px-4 py-8 space-y-8">
|
||||
|
||||
<?php if ($message): ?>
|
||||
<div class="p-4 rounded-2xl bg-emerald-500/20 border border-emerald-500/30 text-emerald-300 text-xs font-bold flex items-center gap-2">
|
||||
<i data-lucide="check-circle" class="w-4 h-4"></i> <?= htmlspecialchars($message) ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($error): ?>
|
||||
<div class="p-4 rounded-2xl bg-rose-500/20 border border-rose-500/30 text-rose-300 text-xs font-bold flex items-center gap-2">
|
||||
<i data-lucide="alert-circle" class="w-4 h-4"></i> <?= htmlspecialchars($error) ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Stats Overview Cards -->
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<div class="p-5 rounded-2xl bg-slate-900 border border-slate-800">
|
||||
<span class="text-xs text-slate-400">تنوع کل تایرها در انبار</span>
|
||||
<div class="text-2xl font-black text-white mt-1"><?= count($tires) ?> <span class="text-xs text-slate-500 font-normal">مدل</span></div>
|
||||
</div>
|
||||
|
||||
<div class="p-5 rounded-2xl bg-slate-900 border border-slate-800">
|
||||
<span class="text-xs text-slate-400">مجموع موجودی حلقهها</span>
|
||||
<div class="text-2xl font-black text-amber-400 mt-1"><?= array_sum(array_column($tires, 'stock')) ?> <span class="text-xs text-slate-500 font-normal">حلقه</span></div>
|
||||
</div>
|
||||
|
||||
<div class="p-5 rounded-2xl bg-slate-900 border border-slate-800">
|
||||
<span class="text-xs text-slate-400">درخواستهای مشاوره و استعلام</span>
|
||||
<div class="text-2xl font-black text-emerald-400 mt-1"><?= count($consultations) ?> <span class="text-xs text-slate-500 font-normal">مورد</span></div>
|
||||
</div>
|
||||
|
||||
<div class="p-5 rounded-2xl bg-slate-900 border border-slate-800">
|
||||
<span class="text-xs text-slate-400">وضعیت سرور و اتصال گیت</span>
|
||||
<div class="text-sm font-bold text-cyan-400 mt-2 flex items-center gap-1.5">
|
||||
<span class="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></span> آنلاین و فعال
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Add New Tire Form Accordion -->
|
||||
<div class="p-6 rounded-3xl bg-slate-900 border border-slate-800 space-y-4">
|
||||
<h2 class="text-base font-black text-white flex items-center gap-2">
|
||||
<i data-lucide="plus-circle" class="w-5 h-5 text-brand-400"></i>
|
||||
افزودن تایر جدید به انبار و کاتالوگ
|
||||
</h2>
|
||||
|
||||
<form method="POST" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 text-xs">
|
||||
<input type="hidden" name="admin_action" value="add_tire">
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">نام و مدل تایر *</label>
|
||||
<input type="text" name="name" required placeholder="مثلاً: بارز پریمیوم P660" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">برند سازنده *</label>
|
||||
<input type="text" name="brand" required placeholder="بارز، کویر، هانکوک..." class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">کشور سازنده</label>
|
||||
<input type="text" name="country" placeholder="ایران، کره جنوبی، فرانسه..." class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">دستهبندی</label>
|
||||
<select name="category" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
<option value="سواری">سواری شهری</option>
|
||||
<option value="اسپرت">اسپرت و ریسینگ</option>
|
||||
<option value="شاسی بلند و آفرود (SUV/4x4)">شاسی بلند و آفرود (SUV/4x4)</option>
|
||||
<option value="لوکس و پرمیوم">لوکس و پرمیوم</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">پهنا (Width - mm)</label>
|
||||
<input type="number" name="width" value="205" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">نسبت فاق (Aspect - %)</label>
|
||||
<input type="number" name="aspect_ratio" value="55" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">قطر رینگ (Rim - اینچ)</label>
|
||||
<input type="number" name="rim" value="16" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">قیمت هر حلقه (تومان) *</label>
|
||||
<input type="number" name="price" required placeholder="5500000" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">موجودی انبار (حلقه)</label>
|
||||
<input type="number" name="stock" value="20" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block font-bold text-slate-300 mb-1">گارانتی (ماه)</label>
|
||||
<input type="number" name="warranty_months" value="36" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-2">
|
||||
<label class="block font-bold text-slate-300 mb-1">خودروهای سازگار (با کاما جدا کنید)</label>
|
||||
<input type="text" name="vehicles" placeholder="دنا پلاس, تارا, شاهین, مگان" class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-4">
|
||||
<label class="block font-bold text-slate-300 mb-1">توضیحات فنی و کاربرد</label>
|
||||
<input type="text" name="description" placeholder="توضیح کوتاه درباره کارایی و چسبندگی تایر..." class="w-full bg-slate-950 border border-slate-800 rounded-xl px-3 py-2 text-white">
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-4 pt-2">
|
||||
<button type="submit" class="px-6 py-2.5 rounded-xl bg-emerald-600 hover:bg-emerald-500 text-white font-bold transition-all shadow">
|
||||
افزودن و انتشار در کاتالوگ
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Tire Inventory Table -->
|
||||
<div class="p-6 rounded-3xl bg-slate-900 border border-slate-800 space-y-4">
|
||||
<h2 class="text-base font-black text-white flex items-center gap-2">
|
||||
<i data-lucide="database" class="w-5 h-5 text-amber-400"></i>
|
||||
مدیریت موجودی و قیمت تایرها
|
||||
</h2>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full text-right text-xs">
|
||||
<thead>
|
||||
<tr class="border-b border-slate-800 text-slate-400">
|
||||
<th class="p-3">کد</th>
|
||||
<th class="p-3">نام و مدل تایر</th>
|
||||
<th class="p-3">برند</th>
|
||||
<th class="p-3">سایز</th>
|
||||
<th class="p-3">قیمت مصوب</th>
|
||||
<th class="p-3">موجودی</th>
|
||||
<th class="p-3">گارانتی</th>
|
||||
<th class="p-3 text-center">عملیات</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-slate-800/60 text-slate-200">
|
||||
<?php foreach ($tires as $t): ?>
|
||||
<tr class="hover:bg-slate-800/30">
|
||||
<td class="p-3 font-mono text-slate-400"><?= $t['id'] ?></td>
|
||||
<td class="p-3 font-bold text-white"><?= htmlspecialchars($t['name']) ?></td>
|
||||
<td class="p-3 text-brand-400 font-medium"><?= htmlspecialchars($t['brand']) ?></td>
|
||||
<td class="p-3"><span class="px-2 py-0.5 rounded bg-slate-800"><?= $t['size_str'] ?></span></td>
|
||||
<td class="p-3 font-bold"><?= number_format($t['price']) ?> تومان</td>
|
||||
<td class="p-3"><span class="px-2 py-0.5 rounded <?= $t['stock'] > 10 ? 'bg-emerald-500/20 text-emerald-400' : 'bg-rose-500/20 text-rose-400' ?>"><?= $t['stock'] ?> حلقه</span></td>
|
||||
<td class="p-3"><?= $t['warranty_months'] ?> ماه</td>
|
||||
<td class="p-3 text-center">
|
||||
<form method="POST" onsubmit="return confirm('آیا از حذف این تایر مطمئن هستید؟');" class="inline">
|
||||
<input type="hidden" name="admin_action" value="delete_tire">
|
||||
<input type="hidden" name="tire_id" value="<?= $t['id'] ?>">
|
||||
<button type="submit" class="p-1.5 rounded-lg bg-rose-500/10 hover:bg-rose-500/30 text-rose-400 transition-colors" title="حذف تایر">
|
||||
<i data-lucide="trash-2" class="w-4 h-4"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Inquiries / Consultations Table -->
|
||||
<div class="p-6 rounded-3xl bg-slate-900 border border-slate-800 space-y-4">
|
||||
<h2 class="text-base font-black text-white flex items-center gap-2">
|
||||
<i data-lucide="headset" class="w-5 h-5 text-emerald-400"></i>
|
||||
درخواستهای استعلام قیمت و مشاوره کاربران
|
||||
</h2>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full text-right text-xs">
|
||||
<thead>
|
||||
<tr class="border-b border-slate-800 text-slate-400">
|
||||
<th class="p-3">کد</th>
|
||||
<th class="p-3">نام مشتری</th>
|
||||
<th class="p-3">شماره تماس</th>
|
||||
<th class="p-3">خودرو</th>
|
||||
<th class="p-3">متن پیام</th>
|
||||
<th class="p-3">تاریخ ثبت</th>
|
||||
<th class="p-3">وضعیت</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-slate-800/60 text-slate-200">
|
||||
<?php foreach ($consultations as $c): ?>
|
||||
<tr class="hover:bg-slate-800/30">
|
||||
<td class="p-3 font-mono text-slate-400"><?= $c['id'] ?></td>
|
||||
<td class="p-3 font-bold text-white"><?= htmlspecialchars($c['name']) ?></td>
|
||||
<td class="p-3 font-mono text-brand-400"><?= htmlspecialchars($c['phone']) ?></td>
|
||||
<td class="p-3 text-slate-300"><?= htmlspecialchars($c['car'] ?: '-') ?></td>
|
||||
<td class="p-3 text-slate-400 max-w-xs truncate"><?= htmlspecialchars($c['message'] ?: '-') ?></td>
|
||||
<td class="p-3 text-slate-500"><?= htmlspecialchars($c['created_at']) ?></td>
|
||||
<td class="p-3"><span class="px-2 py-0.5 rounded bg-emerald-500/20 text-emerald-400 font-bold"><?= htmlspecialchars($c['status']) ?></span></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
lucide.createIcons();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user