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.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
خالی است یا وضعیت داده شده هیچ سفارشی را تطابق نمی‌دهد، سپس پیام مناسب بازگردانید. --- جمع‌بندی این کد به خوبی سفارشات را بر اساس وضعیت برای مدیران بازیابی می‌کند. می‌توانید با بهینه‌سازی‌های پیشنهادی آن را مؤثرتر کنید.
پروژه 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 لیست سفارشات را به صورت مرتب و خوانا نمایش می‌دهد و امکانات پایه‌ای مانند جستجو و صفحه‌بندی را فراهم کرده است. با افزودن قابلیت‌های بیشتر و بهینه‌سازی، می‌توانید عملکرد و تجربه کاربری را بهبود دهید.