eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
121 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
Test_Store 6.zip
حجم: 45.7M
قسمت آخر user ثبت نام و ورود واقعا ببخشید که کد های من زمان زیادی طول کشید بعدا کد ها را توضیح می دهم
ساختار درختی پوشه و فایل Test_Store │ ├── Doc │ ├── Src │ ├── Common │ │ └── library: Test_Store.Common │ │ ├── Dto │ │ │ └── ResultDto.cs │ │ ├── Roles │ │ │ └── UserRoles.cs │ │ ├── Pagination.cs │ │ └── PasswordHasher.cs │ │ │ ├──── Core │ │ ├──── library: Test_Store.Application │ │ │ ├── Interfaces │ │ │ │ ├── Contexs │ │ │ │ │ └── IDataBaseCotex.cs │ │ │ │ └── FacadPatterns │ │ │ │ └── IProductFacad.cs │ │ │ └── Services │ │ │ ├── Users │ │ │ │ ├── Commands │ │ │ │ │ ├── EditUser │ │ │ │ │ │ └── IEditUserService.cs │ │ │ │ │ ├── RegisterUser │ │ │ │ │ │ └── IRegisterUserService.cs │ │ │ │ │ ├── RemoveUser │ │ │ │ │ │ ├── IRemoveUserService.cs │ │ │ │ │ │ └── RemoveUserService.cs │ │ │ │ │ ├── UserLogin │ │ │ │ │ │ └── IUserLoginService.cs │ │ │ │ │ └── UserSatusChange │ │ │ │ │ └── IUserSatusChangeService.cs │ │ │ │ └── Queries │ │ │ │ ├── GetRoles │ │ │ │ │ ├── GetRolesService.cs │ │ │ │ │ ├── IGetRolesService.cs │ │ │ │ │ └── RolesDto.cs │ │ │ │ └── GetUsers │ │ │ │ ├── GetUsersDto.cs │ │ │ │ ├── GetUsersService.cs │ │ │ │ ├── IGetUsersService.cs │ │ │ │ ├── RequestGetUserDto.cs │ │ │ │ └── ReslutGetUserDto.cs │ │ │ └── Products │ │ │ ├── Commands │ │ │ │ └── AddNewCategory │ │ │ │ └── IAddNewCategoryService.cs │ │ │ ├── FacadPattern │ │ │ │ └── ProductFacad.cs │ │ │ └── Queries │ │ │ └── GetCategories │ │ │ └── IGetCategoriesService.cs │ │ │ │ │ └── library: Test_Store.Domain │ │ └── Entities │ │ ├── Users │ │ │ ├── Role.cs │ │ │ ├── User.cs │ │ │ └── UserInRole.cs │ │ ├── Commons │ │ │ ├── BaseEntity.cs │ │ │ └── BaseEntityNotId.cs │ │ └── Products │ │ └── Category.cs │ │ │ ├── Infrastructure │ │ ├── library: Test_Store.Infrastructure │ │ └── library: Test_Store.Persistence │ │ ├── Context │ │ │ └── DataBaseContext.cs │ │ └── Migrations │ │ ├── ......_Users.cs │ │ └── DataBaseContextModelSnapshot.cs │ │ │ └── Presentation │ └── ASP.NET Core: EndPoint.Site │ │ │ ├── Areas │ │ └── Admin │ │ ├── Controllers │ │ │ └── UsersController.cs │ │ ├── Views │ │ │ ├── Shared │ │ │ │ └── _AdminLayout.cshtml │ │ │ └── Users │ │ │ ├── Create.cshtml │ │ │ └── Index.cshtml │ │ └── Models │ ├── Controllers │ │ ├── AuthenticationController.cs │ │ └── HomeController.cs │ ├── Views │ │ ├── Authentication │ │ │ ├── Signin.cshtml │ │ │ └── Signup.cshtml │ │ ├── Home │ │ │ ├── Index.cshtml │ │ │ └── Privacy.cshtml │ │ ├── Shared │ │ │ ├── _Layout.cshtml │ │ │ ├── _ValidationScriptsPartial.cshtml │ │ │ └── Error.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── Models │ │ ├── ViewModels │ │ │ └── AuthenticationViewModel
│ │ │ └── SignupViewModel.cs │ │ └── ErrorViewModel.cs │ ├── wwwroot │ │ ├── AdminTemplate │ │ ├── css │ │ ├── js │ │ ├── lib │ │ ├── SiteTemplate │ │ └── favicon.ico │ └── Program.cs │ └── Test
Test_Store.Common => PasswordHasher.cs بیایید با توضیح کد
PasswordHasher
که در کلاس
Test_Store.Common.PasswordHasher
قرار دارد، شروع کنیم. این کلاس به منظور هش و تأیید رمز عبور‌ها طراحی شده است و از الگوریتم‌های مختلفی استفاده می‌کند. توضیحات کد: 1. Properties (ویژگی‌ها): -
bool _useAspNetCore
: مشخص می‌کند که آیا از کتابخانه Microsoft.AspNetCore.Cryptography.KeyDerivation استفاده می‌شود یا خیر. -
byte _formatMarker
: نشانگر قالب هش (مانند IdentityV2, IdentityV3, Custom). -
KeyDerivationPrf _prf
: تابع اشتقاق کلید مورد استفاده (مانند HMACSHA256). -
HashAlgorithmName _hashAlgorithmName
: نام الگوریتم هش مورد استفاده (مانند SHA256). -
bool _includeHeaderInfo
: مشخص می‌کند که آیا اطلاعات پیکربندی در هدر قرار داده می‌شود یا خیر. -
int _saltLength
: طول نمک. -
int _requestedLength
: طول کلید مشتق شده. -
int _iterCount
: تعداد تکرارهای الگوریتم PBKDF2. 2. Constructor (سازنده): - سازنده کلاس
PasswordHasher
پیش‌فرض‌ها را تنظیم می‌کند. در این مثال، تنظیمات IdentityV3 با HMACSHA256 و 10000 تکرار استفاده شده است. 3. HashPassword Method (متد HashPassword): - این متد یک رمز عبور را هش می‌کند. ابتدا یک نمک تولید می‌کند، سپس کلید مشتق شده (subkey) را با استفاده از PBKDF2 تولید می‌کند و نهایتاً خروجی به دست آمده را به صورت Base64 بازمی‌گرداند. 4. VerifyPassword Method (متد VerifyPassword): - این متد رمز عبور ورودی را با رمز عبور هش شده مقایسه می‌کند. ابتدا رمز عبور هش شده را تجزیه و تحلیل می‌کند، سپس رمز عبور ورودی را هش می‌کند و کلیدهای مشتق شده (subkeys) را با هم مقایسه می‌کند. 5. Helper Methods (متدهای کمکی): -
ByteArraysEqual
: دو آرایه بایت را برای برابری مقایسه می‌کند. -
ReadNetworkByteOrder
: خواندن یک مقدار UInt32 از آرایه بایت. -
WriteNetworkByteOrder
: نوشتن یک مقدار UInt32 به آرایه بایت. نتیجه‌گیری: این کلاس به شما کمک می‌کند تا رمز عبورهای کاربران را به صورت ایمن هش کنید و در پایگاه داده ذخیره کنید. همچنین می‌توانید رمز عبورهای ورودی کاربران را با رمز عبورهای ذخیره شده مقایسه کنید و از صحت آن‌ها اطمینان حاصل کنید.
Test_Store.Application => FacadPatterns => IProductFacad.cs بیایید این اینترفیس
IProductFacad
را بررسی کنیم تا ببینیم که چگونه عمل می‌کند و چه نیازهایی دارد. بررسی کد: 1. تعریف اینترفیس `IProductFacad`: - این اینترفیس دو پراپرتی شامل
AddNewCategoryService
و
GetCategoriesService
دارد. - این دو پراپرتی به سرویس‌های مربوط به افزودن دسته‌بندی جدید و دریافت دسته‌بندی‌ها اشاره دارند. کد: csharp public interface IProductFacad { AddNewCategoryService AddNewCategoryService { get; } IGetCategoriesService GetCategoriesService { get; } } مفاهیم مرتبط: 1. پراپرتی `AddNewCategoryService`: - این پراپرتی به یک کلاس سرویس به نام
AddNewCategoryService
اشاره دارد که مسئولیت افزودن دسته‌بندی جدید را بر عهده دارد. 2. پراپرتی `GetCategoriesService`: - این پراپرتی به یک اینترفیس سرویس به نام
IGetCategoriesService
اشاره دارد که مسئولیت دریافت دسته‌بندی‌ها را بر عهده دارد. نتیجه‌گیری: این اینترفیس به نوعی الگوی طراحی Facade را پیاده‌سازی می‌کند که به شما امکان می‌دهد تا مجموعه‌ای از سرویس‌های مرتبط را از طریق یک نقطه ورود واحد مدیریت کنید.
Test_Store => Application => Services => Products => Commands => AddNewCategory => IAddNewCategoryService.cs بیایید با هم کد AddNewCategoryService را بررسی کنیم. این کد به منظور افزودن یک دسته‌بندی جدید به فروشگاه شما طراحی شده است. توضیحات کد: Interface IAddNewCategoryService: اینترفیس IAddNewCategoryService یک متد Execute را تعریف می‌کند که یک دسته‌بندی جدید را به دیتابیس اضافه می‌کند. این متد دو پارامتر می‌پذیرد: ParentId که شناسه دسته‌بندی والد است (در صورت وجود) و Name که نام دسته‌بندی جدید است. این متد یک شیء ResultDto برمی‌گرداند که حاوی وضعیت و پیام نتیجه عملیات است. Class AddNewCategoryService: کلاس AddNewCategoryService پیاده‌سازی اینترفیس IAddNewCategoryService است. Constructor (سازنده): سازنده کلاس AddNewCategoryService که یک شیء از نوع IDataBaseContext را دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات افزودن دسته‌بندی جدید است. ابتدا بررسی می‌کند که آیا Name خالی یا null است. اگر خالی باشد، یک پیام خطا برمی‌گرداند. سپس یک شیء از نوع Category ایجاد می‌کند و نام دسته‌بندی و دسته‌بندی والد (در صورت وجود) را تنظیم می‌کند. این دسته‌بندی جدید را به دیتابیس اضافه می‌کند و تغییرات را ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز برمی‌گرداند. Method GetParent: این متد مسئول یافتن دسته‌بندی والد با استفاده از ParentId است. اگر ParentId موجود باشد، دسته‌بندی والد را از دیتابیس پیدا می‌کند و برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا دسته‌بندی‌های جدید را به دیتابیس خود اضافه کنید و در صورت وجود، دسته‌بندی والد را نیز تنظیم کنید. این فرآیند به شما کمک می‌کند تا ساختار دسته‌بندی‌های فروشگاه خود را بهبود بخشید و مدیریت کنید.
Test_Store => Application => Services => Products => FacadPattern => ProductFacad.cs بیایید کد ProductFacad را بررسی کنیم. این کلاس به منظور مدیریت الگوی فاساد (Facad Pattern) برای عملیات مرتبط با محصولات طراحی شده است. فاساد پترن یکی از الگوهای طراحی است که به منظور ساده‌سازی و یکپارچه‌سازی دسترسی به سیستم‌های پیچیده استفاده می‌شود. توضیحات کد: Namespace و Interface: namespace Test_Store.Application.Services.Products.FacadPattern: نام‌فضا برای سازماندهی کدها. IProductFacad: اینترفیس مربوط به کلاس ProductFacad. Class ProductFacad: این کلاس پیاده‌سازی اینترفیس IProductFacad است. Constructor (سازنده): سازنده کلاس ProductFacad که یک شیء از نوع IDataBaseContext را دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Property AddNewCategoryService: این Property یک شیء از نوع AddNewCategoryService را برمی‌گرداند. در صورتی که این شیء از قبل ایجاد نشده باشد، یک نمونه جدید از آن ایجاد می‌کند. استفاده از الگوی Singleton برای اطمینان از این که تنها یک نمونه از AddNewCategoryService وجود دارد. Property GetCategoriesService: این Property یک شیء از نوع IGetCategoriesService را برمی‌گرداند. در صورتی که این شیء از قبل ایجاد نشده باشد، یک نمونه جدید از آن ایجاد می‌کند. استفاده از الگوی Singleton برای اطمینان از این که تنها یک نمونه از GetCategoriesService وجود دارد. مزایای استفاده از Facad Pattern: سادگی و یکنواختی: فاساد پترن به شما اجازه می‌دهد تا یک رابط ساده و یکنواخت برای عملیات پیچیده ایجاد کنید. نگهداری آسان: با استفاده از این الگو، تغییرات و نگهداری کدها ساده‌تر می‌شود، زیرا تمامی دسترسی‌ها از طریق یک نقطه (فاساد) انجام می‌شود. افزایش انعطاف‌پذیری: این الگو به شما امکان می‌دهد تا به راحتی سرویس‌های جدیدی اضافه کنید یا سرویس‌های موجود را تغییر دهید، بدون این که تغییرات زیادی در سایر قسمت‌های برنامه اعمال شود. نتیجه‌گیری: کلاس ProductFacad به شما اجازه می‌دهد تا عملیات مرتبط با محصولات را ساده‌تر مدیریت کنید و دسترسی به سرویس‌های مختلف مانند AddNewCategoryService و GetCategoriesService را یکپارچه کنید. این کلاس با استفاده از الگوی Singleton اطمینان حاصل می‌کند که تنها یک نمونه از هر سرویس ایجاد می‌شود.
Test_Store => Application => Services => Products => Queries => GetCategories => IGetCategoriesService.cs بیایید کد GetCategoriesService را بررسی کنیم. این کد به منظور دریافت لیست دسته‌بندی‌ها طراحی شده است و شامل اینترفیس، کلاس سرویس، و چند DTO می‌شود. توضیحات کد: Interface IGetCategoriesService: این اینترفیس یک متد Execute را تعریف می‌کند که لیست دسته‌بندی‌ها را بر اساس ParentId برمی‌گرداند. این متد یک شیء ResultDto شامل لیستی از CategoriesDto را برمی‌گرداند. Class GetCategoriesService: کلاس GetCategoriesService پیاده‌سازی اینترفیس IGetCategoriesService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد لیست دسته‌بندی‌ها را بر اساس ParentId برمی‌گرداند. ابتدا دسته‌بندی‌ها را از دیتابیس دریافت می‌کند، سپس آن‌ها را به لیست CategoriesDto تبدیل می‌کند و نهایتاً نتیجه را برمی‌گرداند. DTO Classes: CategoriesDto: این کلاس نمایشی از یک دسته‌بندی شامل Id, Name, HasChild, و Parent است. ParentCategoryDto: این کلاس نمایشی از دسته‌بندی والد شامل Id و name است. نحوه عملکرد Execute Method: دریافت دسته‌بندی‌ها از دیتابیس: ابتدا دسته‌بندی‌ها را با استفاده از Include (برای بارگذاری دسته‌بندی والد و زیر دسته‌ها) و Where (برای فیلتر کردن بر اساس ParentId) از دیتابیس دریافت می‌کند. تبدیل به DTO: سپس دسته‌بندی‌ها را به لیست CategoriesDto تبدیل می‌کند. در هر CategoriesDto، اطلاعات مربوط به دسته‌بندی مانند Id, Name, Parent (در صورت وجود)، و HasChild (برای بررسی وجود زیر دسته‌ها) ذخیره می‌شود. بازگرداندن نتیجه: نهایتاً یک شیء ResultDto شامل لیست دسته‌بندی‌ها، وضعیت موفقیت‌آمیز بودن عملیات، و یک پیام برگردانده می‌شود. نتیجه‌گیری: این کد به شما کمک می‌کند تا به راحتی لیست دسته‌بندی‌ها را بر اساس ParentId دریافت کنید و آن‌ها را به صورت DTO بازگردانید. این روش به شما امکان می‌دهد تا داده‌ها را به شکل مورد نیاز در لایه‌های مختلف برنامه نمایش دهید.
Test_Store => Application => Services => Users => Commands => EditUser => IEditUserService.cs بیایید کد EditUserService را بررسی کنیم. این کد به منظور ویرایش اطلاعات کاربر طراحی شده است و شامل اینترفیس، کلاس سرویس، و یک DTO می‌شود. توضیحات کد: Interface IEditUserService: این اینترفیس یک متد Execute را تعریف می‌کند که درخواست ویرایش کاربر را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء RequestEdituserDto به عنوان ورودی می‌پذیرد و یک شیء ResultDto به عنوان خروجی برمی‌گرداند. Class EditUserService: کلاس EditUserService پیاده‌سازی اینترفیس IEditUserService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات ویرایش کاربر است. ابتدا با استفاده از request.UserId کاربر مورد نظر را از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا برمی‌گرداند. اگر کاربر یافت شد، نام کامل کاربر (FullName) را به مقدار جدید تنظیم می‌کند و تغییرات را ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز برمی‌گرداند. DTO Classes: RequestEdituserDto: این کلاس نمایشی از درخواست ویرایش کاربر شامل UserId و Fullname است. نحوه عملکرد Execute Method: پیدا کردن کاربر: ابتدا کاربر مورد نظر را با استفاده از request.UserId از دیتابیس پیدا می‌کند. اگر کاربر یافت نشد، یک پیام خطا شامل IsSuccess برابر با false و Message با مقدار "کاربر یافت نشد" برمی‌گرداند. ویرایش اطلاعات کاربر: اگر کاربر یافت شد، مقدار FullName کاربر را به مقدار جدید از request.Fullname تنظیم می‌کند. تغییرات را در دیتابیس ذخیره می‌کند. در نهایت، یک پیام موفقیت‌آمیز شامل IsSuccess برابر با true و Message با مقدار "ویرایش کاربر انجام شد" برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا اطلاعات کاربر را به راحتی ویرایش کنید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Application => Services => Users => Commands => RegisterUser => IRegisterUserService.cs بیایید با هم کد RegisterUserService را بررسی کنیم. این کد به منظور ثبت‌نام کاربران جدید طراحی شده است و شامل اینترفیس، کلاس سرویس، و چند DTO می‌شود. توضیحات کد: Interface IRegisterUserService: این اینترفیس یک متد Execute را تعریف می‌کند که درخواست ثبت‌نام کاربر را می‌پذیرد و نتیجه عملیات را برمی‌گرداند. این متد یک شیء RequestRegisterUserDto به عنوان ورودی می‌پذیرد و یک شیء ResultDto<ResultRegisterUserDto> به عنوان خروجی برمی‌گرداند. Class RegisterUserService: کلاس RegisterUserService پیاده‌سازی اینترفیس IRegisterUserService است. Constructor: سازنده کلاس که یک شیء از نوع IDataBaseContext دریافت می‌کند. این شیء برای دسترسی به دیتابیس استفاده می‌شود. Method Execute: این متد مسئول اجرای عملیات ثبت‌نام کاربر است. ابتدا بررسی می‌کند که آیا فیلدهای ضروری (ایمیل، نام، رمز عبور، تکرار رمز عبور) خالی یا نادرست هستند و در صورت لزوم پیام خطا برمی‌گرداند. سپس ایمیل کاربر را با استفاده از یک الگوی regex بررسی می‌کند تا از صحت آن اطمینان حاصل کند. رمز عبور کاربر را هش می‌کند و یک شیء User جدید ایجاد می‌کند. نقش‌های کاربر را به UserInRole ها تبدیل می‌کند و آن‌ها را به کاربر اضافه می‌کند. کاربر جدید را به دیتابیس اضافه می‌کند و تغییرات را ذخیره می‌کند. در نهایت، نتیجه موفقیت‌آمیز بودن عملیات را برمی‌گرداند. DTO Classes: RequestRegisterUserDto: این کلاس نمایشی از درخواست ثبت‌نام کاربر شامل FullName, Email, Password, RePassword, و لیستی از RolesInRegisterUserDto است. RolesInRegisterUserDto: این کلاس نمایشی از نقش‌های کاربر شامل Id است. ResultRegisterUserDto: این کلاس نمایشی از نتیجه ثبت‌نام کاربر شامل UserId است. نحوه عملکرد Execute Method: بررسی فیلدهای ورودی: ابتدا بررسی می‌کند که آیا فیلدهای ضروری خالی هستند یا خیر. اگر هر یک از فیلدها خالی باشد، یک پیام خطا شامل IsSuccess برابر با false و Message مناسب برمی‌گرداند. بررسی صحت ایمیل: با استفاده از regex، صحت ایمیل ورودی را بررسی می‌کند. اگر ایمیل نادرست باشد، یک پیام خطا برمی‌گرداند. هش کردن رمز عبور: رمز عبور ورودی را با استفاده از PasswordHasher هش می‌کند. ایجاد و ذخیره کاربر جدید: یک شیء User جدید ایجاد می‌کند و اطلاعات کاربر را تنظیم می‌کند. نقش‌های کاربر را به UserInRole ها تبدیل می‌کند و آن‌ها را به کاربر اضافه می‌کند. کاربر جدید را به دیتابیس اضافه می‌کند و تغییرات را ذخیره می‌کند. نتیجه موفقیت‌آمیز بودن عملیات را با UserId کاربر جدید برمی‌گرداند. مدیریت خطاها: در صورت بروز هرگونه خطا، یک پیام خطا برمی‌گرداند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا کاربران جدید را به راحتی ثبت‌نام کنید و نتیجه عملیات را به صورت یک شیء ResultDto شامل وضعیت موفقیت و پیام مناسب برگردانید.
Test_Store => Application => Services => Users => Commands => RemoveUser => IRemoveUserService.cs بیایید کد IRemoveUserService را بررسی کنیم. این کد شامل یک اینترفیس است که متد حذف کاربر را تعریف می‌کند. توضیحات کد: Namespace: namespace Test_Store.Application.Services.Users.Commands.RemoveUser: نام‌فضا برای سازماندهی کدهای مرتبط با عملیات حذف کاربر. Interface IRemoveUserService: این اینترفیس یک متد Execute را تعریف می‌کند که مسئولیت حذف کاربر را بر عهده دارد. متد Execute: این متد یک پارامتر UserId از نوع long می‌پذیرد که شناسه کاربری است که باید حذف شود. این متد یک شیء ResultDto برمی‌گرداند که شامل وضعیت و پیام نتیجه عملیات حذف است. نتیجه‌گیری: این اینترفیس IRemoveUserService، یک قرارداد برای سرویس حذف کاربر تعریف می‌کند که شامل یک متد Execute است. این متد شناسه کاربر را به عنوان ورودی می‌پذیرد و نتیجه عملیات حذف را به صورت یک شیء ResultDto بازمی‌گرداند. برای پیاده‌سازی این اینترفیس، شما نیاز به یک کلاس دارید که این اینترفیس را پیاده‌سازی کند و عملیات حذف کاربر را انجام دهد.