Initial commit — AsadiTools v1.0
CI/CD / CI — dotnet build (push) Successful in 44s
CI/CD / Deploy — docker compose (push) Failing after 1s

Full ASP.NET Core 10 Razor Pages app for آساد ابزار tool repair shop
in Karaj, Iran (official DeWalt representative).

Features:
- Homepage, Services, DeWalt page, Shop (pagination + images)
- 10 brand SEO pages (/brands/*) with rich Persian content + FAQ schema
- Blog engine with admin management (/blog, /Admin/Blog)
- Cart, Checkout, Contact (OpenStreetMap embed)
- Admin panel: Products CRUD, Orders, Blog, Change Password
- Jalali date formatting, product images, SiteData centralised contact
- Docker + docker-compose with healthcheck
- Gitea CI/CD via .gitea/workflows/ci-cd.yml (NuGet through Nexus mirror)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Soroush Asadi
2026-06-01 22:08:43 +03:30
commit f97f891d67
146 changed files with 88128 additions and 0 deletions
+318
View File
@@ -0,0 +1,318 @@
@page
@model AsadiTools.Pages.IndexModel
@{
ViewData["Title"] = "آساد ابزار - نمایندگی رسمی دیوالت در کرج";
ViewData["Description"] = "نمایندگی رسمی دیوالت، ماکیتا، رونیکس، توسن و بلک اند دکر در کرج. تعمیر دریل، فرز، مینی فرز، شمشاد زن و بتن کن با ضمانت.";
Layout = "_Layout";
}
@section Head {
<script type="application/ld+json">
{"@@context":"https://schema.org","@@type":"LocalBusiness","name":"آساد ابزار کرج","image":"https://images.unsplash.com/photo-1504148455328-c376907d081c?w=800","telephone":"+98@SiteData.Company.TelPhone.Substring(1)","address":{"@@type":"PostalAddress","streetAddress":"@SiteData.Company.Address","addressLocality":"کرج","addressRegion":"البرز","postalCode":"31489","addressCountry":"IR"},"openingHours":"Mo-Sa 08:00-18:00","priceRange":"$$","sameAs":["https://instagram.com/@SiteData.Company.Instagram"]}
</script>
}
<!-- ═══════════════════════════════ HERO ═══════════════════════════════════ -->
<section class="relative text-white overflow-hidden" style="min-height:580px">
<!-- Background image with overlay -->
<div class="absolute inset-0 bg-cover bg-center bg-no-repeat"
style="background-image:url('https://images.unsplash.com/photo-1504148455328-c376907d081c?w=1400&q=80&auto=format&fit=crop')"></div>
<div class="absolute inset-0 bg-gradient-to-l from-blue-900/95 via-blue-900/85 to-blue-800/70"></div>
<div class="relative max-w-6xl mx-auto px-4 py-20 grid md:grid-cols-2 gap-12 items-center">
<!-- Text -->
<div>
<div class="inline-flex items-center gap-2 bg-yellow-400 text-gray-900 text-sm font-bold px-4 py-1.5 rounded-full mb-5 shadow-lg">
🛡️ نمایندگی رسمی دیوالت در کرج
</div>
<h1 class="text-4xl md:text-5xl font-extrabold leading-tight mb-5">
تعمیر تخصصی<br>
<span class="text-yellow-300">ابزار صنعتی</span><br>
در کرج
</h1>
<p class="text-blue-100 text-lg leading-8 mb-8">
با بیش از ۱۵ سال تجربه، تعمیر دریل، فرز، مینی فرز، بتن‌کن و شمشاد‌زن
برندهای دیوالت، ماکیتا، رونیکس، توسن و بلک اند دکر.
</p>
<div class="flex flex-wrap gap-3 mb-10">
<a href="/Contact" class="bg-yellow-400 text-gray-900 font-bold px-6 py-3 rounded-xl hover:bg-yellow-300 transition-colors shadow-lg">📞 تماس برای تعمیر</a>
<a href="/Shop" class="border-2 border-white/80 text-white font-bold px-6 py-3 rounded-xl hover:bg-white hover:text-blue-900 transition-colors">🛒 فروشگاه قطعات</a>
<a href="/DeWalt" class="bg-white/10 border border-white/30 text-white font-bold px-6 py-3 rounded-xl hover:bg-white/20 transition-colors">🔧 ابزار دیوالت</a>
</div>
<!-- Quick trust badges -->
<div class="flex flex-wrap gap-3">
@foreach (var badge in new[] { "✅ ضمانت ۳ ماهه", "✅ قطعات اصل", "✅ تشخیص رایگان", "✅ تحویل سریع" })
{
<span class="text-sm text-blue-100 bg-white/10 px-3 py-1 rounded-full">@badge</span>
}
</div>
</div>
<!-- Stats cards -->
<div class="grid grid-cols-2 gap-4">
@foreach (var s in new[] {
("+۱۵", "سال تجربه", "🏆"),
("+۵۰۰۰", "دستگاه تعمیر شده", "🔧"),
("۵", "برند پشتیبانی", "⭐"),
("۱۰۰٪", "ضمانت تعمیر", "🛡️")
})
{
<div class="bg-white/10 backdrop-blur-sm rounded-2xl p-6 text-center border border-white/20 hover:bg-white/15 transition-colors">
<div class="text-3xl mb-2">@s.Item3</div>
<div class="text-3xl font-extrabold text-yellow-300 mb-1">@s.Item1</div>
<div class="text-sm text-blue-100">@s.Item2</div>
</div>
}
</div>
</div>
</section>
<!-- ══════════════════════ DEWALT FEATURED ════════════════════════════════ -->
<section class="py-16 px-4" style="background:linear-gradient(135deg,#1a1a1a 0%,#2d2d00 50%,#1a1a00 100%)">
<div class="max-w-6xl mx-auto grid md:grid-cols-2 gap-12 items-center">
<!-- Image -->
<div class="relative rounded-3xl overflow-hidden shadow-2xl" style="height:380px">
<img src="https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=700&q=85&auto=format&fit=crop"
alt="ابزار دیوالت" class="w-full h-full object-cover" loading="lazy" />
<div class="absolute inset-0 bg-gradient-to-t from-black/60 to-transparent"></div>
<div class="absolute bottom-4 right-4">
<span class="bg-yellow-400 text-gray-900 font-extrabold px-4 py-2 rounded-xl text-sm shadow-lg">DEWALT</span>
</div>
</div>
<!-- Content -->
<div class="text-white">
<div class="inline-flex items-center gap-2 bg-yellow-400 text-gray-900 text-xs font-bold px-3 py-1 rounded-full mb-4">
🛡️ مجاز از DeWalt ایران
</div>
<h2 class="text-3xl font-extrabold mb-4 leading-tight">
نمایندگی رسمی<br>
<span class="text-yellow-400">DeWalt</span> در کرج
</h2>
<p class="text-gray-300 leading-8 mb-6">
آساد ابزار افتخار دارد تنها نمایندگی مجاز تعمیر ابزار دیوالت در کرج باشد.
تمامی تعمیرات توسط تکنیسین‌های آموزش‌دیده و با قطعات کاملاً اورجینال انجام می‌شود.
خدمات پشتیبانی شامل بیش از ۱۵ مدل از محبوب‌ترین ابزار دیوالت است.
</p>
<div class="grid grid-cols-2 gap-3 mb-6">
@foreach (var f in new[] { ("۱۵+", "مدل ابزار"), ("قطعه اصل", "دیوالت"), ("آموزش رسمی", "تکنیسین"), ("ضمانت کتبی", "تعمیر") })
{
<div class="bg-white/10 rounded-xl p-3 text-center border border-yellow-400/30">
<div class="font-bold text-yellow-400 text-lg">@f.Item1</div>
<div class="text-xs text-gray-300">@f.Item2</div>
</div>
}
</div>
<div class="flex gap-3">
<a href="/DeWalt" class="bg-yellow-400 text-gray-900 font-bold px-6 py-3 rounded-xl hover:bg-yellow-300 transition-colors">مشاهده همه ابزار دیوالت</a>
<a href="/Services/Brand?id=dewalt" class="border border-yellow-400/50 text-yellow-300 font-bold px-6 py-3 rounded-xl hover:border-yellow-400 transition-colors">خدمات تعمیر </a>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════ BRANDS ════════════════════════════════════════ -->
<section class="py-16 px-4 bg-white">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-2">برندهایی که تعمیر می‌کنیم</h2>
<p class="text-gray-500">تخصص ما در نمایندگی و تعمیر برترین برندهای ابزار صنعتی جهان</p>
</div>
<div class="grid grid-cols-2 md:grid-cols-5 gap-4">
@foreach (var b in SiteData.Brands)
{
<a href="/Services/Brand?id=@b.Id"
class="group relative border-2 rounded-2xl p-5 text-center hover:shadow-xl transition-all hover:-translate-y-1"
style="border-color:@(b.IsOfficial ? "#f59e0b" : "#e5e7eb")">
@if (b.IsOfficial)
{
<div class="absolute -top-3 right-1/2 translate-x-1/2 bg-yellow-400 text-gray-900 text-xs font-bold px-2 py-0.5 rounded-full whitespace-nowrap">🛡️ رسمی</div>
}
<div class="w-16 h-16 rounded-2xl flex items-center justify-center text-2xl font-extrabold mx-auto mb-3 shadow-md"
style="background-color:@b.Color;color:@b.TextColor">
@b.Name.Substring(0, 2)
</div>
<div class="font-bold text-gray-800">@b.NameFa</div>
<div class="text-xs text-gray-400 mt-0.5">@b.Name</div>
<div class="text-xs text-blue-600 mt-2 group-hover:underline">خدمات تعمیر </div>
</a>
}
</div>
</div>
</section>
<!-- ══════════════════════ TOOLS WE REPAIR ═══════════════════════════════ -->
<section class="py-16 px-4 bg-gray-50">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-2">ابزارهایی که تعمیر می‌کنیم</h2>
<p class="text-gray-500">تخصص کامل در تعمیر انواع ابزار برقی صنعتی</p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
@{
var toolImages = new Dictionary<string, string>
{
["drill"] = "https://images.unsplash.com/photo-1572981779307-38b8cabb2407?w=500&q=75&auto=format&fit=crop",
["grinder"] = "https://images.unsplash.com/photo-1487452066049-a710f7296400?w=500&q=75&auto=format&fit=crop",
["mini-grinder"] = "https://images.unsplash.com/photo-1504148455328-c376907d081c?w=500&q=75&auto=format&fit=crop",
["hedge-trimmer"] = "https://images.unsplash.com/photo-1416879595882-3373a0480b5b?w=500&q=75&auto=format&fit=crop",
["rotary-hammer"] = "https://images.unsplash.com/photo-1504307651254-35680f356dfd?w=500&q=75&auto=format&fit=crop",
["laser-level"] = "https://images.unsplash.com/photo-1609220136736-443140cfeaa8?w=500&q=75&auto=format&fit=crop",
["gerd-bar"] = "https://images.unsplash.com/photo-1503387762-592deb58ef4e?w=500&q=75&auto=format&fit=crop",
["miter-saw"] = "https://images.unsplash.com/photo-1558618047-3c8c1d8b9df1?w=500&q=75&auto=format&fit=crop",
["woodworking"] = "https://images.unsplash.com/photo-1588854337115-1c67d9247e4d?w=500&q=75&auto=format&fit=crop",
["laser-measure"] = "https://images.unsplash.com/photo-1518770660439-4636190af475?w=500&q=75&auto=format&fit=crop",
};
}
@foreach (var t in SiteData.ToolTypes)
{
var img = toolImages.TryGetValue(t.Id, out var u) ? u : "";
<a href="/Services" class="bg-white rounded-2xl overflow-hidden border border-gray-100 hover:shadow-lg transition-all hover:-translate-y-0.5 block group">
@if (!string.IsNullOrEmpty(img))
{
<div class="h-44 overflow-hidden relative">
<img src="@img" alt="تعمیر @t.NameFa" loading="lazy"
class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" />
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent"></div>
<div class="absolute bottom-3 right-4 text-3xl">@t.Icon</div>
</div>
}
<div class="p-6">
<h3 class="font-bold text-xl text-gray-900 mb-2">تعمیر @t.NameFa</h3>
<p class="text-gray-500 text-sm leading-7 mb-4">@t.Description</p>
<ul class="space-y-1.5">
@foreach (var issue in t.CommonIssues.Take(3))
{
<li class="flex items-start gap-2 text-sm text-gray-600">
<span class="text-green-500 shrink-0 mt-0.5">✓</span> @issue
</li>
}
</ul>
<div class="mt-4 text-blue-600 text-sm font-medium group-hover:underline">مشاهده جزئیات </div>
</div>
</a>
}
</div>
</div>
</section>
<!-- ══════════════════════ WORKSHOP GALLERY ═══════════════════════════════ -->
<section class="py-16 px-4 bg-white">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-2">کارگاه تعمیر آساد ابزار</h2>
<p class="text-gray-500">نگاهی به محیط کاری و تجهیزات تخصصی ما</p>
</div>
<div class="grid grid-cols-2 md:grid-cols-3 gap-3">
@{
var gallery = new[]
{
("https://images.unsplash.com/photo-1581579438747-1dc8d17bbce4?w=600&q=80&auto=format&fit=crop", "کارگاه تعمیر ابزار"),
("https://images.unsplash.com/photo-1530124566582-a618bc2615dc?w=600&q=80&auto=format&fit=crop", "جعبه ابزار تخصصی"),
("https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=600&q=80&auto=format&fit=crop", "ابزار دیوالت"),
("https://images.unsplash.com/photo-1607400201515-c2c41c07d307?w=600&q=80&auto=format&fit=crop", "تکنیسین متخصص"),
("https://images.unsplash.com/photo-1518770660439-4636190af475?w=600&q=80&auto=format&fit=crop", "قطعات یدکی"),
("https://images.unsplash.com/photo-1504148455328-c376907d081c?w=600&q=80&auto=format&fit=crop", "ابزار صنعتی"),
};
}
@foreach (var (src, alt) in gallery)
{
<div class="relative rounded-2xl overflow-hidden group" style="height:200px">
<img src="@src" alt="@alt" loading="lazy"
class="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500" />
<div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors"></div>
</div>
}
</div>
</div>
</section>
<!-- ══════════════════════ WHY US ════════════════════════════════════════ -->
<section class="py-16 px-4 bg-gray-50">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-2">چرا آساد ابزار؟</h2>
<p class="text-gray-500">دلایل اعتماد هزاران مشتری به ما</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
@foreach (var item in new[] {
("🛡️", "ضمانت تعمیر", "ضمانت کتبی ۳ ماهه روی کلیه تعمیرات انجام‌شده", "bg-blue-50 border-blue-100"),
("🔩", "قطعات ۱۰۰٪ اصل", "فقط قطعات یدکی اورجینال از نمایندگی رسمی", "bg-yellow-50 border-yellow-100"),
("⚡", "تعمیر سریع", "اکثر تعمیرات در کمتر از ۴۸ ساعت تحویل داده می‌شود", "bg-green-50 border-green-100"),
("⭐", "تکنیسین مجرب", "بیش از ۱۵ سال سابقه تعمیر تخصصی ابزار صنعتی", "bg-purple-50 border-purple-100"),
("💰", "قیمت شفاف", "برآورد رایگان قبل از شروع تعمیر بدون هزینه پنهان", "bg-red-50 border-red-100"),
("📦", "ارسال سراسری", "تعمیر ابزار از سراسر کشور از طریق پست و تیپاکس", "bg-orange-50 border-orange-100"),
("📞", "مشاوره رایگان", "مشاوره تلفنی رایگان برای تشخیص عیب دستگاه", "bg-teal-50 border-teal-100"),
("🔄", "خدمات پیشگیرانه", "سرویس دوره‌ای و تنظیم ابزار برای جلوگیری از خرابی", "bg-indigo-50 border-indigo-100"),
})
{
<div class="text-center p-6 rounded-2xl border @item.Item4">
<div class="text-3xl mb-3">@item.Item1</div>
<h3 class="font-bold text-gray-900 mb-2">@item.Item2</h3>
<p class="text-sm text-gray-500 leading-6">@item.Item3</p>
</div>
}
</div>
</div>
</section>
<!-- ══════════════════════ TECHNICIAN SECTION ════════════════════════════ -->
<section class="py-16 px-4 bg-blue-900 text-white">
<div class="max-w-6xl mx-auto grid md:grid-cols-2 gap-12 items-center">
<div>
<h2 class="text-3xl font-extrabold mb-4">تکنیسین‌های ما، متخصص‌ترین در البرز</h2>
<p class="text-blue-100 leading-8 mb-6">
تیم تکنیسین‌های آساد ابزار با گذراندن دوره‌های آموزشی رسمی دیوالت و ماکیتا،
تجربه تعمیر بیش از ۵۰۰۰ دستگاه را دارند. از ساده‌ترین مشکل مانند تعویض کاربن،
تا پیچیده‌ترین عیوب الکترونیکی و مکانیکی.
</p>
<div class="space-y-3">
@foreach (var f in new[] {
"آموزش رسمی از DeWalt و Makita",
"تجربه بیش از ۱۵ سال تعمیر تخصصی",
"استفاده از دستگاه‌های اندازه‌گیری حرفه‌ای",
"به‌روز بودن با آخرین مدل‌های ابزار",
"ارائه رسید و فاکتور رسمی برای تمام تعمیرات",
})
{
<div class="flex items-center gap-3">
<span class="w-5 h-5 rounded-full bg-yellow-400 flex items-center justify-center text-gray-900 text-xs font-bold shrink-0">✓</span>
<span class="text-blue-100 text-sm">@f</span>
</div>
}
</div>
</div>
<div class="relative rounded-3xl overflow-hidden shadow-2xl" style="height:380px">
<img src="https://images.unsplash.com/photo-1581579438747-1dc8d17bbce4?w=700&q=85&auto=format&fit=crop"
alt="تکنیسین تعمیر ابزار آساد ابزار کرج" loading="lazy"
class="w-full h-full object-cover" />
<div class="absolute inset-0 bg-gradient-to-t from-blue-900/80 to-transparent"></div>
<div class="absolute bottom-5 right-5 left-5">
<div class="bg-white/10 backdrop-blur-sm rounded-xl p-4 border border-white/20">
<div class="font-bold text-sm mb-1">آساد ابزار کرج</div>
<div class="text-blue-200 text-xs">نمایندگی رسمی دیوالت • ۱۵ سال تجربه</div>
</div>
</div>
</div>
</div>
</section>
<!-- ══════════════════════ CTA ═══════════════════════════════════════════ -->
<section class="py-16 px-4 bg-yellow-400">
<div class="max-w-3xl mx-auto text-center">
<h2 class="text-3xl font-extrabold text-gray-900 mb-4">ابزار شما خراب شده؟</h2>
<p class="text-gray-700 text-lg mb-8">همین الان با ما تماس بگیرید. مشاوره رایگان و تعمیر با ضمانت کتبی.</p>
<div class="flex flex-wrap justify-center gap-4">
<a href="tel:@SiteData.Company.TelPhone" class="bg-gray-900 text-white font-bold px-8 py-3.5 rounded-xl hover:bg-gray-800 transition-colors text-lg shadow-lg">
📞 @SiteData.Company.Phone
</a>
<a href="https://wa.me/@SiteData.Company.Whatsapp" target="_blank"
class="bg-green-600 text-white font-bold px-8 py-3.5 rounded-xl hover:bg-green-700 transition-colors text-lg shadow-lg">
💬 واتساپ
</a>
<a href="/DeWalt" class="bg-white text-gray-900 font-bold px-8 py-3.5 rounded-xl hover:bg-gray-50 transition-colors text-lg shadow-lg">
🔧 ابزار دیوالت
</a>
</div>
</div>
</section>