Initial commit — AsadiTools v1.0
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:
@@ -0,0 +1,48 @@
|
||||
using AsadiTools.Data;
|
||||
using AsadiTools.Models;
|
||||
using AsadiTools.Services;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace AsadiTools.Pages.Shop;
|
||||
|
||||
public class ShopIndexModel(AppDbContext db, CartService cart) : PageModel
|
||||
{
|
||||
public const int PageSize = 12;
|
||||
|
||||
public List<Product> Products { get; private set; } = [];
|
||||
public string? Category { get; private set; }
|
||||
public string? Brand { get; private set; }
|
||||
public string? Search { get; private set; }
|
||||
public int CurrentPage { get; private set; } = 1;
|
||||
public int TotalPages { get; private set; }
|
||||
public int TotalCount { get; private set; }
|
||||
|
||||
public async Task OnGetAsync(string? category, string? brand, string? search, int page = 1)
|
||||
{
|
||||
Category = category;
|
||||
Brand = brand;
|
||||
Search = search;
|
||||
|
||||
var q = db.Products.Where(p => p.IsActive);
|
||||
if (category is not null) q = q.Where(p => p.Category == category);
|
||||
if (brand is not null) q = q.Where(p => p.Brand == brand);
|
||||
if (search is not null) q = q.Where(p => p.NameFa.Contains(search) || (p.NameEn != null && p.NameEn.Contains(search)) || (p.Sku != null && p.Sku.Contains(search)));
|
||||
|
||||
TotalCount = await q.CountAsync();
|
||||
TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
|
||||
CurrentPage = Math.Clamp(page, 1, Math.Max(1, TotalPages));
|
||||
|
||||
Products = await q.OrderByDescending(p => p.Id)
|
||||
.Skip((CurrentPage - 1) * PageSize)
|
||||
.Take(PageSize)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public IActionResult OnPostAddToCart(int productId, string nameFa, decimal price, string? sku)
|
||||
{
|
||||
cart.AddItem(new CartItem { ProductId = productId, NameFa = nameFa, Price = price, Sku = sku, Qty = 1 });
|
||||
return RedirectToPage();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user