پروژه 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 در ادمین
این کد مربوط به یک سرویس در سیستم مدیریت مالی است که درخواستهای پرداخت کاربران را برای مدیران بازیابی میکند. این سرویس اطلاعاتی مانند مقدار پرداخت، شناسه پرداخت، وضعیت پرداخت و نام کاربر را ارائه میدهد. در ادامه توضیحات کامل کد ارائه شده است:
---
۱. اینترفیس
IGetRequestPayForAdminServicecsharp public interface IGetRequestPayForAdminService { ResultDto<List<RequestPayDto>> Execute(); } شرح عملکرد: - هدف: تعریف یک متد برای بازیابی اطلاعات پرداختها. - متد
Execute: این متد باید لیستی از پرداختها به همراه اطلاعات مربوطه را بازگرداند. - خروجی این متد از نوع
ResultDto<List<RequestPayDto>>است که شامل لیست دادهها (پرداختها) و وضعیت موفقیت یا شکست عملیات میباشد. --- ۲. کلاس
GetRequestPayForAdminServicecsharp 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بازگردانده میشود. --- ۳. کلاس
RequestPayDtocsharp 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 یا پیادهسازیهای دیگر برای تست فراهم میشود. --- ۳. متد
Indexcsharp 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 به خوبی طراحی شده و قابلیت نمایش لیست فاکتورها، جستجو و صفحهبندی را فراهم میکند. با افزودن پیشنهادات بهبود، میتوانید تجربه کاربری و قابلیتهای این صفحه را افزایش دهید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به سرویس ایجاد سفارش جدید در سیستم فروشگاه آنلاین است. این سرویس از اطلاعات سبد خرید کاربر (Cart) و درخواست پرداخت (RequestPay) برای ایجاد سفارش (Order) استفاده میکند. در ادامه توضیح بخشهای مختلف کد ارائه شده است:
---
### ۱. اینترفیس `IAddNewOrderService`
csharp
public interface IAddNewOrderService
{
ResultDto Execute(RequestAddNewOrderSericeDto request);
}
- هدف: تعریف متدی برای ایجاد سفارش جدید.
- متد `Execute`:
- ورودی: یک شیء از نوع
RequestAddNewOrderSericeDtoکه شامل اطلاعات مورد نیاز برای ایجاد سفارش است (مانند شناسه سبد خرید، شناسه درخواست پرداخت، شناسه کاربر و...). - خروجی: یک شیء
ResultDtoکه نشاندهنده وضعیت موفقیت یا شکست عملیات و یک پیام است. --- ### ۲. کلاس `AddNewOrderService` این کلاس پیادهسازی اینترفیس
IAddNewOrderServiceاست و منطق اصلی برای ایجاد سفارش را مدیریت میکند. #### سازنده (`Constructor`): csharp public AddNewOrderService(IDataBaseContext context) { _context = context; } - تزریق وابستگی: کلاس از طریق
IDataBaseContextبه پایگاه داده متصل میشود تا به جدولهای مورد نیاز (مانند کاربران، درخواستهای پرداخت و سبد خرید) دسترسی داشته باشد. #### متد `Execute`: csharp public ResultDto Execute(RequestAddNewOrderSericeDto request) این متد شامل مراحل زیر است: --- ### ۳. مراحل ایجاد سفارش جدید #### (۱) بازیابی اطلاعات مرتبط از پایگاه داده csharp var user = _context.Users.Find(request.UserId); var requestPay = _context.RequestPays.Find(request.RequestPayId); var cart = _context.Carts.Include(p => p.CartItems) .ThenInclude(p => p.Product) .Where(p => p.Id == request.CartId).FirstOrDefault(); - اطلاعات کاربر از جدول
Usersبازیابی میشود. - اطلاعات درخواست پرداخت از جدول
RequestPaysدریافت میشود. - سبد خرید کاربر به همراه آیتمها (
CartItems) و اطلاعات محصولات آن (
Product) بازیابی میشود. --- #### (۲) بهروزرسانی وضعیت پرداخت csharp requestPay.IsPay = true; requestPay.PayDate = DateTime.Now; requestPay.RefId = request.RefId; requestPay.Authority = requestPay.Authority; - وضعیت پرداخت (
IsPay) به
trueتغییر میکند. - تاریخ پرداخت (
PayDate) با تاریخ جاری تنظیم میشود. - شناسه مرجع (
RefId) و کد مرجع (
Authority) بهروزرسانی میشوند. --- #### (۳) تکمیل وضعیت سبد خرید csharp cart.Finished = true; - وضعیت سبد خرید به
Finishedتغییر میکند تا نشان دهد این سبد خرید تکمیل شده و به سفارش تبدیل شده است. --- #### (۴) ایجاد سفارش csharp Order order = new Order() { Address = "", OrderState = OrderState.Processing, RequestPay = requestPay, User = user, }; _context.Orders.Add(order); - یک شیء جدید از نوع
Orderایجاد میشود که شامل اطلاعات کاربر، وضعیت پرداخت و وضعیت سفارش (
OrderState) است. - وضعیت سفارش به صورت پیشفرض
Processing(در حال پردازش) تنظیم میشود. - سفارش به جدول
Ordersاضافه میشود. --- #### (۵) ایجاد جزئیات سفارش (OrderDetails) csharp List<OrderDetail> orderDetails = new List<OrderDetail>(); foreach (var item in cart.CartItems) { OrderDetail orderDetail = new OrderDetail() { Count = item.Count, Order = order, Price = item.Product.Price, Product = item.Product, }; orderDetails.Add(orderDetail); } _context.OrderDetails.AddRange(orderDetails); - برای هر آیتم موجود در سبد خرید، یک شیء از نوع
OrderDetailایجاد میشود که شامل: - تعداد محصول (
Count). - قیمت محصول (
Price). - ارتباط با سفارش (
Order) و محصول (
Product). - جزئیات سفارش به جدول
OrderDetailsاضافه میشوند. --- #### (۶) ذخیره تغییرات در پایگاه داده csharp _context.SaveChanges(); - تمامی تغییرات (ایجاد سفارش، جزئیات سفارش، بهروزرسانی پرداخت و سبد خرید) ذخیره میشوند. --- ### ۴. مدل `RequestAddNewOrderSericeDto` csharp public class RequestAddNewOrderSericeDto { public long CartId { get; set; } public long RequestPayId { get; set; } public long UserId { get; set; } public string Authority { get; set; } public long RefId { get; set; } = 0; } - این مدل دادههای ورودی مورد نیاز برای ایجاد سفارش را شامل میشود: - `CartId`: شناسه سبد خرید. - `RequestPayId`: شناسه درخواست پرداخت. - `UserId`: شناسه کاربر. - `Authority`: کد مرجع پرداخت. - `RefId`: شناسه مرجع پرداخت. ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
### ۵. خروجی `ResultDto`
csharp
return new ResultDto()
{
IsSuccess = true,
Message = "",
};
- خروجی سرویس نشاندهنده موفقیت عملیات و یک پیام توضیحی (در اینجا خالی) است.
---
### ۶. نقاط قوت کد
1. طراحی ماژولار: تمامی مراحل به صورت گام به گام و قابل فهم طراحی شدهاند.
2. مدیریت ارتباطات: استفاده از ارتباطات مستقیم بین سبد خرید، پرداخت و سفارشها.
3. انعطافپذیری: قابلیت استفاده مجدد از این سرویس در بخشهای مختلف سیستم.
---
### ۷. پیشنهادات بهبود
1. افزودن مدیریت خطا:
- بررسی کنید که آیا موجودیتهای بازیابی شده (
user,
cart,
requestPay) خالی (
null) هستند یا نه. csharp if (user == null || cart == null || requestPay == null) { return new ResultDto { IsSuccess = false, Message = "اطلاعات ناقص است." }; } 2. اعتبارسنجی دادههای ورودی: - بررسی کنید که شناسههای ورودی (
CartId,
RequestPayId,
UserId) مقادیر معتبر داشته باشند. 3. بهبود خوانایی: - جداسازی منطق به متدهای کوچکتر برای افزایش خوانایی و نگهداری کد. 4. ثبت لاگ عملیات: - برای ردیابی عملیات، ثبت لاگ در صورت موفقیت یا خطا مفید خواهد بود. --- ### جمعبندی این کد با طراحی مناسب، منطق مربوط به ایجاد سفارش جدید را پیادهسازی کرده است. با اعمال پیشنهادات بهبود، میتوانید قابلیت اطمینان، امنیت و خوانایی کد را افزایش دهید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به کنترلر
AuthenticationControllerاست که مدیریت ثبتنام، ورود و خروج کاربران را در یک فروشگاه آنلاین انجام میدهد. این کنترلر از ویژگیهای ASP.NET Core برای احراز هویت (Authentication) و مدیریت کاربران استفاده میکند. در ادامه توضیحات کامل درباره بخشهای مختلف این کد ارائه شده است: --- ### ۱. وابستگیها و تزریق سرویسها #### تزریق وابستگی: csharp private readonly IRegisterUserService _registerUserService; private readonly IUserLoginService _userLoginService; public AuthenticationController(IRegisterUserService registerUserService, IUserLoginService userLoginService) { _registerUserService = registerUserService; _userLoginService = userLoginService; } - دو سرویس زیر تزریق شدهاند: -
IRegisterUserService: برای مدیریت ثبتنام کاربران استفاده میشود. -
IUserLoginService: برای احراز هویت کاربران هنگام ورود استفاده میشود. - مزیت: استفاده از تزریق وابستگی کد را قابل تست و منعطف میکند. --- ### ۲. اکشن
Signup(ثبتنام کاربر) #### [HttpGet] Signup csharp [HttpGet] public IActionResult Signup() { return View(); } - یک اکشن ساده برای نمایش صفحه ثبتنام. - درخواست از نوع
GETاست و فقط View مربوط به ثبتنام را باز میگرداند. #### [HttpPost] Signup csharp [HttpPost] public IActionResult Signup(SignupViewModel request) - این اکشن وظیفه مدیریت ثبتنام کاربران را بر عهده دارد. - دادههای واردشده توسط کاربر در قالب
SignupViewModelدریافت میشوند. ##### مراحل ثبتنام: 1. اعتبارسنجی اولیه: - اطمینان از ارسال تمامی فیلدهای اجباری (
FullName,
Password,
RePassword). - بررسی برابر بودن رمز عبور و تکرار رمز عبور. - بررسی حداقل طول رمز عبور. - بررسی صحت فرمت ایمیل با استفاده از Regular Expression. 2. بررسی وضعیت ورود: - اگر کاربر از قبل وارد شده باشد، اجازه ثبتنام مجدد داده نمیشود. 3. فراخوانی سرویس ثبتنام: - دادهها به سرویس
RegisterUserServiceارسال میشوند: csharp var signeupResult = _registerUserService.Execute(new RequestRegisterUserDto { ... }); 4. ایجاد Claims برای کاربر: - پس از موفقیت ثبتنام، اطلاعات کاربر در قالب
Claimsایجاد میشود که برای مدیریت احراز هویت استفاده میشود. - نمونه Claims: csharp var claims = new List<Claim>() { new Claim(ClaimTypes.NameIdentifier, signeupResult.Data.UserId.ToString()), new Claim(ClaimTypes.Email, request.Email), new Claim(ClaimTypes.Name, request.FullName), new Claim(ClaimTypes.Role, "Customer"), }; 5. ذخیره احراز هویت: - اطلاعات Claims با استفاده از کوکیها (Cookies) در سیستم ذخیره میشوند: csharp var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); HttpContext.SignInAsync(principal, properties); --- ### ۳. اکشن
Signin(ورود کاربر) #### [HttpGet] Signin csharp public IActionResult Signin(string ReturnUrl = "/") { ViewBag.url = ReturnUrl; return View(); } - نمایش فرم ورود. - پارامتر
ReturnUrlبرای نگهداری مسیر بازگشت کاربر پس از ورود استفاده میشود. #### [HttpPost] Signin csharp [HttpPost] public IActionResult Signin(string Email, string Password, string url = "/") - وظیفه احراز هویت کاربر با استفاده از ایمیل و رمز عبور. ##### مراحل ورود: 1. فراخوانی سرویس ورود: - اطلاعات ایمیل و رمز عبور برای اعتبارسنجی به سرویس
UserLoginServiceارسال میشوند: csharp var signupResult = _userLoginService.Execute(Email, Password); 2. ایجاد Claims برای کاربر: - اطلاعات کاربر شامل شناسه، ایمیل، و نقشها در قالب Claims ایجاد میشود: csharp foreach (var item in signupResult.Data.Roles) { claims.Add(new Claim(ClaimTypes.Role, item)); } 3. ذخیره اطلاعات ورود: - اطلاعات Claims با استفاده از کوکی ذخیره میشوند و زمان انقضای کوکی تنظیم میشود: csharp var properties = new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTime.Now.AddDays(5), }; ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
۴. اکشن
SignOut(خروج کاربر) خروج از حساب کاربری: csharp public IActionResult SignOut() { HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } - کاربر را از سیستم خارج میکند. - تمامی کوکیهای مربوط به احراز هویت حذف میشوند. --- ### ۵. اعتبارسنجی و امنیت - اعتبارسنجی رمز عبور: - بررسی طول و مطابقت رمز عبور. - اعتبارسنجی ایمیل: - استفاده از Regex برای بررسی فرمت ایمیل. - جلوگیری از ثبتنام مکرر: - بررسی وضعیت ورود کاربر پیش از ثبتنام. --- ### ۶. نقاط قوت کد 1. جداسازی وظایف: ثبتنام، ورود و خروج هر کدام در اکشنهای جداگانه مدیریت میشوند. 2. استفاده از Claims: برای مدیریت نقشها و اطلاعات کاربری در سیستم احراز هویت استفاده میشود. 3. اعتبارسنجی اولیه: بررسی دادههای ورودی پیش از ارسال به سرویسها انجام شده است. --- ### ۷. پیشنهادات بهبود 1. اضافه کردن پیامهای مناسبتر: - پیامهای کاربرپسندتر در هنگام خطا (مثلاً فرمت ایمیل اشتباه). 2. پیادهسازی کلمات عبور قویتر: - بررسی شرایط پیچیدگی رمز عبور (مانند حداقل یک حرف بزرگ و یک عدد). 3. پشتیبانی از قابلیت Remember Me: - اضافه کردن گزینه برای ذخیره وضعیت ورود کاربر به مدت طولانیتر. --- ### جمعبندی این کنترلر عملکرد خوبی برای مدیریت عملیات احراز هویت (Authentication) کاربران ارائه میدهد. با استفاده از ابزارهای امنیتی مانند Claims و کوکیها، امنیت سیستم افزایش پیدا کرده است. همچنین، اعتبارسنجی دادهها در مراحل مختلف، کد را امنتر و مطمئنتر کرده است.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به یک کلاس استاتیک به نام
ClaimUtilityاست که ابزارهایی برای مدیریت و استخراج اطلاعات از ClaimsPrincipal در ASP.NET Core ارائه میدهد. در ASP.NET Core، ClaimsPrincipal یک شیء است که اطلاعات احراز هویت و مجوزهای کاربر، مانند شناسه کاربر، ایمیل و نقشها را ذخیره میکند. بیایید هر بخش از این کد را بررسی کنیم: --- ### ۱. کلاس و هدف کلی csharp public static class ClaimUtility - نوع کلاس: استاتیک. - هدف: این کلاس شامل متدهایی برای استخراج اطلاعات کلیدی از ClaimsPrincipal، مثل شناسه کاربر، ایمیل و نقشها است. --- ### ۲. متد `GetUserId` csharp public static long? GetUserId(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipalکه اطلاعات کاربر احراز هویت شده را نگهداری میکند. 2. منطق کاری: - تلاش میکند مقدار ClaimTypes.NameIdentifier را که معمولاً شامل شناسه کاربر است، پیدا کند. - اگر یافت شود، مقدار آن به
longتبدیل میشود و بازگردانده میشود. 3. مدیریت خطا: - اگر هیچ Claim با نوع
NameIdentifierپیدا نشود یا خطایی رخ دهد، مقدار
nullبازگردانده میشود. #### مثال استفاده: csharp long? userId = ClaimUtility.GetUserId(User); if (userId != null) { Console.WriteLine($"شناسه کاربر: {userId}"); } --- ### ۳. متد `GetUserEmail` csharp public static string GetUserEmail(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipalکه شامل اطلاعات Claims است. 2. منطق کاری: - تلاش میکند مقدار ClaimTypes.Email (ایمیل کاربر) را پیدا و بازگرداند. 3. مدیریت خطا: - اگر خطایی رخ دهد یا Claim مربوط به ایمیل وجود نداشته باشد، مقدار
nullبازگردانده میشود. #### مثال استفاده: csharp string email = ClaimUtility.GetUserEmail(User); if (!string.IsNullOrEmpty(email)) { Console.WriteLine($"ایمیل کاربر: {email}"); } --- ### ۴. متد `GetRolse` csharp public static List<string> GetRolse(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipal. 2. منطق کاری: - تمامی Claims که نوع آنها به "role" ختم میشود، استخراج شده و مقادیر آنها به صورت لیستی از رشتهها بازگردانده میشوند. - این Claims معمولاً نشاندهنده نقشهای کاربر در سیستم هستند. 3. مدیریت خطا: - اگر خطایی رخ دهد، مقدار
nullبازگردانده میشود. #### مثال استفاده: csharp List<string> roles = ClaimUtility.GetRolse(User); foreach (var role in roles) { Console.WriteLine($"نقش: {role}"); } --- ### ۵. نقاط قوت کد 1. ساده و کاربردی: - متدها به صورت جداگانه مسئول استخراج اطلاعات خاص از Claims هستند. 2. مدیریت خطا: - هر متد با استفاده از بلوک
try-catchخطاهای احتمالی را مدیریت میکند و برنامه از کرش شدن جلوگیری میشود. 3. استفاده از LINQ: - برای جستجوی نقشها از LINQ استفاده شده است که کد را خواناتر کرده است. --- ### ۶. پیشنهادات بهبود 1. اصلاح نام متد `GetRolse`: - نام متد باید
GetRolesباشد تا اشتباه تایپی (
Rolse) اصلاح شود و خوانایی کد افزایش یابد. csharp public static List<string> GetRoles(ClaimsPrincipal User) 2. ثبت لاگ در مدیریت خطا: - به جای بازگشت `null`، میتوان خطاها را در سیستم لاگ ثبت کرد: csharp catch (Exception ex) { // ثبت خطا در سیستم لاگ Console.WriteLine($"خطا: {ex.Message}"); return null; } 3. بررسی مقادیر Claims پیش از استفاده: - در متد
GetUserEmail`، بهتر است بررسی شود که آیا `FindFirstمقدار
nullبازگردانده است یا خیر: csharp var emailClaim = claimsIdentity.FindFirst(ClaimTypes.Email); return emailClaim != null ? emailClaim.Value : null; 4. ایجاد تستهای واحد: - برای اطمینان از صحت عملکرد متدها، تستهای واحد (Unit Tests) برای هر متد ایجاد شود. --- ### ۷. کاربرد عملی این کلاس معمولاً در پروژههایی که از ASP.NET Core Identity یا Cookie Authentication برای مدیریت کاربران استفاده میکنند، به کار میرود: - بررسی نقش کاربر برای نمایش یا پنهان کردن گزینههای منو. - دریافت شناسه یا ایمیل کاربر احراز هویت شده برای استفاده در عملیات پایگاه داده. - تأمین امنیت بخشهای خاص برنامه بر اساس نقش کاربر. --- ### جمعبندی کلاس
ClaimUtilityیک ابزار ساده و قدرتمند برای مدیریت اطلاعات کاربران احراز هویت شده است. این کلاس امکان استخراج شناسه، ایمیل و نقشهای کاربر را فراهم میکند. با اعمال بهبودهای پیشنهادی، میتوان عملکرد و قابلیت نگهداری آن را افزایش داد.