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 (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
Test_Store.Persistence.Context Test_Store.Application.Interfaces.Contexs این کد یک پیاده‌سازی از معماری لایه‌بندی شده (Layered Architecture) در Entity Framework Core است و برای مدیریت موجودیت‌های
Order
و
OrderDetail
طراحی شده است. توضیحات گام‌به‌گام بخش‌های مختلف این کد در زیر آمده است: --- ۱. `IDataBaseContext`: این اینترفیس ساختار کلی برای مدیریت پایگاه داده را تعریف می‌کند: - `DbSet<Order>` و `DbSet<OrderDetail>`: این موارد نمایانگر جداول مربوط به
Order
و
OrderDetail
در پایگاه داده هستند. - هدف از اینترفیس: - اینترفیس به شما امکان می‌دهد تا وابستگی‌های خود را از کلاس پایگاه داده جدا کنید و تست‌پذیری را بهبود بخشید. --- ۲. `DataBaseContext` (پیاده‌سازی کلاس پایگاه داده): این کلاس از
DbContext
ارث‌بری کرده و پایگاه داده را مدیریت می‌کند: - `DbSet<Order>` و `DbSet<OrderDetail>`: این موارد جداول مرتبط با
Order
و
OrderDetail
را در پایگاه داده نمایش می‌دهند. - `OnModelCreating`: این متد برای تنظیمات پیشرفته‌ی مدل‌سازی پایگاه داده استفاده می‌شود: 1. ارتباط `Order` و `User`: csharp modelBuilder.Entity<Order>() .HasOne(p => p.User) .WithMany(p => p.Orders) .OnDelete(DeleteBehavior.NoAction); - تعریف ارتباط "یک به چند" (یک کاربر می‌تواند چند سفارش داشته باشد). - با
OnDelete(DeleteBehavior.NoAction)
حذف آبشاری غیرفعال شده است. 2. ارتباط `Order` و `RequestPay`: csharp modelBuilder.Entity<Order>() .HasOne(p => p.RequestPay) .WithMany(p => p.Orders) .OnDelete(DeleteBehavior.NoAction); - مشابه ارتباط قبلی، این ارتباط نیز "یک به چند" است. - حذف آبشاری در اینجا نیز غیرفعال شده است. --- ۳. فیلترهای کوئری (`ApplyQueryFilter`): این متد برای اعمال فیلتر پیش‌فرض در جداول استفاده می‌شود: csharp private void ApplyQueryFilter(ModelBuilder modelBuilder) { modelBuilder.Entity<Order>().HasQueryFilter(p => !p.IsRemoved); modelBuilder.Entity<OrderDetail>().HasQueryFilter(p => !p.IsRemoved); } - `HasQueryFilter`: - این فیلتر اطمینان می‌دهد که فقط رکوردهایی که ویژگی
IsRemoved
آن‌ها
false
است در نتایج نمایش داده می‌شوند. - بسیار مفید است برای پنهان کردن رکوردهای حذف‌شده به‌صورت منطقی (Soft Delete). --- ۴. کاربرد کلی کد: 1. مدیریت سفارش‌ها و جزئیات آن‌ها: - جداول
Orders
و
OrderDetails
نمایانگر اطلاعات مربوط به سفارشات و محصولات مربوط به آن‌ها هستند. 2. پشتیبانی از تست‌پذیری: - با استفاده از اینترفیس `IDataBaseContext`، وابستگی‌ها از کلاس پایگاه داده جدا شده و امکان جایگزینی پایگاه داده با نسخه تستی فراهم شده است. 3. پیشگیری از حذف آبشاری: - حذف آبشاری (Cascade Delete) به‌صورت پیش‌فرض غیرفعال شده است تا از حذف ناخواسته رکوردهای وابسته جلوگیری شود. 4. مدیریت Soft Delete: - با استفاده از فیلترهای
HasQueryFilter`، رکوردهایی که حذف منطقی شده‌اند (دارای `IsRemoved = true
هستند) از نتایج عادی پنهان می‌شوند. --- ۵. مزایا: - ساختارمند: تفکیک مسئولیت‌ها در قالب اینترفیس و کلاس پیاده‌سازی. - قابلیت گسترش: امکان افزودن تنظیمات بیشتر در آینده. - بهینه‌سازی کوئری‌ها: با استفاده از فیلترهای پیش‌فرض. --- جمع‌بندی: این کد از روش‌های استاندارد و پیشرفته EF Core برای مدیریت موجودیت‌ها و ارتباطات بین جداول استفاده کرده است. اگر نیاز به گسترش این کد دارید، می‌توان ویژگی‌های دیگری مثل لاگینگ یا تنظیمات پیشرفته‌تر را اضافه کرد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
Test_Store.Application.Services.Orders.Commands.AddNewOrder این کد مربوط به فرآیند ثبت یک سفارش جدید در سیستم است و شامل چندین بخش کلیدی برای مدیریت کاربران، پرداخت‌ها، سبد خرید و جزئیات سفارش است. در ادامه، توضیحات گام به گام ارائه شده است: --- ۱. اینترفیس
IAddNewOrderService
این اینترفیس ساختار سرویس افزودن سفارش جدید را تعریف می‌کند: - متد
Execute
: وظیفه اجرای ثبت سفارش جدید را دارد و یک شیء
ResultDto
را بازمی‌گرداند که شامل اطلاعات موفقیت یا شکست عملیات است. --- ۲. کلاس
AddNewOrderService
این کلاس وظیفه اصلی ثبت سفارش جدید را بر عهده دارد و از اینترفیس
IAddNewOrderService
پیروی می‌کند: سازنده (
Constructor
): - تزریق وابستگی: از طریق
IDataBaseContext
به پایگاه داده دسترسی پیدا می‌کند. متد
Execute
: این متد مراحل ثبت سفارش را مدیریت می‌کند: 1. دریافت داده‌های مرتبط: - کاربر (
User
): از پایگاه داده با استفاده از
UserId
دریافت می‌شود. - پرداخت (
RequestPay
): اطلاعات پرداخت با استفاده از
RequestPayId
دریافت می‌شود. - سبد خرید (
Cart
): اطلاعات سبد خرید شامل آیتم‌ها و محصولات با استفاده از
CartId
دریافت می‌شود. 2. به‌روزرسانی پرداخت: - وضعیت پرداخت (
IsPay
) به
true
تغییر می‌کند. - تاریخ پرداخت (
PayDate
) به زمان فعلی تنظیم می‌شود. 3. به‌روزرسانی سبد خرید: - وضعیت سبد خرید (
Finished
) به
true
تغییر داده می‌شود تا مشخص شود که این سبد دیگر فعال نیست. 4. ایجاد موجودیت سفارش (
Order
): - یک سفارش جدید ایجاد می‌شود و اطلاعات مربوط به کاربر، پرداخت، و وضعیت سفارش (در حال پردازش) تنظیم می‌شود. 5. ایجاد جزئیات سفارش (
OrderDetail
): - برای هر آیتم موجود در سبد خرید، یک جزئیات سفارش (
OrderDetail
) ایجاد می‌شود که شامل تعداد، قیمت، و محصول مرتبط است. - همه جزئیات سفارش در پایگاه داده اضافه می‌شود. 6. ذخیره‌سازی در پایگاه داده: - موجودیت سفارش (
Order
) و جزئیات سفارش (
OrderDetails
) به پایگاه داده اضافه شده و با استفاده از
SaveChanges
ذخیره می‌شوند. 7. برگشت نتیجه: - شیء
ResultDto
بازگردانده می‌شود که شامل اطلاعات موفقیت‌آمیز بودن عملیات است. --- ۳. کلاس
RequestAddNewOrderServiceDto
این کلاس برای انتقال داده‌های لازم جهت ثبت سفارش استفاده می‌شود: -
CartId
: شناسه سبد خرید. -
RequestPayId
: شناسه پرداخت. -
UserId
: شناسه کاربر. --- ۴. ویژگی‌های کلیدی کد 1. تزریق وابستگی: با استفاده از
IDataBaseContext
، کلاس سرویس به پایگاه داده متصل می‌شود. 2. مدیریت موجودیت‌ها: شامل ایجاد موجودیت سفارش و جزئیات آن است. 3. به‌روزرسانی وضعیت‌ها: سبد خرید و پرداخت پس از ثبت سفارش به‌روزرسانی می‌شوند. --- ۵. نقاط قابل بهبود 1. مدیریت خطا: - بررسی کنید که آیا موجودیت‌های
User
,
RequestPay
, و
Cart
قبل از استفاده از آن‌ها وجود دارند (برای جلوگیری از خطا در هنگام عدم وجود داده). - افزودن پیام‌های خطا در
ResultDto
در صورت شکست عملیات. 2. امنیت: - اطمینان حاصل کنید که شناسه‌های ورودی (
UserId
,
RequestPayId
,
CartId
) معتبر و متعلق به کاربر درست هستند. 3. تست‌پذیری: - از Mock کردن
IDataBaseContext
برای تست واحد سرویس استفاده کنید. --- جمع‌بندی این کد به‌طور مؤثر فرآیند ثبت سفارش جدید را مدیریت می‌کند و تمامی مراحل مربوط به کاربر، پرداخت و سبد خرید را پوشش می‌دهد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
EndPoint.Site.Controllers این کد برای مدیریت فرآیند پرداخت در یک سیستم فروشگاه آنلاین طراحی شده است. بیایید بخش‌های مختلف آن را بررسی کنیم: --- ساختار کلی این کلاس کنترلر
PayController
شامل دو اکشن اصلی است: 1.
Index
: شروع فرآیند پرداخت (ارسال درخواست به درگاه زرین‌پال). 2.
Verify
: تأیید پرداخت و پردازش پس از بازگشت کاربر از درگاه پرداخت. --- ۱. اکشن
Index
این اکشن وظیفه ارسال کاربر به درگاه پرداخت را دارد: 1. دریافت شناسه کاربر: csharp long? UserId = ClaimUtility.GetUserId(User); شناسه کاربر از اطلاعات کاربری جاری دریافت می‌شود. 2. دریافت اطلاعات سبد خرید: csharp var cart = _cartService.GetMyCart(_cookiesManeger.GetBrowserId(HttpContext), UserId); اطلاعات سبد خرید با استفاده از خدمات
CartService
دریافت می‌شود. 3. بررسی مبلغ سبد خرید: اگر مبلغ سبد خرید بیشتر از صفر باشد، فرآیند پرداخت ادامه پیدا می‌کند. در غیر این صورت کاربر به صفحه سبد خرید هدایت می‌شود: csharp if (cart.Data.SumAmount > 0) 4. ایجاد درخواست پرداخت: اطلاعات درخواست پرداخت شامل مبلغ و شناسه کاربر تنظیم می‌شود: csharp var requestPay = _addRequestPayService.Execute(cart.Data.SumAmount, UserId.Value); 5. ارسال درخواست به زرین‌پال: - پارامترهای مورد نیاز ارسال می‌شوند: csharp var parameters = new { amount = requestPay.Data.Amount, description = "پرداخت فاکتور شماره:" + requestPay.Data.RequestPayId, merchant_id = "cfa83c81-89b0-4993-9445-2c3fcd323455", callback_url = $"https://localhost:44350/Pay/Verify?guid={requestPay.Data.guid}" }; - درخواست با استفاده از
HttpClient
ارسال می‌شود. - بررسی موفقیت پاسخ از زرین‌پال انجام می‌شود. 6. هدایت کاربر به درگاه: اگر پاسخ موفقیت‌آمیز باشد، کاربر به درگاه پرداخت هدایت می‌شود: csharp string gatewayUrl = $"https://sandbox.zarinpal.com/pg/StartPay/{authority}"; return Redirect(gatewayUrl); --- ۲. اکشن
Verify
این اکشن وظیفه بررسی صحت پرداخت و انجام عملیات پس از آن را دارد: 1. بررسی وضعیت پرداخت: اگر
status
برابر با
"OK"
نباشد، پرداخت لغو شده تلقی می‌شود: csharp if (status != "OK") 2. ارسال درخواست تأیید پرداخت: اطلاعات تأیید به زرین‌پال ارسال شده و پاسخ دریافت می‌شود: csharp VerifyParameters parameters = new VerifyParameters { authority = authority, amount = requestPay.Data.Amount.ToString(), merchant_id = merchant }; 3. بررسی پاسخ: - اگر تراکنش موفق باشد: - شماره پیگیری ذخیره می‌شود. - سفارش جدید ثبت می‌شود: csharp _addNewOrderService.Execute(new RequestAddNewOrderSericeDto { CartId = cart.Data.CartId, UserId = UserId.Value, RequestPayId = requestPay.Data.Id }); - کاربر به صفحه سفارش‌ها هدایت می‌شود. - در صورت خطا، پیام مناسب نمایش داده می‌شود. --- ویژگی‌های کلیدی 1. پردازش پرداخت با زرین‌پال: درخواست پرداخت و تأیید آن با استفاده از API زرین‌پال انجام می‌شود. 2. مدیریت خطا: - خطاهای ارتباط با سرور. - خطاهای تراکنش ناموفق. - پیام‌های مناسب برای کاربر. 3. استفاده از DI: کلاس از وابستگی‌های مختلف مثل
CartService
، 
AddRequestPayService و
AddNewOrderService
استفاده می‌کند. --- پیشنهادات بهبود 1. مدیریت بهتر خطاها: جزئیات بیشتری از خطاها در لاگ ثبت شود. 2. تنظیمات امنیتی: بررسی کنید که شناسه‌های ورودی معتبر باشند. 3. بهینه‌سازی فرآیند: برای تراکنش‌های ناموفق، امکان ذخیره دلایل خطا در پایگاه داده فراهم شود.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
Test_Store.Application.Services.Carts این کد برای مدیریت سبد خرید کاربران در یک فروشگاه آنلاین طراحی شده است. وظایف اصلی شامل افزودن محصول به سبد خرید، حذف محصول، کاهش یا افزایش تعداد اقلام، و نمایش اطلاعات سبد خرید است. در ادامه توضیحات کامل هر بخش ارائه شده است: --- ۱. اینترفیس
ICartService
اینترفیس یک قرارداد را برای سرویس سبد خرید تعریف می‌کند: -
AddToCart
: افزودن یک محصول به سبد خرید با استفاده از
ProductId
و
BrowserId
. -
RemoveFromCart
: حذف محصول از سبد خرید با استفاده از
ProductId
و
BrowserId
. -
GetMyCart
: دریافت اطلاعات سبد خرید کاربر. -
Add
: افزایش تعداد یک آیتم در سبد خرید. -
LowOff
: کاهش تعداد یک آیتم در سبد خرید. اینترفیس برای جداسازی وابستگی‌ها و تسهیل تست‌پذیری استفاده می‌شود. --- ۲. کلاس
CartService
این کلاس پیاده‌سازی اینترفیس
ICartService
است و وظایف مدیریت سبد خرید را بر عهده دارد: #### متدها: 1.
AddToCart
: - هدف: افزودن یک محصول به سبد خرید. - مراحل: - بررسی وجود سبد خرید با استفاده از
BrowserId
. اگر وجود ندارد، یک سبد جدید ایجاد می‌کند. - بررسی وجود محصول در سبد خرید: - اگر محصول قبلاً در سبد خرید باشد، تعداد آن افزایش می‌یابد. - در غیر این صورت، محصول به‌عنوان آیتم جدید اضافه می‌شود. - در نهایت تغییرات ذخیره می‌شود و پیام موفقیت برمی‌گردد. 2.
RemoveFromCart
: - هدف: حذف یک محصول از سبد خرید. - مراحل: - محصول با استفاده از
ProductId
و
BrowserId
پیدا می‌شود. - ویژگی
IsRemoved
مقدار
true
می‌گیرد و زمان حذف (
RemoveTime
) ثبت می‌شود. - تغییرات ذخیره و پیام مناسب برگردانده می‌شود. 3.
GetMyCart
: - هدف: دریافت جزئیات سبد خرید کاربر. - مراحل: - سبد خرید با استفاده از
BrowserId
دریافت می‌شود. - اگر
UserId
موجود باشد، کاربر به سبد خرید مرتبط می‌شود. - اطلاعات سبد خرید شامل تعداد محصولات، مبلغ کل، و جزئیات هر آیتم بازگردانده می‌شود. 4.
Add
: - هدف: افزایش تعداد یک آیتم در سبد خرید. - مراحل: - آیتم با استفاده از
CartItemId
پیدا می‌شود. - تعداد آن افزایش می‌یابد و تغییرات ذخیره می‌شود. 5.
LowOff
: - هدف: کاهش تعداد یک آیتم در سبد خرید. - مراحل: - اگر تعداد آیتم کمتر از ۲ باشد، خطا برگردانده می‌شود. - در غیر این صورت تعداد کاهش می‌یابد و تغییرات ذخیره می‌شود. --- ۳. کلاس‌های DTO (
CartDto
و
CartItemDto
) این کلاس‌ها برای بازگرداندن اطلاعات سبد خرید به کاربر استفاده می‌شوند: 1.
CartDto
: - شامل اطلاعات کلی سبد خرید: -
CartId
: شناسه سبد خرید. -
ProductCount
: تعداد کل محصولات. -
SumAmount
: مبلغ کل. -
CartItems
: لیست آیتم‌های موجود در سبد خرید. 2.
CartItemDto
: - شامل اطلاعات هر آیتم: -
Id
: شناسه آیتم. -
Product
: نام محصول. -
Images
: تصویر محصول. -
Count
: تعداد. -
Price
: قیمت. --- ویژگی‌های کلیدی 1. Soft Delete: - محصولاتی که از سبد خرید حذف می‌شوند، به‌طور کامل از پایگاه داده حذف نمی‌شوند. ویژگی
IsRemoved
برای مدیریت این موضوع استفاده می‌شود. 2. ارتباط بین موجودیت‌ها: - هر سبد خرید شامل لیستی از آیتم‌ها است (
CartItems
). - هر آیتم مرتبط با یک محصول خاص است. 3. استفاده از EF Core: - از
Include
و
ThenInclude
برای بارگذاری اطلاعات مرتبط (مانند تصاویر محصولات) استفاده شده است. 4. امنیت و اعتبارسنجی: - از
BrowserId
برای شناسایی سبد خرید کاربر استفاده می‌شود. این به کاربرانی که وارد سیستم نشده‌اند اجازه مدیریت سبد خریدشان را می‌دهد. --- پیشنهادات بهبود 1. مدیریت خطاها: - پیام‌های خطا و لاگ دقیق‌تری برای مدیریت استثناها اضافه شود. 2. بررسی موجودی: - قبل از افزودن محصول به سبد خرید، موجودی انبار بررسی شود. 3. بهینه‌سازی کوئری‌ها: - از
AsNoTracking
برای کوئری‌های فقط خواندنی استفاده کنید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
Test_Store.Application.Services.Orders.Queries.GetUserOrders این کد برای دریافت لیست سفارش‌های یک کاربر خاص طراحی شده است. در ادامه، بخش‌های کلیدی کد و عملکرد آن را گام‌به‌گام توضیح می‌دهیم. --- ۱. اینترفیس
IGetUserOrdersService
این اینترفیس مسئول تعریف قرارداد مربوط به سرویس دریافت سفارش‌های کاربر است: -
Execute(long UserId)
: - این متد شناسه کاربر (
UserId
) را می‌گیرد و لیستی از سفارش‌های متعلق به آن کاربر را بازمی‌گرداند. - نتیجه در قالب
ResultDto<List<GetUserOrdersDto>>
بازگردانده می‌شود. --- ۲. کلاس
GetUserOrdersService
این کلاس پیاده‌سازی اینترفیس
IGetUserOrdersService
است و وظیفه مدیریت فرآیند دریافت سفارش‌های کاربر را بر عهده دارد. سازنده (
Constructor
): - کلاس از طریق تزریق وابستگی (
IDataBaseContext
) به پایگاه داده دسترسی پیدا می‌کند. متد
Execute
: این متد مراحل زیر را برای دریافت سفارش‌های کاربر اجرا می‌کند: 1. دریافت سفارش‌ها از پایگاه داده: - سفارش‌های متعلق به
UserId
با استفاده از EF Core دریافت می‌شوند: csharp _context.Orders .Include(p => p.OrderDetails) .ThenInclude(p => p.Product) .Where(p => p.UserId == UserId) .OrderByDescending(p => p.Id) .ToList(); - از
Include
و
ThenInclude
برای بارگذاری داده‌های مرتبط (جزئیات سفارش و محصول) استفاده شده است. - سفارش‌ها بر اساس
Id
به ترتیب نزولی مرتب می‌شوند. 2. تبدیل سفارش‌ها به DTO: - سفارش‌ها به مدل ساده‌تری (
GetUserOrdersDto
) تبدیل می‌شوند که فقط اطلاعات لازم را شامل می‌شود: csharp .Select(p => new GetUserOrdersDto { OrderId = p.Id, OrderState = p.OrderState, RequestPayId = p.RequestPayId, OrderDetails = p.OrderDetails.Select(o => new OrderDetailsDto { Count = o.Count, OrderDetailId = o.Id, Price = o.Price, ProductId = o.ProductId, ProductName = o.Product.Name, }).ToList(), }).ToList(); 3. بازگرداندن نتیجه: - لیست سفارش‌ها به همراه جزئیات آن‌ها به صورت موفقیت‌آمیز بازگردانده می‌شود: csharp return new ResultDto<List<GetUserOrdersDto>>() { Data = orders, IsSuccess = true, }; --- ۳. کلاس‌های DTO برای انتقال داده‌های سفارش‌ها و جزئیات آن‌ها از این کلاس‌ها استفاده شده است: 1.
GetUserOrdersDto
: - اطلاعات کلی سفارش: -
OrderId
: شناسه سفارش. -
OrderState
: وضعیت سفارش (پردازش، لغو، تحویل). -
RequestPayId
: شناسه درخواست پرداخت. -
OrderDetails
: لیستی از جزئیات سفارش. 2.
OrderDetailsDto
: - اطلاعات هر جزئیات سفارش: -
OrderDetailId
: شناسه جزئیات سفارش. -
ProductId
: شناسه محصول. -
ProductName
: نام محصول. -
Price
: قیمت محصول. -
Count
: تعداد محصول. --- ۴. ویژگی‌های کلیدی 1. ارتباط داده‌ها: - سفارش‌ها و جزئیات مرتبط به صورت کامل بارگذاری می‌شوند تا اطلاعات دقیق به کاربر ارائه شود. 2. مرتب‌سازی سفارش‌ها: - سفارش‌ها بر اساس زمان ثبت، به ترتیب نزولی مرتب شده‌اند. 3. نمایش اطلاعات مرتبط: - جزئیات هر سفارش شامل محصول، تعداد، و قیمت آن است. 4. تبدیل به DTO: - داده‌ها از مدل پیچیده پایگاه داده به مدل ساده‌تر برای انتقال به سمت کاربر تبدیل می‌شوند. --- ۵. مزایا 1. خوانایی و سازمان‌دهی: - استفاده از کلاس‌های DTO برای ساده کردن انتقال داده‌ها. 2. انعطاف‌پذیری: - قابلیت افزودن ویژگی‌های جدید به مدل‌های DTO بدون تغییر در ساختار پایگاه داده. 3. تست‌پذیری: - تزریق وابستگی و استفاده از اینترفیس امکان تست واحد را فراهم می‌کند. --- ۶. پیشنهادات بهبود 1. مدیریت خطا: - افزودن لاگ برای مدیریت خطاها در صورت عدم وجود سفارش‌ها. 2. بهینه‌سازی کوئری‌ها: - از
AsNoTracking
برای کوئری‌های فقط خواندنی استفاده کنید تا عملکرد افزایش یابد. 3. ویژگی‌های اضافی: - اضافه کردن تاریخ ثبت سفارش به مدل DTO برای نمایش زمان سفارش‌ها.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
EndPoint.Site.Controllers این کد مربوط به کنترلر
OrdersController
است که برای مدیریت سفارش‌های کاربران در یک سیستم فروشگاهی طراحی شده است. در ادامه به توضیحات کامل هر بخش می‌پردازیم: --- ۱. ویژگی‌های کلیدی - کنترلر `OrdersController`: - کنترلری برای دریافت و نمایش سفارش‌های یک کاربر خاص. - به دلیل استفاده از `[Authorize]`، فقط کاربران وارد شده به سیستم می‌توانند به این کنترلر دسترسی داشته باشند. - تزریق وابستگی (`Dependency Injection`): - از طریق `IGetUserOrdersService`، کنترلر به سرویس دریافت سفارش‌های کاربر دسترسی پیدا می‌کند. --- ۲. تزریق سرویس در سازنده csharp private readonly IGetUserOrdersService _getUserOrdersService; public OrdersController(IGetUserOrdersService getUserOrdersService) { _getUserOrdersService = getUserOrdersService; } - وظیفه: - وابستگی سرویس
IGetUserOrdersService
تزریق می‌شود تا متدهای مربوط به دریافت سفارش‌های کاربر قابل استفاده باشند. --- ۳. اکشن `Index` این اکشن برای نمایش لیست سفارش‌های کاربر در نمای مربوطه (View) استفاده می‌شود: csharp public IActionResult Index() { long userId = ClaimUtility.GetUserId(User).Value; return View(_getUserOrdersService.Execute(userId).Data); } مراحل: 1. دریافت شناسه کاربر (`UserId`): - شناسه کاربر وارد شده به سیستم با استفاده از ClaimUtility.GetUserId(User) دریافت می‌شود. - اگر کاربر وارد نشده باشد، به دلیل
[Authorize]
امکان دسترسی به این اکشن وجود نخواهد داشت. 2. دریافت سفارش‌های کاربر: - متد
Execute
از سرویس
IGetUserOrdersService
فراخوانی می‌شود که لیست سفارش‌های مرتبط با
UserId
را بازمی‌گرداند. 3. ارسال داده‌ها به ویو: - نتیجه متد
Execute
که شامل اطلاعات سفارش‌هاست، به نمای مربوطه ارسال می‌شود. --- ۴. امنیت و دسترسی - ویژگی `[Authorize]`: - تضمین می‌کند که فقط کاربران تأییدشده به این کنترلر دسترسی دارند. - کاربرانی که وارد سیستم نشده‌اند، به صفحه ورود هدایت می‌شوند. - استفاده از `ClaimUtility`: - برای شناسایی هویت کاربر فعلی، از
ClaimUtility
استفاده می‌شود که به‌طور ایمن اطلاعات کاربر را از
Claims
استخراج می‌کند. --- ۵. هدف اکشن `Index` - لیست تمامی سفارش‌های یک کاربر خاص را نمایش می‌دهد. - این لیست شامل جزئیات مربوط به سفارش‌ها خواهد بود (مانند اطلاعات محصول و وضعیت سفارش) که توسط
IGetUserOrdersService
تأمین می‌شود. --- ۶. نقاط قابل بهبود 1. مدیریت خطاها: - اگر
UserId
به درستی مقداردهی نشود یا سرویس بازگرداندن اطلاعات خطا داشته باشد، باید پیام‌های مناسبی به کاربر نمایش داده شود. 2. پشتیبانی از صفحه‌بندی: - در صورت وجود تعداد زیاد سفارش‌ها، صفحه‌بندی (Pagination) می‌تواند عملکرد بهتری را فراهم کند. 3. نمایش بهتر در ویو: - جزئیات کامل سفارش‌ها در ویو باید به‌صورت خوانا و قابل فهم نمایش داده شود. --- جمع‌بندی - عملکرد کنترلر: این کنترلر به کاربر اجازه می‌دهد لیست سفارش‌های خود را مشاهده کند. - امنیت: استفاده از
[Authorize]
و استخراج امن شناسه کاربر. - سادگی و خوانایی: منطق دریافت سفارش‌ها و نمایش آن‌ها در حد امکان ساده و قابل فهم طراحی شده است.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
این کد مربوط به نمای (View) صفحه نمایش سفارش‌های کاربران در یک فروشگاه آنلاین است. کد به زبان Razor نوشته شده و داده‌های سفارش‌های کاربر را که از کنترلر
OrdersController
ارسال می‌شود، به صورت جدول نمایش می‌دهد. در ادامه، بخش‌های مختلف کد توضیح داده شده است: --- ۱. استفاده از View Model csharp @model List<GetUserOrdersDto> - این خط نشان می‌دهد که View از یک لیست حاوی اطلاعات سفارش‌ها (
GetUserOrdersDto
) به عنوان مدل استفاده می‌کند. - اطلاعات سفارش شامل شناسه سفارش، وضعیت سفارش، شماره درخواست پرداخت و جزئیات محصولات است. --- ۲. تنظیمات View csharp @{ ViewData["Title"] = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } - ViewData["Title"]: عنوان صفحه تنظیم شده است. - Layout: این View از قالب اصلی (
_Layout.cshtml
) استفاده می‌کند که شامل Header، Footer و سایر بخش‌های مشترک است. --- ۳. نمایش عنوان html <h1>سفارشات شما</h1> - عنوان صفحه برای کاربر نمایش داده می‌شود که نشان‌دهنده بخش سفارشات است. --- ۴. ساختار جدول اصلی html <table style="border:dashed" class="table table-responsive table-active table-bordered"> - از یک جدول HTML برای نمایش اطلاعات سفارشات استفاده شده است. - کلاس‌های Bootstrap مانند
table-responsive
و
table-bordered
برای زیباسازی جدول استفاده شده‌اند. سرصفحه جدول (Thead): html <thead> <tr style="border:solid"> <th>شماره سفارش</th> <th>شماره فاکتور</th> <th>وضعیت سفارش</th> <th>محصولات در این سفارش</th> </tr> </thead> - ستون‌های اصلی جدول شامل: شماره سفارش، شماره فاکتور (RequestPayId)، وضعیت سفارش و لیست محصولات است. --- ۵. نمایش اطلاعات سفارش‌ها html <tbody> @foreach (var item in Model) { <tr style="border:solid"> <td>@item.OrderId</td> <td>@item.RequestPayId </td> <td>@item.OrderState </td> - این بخش برای هر سفارش در مدل (
Model
) یک ردیف جدید در جدول ایجاد می‌کند. - اطلاعات اصلی سفارش مانند شناسه، فاکتور و وضعیت نمایش داده می‌شود. --- ۶. نمایش محصولات در هر سفارش html <td> <table> @foreach (var detail in item.OrderDetails) { <tr style="border:outset"> <td> @detail.ProductName</td> <td> @detail.Price</td> <td> @detail.Count</td> </tr> } </table> </td> - این بخش یک جدول داخلی برای نمایش محصولات مرتبط با هر سفارش ایجاد می‌کند. - اطلاعات هر محصول شامل نام، قیمت و تعداد نمایش داده می‌شود. - از حلقه
foreach
برای پیمایش جزئیات هر سفارش (
OrderDetails
) استفاده شده است. --- ۷. زیباسازی و استایل‌دهی - جدول اصلی: - از
style="border:dashed"
برای نمایش خطوط جدول با استایل خاص استفاده شده است. - جدول داخلی: - از
style="border:outset"
برای نمایش خطوط جزئیات محصولات استفاده شده است. - استایل‌های Bootstrap: - کلاس‌های مربوط به جدول (
table-responsive
,
table-active
,
table-bordered
) برای طراحی بهتر و واکنش‌گرایی اضافه شده‌اند. --- ۸. کاربرد عملی این View به کاربر اجازه می‌دهد تا: - لیست سفارش‌های خود را به همراه وضعیت مشاهده کند. - جزئیات هر سفارش شامل محصولات، قیمت و تعداد آن‌ها را بررسی کند. --- پیشنهادات بهبود 1. اضافه کردن تاریخ سفارش: - یک ستون جدید برای نمایش تاریخ ثبت سفارش می‌تواند اضافه شود. 2. بهبود استایل: - از کلاس‌های بیشتر Bootstrap برای زیباسازی بهتر استفاده کنید. 3. صفحه‌بندی (Pagination): - اگر تعداد سفارش‌ها زیاد باشد، صفحه‌بندی می‌تواند کارایی و خوانایی را افزایش دهد. --- این View ساختاری مناسب و ساده دارد و اطلاعات مهم سفارش‌ها را به کاربر نمایش می‌دهد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه فروشگاه این قسمت ثبت سفارش
این کد بخشی از فایل Program.cs (یا قبلاً Startup.cs) در یک پروژه ASP.NET Core است و برای تنظیم تزریق وابستگی (Dependency Injection) استفاده می‌شود. در ادامه توضیحات دقیق ارائه می‌گردد: --- هدف کد این خطوط سرویس‌های
IAddNewOrderService
و
IGetUserOrdersService
را با استفاده از متد
AddScoped
به کانتینر DI (Dependency Injection) اضافه می‌کنند. --- تزریق وابستگی (Dependency Injection) چیست؟ - DI یک الگوی طراحی است که وابستگی‌ها را به کلاس‌ها تزریق می‌کند به جای اینکه کلاس‌ها خودشان وابستگی‌هایشان را ایجاد کنند. - مزایا: - افزایش تست‌پذیری: کدها به راحتی با استفاده از Mocking قابل تست هستند. - کاهش وابستگی سخت‌افزاری: وابستگی‌ها به صورت پویا توسط کانتینر DI مدیریت می‌شوند. - کاهش پیچیدگی: مدیریت چرخه حیات آبجکت‌ها ساده‌تر می‌شود. --- متد
AddScoped
متد
AddScoped
یکی از روش‌های رایج برای ثبت سرویس‌ها در کانتینر DI در ASP.NET Core است. سطوح عمر آبجکت (Lifetime): 1.
Transient
: - برای هر درخواست، نمونه جدیدی ایجاد می‌شود. - مناسب برای اشیاء سبک و بدون‌حالت. 2.
Scoped
: - برای هر درخواست HTTP یک نمونه ایجاد می‌شود. - مناسب برای سرویس‌هایی که برای کل طول عمر درخواست HTTP به یک نمونه نیاز دارند. 3.
Singleton
: - یک نمونه برای کل عمر برنامه ایجاد می‌شود. - مناسب برای سرویس‌های بدون‌حالت و اشتراکی. در این کد: csharp builder.Services.AddScoped<IAddNewOrderService, AddNewOrderService>(); builder.Services.AddScoped<IGetUserOrdersService, GetUserOrdersService>(); - هر بار که یک درخواست HTTP انجام می‌شود: - اگر کنترلری به
IAddNewOrderService
نیاز داشته باشد، کانتینر DI یک نمونه از
AddNewOrderService
ایجاد می‌کند. - اگر کنترلری به
IGetUserOrdersService
نیاز داشته باشد، کانتینر DI یک نمونه از
GetUserOrdersService
ایجاد می‌کند. --- کاربرد در برنامه 1.
IAddNewOrderService
: - این سرویس مسئول اضافه کردن سفارش‌های جدید است. - وقتی کنترلر (مثلاً
PayController
) یا هر کلاس دیگری به این سرویس نیاز داشته باشد، از طریق DI یک نمونه از
AddNewOrderService
دریافت می‌کند. 2.
IGetUserOrdersService
: - این سرویس مسئول دریافت لیست سفارش‌های کاربران است. - کنترلر
OrdersController
از این سرویس استفاده می‌کند. --- جمع‌بندی - این کد سرویس‌ها را با
Scoped
ثبت می‌کند تا برای هر درخواست HTTP یک نمونه مجزا ایجاد شود. - این روش باعث می‌شود سرویس‌های
AddNewOrderService
و
GetUserOrdersService
به صورت موثر و قابل مدیریت در برنامه استفاده شوند.
Test_Store 19.zip
حجم: 56.9M
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
مواردی که شما مطرح کرده‌اید یعنی Authentication (احراز هویت)**، **Authorization (مجوز دسترسی)**، **دسترسی و نقش‌ها**، بخش‌های کلیدی در امنیت برنامه‌های کاربردی هستند. اجازه دهید هر کدام را به صورت جداگانه توضیح دهیم: --- **۱. Authentication (احراز هویت) احراز هویت فرآیندی است که مشخص می‌کند آیا یک کاربر یا سیستم همان کسی است که ادعا می‌کند. - هدف: تأیید هویت کاربر یا موجودیت. - مثال‌های رایج: - نام کاربری و رمز عبور: کاربر باید اطلاعاتی مثل رمز عبور را وارد کند. - Multi-Factor Authentication: تأیید هویت با چندین مرحله (مانند رمز عبور و کد پیامک). - OAuth: استفاده از سرویس‌های شخص ثالث (مثلاً ورود با گوگل یا فیسبوک). مراحل کلی Authentication: 1. ورود اطلاعات: کاربر اطلاعاتی مانند ایمیل و رمز عبور وارد می‌کند. 2. بررسی: سیستم اطلاعات وارد شده را با داده‌های ذخیره شده در پایگاه داده مقایسه می‌کند. 3. نتیجه: در صورت معتبر بودن اطلاعات، کاربر وارد سیستم می‌شود. --- ۲. Authorization (مجوز دسترسی) پس از اینکه کاربر احراز هویت شد، فرآیند Authorization تعیین می‌کند که کاربر به چه داده‌ها یا قابلیت‌هایی دسترسی دارد. - هدف: اطمینان از اینکه فقط کاربران مجاز به بخش‌های خاصی از برنامه دسترسی داشته باشند. - مثال‌های رایج: - یک مدیر (Admin) بتواند کاربران را مدیریت کند ولی مشتری (Customer) فقط بتواند محصولات را مشاهده کند. - اپراتور (Operator) اجازه داشته باشد سفارش‌ها را مدیریت کند اما به تنظیمات سیستم دسترسی نداشته باشد. روش‌های رایج Authorization: 1. Role-Based Authorization (بر اساس نقش): دسترسی‌ها بر اساس نقش کاربر تنظیم می‌شود. 2. Policy-Based Authorization (بر اساس سیاست‌ها): قوانین پیچیده برای دسترسی‌ها اعمال می‌شود (مثلاً دسترسی بر اساس زمان یا مکان). --- ۳. دسترسی (Access Control) دسترسی به معنای تنظیم سطوح دسترسی برای کاربران و سیستم‌ها است. این مفهوم معمولاً با Authentication و Authorization ترکیب می‌شود. روش‌های کنترل دسترسی: 1. Discretionary Access Control (DAC): کاربر تعیین می‌کند چه کسانی به منابع دسترسی داشته باشند. 2. Mandatory Access Control (MAC): دسترسی‌ها بر اساس سیاست‌های مشخص شده توسط سیستم تنظیم می‌شود. 3. Role-Based Access Control (RBAC): دسترسی‌ها بر اساس نقش‌ها تعیین می‌شوند. --- ۴. نقش‌ها (Roles) نقش‌ها (Roles) یک بخش کلیدی از Authorization هستند. هر نقش مشخص می‌کند که کاربر چه توانمندی‌هایی در سیستم دارد. - هدف: ساده‌سازی مدیریت دسترسی‌ها. - مثال‌های نقش‌ها: - Admin: دسترسی کامل به تمامی بخش‌های سیستم. - Operator: دسترسی محدود به عملیات خاص (مانند مدیریت سفارش‌ها). - Customer: دسترسی فقط به مشاهده محصولات. مدیریت نقش‌ها: 1. نقش‌ها در پایگاه داده ذخیره می‌شوند. 2. هنگام احراز هویت، نقش کاربر به سیستم ارسال می‌شود. 3. سیستم بر اساس نقش کاربر، مجوزها و دسترسی‌ها را اعمال می‌کند. --- چگونه این موارد با هم کار می‌کنند؟ 1. کاربر وارد سیستم می‌شود (Authentication). 2. سیستم نقش کاربر را دریافت می‌کند (مثلاً
Admin
، 
Customer) و مجوزها را تعیین می‌کند (Authorization). 3. بر اساس نقش و مجوزها، دسترسی به قابلیت‌های خاص یا داده‌ها فراهم می‌شود (Access Control). --- توصیه‌ها برای پیاده‌سازی بهتر: 1. استفاده از استانداردهای امنیتی: مثل JWT برای احراز هویت و دسترسی امن. 2. مدیریت ساده نقش‌ها: از Role-Based Access Control (RBAC) برای تنظیم نقش‌ها و دسترسی‌ها استفاده کنید. 3. فعال کردن Multi-Factor Authentication: امنیت را با لایه‌های مختلف تأیید هویت افزایش دهید. 4. بررسی مجوزها در هر درخواست: برای جلوگیری از دسترسی غیرمجاز، Authorization باید در هر درخواست اجرا شود.
پروژه 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
خالی است یا وضعیت داده شده هیچ سفارشی را تطابق نمی‌دهد، سپس پیام مناسب بازگردانید. --- جمع‌بندی این کد به خوبی سفارشات را بر اساس وضعیت برای مدیران بازیابی می‌کند. می‌توانید با بهینه‌سازی‌های پیشنهادی آن را مؤثرتر کنید.