اضافه کردن سبد خرید به پروژه یکی از ویژگیهای بسیار متداول و مهم در فروشگاههای آنلاین است. ذخیرهسازی سبد خرید در سمت کلاینت و سپس انتقال آن به سرور هنگام تکمیل خرید یک روش موثر برای کاهش بار سرور و افزایش کارایی برنامه است. بیایید یک روش ساده برای پیادهسازی این فرآیند را بررسی کنیم.
مرحله 1: ذخیرهسازی سبد خرید در سمت کلاینت
میتوانید از کوکیها یا Local Storage برای ذخیرهسازی سبد خرید در سمت کلاینت استفاده کنید. Local Storage برای دادههای بیشتری نسبت به کوکیها مناسبتر است.
مثال با استفاده از Local Storage:
javascript
// افزودن آیتم به سبد خرید
function addToCart(product) {
let cart = JSON.parse(localStorage.getItem('shoppingCart')) || [];
cart.push(product);
localStorage.setItem('shoppingCart', JSON.stringify(cart));
}
// دریافت سبد خرید
function getCart() {
return JSON.parse(localStorage.getItem('shoppingCart')) || [];
}
// حذف آیتم از سبد خرید
function removeFromCart(productId) {
let cart = JSON.parse(localStorage.getItem('shoppingCart')) || [];
cart = cart.filter(item => item.id !== productId);
localStorage.setItem('shoppingCart', JSON.stringify(cart));
}
مرحله 2: نمایش سبد خرید در سمت کلاینت
میتوانید از جاوااسکریپت برای نمایش سبد خرید در صفحه وب استفاده کنید.
مثال:
javascript
function displayCart() {
let cart = getCart();
let cartHtml = '';
cart.forEach(item => {
cartHtml +=
<div>${item.name} - ${item.price}</div>;
});
document.getElementById('cart').innerHTML = cartHtml;
}
// فراخوانی تابع نمایش سبد خرید هنگام بارگذاری صفحه
window.onload = displayCart;
مرحله 3: ارسال سبد خرید به سرور هنگام تکمیل خرید
وقتی کاربر خرید خود را کامل کرد، سبد خرید را به سرور ارسال کنید تا در پایگاه داده ذخیره شود.
مثال با استفاده از Fetch API:
javascript
async function completePurchase() {
let cart = getCart();
let response = await fetch('/api/completePurchase', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(cart)
});
if (response.ok) {
// خرید با موفقیت انجام شد
localStorage.removeItem('shoppingCart'); // پاک کردن سبد خرید
} else {
// مدیریت خطا
console.error('Error completing purchase');
}
}
مرحله 4: دریافت و ذخیرهسازی سبد خرید در سرور (ASP.NET Core)
سمت سرور باید یک اکشن برای دریافت و ذخیرهسازی سبد خرید فراهم کند.
مثال در ASP.NET Core:
csharp
[HttpPost]
[Route("api/completePurchase")]
public IActionResult CompletePurchase([FromBody] List<Product> cart)
{
// ذخیرهسازی سبد خرید در پایگاه داده
// این قسمت به صورت تمثیلی است و بستگی به نیازهای پروژه شما دارد
foreach (var product in cart)
{
_context.Orders.Add(new Order
{
ProductId = product.Id,
Quantity = product.Quantity,
Price = product.Price,
OrderDate = DateTime.Now
});
}
_context.SaveChanges();
return Ok("Purchase completed successfully");
}
نتیجهگیری
این روش به شما امکان میدهد تا سبد خرید را در سمت کلاینت نگه دارید و بار سرور را کاهش دهید. وقتی کاربر خرید خود را تکمیل کرد، سبد خرید به سرور ارسال میشود تا در پایگاه داده ذخیره شود. این روش کارایی و عملکرد برنامه را بهبود میبخشد.رمزگذاری پسوردها در برنامههای وب بسیار مهم است تا از امنیت کاربران و اطلاعات آنها محافظت شود. استفاده از الگوریتمهای رمزنگاری مطمئن به جلوگیری از دسترسی غیرمجاز به پسوردها کمک میکند. در ASP.NET Core، میتوانید از کتابخانههای استاندارد برای رمزگذاری پسوردها استفاده کنید. بیایید یک روش ساده برای انجام این کار را بررسی کنیم.
1. استفاده از ASP.NET Core Identity
ASP.NET Core Identity
شامل ابزارها و سرویسهایی برای مدیریت کاربران و رمزگذاری پسوردها است. در اینجا نحوه پیکربندی و استفاده از آن آورده شده است.
نصب ASP.NET Core Identity: ابتدا باید بستههای مورد نیاز را به پروژه خود اضافه کنید. میتوانید این کار را از طریق NuGet Package Manager انجام دهید:
Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
پیکربندی ASP.NET Core Identity: سپس باید Identity را در متد ConfigureServices در Startup.cs پیکربندی کنید:
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddControllersWithViews();
}
2. ایجاد مدل کاربر و دیتابیس
ایجاد مدل کاربر و دیتابیس با استفاده از Entity Framework Core و ASP.NET Core Identity.
csharp
public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
3. استفاده از UserManager برای مدیریت کاربران و رمزگذاری پسوردها
استفاده از UserManager برای ایجاد کاربران و رمزگذاری پسوردها.
ایجاد کاربر جدید:
csharp
public async Task<IActionResult> Register(string username, string password)
{
var user = new IdentityUser { UserName = username };
var result = await _userManager.CreateAsync(user, password);
if (result.Succeeded)
{
return Ok("User created successfully");
}
else
{
return BadRequest("Failed to create user");
}
}
4. استفاده از PasswordHasher به صورت مستقل
اگر نمیخواهید از ASP.NET Core Identity استفاده کنید، میتوانید از PasswordHasher به صورت مستقل برای رمزگذاری پسوردها استفاده کنید.
مثال مستقل:
csharp
public class PasswordService
{
private readonly IPasswordHasher<IdentityUser> _passwordHasher;
public PasswordService()
{
_passwordHasher = new PasswordHasher<IdentityUser>();
}
public string HashPassword(string password)
{
var user = new IdentityUser();
return _passwordHasher.HashPassword(user, password);
}
public bool VerifyPassword(string hashedPassword, string providedPassword)
{
var user = new IdentityUser();
var result = _passwordHasher.VerifyHashedPassword(user, hashedPassword, providedPassword);
return result == PasswordVerificationResult.Success;
}
}
// استفاده از PasswordService برای رمزگذاری و اعتبارسنجی پسوردها
var passwordService = new PasswordService();
string hashedPassword = passwordService.HashPassword("MySecurePassword");
bool isPasswordValid = passwordService.VerifyPassword(hashedPassword, "MySecurePassword");
نتیجهگیری
رمزگذاری پسوردها و ذخیره آنها در دیتابیس به امنیت کاربران و اطلاعات آنها کمک میکند. ASP.NET Core Identity ابزارهای قدرتمندی برای مدیریت کاربران و رمزگذاری پسوردها فراهم میکند، اما شما میتوانید از PasswordHasher به صورت مستقل نیز استفاده کنید.
ذخیره اطلاعات لاگین در کوکی مرورگر یکی از روشهای معمول برای مدیریت سشنهای کاربر است. با این حال، باید با احتیاط این کار را انجام دهید تا امنیت اطلاعات کاربر حفظ شود. بیایید به نحوه انجام این کار در ASP.NET Core بپردازیم.
مرحله 1: ایجاد و ذخیرهسازی کوکی لاگین
میتوانید اطلاعات لاگین کاربر را پس از احراز هویت در کوکی مرورگر ذخیره کنید. برای این کار میتوانید از متد SignInAsync استفاده کنید.
مثال:
csharp
public async Task<IActionResult> Login(string username, string password)
{
// اعتبارسنجی کاربر
var user = await _userManager.FindByNameAsync(username);
if (user != null && await _userManager.CheckPasswordAsync(user, password))
{
// ایجاد لیست کلایمها (Claims)
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.NameIdentifier, user.Id),
};
// ایجاد هویت کلایم (ClaimsIdentity)
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
// گزینههای احراز هویت
var authProperties = new AuthenticationProperties
{
IsPersistent = true, // کوکی پایدار باشد
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30) // تنظیم تاریخ انقضای کوکی
};
// ورود به سیستم و ایجاد کوکی
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
return RedirectToAction("Index", "Home");
}
// بازگشت به صفحه لاگین در صورت عدم موفقیت در احراز هویت
return View("Login");
}
مرحله 2: پیکربندی احراز هویت کوکی در Startup.cs
باید احراز هویت کوکی را در متدهای ConfigureServices و Configure پیکربندی کنید.
ConfigureServices:
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login"; // مسیر صفحه لاگین
options.LogoutPath = "/Account/Logout"; // مسیر صفحه لاگآوت
options.AccessDeniedPath = "/Account/AccessDenied"; // مسیر صفحه دسترسی ممنوع
});
services.AddControllersWithViews();
}
Configure:
csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // استفاده از میانافزار احراز هویت
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
مرحله 3: مدیریت لاگآوت
برای حذف کوکی و خروج کاربر از سیستم، میتوانید از متد SignOutAsync استفاده کنید.
مثال لاگآوت:
csharp
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Index", "Home");
}
امنیت کوکی
برای اطمینان از امنیت کوکیها، مطمئن شوید که از گزینههای زیر استفاده میکنید:
HttpOnly:
کوکیها را به گونهای تنظیم کنید که فقط از طریق HTTP قابل دسترسی باشند و جاوااسکریپت نتواند به آنها دسترسی پیدا کند.
Secure:
کوکیها را به گونهای تنظیم کنید که فقط در ارتباطات HTTPS ارسال شوند.
SameSite:
از ویژگی SameSite برای جلوگیری از ارسال کوکیها در درخواستهای متقاطع استفاده کنید.
نتیجهگیری
با استفاده از روشهای بالا، میتوانید اطلاعات لاگین کاربران را به صورت امن در کوکی مرورگر ذخیره و مدیریت کنید. این کار به شما کمک میکند تا سشنهای کاربران را مدیریت کرده و تجربه کاربری بهتری فراهم کنید.
من دو تا قالب های HTML رایگان پیدا کردم قالب فروشگاه و قالب ادمین که در
پروژه ASP.NET Core هفته بعد شروع به کد نویسی می کنیم
Test_Store.zip
حجم:
2.2M
بیایید هر بخش را به تفصیل بررسی کنیم تا مطمئن شویم که همه چیز به درستی تنظیم شده است:
blank solution : Test_Store
│
├── Folder: Doc
│
├── Folder: Src
│ ├── Folder: Common
│ │ └── library: Test_Store.Common
│ │
│ ├── Folder: Core
│ │ ├── library: Test_Store.Application
│ │ └── library: Test_Store.Domain
│ │
│ ├── Folder: Infrastructure
│ │ ├── library: Test_Store.Infrastructure
│ │ └── library: Test_Store.Persistence
│ │
│ └── Folder: Presentation
│ └── ASP.NET Core: EndPoint.Site
│
└── Folder: Test
توضیحات:
1. blank solution : Test_Store
این پوشه اصلی پروژه شماست که سایر پوشهها و کتابخانهها در آن قرار دارند.
2. Folder: Doc
این پوشه برای ذخیره مستندات پروژه، مانند راهنماها، مستندات طراحی و هر نوع اطلاعات مرتبط با پروژه، مورد استفاده میگیرد.
3. Folder: Src
این پوشه شامل کد منبع (Source Code) پروژه است و به زیرپوشههای مختلف تقسیم شده است:
3-1. Folder: Common:
شامل کتابخانههای مشترکی است که توسط سایر بخشهای پروژه استفاده میشوند.
- library: Test_Store.Common:
شامل کدهای مشترک و ابزارهای کمکی که بین تمامی بخشهای پروژه استفاده میشوند.
3-2. Folder: Core:
شامل منطق کسبوکار و مدلهای دامنه (Domain Models) پروژه است.
- library: Test_Store.Application:
شامل منطق کسبوکار و موارد استفاده (Use Cases) پروژه.
- library: Test_Store.Domain:
شامل مدلهای دامنه و قوانین کسبوکار اصلی.
3-3. Folder: Infrastructure:
شامل کدهای زیرساختی و سرویسهایی است که توسط پروژه استفاده میشوند.
- library: Test_Store.Infrastructure:
شامل پیادهسازی سرویسهای زیرساختی مانند ارتباط با فایل سیستم، APIهای خارجی و غیره.
- library: Test_Store.Persistence:
شامل کدهای مربوط به ذخیرهسازی دادهها، مانند DbContext و مدلهای پایگاه داده.
3-4. Folder: Presentation:
شامل لایه ارائه (Presentation Layer) پروژه است.
- ASP.NET Core: EndPoint.Site:
پروژه ASP.NET Core MVC که برای مدیریت رابط کاربری و APIهای وب استفاده میشود.
4. Folder: Test
این پوشه میتواند شامل تستهای واحد (Unit Tests) و یکپارچه (Integration Tests) باشد تا به بررسی و اعتبارسنجی عملکرد کدهای شما کمک کند.
Test_Store2.zip
حجم:
38.2M
زمان زیادی طول کشید تا کدها را برسی کنم و اشکالاتم را برطرف کنم
من هم یاد می گیرم و به اشتراک می گذارم
پیاده سازی قالب ادمین به پروژه
آدرس پنل:
localhost:7236/admin/users/index