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 است بررسی کنیم. توضیحات کد: افزودن سرویس احراز هویت: csharp builder.Services.AddAuthentication(options => { options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) AddAuthentication: این متد، احراز هویت را به کانتینر سرویس‌ها اضافه می‌کند. options.DefaultSignInScheme: تعیین طرح پیش‌فرض برای ورود به سیستم (sign-in). در اینجا از کوکی‌ها استفاده شده است. options.DefaultAuthenticateScheme: تعیین طرح پیش‌فرض برای احراز هویت. options.DefaultChallengeScheme: تعیین طرح پیش‌فرض برای چالش‌های احراز هویت. پیکربندی تنظیمات کوکی: csharp .AddCookie(options => { options.LoginPath = new PathString("/"); options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0); }); AddCookie: این متد پیکربندی احراز هویت با کوکی را به احراز هویت اضافه می‌کند. options.LoginPath: مسیر ورود به سیستم را تعیین می‌کند. در اینجا مسیر ریشه (/) تعیین شده است. options.ExpireTimeSpan: زمان انقضای کوکی‌ها را تعیین می‌کند. در اینجا 5 دقیقه تنظیم شده است. نتیجه‌گیری: این کد احراز هویت با کوکی را در برنامه ASP.NET Core شما پیکربندی می‌کند. با تنظیم گزینه‌های مختلف مانند طرح‌های پیش‌فرض برای ورود، احراز هویت و چالش‌های احراز هویت، و همچنین پیکربندی تنظیمات کوکی مانند مسیر ورود و زمان انقضا، این کد به شما اطمینان می‌دهد که کاربران به درستی احراز هویت می‌شوند و دسترسی به منابع محافظت شده کنترل می‌شود.
پروژه ASP.Net Core MVC (وب و سی شارپ)
مدیریت دسته بندی ها
ادامه کدهای user قسمت سوم هست و این دفعه فقط Controller و Views اضافه شدند و تغیرات در AdminLayout و Layout اعمال شده است که کدها را توضیح می دهیم
بیایید این کدها را که در فایل AdminLayout استفاده شده‌اند توضیح دهیم. این کدها مربوط به رندر کردن بخش‌های اختیاری Scripts و Modals هستند. توضیحات کد: @RenderSection("Scripts", false): این خط کد بخش Scripts را رندر می‌کند. false به این معنی است که این بخش اختیاری است و اگر در صفحه ویو (View) تعریف نشده باشد، هیچ خطایی ایجاد نمی‌شود. این بخش معمولاً برای درج فایل‌های جاوا اسکریپت مورد استفاده قرار می‌گیرد که به صورت خاص برای یک صفحه نیاز هستند. @RenderSection("Modals", false): این خط کد بخش Modals را رندر می‌کند. false به این معنی است که این بخش نیز اختیاری است و اگر در صفحه ویو تعریف نشده باشد، هیچ خطایی ایجاد نمی‌شود. این بخش معمولاً برای درج مودال‌ها (پنجره‌های پاپ آپ) که به صورت خاص برای یک صفحه نیاز هستند استفاده می‌شود. مثال کاربرد: فرض کنید شما یک صفحه ویو دارید که نیاز به برخی فایل‌های جاوا اسکریپت و یک مودال دارد. در این صفحه ویو می‌توانید این بخش‌ها را تعریف کنید: csharp @section Scripts { <script src="~/js/custom-script.js"></script> } @section Modals { <div class="modal" id="myModal"> <!-- Modal content --> </div> } نتیجه‌گیری: استفاده از @RenderSection("Scripts", false) و @RenderSection("Modals", false) به شما این امکان را می‌دهد که بخش‌های اختیاری را به صفحات خود اضافه کنید. این کار باعث می‌شود که صفحات شما انعطاف‌پذیرتر شوند و بتوانید به راحتی فایل‌های جاوا اسکریپت و مودال‌های مورد نیاز هر صفحه را مدیریت کنید.
EndPoint.Site => Areas => Admin => Views => Categories => Index.cshtml بیایید کد صفحه نمایشی دسته‌بندی‌ها را که در فایل ویو Index استفاده شده است بررسی کنیم. توضیحات کد: Imports و مدل: csharp @using Test_Store.Application.Services.Products.Queries.GetCategories @model List<CategoriesDto> @using برای استفاده از فضای نام سرویس‌های مورد نیاز برای دریافت دسته‌بندی‌ها. @model برای تعریف مدل داده‌ای که به ویو ارسال می‌شود. در اینجا یک لیست از CategoriesDto. ViewData و Layout: csharp @{ ViewData["Title"] = "Index"; Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml"; } ViewData["Title"]: عنوان صفحه را به "Index" تنظیم می‌کند. Layout: از Layout مشخص شده برای این صفحه استفاده می‌کند. ساختار HTML: بخش‌های مختلف صفحه شامل هدر، بدنه، و جدول برای نمایش دسته‌بندی‌ها. بخش اصلی نمایش جدول دسته‌بندی‌ها: html <section id="configuration"> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-header"> <div class="card-title-wrap bar-success"> <h4 class="card-title">لیست دسته بندی ها</h4> </div> </div> <div class="card-body collapse show"> <div class="card-block card-dashboard"> <p class="card-text">دسته بندی محصولات فروشگاه </p> <a href="~/admin/categories/addnewcategory" class="btn btn-success">افزودن دسته بندی جدید</a> <div id="DataTables_Table_0_wrapper" class="dataTables_wrapper container-fluid dt-bootstrap4"> <div class="col-sm-12"> <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 class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="دسته بندی: activate to sort column descending" style="width: 222px;">دسته بندی</th> <th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="پدر: activate to sort column descending" style="width: 222px;">پدر</th> <th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label=": activate to sort column descending" style="width: 222px;"></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr role="row" class="odd"> <td class="sorting_1">@item.Name</td> <td> @{ string parent = item.Parent != null ? item.Parent.name : "-"; } <text> @parent </text> </td> <td> @if (item.Parent == null) { <a href="~/admin/categories/addnewcategory?ParentId=@item.Id" class="btn btn-success">افزودن فرزند</a> }
@if (item.HasChild == true) { <a href="~/admin/categories/index?ParentId=@item.Id" class="btn btn-info">مشاهده لیست فرزند ها </a> } </td> </tr> } </tbody> </table> </div> </div> </div> </div> </div> </div> </div> </section> جدول نمایش دسته‌بندی‌ها: ستون‌های دسته بندی، پدر و گزینه‌های مدیریت دسته‌بندی‌ها (افزودن فرزند، مشاهده لیست فرزندان). از foreach برای پیمایش مدل (لیست دسته‌بندی‌ها) و نمایش اطلاعات هر دسته‌بندی استفاده شده است. نتیجه‌گیری: این کد به شما امکان می‌دهد تا لیست دسته‌بندی‌های محصولات را به صورت جدولی نمایش دهید. هر ردیف شامل نام دسته‌بندی، پدر (در صورت وجود) و دکمه‌های افزودن فرزند و مشاهده لیست فرزندان است. از foreach برای پیمایش لیست دسته‌بندی‌ها استفاده می‌شود و اطلاعات در جدول به صورت پویا نمایش داده می‌شود.
EndPoint.Site => Areas => Admin => Views => Categories => AddNewCategory.cshtml بیایید کد صفحه‌ی AddNewCategory را که برای اضافه کردن دسته‌بندی جدید به محصولات استفاده می‌شود بررسی کنیم. توضیحات کد: ViewData و Layout: csharp @{ ViewData["Title"] = "AddNewCategory"; Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml"; } ViewData["Title"]: عنوان صفحه را به "AddNewCategory" تنظیم می‌کند. Layout: از Layout مشخص شده برای این صفحه استفاده می‌کند. ساختار اصلی HTML: استفاده از تگ section برای تعریف بخش اصلی صفحه. در اینجا از کلاس‌های Bootstrap برای تنظیمات واکنش‌گرا استفاده شده است. بخش اصلی فرم اضافه کردن دسته‌بندی: html <section class="basic-elements"> <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-header"> <div class="card-title-wrap bar-success"> <h4 class="card-title mb-0">اضافه کردن دسته بندی جدید برای محصولات</h4> </div> </div> <div class="card-body"> <div class="px-3"> <div class="form"> <div class="form-body"> <div class="row"> <div class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <input type="hidden" id="parentId" value="@ViewBag.parentId" /> <label for="basicInput">نام دسته بندی</label> <input type="text" class="form-control" id="Name"> </fieldset> </div> <div class="col-xl-12 col-lg-12 col-md-12 mb-1"> <fieldset class="form-group"> <br /> <a onclick="AddNewCategory()" class="btn btn-success col-md-12">اضافه کردن به لیست</a> </fieldset> </div> </div> </div> </div> </div> </div> </div> </div> </div> </section> فرم اصلی شامل یک فیلد ورودی برای نام دسته‌بندی و یک دکمه برای اضافه کردن دسته‌بندی است. از ViewBag.parentId برای تنظیم مقدار parentId استفاده می‌شود. بخش اسکریپت:
csharp @section Scripts { <link href="~/Sweetalert2/sweetalert2.min.css" rel="stylesheet" /> <script src="~/Sweetalert2/sweetalert2.min.js"></script> <script> function AddNewCategory() { swal.fire({ title: 'دسته بندی جدید', text: "آیا میخواهید دسته بندی جدید به لیست دسته بندی ها اضافه شود؟", icon: 'info', showCancelButton: true, confirmButtonColor: '', cancelButtonColor: '', confirmButtonText: 'بله، اضافه شود', cancelButtonText: 'خیر' }).then((result) => { if (result.value) { var Name = $("").val(); var parentId = $("").val(); var postData = { 'Name': Name, 'parentId': parentId, }; $.ajax({ contentType: 'application/x-www-form-urlencoded', dataType: 'json', type: "POST", url: "AddNewCategory", data: postData, success: function (data) { if (data.isSuccess == true) { swal.fire( 'موفق!', data.message, 'success' ).then(function (isConfirm) { location.reload(); }); } else { swal.fire( 'هشدار!', data.message, 'warning' ); } }, error: function (request, status, error) { swal.fire( 'هشدار!', request.responseText, 'warning' ); } }); } }) } </script> } استفاده از SweetAlert2 برای نمایش پیام‌های تایید و هشدار. تابع AddNewCategory برای ارسال درخواست AJAX به سرور و اضافه کردن دسته‌بندی جدید. بررسی صحت ورود اطلاعات و نمایش پیام‌های مناسب بر اساس پاسخ سرور. نتیجه‌گیری: این کد به شما امکان می‌دهد تا یک صفحه‌ی کاربرپسند برای اضافه کردن دسته‌بندی جدید به محصولات خود ایجاد کنید. از SweetAlert2 برای نمایش پیام‌های تایید و هشدار استفاده می‌شود و درخواست‌های AJAX برای ارسال داده‌ها به سرور استفاده می‌شوند.
EndPoint.Site => Areas => Admin => Controllers CategoriesController.cs بیایید کد CategoriesController را بررسی کنیم. این کنترلر برای مدیریت عملیات‌های مربوط به دسته‌بندی‌ها در قسمت مدیرت (Admin) استفاده می‌شود. توضیحات کد: Namespace و Imports: csharp using Microsoft.AspNetCore.Mvc; using Test_Store.Application.Interfaces.FacadPatterns; namespace EndPoint.Site.Areas.Admin.Controllers: نام‌فضا برای سازماندهی کدهای مرتبط با کنترلرهای قسمت مدیریت. using ها برای ایمپورت کردن کلاس‌ها و اینترفیس‌های مورد نیاز. تعریف کنترلر: csharp [Area("Admin")] public class CategoriesController : Controller { private readonly IProductFacad _productFacad; public CategoriesController(IProductFacad productFacad) { _productFacad = productFacad; } } [Area("Admin")]: مشخص می‌کند که این کنترلر متعلق به ناحیه (Area) "Admin" است. private readonly IProductFacad _productFacad;: تعریف یک فیلد خصوصی برای فاساد محصولات. سازنده کنترلر که وابستگی به IProductFacad را از طریق تزریق وابستگی دریافت می‌کند. متد Index: csharp public IActionResult Index(long? parentId) { return View(_productFacad.GetCategoriesService.Execute(parentId).Data); } این متد داده‌های دسته‌بندی‌ها را از سرویس GetCategoriesService می‌گیرد و به ویو ارسال می‌کند. parentId به عنوان پارامتر ورودی برای فیلتر کردن دسته‌بندی‌ها استفاده می‌شود. متد AddNewCategory (HttpGet): csharp [HttpGet] public IActionResult AddNewCategory(long? parentId) { ViewBag.parentId = parentId; return View(); } این متد ویو AddNewCategory را نمایش می‌دهد و parentId را به ViewBag اختصاص می‌دهد تا در ویو استفاده شود. متد AddNewCategory (HttpPost): csharp [HttpPost] public IActionResult AddNewCategory(long? ParentId, string Name) { var result = _productFacad.AddNewCategoryService.Execute(ParentId, Name); return Json(result); } این متد داده‌های ارسال شده توسط کاربر را دریافت می‌کند و به سرویس AddNewCategoryService ارسال می‌کند. سپس نتیجه را به صورت JSON بازمی‌گرداند. نتیجه‌گیری: این کنترلر CategoriesController به شما امکان می‌دهد تا عملیات‌های مربوط به مدیریت دسته‌بندی‌ها را انجام دهید. شامل متدهای Index برای نمایش لیست دسته‌بندی‌ها، AddNewCategory برای نمایش فرم اضافه کردن دسته‌بندی جدید (با متد GET) و پردازش فرم اضافه کردن دسته‌بندی جدید (با متد POST) است.
Test_Store 8.zip
حجم: 53.6M
افزودن محصولات جدید و لیست محصولات با جزئیات
بیایید کد IDataBaseContext را بررسی کنیم. این اینترفیس به منظور تعریف قراردادهای مورد نیاز برای ارتباط با دیتابیس در لایه‌ی داده‌ای (Data Layer) استفاده می‌شود. توضیحات کد: تعریف اینترفیس: csharp public interface IDataBaseContext { // ... } این کد یک اینترفیس به نام IDataBaseContext تعریف می‌کند که شامل قراردادهای مورد نیاز برای کار با دیتابیس است. DbSet ویژگی‌ها: این بخش شامل تعریف جداول مختلف دیتابیس به صورت DbSet است که نمایشی از جداول در دیتابیس را ارائه می‌دهد. DbSet<T> کلاس‌هایی هستند که از طرف Entity Framework برای کار با جداول دیتابیس استفاده می‌شوند. csharp DbSet<User> Users { get; set; } DbSet<Role> Roles { get; set; } DbSet<UserInRole> UserInRoles { get; set; } DbSet<Category> Categories { get; set; } DbSet<Product> Products { get; set; } DbSet<ProductImages> ProductImages { get; set; } DbSet<ProductFeatures> ProductFeatures { get; set; } هر یک از این DbSet ها به ترتیب برای کار با جداول User, Role, UserInRole, Category, Product, ProductImages, و ProductFeatures استفاده می‌شوند. متدهای SaveChanges: این بخش شامل تعریف متدهای مختلف برای ذخیره تغییرات در دیتابیس است. csharp int SaveChanges(bool acceptAllChangesOnSuccess); int SaveChanges(); Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken()); Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()); int SaveChanges(bool acceptAllChangesOnSuccess): این متد تغییرات را در دیتابیس ذخیره می‌کند و پارامتر acceptAllChangesOnSuccess تعیین می‌کند که آیا همه تغییرات در صورت موفقیت ذخیره شوند یا خیر. int SaveChanges(): این متد تغییرات را در دیتابیس ذخیره می‌کند. Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken()): این متد به صورت غیر همزمان (asynchronous) تغییرات را در دیتابیس ذخیره می‌کند. Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()): این متد به صورت غیر همزمان تغییرات را در دیتابیس ذخیره می‌کند. نتیجه‌گیری: این اینترفیس IDataBaseContext به شما امکان می‌دهد تا جداول مختلف دیتابیس را تعریف کنید و متدهای مختلف برای ذخیره تغییرات در دیتابیس را ارائه می‌دهد. این طراحی کمک می‌کند تا ارتباط با دیتابیس به صورت انعطاف‌پذیر و قابل تست باشد.
بیایید کد اینترفیس IProductFacad را بررسی کنیم. این اینترفیس به منظور تعریف قراردادهای مورد نیاز برای فاساد محصولات استفاده می‌شود. فاساد (Facade) یک الگوی طراحی است که یک رابط ساده و یکپارچه برای سیستم‌های پیچیده ارائه می‌دهد. توضیحات کد: تعریف اینترفیس: csharp public interface IProductFacad { // ... } این کد یک اینترفیس به نام IProductFacad تعریف می‌کند که شامل قراردادهای مورد نیاز برای مدیریت محصولات است. ویژگی‌ها (Properties): این بخش شامل تعریف ویژگی‌های مختلف برای عملیات‌های مرتبط با محصولات است. csharp AddNewCategoryService AddNewCategoryService { get; } IGetCategoriesService GetCategoriesService { get; } AddNewProductService AddNewProductService { get; } IGetAllCategoriesService GetAllCategoriesService { get; } IGetProductForAdminService GetProductForAdminService { get; } IGetProductDetailForAdminService GetProductDetailForAdminService { get; } AddNewCategoryService: این ویژگی یک شیء از نوع AddNewCategoryService را بازمی‌گرداند که برای اضافه کردن دسته‌بندی جدید استفاده می‌شود. IGetCategoriesService: این ویژگی یک شیء از نوع IGetCategoriesService را بازمی‌گرداند که برای دریافت دسته‌بندی‌ها استفاده می‌شود. AddNewProductService: این ویژگی یک شیء از نوع AddNewProductService را بازمی‌گرداند که برای اضافه کردن محصول جدید استفاده می‌شود. IGetAllCategoriesService: این ویژگی یک شیء از نوع IGetAllCategoriesService را بازمی‌گرداند که برای دریافت همه دسته‌بندی‌ها استفاده می‌شود. IGetProductForAdminService: این ویژگی یک شیء از نوع IGetProductForAdminService را بازمی‌گرداند که برای دریافت اطلاعات محصولات برای مدیران استفاده می‌شود. IGetProductDetailForAdminService: این ویژگی یک شیء از نوع IGetProductDetailForAdminService را بازمی‌گرداند که برای دریافت جزئیات محصولات برای مدیران استفاده می‌شود. نتیجه‌گیری: این اینترفیس IProductFacad به شما امکان می‌دهد تا قراردادهای مختلف برای مدیریت محصولات را تعریف کنید. با استفاده از اینترفیس فاساد، می‌توانید به صورت یکپارچه و ساده به عملیات‌های پیچیده‌ای مانند اضافه کردن دسته‌بندی و محصول، دریافت دسته‌بندی‌ها و محصولات دسترسی داشته باشید.