سلام و احترام خدمت استاد و همه دوستان
بنده در پروژه خودم سرویس مربوط به Ad را به این صورت پیاده سازی کرده ام. کدها چون زیاد بودن کل لینک پروژه را میزارم. (سرویس - ریپوزیتوری - ویومدل ها - کانفیگ ها - کنترلر ها - ویو ها و ...)
https://riazikade.com/AddZone%20-%20Copy.rar
فقط چند نکته این که :
1 - ماژول AdZone را کامل حذف کرده ام و از Enum استفاده کرده ام :
public enum AdZoneEnum
{
[Display(Name = "پایین هدر صفحه اصلی")]
BottomOfHeaderHomePage = 1,
[Display(Name = "سمت چپ اسلایدر صفحه اصلی")]
LeftOfSliderHomePage = 2,
[Display(Name = "پایین اسلایدر صفحه اصلی")]
BottomOfSliderHomePage = 3,
[Display(Name = "وسط صفحه اصلی")]
CenterHomePage = 4,
[Display(Name = "بالای فوتر صفحه اصلی")]
TopOfFooterHomePage = 5
}
2 - حذف اسلاید ها به صورت حذف سخت هست. (از BaseEntity ارث بری نشده)
public void Delete(Ad ad)
{
_context.Remove(ad);
}
3 - یک ویوکامپوننت کلی (AdBoxViewComponent) برای مدیریت همه ی محل های تبلیغاتی ساخته شده
(ارسال پارامتر AdZoneEnum به کامپوننت)
namespace ShopStock.Web.Components
{
public class AdBoxViewComponent : ViewComponent
{
private readonly IAdService _adService;
public AdBoxViewComponent(IAdService adService)
{
_adService = adService;
}
public async Task<IViewComponentResult> InvokeAsync(AdZoneEnum adZone)
{
List<AdItemForFrontViewModel> ads = await _adService.GetAdsByAdZoneForFrontAsync(adZone);
return View(ads);
}
}
}
4 - تبدیل تاریخ های شمسی به میلادی و میلادی به شمسی با استفاده از جاوااسکریپت و در ویو صورت میگیره
(رفرنس ها و کدهای جاوااسکریپتی قسمت پایین ویوهای create و edit ماژول Ad)
5 - کلیک روی هر بنر شمارش میشه
(فایل Default.cshtml کامپوننت AdBoxViewComponent --- فایل custom.js قالب - اکشن TrackAdClick در کنترلر Home و در ادامه سرویس Ad )
// شماره تعداد کلیک های بنرهای تبلیغاتی
[HttpPost]
public async Task<IActionResult> TrackAdClick(int adId)
{
await _adService.RecordClickAsync(adId);
return Ok();
}
ثبت کلیک یک آپدیت مستقیم در دیتابیس ایجاد میکنه و هیچ داده ای از دیتابیس واکشی نمیشه.
// ViewCount Field
public async Task IncrementClickCountAsync(int adId)
{
await _context.Ads
.Where(a => a.Id == adId)
.ExecuteUpdateAsync(s => s.SetProperty(a => a.ViewCount, a => a.ViewCount + 1));
}
6 - قسمت کامپوننت مربوط به بنر ها میتونه تو مموری کش قرار بگیره.
با تشکر.
ممنون وحید جان
خیلی عالی ساختی و میزارم تو پروژه