eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به سرویس ایجاد سفارش جدید در سیستم فروشگاه آنلاین است. این سرویس از اطلاعات سبد خرید کاربر (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
,
Email
,
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
یک ابزار ساده و قدرتمند برای مدیریت اطلاعات کاربران احراز هویت شده است. این کلاس امکان استخراج شناسه، ایمیل و نقش‌های کاربر را فراهم می‌کند. با اعمال بهبود‌های پیشنهادی، می‌توان عملکرد و قابلیت نگهداری آن را افزایش داد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به یک کنترلر در بخش مدیریت (Admin) یک سایت است که وظیفه مدیریت دسته‌بندی‌ها را بر عهده دارد. این کنترلر شامل عملیات‌هایی برای نمایش لیست دسته‌بندی‌ها، اضافه کردن دسته‌بندی جدید و مدیریت دسته‌بندی‌ها است. در ادامه بخش‌های مختلف این کد را توضیح می‌دهیم: --- ۱. مشخصات کلی کنترلر ویژگی
[Area("Admin")]
: csharp [Area("Admin")] - این ویژگی نشان‌دهنده این است که کنترلر مربوط به بخش مدیریت سایت است. - مسیر دسترسی به کنترلر شامل نام بخش خواهد بود (مثلاً
/Admin/Categories
). ویژگی
[Authorize(Roles = "Admin,Operator")]
: csharp [Authorize(Roles = "Admin,Operator")] - این ویژگی دسترسی به کنترلر را محدود به کاربران با نقش‌های
Admin
یا
Operator
می‌کند. - اگر کاربر وارد نشده باشد یا نقش مناسبی نداشته باشد، نمی‌تواند به این کنترلر دسترسی داشته باشد. --- ۲. وابستگی‌ها و سازنده کنترلر تعریف وابستگی: csharp private readonly IProductFacad _productFacad; -
IProductFacad
: این وابستگی به یک الگوی Facade اشاره دارد که عملیات مربوط به محصولات و دسته‌بندی‌ها را مدیریت می‌کند. تزریق وابستگی: csharp public CategoriesController(IProductFacad productFacad) { _productFacad = productFacad; } - وابستگی
IProductFacad
از طریق سازنده کنترلر تزریق می‌شود. - این روش باعث افزایش تست‌پذیری و انعطاف‌پذیری کنترلر می‌شود. --- ۳. اکشن
Index
(نمایش لیست دسته‌بندی‌ها) تعریف اکشن: csharp public IActionResult Index(long? parentId) { return View(_productFacad.GetCategoriesService.Execute(parentId).Data); } عملکرد: 1. ورودی: -
parentId
: یک شناسه اختیاری برای نمایش زیرشاخه‌های دسته‌بندی. - اگر
parentId
مقدار داشته باشد، زیرشاخه‌های دسته‌بندی مربوطه نمایش داده می‌شوند. 2. فراخوانی سرویس: - از متد
Execute
در
GetCategoriesService
وابسته به Facade استفاده می‌شود تا دسته‌بندی‌های مرتبط بازیابی شوند. 3. خروجی: - داده‌های بازیابی‌شده به View ارسال می‌شوند تا لیست دسته‌بندی‌ها نمایش داده شود. مثال استفاده: - نمایش تمامی دسته‌بندی‌های اصلی: /Admin/Categories/Index - نمایش زیرشاخه‌های یک دسته‌بندی: /Admin/Categories/Index?parentId=5 --- ۴. اکشن
AddNewCategory
(افزودن دسته‌بندی جدید) نمایش فرم افزودن دسته‌بندی: csharp [HttpGet] public IActionResult AddNewCategory(long? parentId) { ViewBag.parentId = parentId; return View(); } - این اکشن با روش
GET
فرم افزودن دسته‌بندی را نمایش می‌دهد. - مقدار
parentId
به View ارسال می‌شود تا در صورت نیاز، دسته‌بندی والد مشخص شود. --- ثبت دسته‌بندی جدید: csharp [HttpPost] public IActionResult AddNewCategory(long? ParentId, string Name) { var result = _productFacad.AddNewCategoryService.Execute(ParentId, Name); return Json(result); } شرح عملکرد: 1. ورودی: -
ParentId
: شناسه والد دسته‌بندی (اختیاری). -
Name
: نام دسته‌بندی جدید. 2. فراخوانی سرویس: - متد
Execute
از
AddNewCategoryService
فراخوانی می‌شود تا دسته‌بندی جدید ایجاد شود. 3. خروجی: - نتیجه عملیات به صورت JSON بازگردانده می‌شود. مثال استفاده: - افزودن یک دسته‌بندی اصلی: json { "ParentId": null, "Name": "دسته‌بندی جدید" } - افزودن یک زیرشاخه: json { "ParentId": 5, "Name": "زیرشاخه جدید" } --- ۵. الگوی Facade و وابستگی‌ها این کنترلر به
IProductFacad
وابسته است.
IProductFacad
احتمالاً شامل چندین سرویس است که عملیات مرتبط با دسته‌بندی‌ها و محصولات را مدیریت می‌کنند. سرویس‌های مورد استفاده: -
GetCategoriesService
: برای بازیابی لیست دسته‌بندی‌ها. -
AddNewCategoryService
: برای ایجاد دسته‌بندی جدید. --- ۶. نقاط قوت کد 1. کنترل دسترسی: محدود کردن دسترسی به کاربران مجاز با استفاده از
[Authorize(Roles = "Admin,Operator")]
. 2. استفاده از الگوی Facade: سرویس‌ها از طریق یک نقطه ورود (Facade) مدیریت می‌شوند، که کد را خواناتر و قابل نگهداری‌تر می‌کند. 3. تعامل ساده با Viewها: داده‌ها به صورت مستقیم به View ارسال می‌شوند. 4. پشتیبانی از دسته‌بندی‌های تو در تو: امکان ایجاد دسته‌بندی‌های والد و زیرشاخه‌ها به خوبی مدیریت شده است. --- ۷. پیشنهادات بهبود 1. اعتبارسنجی داده‌های ورودی: - بررسی کنید که
Name
خالی یا خیلی کوتاه نباشد: csharp if (string.IsNullOrWhiteSpace(Name)) { return Json(new { IsSuccess = false, Message = "نام دسته‌بندی نمی‌تواند خالی باشد" }); }
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
2. مدیریت خطاها: - در صورت بروز خطا در سرویس یا بازگشت نتیجه ناموفق، پیام مناسب به کاربر نمایش داده شود. 3. ثبت عملیات در لاگ: - ثبت لاگ برای عملیات اضافه کردن دسته‌بندی یا خطاهای احتمالی می‌تواند مفید باشد. --- جمع‌بندی این کنترلر به خوبی مدیریت عملیات مرتبط با دسته‌بندی‌ها را انجام می‌دهد و از اصول طراحی مناسب مانند تزریق وابستگی و استفاده از الگوی Facade بهره می‌برد. قابلیت‌هایی مانند نمایش دسته‌بندی‌ها، اضافه کردن زیرشاخه‌ها و محدود کردن دسترسی با استفاده از نقش‌ها، کد را امن و کاربردی کرده‌اند.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این بخش از کد مربوط به ناوبری (Navigation) در بخش مدیریت (
Admin Layout
) است و بر اساس نقش‌های کاربری (
Admin
و
Operator
) مشخص می‌کند که آیا بخش "دسته‌بندی‌ها" در منوی مدیریت نمایش داده شود یا خیر. در ادامه توضیحات کامل ارائه شده است: --- ۱. نقش‌ها و بررسی دسترسی csharp @if (ClaimUtility.GetRolse(User).Where(p => p == "Admin" || p == "Operator").Count() >= 1) شرح عملکرد: - متد ClaimUtility.GetRolse(User) لیستی از نقش‌های کاربر وارد‌شده را برمی‌گرداند. - از شرط
Where(p => p == "Admin" || p == "Operator")
استفاده می‌شود تا بررسی کند آیا کاربر نقش
Admin
یا
Operator
دارد. - اگر تعداد نقش‌ها بیشتر از 0 باشد (
Count() >= 1
)، منوی دسته‌بندی‌ها نمایش داده می‌شود. - این شرط تضمین می‌کند که فقط کاربران با نقش‌های مجاز به این بخش دسترسی داشته باشند. --- ۲. طراحی منوی "دسته‌بندی‌ها" html <li class="nav-item has-treeview "> <a href="#" class="nav-link active"> <i class="fa fa-tag"></i> <p> دسته بندی ها <i class="right fa fa-angle-left"></i> </p> </a> <ul class="nav nav-treeview"> <li class="nav-item"> <a href="~/admin/categories/" class="nav-link active"> <i class="fa fa-bookmark-o"></i> <p>دسته بندی ها </p> </a> </li> <li class="nav-item"> <a href="~/admin/categories/addnewcategory" class="nav-link active"> <i class="fa fa-plus nav-icon"></i> <p>افزودن دسته بندی جدید </p> </a> </li> </ul> </li> شرح طراحی: 1. مجموعه منو (
has-treeview
): - کلاس
nav-item has-treeview
نشان‌دهنده این است که این گزینه دارای زیرمنو است. 2. لینک اصلی منو (
nav-link active
): - لینک اصلی منو به‌صورت فعال (
active
) نشان داده شده است. -
fa fa-tag
: یک آیکون برای دسته‌بندی‌ها نمایش داده می‌شود. - متن "دسته بندی ها" و فلش کنار آن (
fa fa-angle-left
) نمایش داده می‌شود. 3. زیرمنوها (
nav nav-treeview
): - شامل دو گزینه است: - مشاهده دسته‌بندی‌ها: لینک به
~/admin/categories/
برای نمایش دسته‌بندی‌ها. - افزودن دسته‌بندی جدید: لینک به
~/admin/categories/addnewcategory
برای ایجاد دسته‌بندی جدید. --- ۳. نقاط قوت کد 1. کنترل دسترسی: - استفاده از نقش‌های کاربری برای کنترل نمایش منو باعث افزایش امنیت و بهبود تجربه کاربری شده است. 2. طراحی خوانا و ساده: - ساختار HTML منو به خوبی طراحی شده و از کلاس‌های Bootstrap برای استایل‌دهی استفاده شده است. 3. انعطاف‌پذیری: - به راحتی می‌توان گزینه‌های بیشتری به زیرمنو اضافه کرد یا نقش‌های کاربری دیگری را به شرط دسترسی افزود. --- ۴. پیشنهادات بهبود 1. استفاده از
Any
به جای
Where
و
Count
: - شرط می‌تواند به این شکل ساده‌تر شود: csharp @if (ClaimUtility.GetRolse(User).Any(p => p == "Admin" || p == "Operator")) 2. نمایش منوی غیرفعال برای کاربران غیرمجاز: - به جای حذف منو برای کاربران غیرمجاز، می‌توان منوی غیرفعال نمایش داد: html <li class="nav-item has-treeview disabled"> <a href="#" class="nav-link"> <i class="fa fa-tag"></i> <p>دسته بندی ها</p> </a> </li> 3. پیاده‌سازی سیاست‌های دسترسی پیشرفته: - می‌توانید از سیستم
Policy-Based Authorization
در ASP.NET Core برای مدیریت دقیق‌تر دسترسی‌ها استفاده کنید. --- جمع‌بندی این کد به خوبی نمایش منوی "دسته‌بندی‌ها" را بر اساس نقش‌های کاربری مدیریت می‌کند. طراحی ساده و استفاده از کلاس‌های CSS و Bootstrap باعث بهبود خوانایی و کارایی شده است. با بهبودهای پیشنهادی، می‌توانید این کد را مؤثرتر و منعطف‌تر کنید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به پیکربندی احراز هویت (Authentication) و مجوزها (Authorization) در پروژه ASP.NET Core است. این تنظیمات در فایل `Program.cs`استفاده می‌شوند تا مکانیزم امنیتی برای مدیریت کاربران و دسترسی‌ها فعال شود. بیایید هر بخش از کد را بررسی کنیم: --- ### ۱. تنظیم مجوزها (Authorization) #### بخش `AddAuthorization`: csharp builder.Services.AddAuthorization(options => { options.AddPolicy(UserRoles.Admin, policy => policy.RequireRole(UserRoles.Admin)); options.AddPolicy(UserRoles.Customer, policy => policy.RequireRole(UserRoles.Customer)); options.AddPolicy(UserRoles.Operator, policy => policy.RequireRole(UserRoles.Operator)); }); #### عملکرد: - افزودن سیاست‌های دسترسی: - در این بخش، سه سیاست دسترسی بر اساس نقش‌های
Admin`، `Customer
و
Operator
تعریف شده‌اند. - `AddPolicy`: برای تعریف سیاست‌های دسترسی استفاده می‌شود. - `RequireRole`: مشخص می‌کند که کاربر باید دارای نقش خاصی باشد تا بتواند از این سیاست استفاده کند. #### مثال: - اگر بخواهید دسترسی به یک اکشن را محدود به کاربران با نقش
Admin
کنید، از سیاست تعریف‌شده استفاده می‌کنید: csharp [Authorize(Policy = UserRoles.Admin)] public IActionResult AdminOnly() { return View(); } #### کاربرد سیاست‌ها: - سیاست‌ها به صورت انعطاف‌پذیر به اکشن‌ها یا کنترلرها اعمال می‌شوند. - می‌توانید سیاست‌های پیچیده‌تر تعریف کنید (مثلاً بررسی شرایط مختلف). --- ### ۲. تنظیم احراز هویت (Authentication) #### بخش `AddAuthentication`: csharp builder.Services.AddAuthentication(options => { options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }); #### عملکرد: - افزودن سیستم احراز هویت: - این بخش مکانیزم احراز هویت را فعال می‌کند. - `DefaultSignInScheme`: مشخص می‌کند که از کوکی‌ها برای ورود کاربر استفاده شود. - `DefaultAuthenticateScheme`: تنظیمات مربوط به احراز هویت را مشخص می‌کند. - `DefaultChallengeScheme`: مشخص می‌کند که هنگام درخواست ورود، از کدام سیستم استفاده شود. --- ### ۳. تنظیمات کوکی‌ها #### بخش `AddCookie`: csharp .AddCookie(options => { options.LoginPath = new PathString("/Authentication/Signin"); options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0); options.AccessDeniedPath = new PathString("/Authentication/Signin"); }); #### عملکرد: - پیکربندی سیستم کوکی‌ها: - `LoginPath`: مسیر نمایش صفحه ورود کاربر. اگر کاربر احراز هویت نشده باشد و به مسیری که نیاز به ورود دارد دسترسی پیدا کند، به این مسیر هدایت می‌شود. - مثال:
/Authentication/Signin
. - `ExpireTimeSpan`: مدت زمان انقضای کوکی‌ها. در اینجا کوکی پس از 5 دقیقه منقضی می‌شود. - `AccessDeniedPath`: مسیر نمایش صفحه دسترسی غیرمجاز. اگر کاربر احراز هویت شده اما دسترسی به مسیر خاصی ندارد، به این مسیر هدایت می‌شود. --- ### ۴. فرآیند کلی کار 1. تعریف نقش‌ها و سیاست‌ها: - در بخش `AddAuthorization`، سیاست‌های مبتنی بر نقش‌ها تعریف می‌شوند. - این سیاست‌ها در کنترلرها و اکشن‌ها برای محدود کردن دسترسی استفاده می‌شوند. 2. احراز هویت و کوکی‌ها: - سیستم احراز هویت بر اساس کوکی‌ها پیکربندی شده است. - مسیر ورود و دسترسی غیرمجاز مشخص شده‌اند. --- ### ۵. نکات بهبود و بهترین روش‌ها 1. مدت زمان انقضای کوکی: - اگر سیستم برای استفاده طولانی‌مدت طراحی شده است، مدت زمان انقضای کوکی‌ها را افزایش دهید. - یا قابلیت
Remember Me
اضافه کنید. 2. اضافه کردن صفحه دسترسی غیرمجاز: - صفحه‌ای مخصوص برای نمایش پیام "دسترسی غیرمجاز" ایجاد کنید و در
AccessDeniedPath
استفاده کنید: csharp options.AccessDeniedPath = new PathString("/Authentication/AccessDenied"); 3. مدیریت نقش‌ها در دیتابیس: - تعریف نقش‌ها در کد (Hardcoded) ممکن است محدود باشد. به جای آن، نقش‌ها را در پایگاه داده مدیریت کنید و از سیستم
RoleManager
استفاده کنید. --- ### جمع‌بندی این کد تنظیمات اساسی برای مدیریت احراز هویت و دسترسی‌ها در یک پروژه ASP.NET Core فراهم می‌کند. از کوکی‌ها برای مدیریت وضعیت ورود کاربران استفاده می‌شود و سیاست‌های مبتنی بر نقش‌ها برای کنترل دسترسی تعریف شده‌اند. این رویکرد ساده و مؤثر است و می‌تواند به راحتی گسترش یابد.