eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به بخشی از سیستم مدیریت سفارشات یک فروشگاه آنلاین است که به صورت خاص سفارشات را برای مدیران (Admin) بازیابی می‌کند. در ادامه توضیح بخش‌های مختلف کد ارائه می‌شود: --- ۱. اینترفیس
IGetOrdersForAdminService
این اینترفیس تعریف می‌کند که کلاس سرویس باید متدی با مشخصات زیر داشته باشد: -
Execute(OrderState orderState)
: - ورودی: وضعیت سفارش (OrderState) که مشخص می‌کند چه نوع سفارشاتی باید بازیابی شوند (مثلاً سفارشات در حال پردازش، لغو شده یا تحویل داده شده). - خروجی: شیء
ResultDto
شامل لیستی از سفارشات (از نوع
OrdersDto
) و وضعیت موفقیت یا شکست عملیات. --- ۲. کلاس
GetOrdersForAdminService
این کلاس پیاده‌سازی اینترفیس
IGetOrdersForAdminService
است و وظیفه مدیریت بازیابی سفارشات بر اساس وضعیت آنها را بر عهده دارد. سازنده (
Constructor
): csharp public GetOrdersForAdminService(IDataBaseContext context) { _context = context; } - از طریق تزریق وابستگی (Dependency Injection)، این کلاس به
IDataBaseContext
دسترسی پیدا می‌کند که برای ارتباط با پایگاه داده استفاده می‌شود. متد
Execute
: csharp public ResultDto<List<OrdersDto>> Execute(OrderState orderState) { var orders = _context.Orders .Include(p => p.OrderDetails) .Where(p => p.OrderState == orderState) .OrderByDescending(p => p.Id) .ToList() .Select(p => new OrdersDto { InsetTime = p.InsertTime, OrderId = p.Id, OrderState = p.OrderState, ProductCount = p.OrderDetails.Count(), RequestId = p.RequestPayId, UserId = p.UserId, }).ToList(); return new ResultDto<List<OrdersDto>>() { Data = orders, IsSuccess = true, }; } شرح مراحل: 1. بازیابی سفارشات از پایگاه داده: - تمامی سفارشاتی که وضعیت آنها با
orderState
ورودی تطابق دارند از جدول
Orders
بازیابی می‌شوند: csharp .Where(p => p.OrderState == orderState) 2. لود داده‌های مرتبط: - از
Include
برای بارگذاری
OrderDetails
(جزئیات سفارش) به همراه هر سفارش استفاده شده است: csharp .Include(p => p.OrderDetails) 3. مرتب‌سازی: - سفارشات بر اساس شناسه آنها به ترتیب نزولی مرتب می‌شوند: csharp .OrderByDescending(p => p.Id) 4. انتقال به DTO: - هر سفارش به یک شیء از نوع
OrdersDto
تبدیل می‌شود تا فقط داده‌های مورد نیاز ارسال شوند: csharp .Select(p => new OrdersDto { ... }) 5. بازگشت نتیجه: - لیست سفارشات همراه با وضعیت موفقیت عملیات بازگردانده می‌شود: csharp return new ResultDto<List<OrdersDto>> { ... }; --- ۳. کلاس
OrdersDto
این کلاس نمایانگر داده‌هایی است که در پاسخ به درخواست بازیابی سفارشات ارسال می‌شود. ویژگی‌ها: -
OrderId
: شناسه سفارش. -
InsetTime
: زمان ثبت سفارش. -
RequestId
: شناسه درخواست پرداخت مرتبط با سفارش. -
UserId
: شناسه کاربر ثبت‌کننده سفارش. -
OrderState
: وضعیت سفارش (مثلاً در حال پردازش، لغو شده، یا تحویل داده شده). -
ProductCount
: تعداد اقلام موجود در سفارش. --- ۴. نقاط قوت کد 1. خوانایی و سازمان‌دهی: - متد
Execute
خوانا و به خوبی سازماندهی شده است. 2. تبدیل به DTO: - برای جلوگیری از ارسال کل موجودیت‌های پایگاه داده، فقط داده‌های مورد نیاز در قالب
OrdersDto
ارسال می‌شوند. 3. ارتباطات مؤثر با پایگاه داده: - استفاده از
Include
برای لود داده‌های مرتبط باعث کاهش درخواست‌های اضافی به پایگاه داده می‌شود. --- ۵. پیشنهادات بهبود 1. بهینه‌سازی Query: - اگر فقط به تعداد جزئیات سفارش نیاز دارید، از
Select
برای محاسبه
ProductCount
در سمت پایگاه داده استفاده کنید، به جای لود کردن کل
OrderDetails
. - نمونه: csharp .Select(p => new OrdersDto { ProductCount = _context.OrderDetails.Count(d => d.OrderId == p.Id), ... }) 2. پیاده‌سازی صفحه‌بندی: - برای مدیریت بهتر تعداد زیاد سفارشات، صفحه‌بندی (Paging) می‌تواند اضافه شود. 3. مدیریت خطاها: - بررسی کنید که آیا جدول
Orders
خالی است یا وضعیت داده شده هیچ سفارشی را تطابق نمی‌دهد، سپس پیام مناسب بازگردانید. --- جمع‌بندی این کد به خوبی سفارشات را بر اساس وضعیت برای مدیران بازیابی می‌کند. می‌توانید با بهینه‌سازی‌های پیشنهادی آن را مؤثرتر کنید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به کنترلر
OrdersController
است که در بخش مدیریت سفارشات (Admin) قرار دارد. این کنترلر برای مدیران و اپراتورها طراحی شده است تا بتوانند بر اساس وضعیت سفارش‌ها، آن‌ها را مشاهده و مدیریت کنند. در ادامه توضیح بخش‌های مختلف کد ارائه می‌شود: --- ### ۱. ویژگی‌های کلیدی کلاس
OrdersController
#### Namespace و ویژگی
Area
: csharp [Area("admin")] - این کنترلر در بخش
Admin
برنامه قرار دارد. - ویژگی
[Area("admin")]
مشخص می‌کند که این کنترلر فقط به بخش
admin
مربوط می‌شود و مسیر دسترسی به آن از طریق
admin/Orders/Index
خواهد بود. ویژگی
Authorize
: csharp [Authorize(Roles = "Admin,Operator")] - فقط کاربران با نقش‌های
Admin
و
Operator
اجازه دسترسی به این کنترلر و اکشن‌های آن را دارند. - این ویژگی از مکانیزم Authorization استفاده می‌کند تا امنیت دسترسی‌ها را تضمین کند. --- ۲. سازنده کنترلر csharp public OrdersController(IGetOrdersForAdminService getOrdersForAdminService) { _getOrdersForAdminService = getOrdersForAdminService; } - تزریق وابستگی: از طریق سازنده کنترلر، سرویس
IGetOrdersForAdminService
تزریق می‌شود. - این سرویس مسئول بازیابی سفارش‌ها از پایگاه داده است و اطلاعات لازم را برای View ارسال می‌کند. --- ۳. اکشن
Index
csharp public IActionResult Index(OrderState orderState) { return View(_getOrdersForAdminService.Execute(orderState).Data); } - ورودی: - پارامتر
OrderState
: وضعیت سفارش‌ها (مثل سفارش‌های در حال پردازش، لغو شده یا تحویل داده شده). - این پارامتر تعیین می‌کند که چه سفارش‌هایی باید بازیابی شوند. - خروجی: - نتیجه‌ای که از سرویس
GetOrdersForAdminService
دریافت می‌شود به View ارسال می‌شود. - فقط داده‌های مرتبط با سفارش‌ها (از نوع
OrdersDto
) به View ارسال می‌شوند. مراحل داخلی: 1. فراخوانی سرویس: - سرویس
GetOrdersForAdminService
برای بازیابی سفارش‌ها بر اساس وضعیت (
OrderState
) فراخوانی می‌شود. 2. بازگشت View: - داده‌های بازگشتی از سرویس به View ارسال می‌شوند تا نمایش داده شوند. --- ۴. سرویس
GetOrdersForAdminService
این سرویس قبلاً توضیح داده شده است و وظیفه بازیابی سفارشات بر اساس وضعیت آنها از پایگاه داده را دارد: - سفارشات مرتبط با وضعیت داده شده بازیابی می‌شوند. - فقط داده‌های مورد نیاز به View ارسال می‌شوند. --- ۵. نقاط قوت کد 1. امنیت: با استفاده از ویژگی
[Authorize]
دسترسی‌ها محدود به کاربران مجاز می‌شوند. 2. استفاده از DI (تزریق وابستگی): سرویس‌های مورد نیاز به صورت پویا تزریق می‌شوند که باعث افزایش تست‌پذیری کد می‌شود. 3. خوانایی: اکشن
Index
واضح و هدف‌محور طراحی شده است. --- ۶. پیشنهادات بهبود 1. مدیریت خطاها: - بررسی کنید که آیا
Execute
نتیجه‌ای بازگرداند یا نه، و در صورت خطا، یک پیام مناسب نمایش داده شود: csharp var result = _getOrdersForAdminService.Execute(orderState); if (result.Data == null || !result.IsSuccess) { return View("Error"); // نمایش یک صفحه خطا مناسب } return View(result.Data); 2. صفحه‌بندی: - اگر تعداد سفارشات زیاد باشد، می‌توانید قابلیت صفحه‌بندی (Paging) اضافه کنید. 3. فیلتر پیشرفته: - امکان جستجوی سفارش‌ها بر اساس پارامترهای بیشتری مانند تاریخ ثبت، شناسه کاربر یا مبلغ سفارش. --- جمع‌بندی این کنترلر به خوبی طراحی شده و وظیفه مدیریت سفارشات برای مدیران و اپراتورها را انجام می‌دهد. با استفاده از پیشنهادات بهبود می‌توانید آن را مؤثرتر کنید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به View صفحه لیست سفارشات در بخش مدیریت فروشگاه است که داده‌ها را از
OrdersController
دریافت می‌کند و آن‌ها را در قالب جدول نمایش می‌دهد. در ادامه توضیحات کامل بخش‌های مختلف این کد ارائه می‌شود: --- ۱. تنظیمات کلی View استفاده از @using و @model: csharp @using Test_Store.Common; @using Test_Store.Application.Services.Orders.Queries.GetOrdersForAdmin; @model List<OrdersDto> - @using: فضاهای نام مورد نیاز برای دسترسی به کلاس‌های
OrdersDto
و ابزارهای کمکی (مثل
EnumHelpers
) وارد شده‌اند. - @model: مدل داده مورد استفاده در این View، لیستی از
OrdersDto
است که توسط کنترلر به View ارسال می‌شود. تنظیمات Layout و Title: csharp @{ ViewData["Title"] = "Index"; Layout = "~/Areas/Admin/Views/Shared/_Adminlayout.cshtml"; } -
ViewData["Title"]
: عنوان صفحه تنظیم شده است. -
Layout
: مشخص می‌کند که این View از فایل قالب (
_Adminlayout.cshtml
) استفاده می‌کند. --- ۲. بخش جستجو در سفارشات html <form method="get" class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <input type="text" class="form-control" name="serchkey"> <button class="btn btn-success">جستجو</button> </fieldset> </form> - هدف: فرم جستجو به مدیر اجازه می‌دهد سفارشات را بر اساس یک کلید جستجو (مانند شماره سفارش یا شماره فاکتور) فیلتر کند. - روش ارسال: از
method="get"
استفاده شده تا داده‌ها در URL ارسال شوند و قابلیت اشتراک‌گذاری لینک فراهم شود. --- ۳. بخش جدول سفارشات html <table class="table table-striped table-bordered zero-configuration dataTable" id="DataTables_Table_0" role="grid" aria-describedby="DataTables_Table_0_info"> <thead> <tr role="row"> <th>شماره سفارش</th> <th>تاریخ ثبت سفارش</th> <th>شماره فاکتور</th> <th>وضعیت سفارش</th> <th>عملیات</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr role="row" class="odd"> <td>@item.OrderId</td> <td>@item.InsetTime</td> <td>@item.RequestId</td> <td> @{ string state = EnumHelpers<Test_Store.Domain.Entities.Orders.OrderState>.GetDisplayValue(item.OrderState); } <text>@state </text> </td> <td> <a class="btn btn-info"> کاربر ثبت کننده سفارش</a> <a class="btn btn-danger">مشاهده فاکتور </a> </td> </tr> } </tbody> </table> توضیحات بخش‌های اصلی جدول: 1. سربرگ جدول (
thead
): - ستون‌های اصلی جدول شامل: - شماره سفارش - تاریخ ثبت سفارش - شماره فاکتور - وضعیت سفارش - عملیات (مانند مشاهده فاکتور) 2. داده‌های جدول (
tbody
): - داده‌های هر سفارش با استفاده از حلقه
foreach
از
Model
بارگذاری می‌شوند. - ویژگی‌های
OrderId
، 
InsetTime
، 
RequestId و
OrderState
نمایش داده می‌شوند. 3. وضعیت سفارش (
OrderState
): - از کلاس ابزار
EnumHelpers
برای دریافت مقدار نمایشی وضعیت سفارش استفاده شده است: csharp string state = EnumHelpers<Test_Store.Domain.Entities.Orders.OrderState>.GetDisplayValue(item.OrderState); 4. عملیات (Action Buttons): - دکمه‌هایی برای مشاهده کاربر ثبت‌کننده سفارش و فاکتور مرتبط با سفارش وجود دارند. --- ۴. صفحه‌بندی جدول html <div class="dataTables_paginate paging_simple_numbers" id="DataTables_Table_0_paginate"> <ul class="pagination"> <li class="paginate_button page-item previous disabled"><a href="#" class="page-link">قبلی</a></li> <li class="paginate_button page-item active"><a href="#" class="page-link">1</a></li> <li class="paginate_button page-item"><a href="#" class="page-link">2</a></li> <li class="paginate_button page-item next"><a href="#" class="page-link">بعدی</a></li> </ul> </div> - هدف: ایجاد قابلیت صفحه‌بندی برای مدیریت تعداد زیاد سفارشات. - این کد برای نمایش شماره صفحات استفاده شده است و کلاس‌های Bootstrap برای طراحی بهتر اعمال شده‌اند. ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
۵. پیشنهادات بهبود 1. افزودن قابلیت حذف و ویرایش سفارشات: - دکمه‌هایی برای حذف یا ویرایش سفارش‌ها می‌تواند اضافه شود. 2. بهبود جستجو: - جستجو بر اساس پارامترهای بیشتر، مانند تاریخ ثبت سفارش یا نام کاربر. 3. نمایش جزئیات بیشتر: - نمایش تعداد محصولات در هر سفارش یا مبلغ کل سفارش می‌تواند اضافه شود. 4. بهبود عملکرد: - از صفحه‌بندی سمت سرور (Server-Side Paging) برای کاهش بارگذاری داده‌ها استفاده کنید. --- جمع‌بندی این View لیست سفارشات را به صورت مرتب و خوانا نمایش می‌دهد و امکانات پایه‌ای مانند جستجو و صفحه‌بندی را فراهم کرده است. با افزودن قابلیت‌های بیشتر و بهینه‌سازی، می‌توانید عملکرد و تجربه کاربری را بهبود دهید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به مدل‌های مرتبط با سفارشات در یک سیستم فروشگاه آنلاین است. این مدل‌ها شامل سفارش (Order)، جزئیات سفارش (OrderDetail) و وضعیت سفارش (OrderState) هستند. بیایید بخش‌های مختلف کد را بررسی کنیم: --- ۱. کلاس
Order
این کلاس نشان‌دهنده یک سفارش است و شامل اطلاعات کلی سفارش می‌باشد. ویژگی‌ها: -
User
و
UserId
: - این ویژگی‌ها نشان‌دهنده کاربری هستند که سفارش را ثبت کرده است. -
User
به کلاس
User
اشاره می‌کند (ارتباط بین سفارش و کاربر). -
UserId
شناسه کاربر را ذخیره می‌کند. -
RequestPay
و
RequestPayId
: - این ویژگی‌ها مربوط به اطلاعات پرداخت هستند. -
RequestPay
به کلاس
RequestPay
اشاره می‌کند. -
RequestPayId
شناسه پرداخت را ذخیره می‌کند. -
OrderState
: - وضعیت سفارش را نگه می‌دارد (مثلاً در حال پردازش، لغو شده یا تحویل شده). - مقدار آن از نوع
enum
OrderState
است. -
Address
: - آدرس مربوط به سفارش (مانند محل تحویل) را ذخیره می‌کند. -
OrderDetails
: - لیستی از جزئیات سفارش (مانند محصولات موجود در سفارش) است. - از نوع
ICollection<OrderDetail>
برای ارتباط یک به چند با کلاس
OrderDetail
استفاده می‌کند. --- ۲. کلاس
OrderDetail
این کلاس جزئیات هر سفارش را نگه می‌دارد (مانند محصولات، تعداد و قیمت). ویژگی‌ها: -
Order
و
OrderId
: - نشان‌دهنده ارتباط جزئیات سفارش با سفارش اصلی است. -
Order
به کلاس
Order
اشاره می‌کند. -
OrderId
شناسه سفارش اصلی را ذخیره می‌کند. -
Product
و
ProductId
: - اطلاعات محصولی که در سفارش خریداری شده است. -
Product
به کلاس
Product
اشاره می‌کند. -
ProductId
شناسه محصول را ذخیره می‌کند. -
Price
: - قیمت محصول در این سفارش را ذخیره می‌کند. -
Count
: - تعداد محصولی که در این سفارش خریداری شده است. --- ### ۳.
OrderState
(وضعیت سفارش) یک Enum است که وضعیت سفارش را مشخص می‌کند. برای هر مقدار از Enum، ویژگی
Display
استفاده شده است تا مقدار نمایشی را مشخص کند. مقادیر: 1.
Processing
: در حال پردازش (عدد 0) 2.
Canceled
: لغو شده (عدد 1) 3.
Delivered
: تحویل شده (عدد 2) مثال: - اگر مقدار
OrderState
برابر
Processing
باشد، نمایش داده شده "در حالی پردازش" خواهد بود. --- ۴. ارث‌بری از
BaseEntity
هم کلاس
Order
و هم
OrderDetail
از کلاس
BaseEntity
ارث‌بری می‌کنند. این معمولاً شامل ویژگی‌های پایه مانند: -
Id
(شناسه اصلی) -
InsertTime
(زمان ثبت) -
UpdateTime
(زمان به‌روزرسانی) - و سایر ویژگی‌های پایه است. این کار باعث می‌شود که ویژگی‌های مشترک بین موجودیت‌ها در کلاس پایه مدیریت شوند. --- ۵. نقاط قوت کد 1. مدیریت روابط: - استفاده از روابط
virtual
و کلید‌های خارجی (
ForeignKey
) برای مدیریت ارتباطات بین موجودیت‌ها. 2. استفاده از Enum برای وضعیت سفارش: - این کار مدیریت وضعیت‌ها را ساده‌تر و قابل‌فهم‌تر می‌کند. 3. طراحی شیءگرا: - جدا کردن جزئیات سفارش از سفارش اصلی باعث افزایش خوانایی و انعطاف‌پذیری کد می‌شود. --- ۶. پیشنهادات بهبود 1. افزودن اعتبارسنجی (Validation): - بررسی کنید که قیمت و تعداد (
Price
و
Count
) مقادیر معتبر (مثلاً مثبت) داشته باشند. - برای آدرس (
Address
) محدودیت طول اضافه کنید. csharp [MaxLength(500, ErrorMessage = "آدرس نمی‌تواند بیشتر از 500 کاراکتر باشد.")] public string Address { get; set; } 2. مدیریت حذف وابسته: - اگر یک سفارش حذف شد، تمام
OrderDetail
های مرتبط به صورت خودکار حذف شوند (Cascade Delete). 3. افزودن توضیحات بیشتر در Enum: - در صورت نیاز، می‌توان مقادیر بیشتری برای وضعیت سفارش اضافه کرد، مانند "در انتظار پرداخت" یا "ارسال شده". --- جمع‌بندی این کد ساختار مناسبی برای مدیریت سفارشات در یک فروشگاه آنلاین ارائه می‌دهد. تمامی ارتباطات بین کاربر، پرداخت، محصولات و وضعیت سفارش به درستی طراحی شده است. پیشنهادات بهبود می‌توانند به افزایش قابلیت‌های کد و جلوگیری از خطاهای احتمالی کمک کنند.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد کلاس عمومی
EnumHelpers<T>
را تعریف می‌کند که شامل مجموعه‌ای از متدهای کمکی برای کار با انواع Enum در C# است. این کلاس ابزارهایی برای دریافت مقادیر Enum، نمایش نام‌ها و مقادیر نمایشی Enum، و تبدیل بین رشته‌ها و مقادیر Enum فراهم می‌کند. در ادامه توضیح کامل هر بخش از کد ارائه می‌شود: --- ۱. دریافت مقادیر Enum (
GetValues
) csharp public static IList<T> GetValues(Enum value) { var enumValues = new List<T>(); foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)) { enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false)); } return enumValues; } عملکرد: - این متد تمامی مقادیر Enum را به عنوان لیستی از نوع
T
برمی‌گرداند. - از Reflection برای دسترسی به فیلدهای عمومی و ایستا (
Static
) نوع Enum استفاده می‌کند. - هر مقدار Enum با استفاده از Enum.Parse به نوع
T
تبدیل می‌شود. مثال: csharp var values = EnumHelpers<OrderState>.GetValues(OrderState.Processing); // نتیجه: لیستی شامل [Processing, Canceled, Delivered] --- ۲. تبدیل رشته به Enum (
Parse
) csharp public static T Parse(string value) { return (T)Enum.Parse(typeof(T), value, true); } عملکرد: - این متد یک رشته را به مقدار Enum متناظر تبدیل می‌کند. - پارامتر
true
در Enum.Parse برای نادیده گرفتن حساسیت به حروف بزرگ/کوچک استفاده می‌شود. مثال: csharp var state = EnumHelpers<OrderState>.Parse("Delivered"); // نتیجه: OrderState.Delivered --- ۳. دریافت نام‌های Enum (
GetNames
) csharp public static IList<string> GetNames(Enum value) { return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList(); } عملکرد: - این متد نام‌های تمامی مقادیر Enum را به عنوان لیستی از رشته‌ها برمی‌گرداند. - از Reflection برای دسترسی به نام فیلدهای Enum استفاده می‌شود. مثال: csharp var names = EnumHelpers<OrderState>.GetNames(OrderState.Processing); // نتیجه: لیستی شامل ["Processing", "Canceled", "Delivered"] --- ۴. دریافت مقادیر نمایشی Enum (
GetDisplayValues
) csharp public static IList<string> GetDisplayValues(Enum value) { return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList(); } عملکرد: - این متد تمامی مقادیر نمایشی (
Display Name
) مقادیر Enum را برمی‌گرداند. - برای هر مقدار Enum، متد
GetDisplayValue
فراخوانی می‌شود تا نام نمایشی آن بازیابی شود. مثال: csharp var displayValues = EnumHelpers<OrderState>.GetDisplayValues(OrderState.Processing); // نتیجه: لیستی شامل ["در حالی پردازش", "لغو شده", "تحویل شده"] --- ۵. بازیابی مقدار نمایشی (
GetDisplayValue
) csharp public static string GetDisplayValue(T value) { try { var fieldInfo = value.GetType().GetField(value.ToString()); var descriptionAttributes = fieldInfo.GetCustomAttributes( typeof(DisplayAttribute), false) as DisplayAttribute[]; if (descriptionAttributes[0].ResourceType != null) return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name); if (descriptionAttributes == null) return string.Empty; return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString(); } catch (Exception) { return "نا مشخص"; } } عملکرد: - مقدار نمایشی یک مقدار Enum را از طریق ویژگی
[Display(Name = "...")]
در کلاس Enum دریافت می‌کند. - اگر ویژگی
DisplayAttribute
شامل
ResourceType
باشد، مقدار نمایشی از فایل‌های منابع (
Resource Files
) بازیابی می‌شود. - در صورت بروز خطا، مقدار پیش‌فرض
"نا مشخص"
بازگردانده می‌شود. مثال: csharp var displayValue = EnumHelpers<OrderState>.GetDisplayValue(OrderState.Processing); // نتیجه: "در حالی پردازش" ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
۶. بازیابی از منابع (
lookupResource
) csharp private static string lookupResource(Type resourceManagerProvider, string resourceKey) { foreach (PropertyInfo staticProperty in resourceManagerProvider.GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)) { if (staticProperty.PropertyType == typeof(System.Resources.ResourceManager)) { System.Resources.ResourceManager resourceManager = (System.Resources.ResourceManager)staticProperty.GetValue(null, null); return resourceManager.GetString(resourceKey); } } return resourceKey; // Fallback with the key name } عملکرد: - تلاش می‌کند مقدار نمایشی را از فایل‌های منابع مرتبط با
DisplayAttribute
بازیابی کند. - اگر مقدار مورد نظر در فایل منابع پیدا نشد، مقدار پیش‌فرض (
resourceKey
) بازگردانده می‌شود. --- جمع‌بندی کلاس
EnumHelpers<T>
ابزار قدرتمندی برای مدیریت انواع Enum در C# فراهم می‌کند. ویژگی‌های برجسته این کلاس عبارتند از: 1. دریافت مقادیر و نام‌ها: قابلیت دریافت لیست مقادیر یا نام‌های Enum. 2. تبدیل رشته به Enum: تبدیل رشته‌ها به مقادیر Enum. 3. پشتیبانی از DisplayAttribute: نمایش مقادیر نمایشی با استفاده از ویژگی
[Display]
. این کلاس برای مدیریت بهتر Enum‌ها در پروژه‌های بزرگ بسیار مفید است.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به یک سرویس در سیستم مدیریت مالی است که درخواست‌های پرداخت کاربران را برای مدیران بازیابی می‌کند. این سرویس اطلاعاتی مانند مقدار پرداخت، شناسه پرداخت، وضعیت پرداخت و نام کاربر را ارائه می‌دهد. در ادامه توضیحات کامل کد ارائه شده است: --- ۱. اینترفیس
IGetRequestPayForAdminService
csharp public interface IGetRequestPayForAdminService { ResultDto<List<RequestPayDto>> Execute(); } شرح عملکرد: - هدف: تعریف یک متد برای بازیابی اطلاعات پرداخت‌ها. - متد
Execute
: این متد باید لیستی از پرداخت‌ها به همراه اطلاعات مربوطه را بازگرداند. - خروجی این متد از نوع
ResultDto<List<RequestPayDto>>
است که شامل لیست داده‌ها (پرداخت‌ها) و وضعیت موفقیت یا شکست عملیات می‌باشد. --- ۲. کلاس
GetRequestPayForAdminService
csharp public class GetRequestPayForAdminService : IGetRequestPayForAdminService - این کلاس پیاده‌سازی اینترفیس
IGetRequestPayForAdminService
است. - از طریق تزریق وابستگی (Dependency Injection) به پایگاه داده (از طریق
IDataBaseContext
) متصل می‌شود. سازنده (
Constructor
): csharp public GetRequestPayForAdminService(IDataBaseContext context) { _context = context; } - ورودی:
IDataBaseContext
که برای دسترسی به جدول‌های پایگاه داده استفاده می‌شود. - ذخیره در فیلد: متغیر
_context
برای استفاده در سراسر کلاس ذخیره می‌شود. متد
Execute
: csharp public ResultDto<List<RequestPayDto>> Execute() { var requestPay = _context.RequestPays .Include(p => p.User) .ToList() .Select(p => new RequestPayDto { Id = p.Id, Amount = p.Amount, Authority = p.Authority, Guid = p.Guid, IsPay = p.IsPay, PayDate = p.PayDate, RefId = p.RefId, UserId = p.UserId, UserName = p.User.FullName }).ToList(); return new ResultDto<List<RequestPayDto>>() { Data = requestPay, IsSuccess = true, }; } عملیات کلیدی: 1. دریافت داده‌ها از پایگاه داده: - داده‌های جدول
RequestPays
بازیابی می‌شوند. - از
Include(p => p.User)
برای لود اطلاعات کاربر مربوط به هر پرداخت استفاده شده است (ارتباط
User
و
RequestPay
). 2. تبدیل داده‌ها به DTO: - داده‌ها به یک شیء از نوع
RequestPayDto
تبدیل می‌شوند که شامل فیلدهای مورد نیاز برای نمایش یا پردازش در لایه بالا است. 3. بازگشت نتیجه: - نتیجه به همراه وضعیت موفقیت عملیات در قالب
ResultDto
بازگردانده می‌شود. --- ۳. کلاس
RequestPayDto
csharp public class RequestPayDto این کلاس برای انتقال داده‌های پرداخت به لایه‌های بالاتر استفاده می‌شود. ویژگی‌ها: 1.
Id
: شناسه پرداخت. 2.
Guid
: مقدار GUID یکتا برای شناسایی پرداخت. 3.
UserName
: نام کامل کاربر مرتبط با پرداخت. 4.
UserId
: شناسه کاربر. 5.
Amount
: مقدار پرداخت (معمولاً به واحد پولی ریال یا تومان). 6.
IsPay
: وضعیت پرداخت (آیا پرداخت انجام شده یا نه). 7.
PayDate
: تاریخ پرداخت (nullable). 8.
Authority
: کد مرجع پرداخت. 9.
RefId
: شناسه مرجع تراکنش (معمولاً از سمت درگاه پرداخت). --- ۴. نقاط قوت کد 1. ساختار خوب و خوانا: - کلاس‌ها به درستی از هم جدا شده‌اند و مسئولیت‌های مشخص دارند. 2. مدیریت ارتباطات: - استفاده از
Include
برای بارگیری داده‌های مرتبط (مانند
User
) کارایی و سادگی کد را افزایش می‌دهد. 3. بازیابی داده‌ها بهینه: - داده‌های پایگاه داده به
DTO
تبدیل می‌شوند تا فقط اطلاعات لازم به لایه‌های بالاتر ارسال شوند. --- ۵. پیشنهادات بهبود 1. افزودن صفحه‌بندی: اگر تعداد پرداخت‌ها زیاد باشد، می‌توانید با استفاده از صفحه‌بندی (Paging) از بارگذاری بیش از حد جلوگیری کنید. csharp var requestPay = _context.RequestPays .Include(p => p.User) .Skip((page - 1) * pageSize) .Take(pageSize) .ToList(); 2. مدیریت وضعیت پرداخت: - می‌توانید فیلترهایی برای وضعیت پرداخت (پرداخت شده/پرداخت نشده) اضافه کنید. - این فیلتر می‌تواند به صورت یک پارامتر ورودی در
Execute
دریافت شود. 3. مدیریت خطاها: - بررسی کنید که آیا جدول
RequestPays
خالی است یا ارتباط با پایگاه داده مشکلی دارد، سپس یک پیام خطای مناسب بازگردانید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
4. بهینه‌سازی کوئری: - به جای بارگذاری تمام داده‌ها و استفاده از
ToList
قبل از
Select
، می‌توانید کوئری را بهینه کنید: csharp var requestPay = _context.RequestPays .Include(p => p.User) .Select(p => new RequestPayDto { Id = p.Id, Amount = p.Amount, Authority = p.Authority, Guid = p.Guid, IsPay = p.IsPay, PayDate = p.PayDate, RefId = p.RefId, UserId = p.UserId, UserName = p.User.FullName }).ToList(); --- جمع‌بندی این سرویس یک راهکار ساده و کارآمد برای بازیابی اطلاعات پرداخت‌ها و نمایش آن‌ها در پنل مدیریت است. استفاده از ساختار DTO باعث بهبود امنیت و عملکرد سیستم شده است. همچنین پیشنهادات بهبود می‌تواند کد را منعطف‌تر و کاربردی‌تر کند.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به کنترلر
RequestPayController
در ناحیه مدیریت (Admin Area) است و برای مدیریت درخواست‌های پرداخت کاربران طراحی شده است. این کنترلر اطلاعات درخواست‌های پرداخت را از سرویس دریافت کرده و آن‌ها را به View ارسال می‌کند. در ادامه توضیح کامل هر بخش از کد ارائه شده است: --- ۱. ویژگی‌های کلیدی کنترلر
RequestPayController
[Area("Admin")]: csharp [Area("Admin")] - این ویژگی مشخص می‌کند که این کنترلر متعلق به ناحیه
Admin
است. - مسیر دسترسی به این کنترلر چیزی شبیه به
/Admin/RequestPay/Index
خواهد بود. --- ۲. تزریق وابستگی (Dependency Injection) سازنده کنترلر: csharp private readonly IGetRequestPayForAdminService _getRequestPayForAdminService; public RequestPayController(IGetRequestPayForAdminService getRequestPayForAdminService) { _getRequestPayForAdminService = getRequestPayForAdminService; } توضیحات: 1. تزریق سرویس: - وابستگی به سرویس
IGetRequestPayForAdminService
از طریق سازنده کنترلر تزریق می‌شود. - این سرویس وظیفه بازیابی درخواست‌های پرداخت از پایگاه داده را بر عهده دارد. 2. مزایای تزریق وابستگی: - کد قابل تست‌تر و انعطاف‌پذیرتر می‌شود. - امکان جایگزینی سرویس‌ها با Mock یا پیاده‌سازی‌های دیگر برای تست فراهم می‌شود. --- ۳. متد
Index
csharp public IActionResult Index() { return View(_getRequestPayForAdminService.Execute().Data); } شرح عملکرد: 1. فراخوانی سرویس: - متد
Execute
از سرویس
IGetRequestPayForAdminService
فراخوانی می‌شود تا لیست درخواست‌های پرداخت بازیابی شود. 2. ارسال داده‌ها به View: - داده‌های بازیابی شده از سرویس به View ارسال می‌شوند. -
Data
شامل لیستی از
RequestPayDto
است که حاوی اطلاعات پرداخت‌ها می‌باشد. 3. خروجی: - خروجی این متد یک View است که داده‌های دریافت‌شده را نمایش می‌دهد. --- ۴. تعامل با سرویس سرویسی که در این کنترلر استفاده شده است (
IGetRequestPayForAdminService
) وظیفه دارد داده‌های درخواست‌های پرداخت را از پایگاه داده بازیابی کند. این سرویس قبلاً توضیح داده شده و شامل ویژگی‌هایی مانند: - بازیابی اطلاعات کاربر مرتبط با پرداخت. - فیلدهای مهمی مانند مقدار پرداخت، وضعیت پرداخت، شناسه پرداخت و تاریخ پرداخت. --- ۵. موارد قابل بهبود 1. اضافه کردن مدیریت خطا: اگر سرویس داده‌ای را بازنگرداند یا به دلایلی اجرای آن موفق نباشد، باید خطا مدیریت شود: csharp public IActionResult Index() { var result = _getRequestPayForAdminService.Execute(); if (!result.IsSuccess || result.Data == null) { // نمایش صفحه خطا return View("Error", "در دریافت اطلاعات مشکلی پیش آمده است."); } return View(result.Data); } 2. افزودن صفحه‌بندی (Paging): - اگر تعداد درخواست‌های پرداخت زیاد باشد، می‌توانید قابلیت صفحه‌بندی اضافه کنید تا فقط تعداد مشخصی از داده‌ها در هر صفحه نمایش داده شوند. 3. فیلترهای پیشرفته: - اضافه کردن امکان جستجو یا فیلتر بر اساس تاریخ پرداخت، وضعیت پرداخت (
IsPay
) یا کاربر. 4. نمایش پیام موفقیت یا خطا در عملیات: - اگر قرار است عملیات خاصی (مثل تأیید یا لغو پرداخت‌ها) اضافه شود، می‌توانید از
TempData
برای نمایش پیام‌های موفقیت یا خطا استفاده کنید. --- جمع‌بندی کنترلر
RequestPayController
یک کنترلر ساده و خواناست که درخواست‌های پرداخت را از سرویس دریافت کرده و آن‌ها را به View ارسال می‌کند. ساختار کنونی برای نمایش لیست درخواست‌ها مناسب است، اما می‌توان قابلیت‌هایی مثل مدیریت خطا، صفحه‌بندی و فیلتر پیشرفته را برای بهبود تجربه کاربری و عملکرد اضافه کرد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به View نمایش لیست فاکتورهای درخواست‌های پرداخت در بخش مدیریت فروشگاه است و داده‌ها را از کنترلر
RequestPayController
دریافت می‌کند. این View داده‌های مالی کاربران، وضعیت پرداخت و اطلاعات مربوط به فاکتورها را به صورت جدول ارائه می‌دهد. بیایید بخش‌های مختلف آن را بررسی کنیم: --- ۱. تنظیمات اولیه View استفاده از @using و @model: csharp @using Test_Store.Application.Services.Fainances.Queries.GetRequestPayForAdmin; @model List<RequestPayDto> - @using: فضای نام مربوط به سرویس‌ها و DTO‌های درخواست پرداخت وارد شده است. - @model: مدل داده‌ای که توسط کنترلر ارسال شده (
List<RequestPayDto
) در این View استفاده می‌شود. این مدل لیستی از فاکتورها و جزئیات پرداخت را ارائه می‌دهد. تنظیمات عنوان و قالب‌بندی: csharp @{ ViewData["Title"] = "Index"; Layout = "~/Areas/Admin/Views/Shared/_Adminlayout.cshtml"; } -
ViewData["Title"]
: عنوان صفحه برای نمایش تنظیم شده است. -
Layout
: قالب اصلی (
_Adminlayout.cshtml
) برای طراحی ظاهر کلی View استفاده می‌شود. --- ### ۲. بخش جستجو html <form method="get" class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <input type="text" class="form-control" name="serchkey"> <button class="btn btn-success">جستجو</button> </fieldset> </form> #### عملکرد: - این فرم به مدیر اجازه می‌دهد بر اساس یک کلید جستجو (مانند شماره فاکتور یا نام کاربر) فاکتورها را فیلتر کند. - روش ارسال: از
method="get"
استفاده شده است، که داده‌ها در URL ارسال می‌شوند و قابلیت اشتراک‌گذاری لینک فراهم می‌شود. --- ### ۳. نمایش جدول فاکتورها html <table class="table table-striped table-bordered zero-configuration dataTable" id="DataTables_Table_0" role="grid" aria-describedby="DataTables_Table_0_info"> <thead> <tr role="row"> <th>شماره فاکتور</th> <th>مبلغ</th> <th>کاربر</th> <th>پرداخت شده؟</th> <th>تاریخ پرداخت</th> <th>RefId</th> <th>Authority</th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr role="row" class="odd"> <td>@item.Id</td> <td>@item.Amount.ToString("n0")</td> <td>@item.UserName</td> <td>@item.IsPay</td> <td>@item.PayDate</td> <td>@item.RefId</td> <td>@item.Authority</td> <td> </td> </tr> } </tbody> </table> #### شرح بخش‌ها: 1. سربرگ جدول (
thead
): - ستون‌های اصلی شامل: - شماره فاکتور - مبلغ پرداختی - نام کاربر - وضعیت پرداخت (پرداخت شده/نشده) - تاریخ پرداخت - شناسه مرجع تراکنش (
RefId
) - کد مرجع (
Authority
) 2. داده‌های جدول (
tbody
): - داده‌های هر فاکتور با استفاده از حلقه
foreach
از مدل
RequestPayDto
بارگذاری می‌شوند. - مقادیر مهم فاکتورها مانند مبلغ و تاریخ پرداخت نمایش داده می‌شوند. 3. قالب‌بندی مبلغ: - از
ToString("n0")
برای نمایش مبلغ به صورت قالب عددی (مثلاً 1,000,000) استفاده شده است. 4. وضعیت پرداخت (
IsPay
): - وضعیت پرداخت به صورت مقدار
true
یا
false
نمایش داده می‌شود. 5. دکمه‌های عملیاتی (فیلد
td
خالی): - هنوز هیچ دکمه عملیاتی مانند "مشاهده جزئیات" یا "ویرایش فاکتور" اضافه نشده است. --- ### ۴. بخش صفحه‌بندی html <div class="dataTables_paginate paging_simple_numbers" id="DataTables_Table_0_paginate"> <ul class="pagination"> <li class="paginate_button page-item previous disabled"><a href="#" class="page-link">قبلی</a></li> <li class="paginate_button page-item active"><a href="#" class="page-link">1</a></li> <li class="paginate_button page-item"><a href="#" class="page-link">2</a></li> <li class="paginate_button page-item next"><a href="#" class="page-link">بعدی</a></li> </ul> </div> #### عملکرد: - قابلیت صفحه‌بندی جدول اضافه شده است. - از کلاس‌های Bootstrap برای طراحی و زیبایی صفحه‌بندی استفاده شده است. ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
### ۵. نقاط قوت کد 1. قابلیت جستجو و فیلتر کردن: مدیر می‌تواند فاکتورهای مورد نظر را بر اساس کلید جستجو پیدا کند. 2. طراحی خوانا و مرتب: جدول با استفاده از کلاس‌های CSS و Bootstrap طراحی شده است. 3. قابلیت صفحه‌بندی: برای مدیریت تعداد زیاد فاکتورها بسیار کاربردی است. --- ### ۶. پیشنهادات بهبود 1. افزودن دکمه‌های عملیاتی: - می‌توانید گزینه‌هایی مانند "مشاهده جزئیات" یا "ویرایش فاکتور" در ستون آخر اضافه کنید. html <td> <a href="/Admin/RequestPay/Details/@item.Id" class="btn btn-info btn-sm">مشاهده جزئیات</a> <a href="/Admin/RequestPay/Edit/@item.Id" class="btn btn-warning btn-sm">ویرایش</a> </td> 2. بهبود نمایش وضعیت پرداخت: - به جای نمایش
true
یا `false`، از مقدار نمایشی مانند "پرداخت شده" یا "پرداخت نشده" استفاده کنید. 3. نمایش مقدار `PayDate` در قالب مناسب: - تاریخ پرداخت را به فرمت قابل خواندن نمایش دهید: csharp <td>@item.PayDate?.ToString("yyyy/MM/dd")</td> 4. مدیریت خطاها: - بررسی کنید که آیا مدل داده خالی (
null
) است یا نه، سپس پیام مناسب نمایش دهید. --- ### جمع‌بندی این View به خوبی طراحی شده و قابلیت نمایش لیست فاکتورها، جستجو و صفحه‌بندی را فراهم می‌کند. با افزودن پیشنهادات بهبود، می‌توانید تجربه کاربری و قابلیت‌های این صفحه را افزایش دهید.