پروژه فروشگاه اینترنتی با جاوااسکریپت - بخش دوم


🎯 اهداف این بخش

  • پیاده‌سازی کامل سیستم مدیریت سبد خرید
  • افزودن، حذف و به‌روزرسانی محصولات در سبد خرید
  • محاسبه جمع کل و تخفیف‌ها
  • نمایش سبد خرید به کاربر
  • ذخیره‌سازی سبد خرید در localStorage

📌 پیاده‌سازی کلاس Cart

برای مدیریت سبد خرید از یک کلاس اختصاصی استفاده می‌کنیم:

javascript
class Cart {
constructor() {
this.items = [];
this.loadFromLocalStorage();
}
// بارگیری سبد خرید از localStorage
loadFromLocalStorage() {
const cartData = localStorage.getItem('cart');
this.items = cartData ? JSON.parse(cartData) : [];
}
// ذخیره سبد خرید در localStorage
saveToLocalStorage() {
localStorage.setItem('cart', JSON.stringify(this.items));
}

توضیحات کلاس پایه:

  • constructor: مقداردهی اولیه و بارگیری از حافظه مرورگر
  • loadFromLocalStorage: بازیابی اطلاعات سبد خرید از localStorage
  • saveToLocalStorage: ذخیره سبد خرید در localStorage برای ماندگاری بین صفحات

📌 افزودن محصول به سبد خرید

تابع addItem برای اضافه کردن محصول جدید یا افزایش تعداد محصول موجود:

javascript
addItem(product, quantity = 1) {
const existingItem = this.items.find(item => item.id === product.id);
if (existingItem) {
existingItem.quantity += quantity;
} else {
this.items.push({
...product,
quantity,
totalPrice: product.price * quantity
});
}
this.saveToLocalStorage();
this.updateCartUI();
}

📌 حذف محصول از سبد خرید

تابع removeItem برای حذف کامل یک محصول از سبد خرید:

javascript
removeItem(productId) {
this.items = this.items.filter(item => item.id !== productId);
this.saveToLocalStorage();
this.updateCartUI();
}

📌 به‌روزرسانی تعداد محصول

تابع updateItemQuantity برای تغییر تعداد یک محصول در سبد خرید:

javascript
updateItemQuantity(productId, newQuantity) {
const item = this.items.find(item => item.id === productId);
if (item) {
item.quantity = newQuantity;
item.totalPrice = item.price * newQuantity;
this.saveToLocalStorage();
this.updateCartUI();
}
}

📌 محاسبه جمع کل سبد خرید

تابع calculateTotal برای محاسبه جمع کل و تخفیف‌ها:

javascript
calculateTotal() {
const subtotal = this.items.reduce((sum, item) => sum + item.totalPrice, 0);
const discount = this.calculateDiscount(subtotal);
const total = subtotal - discount;
return {
subtotal,
discount,
total
};
}

📌 نمایش سبد خرید در صفحه

تابع renderCart برای نمایش سبد خرید به کاربر:

javascript
renderCart() {
const cartContainer = document.querySelector('.cart-items');
const totalsContainer = document.querySelector('.cart-totals');
// خالی کردن محتوای قبلی
cartContainer.innerHTML = '';
// نمایش محصولات سبد خرید
this.items.forEach(item => {
const itemElement = document.createElement('div');
itemElement.className = 'cart-item';
itemElement.innerHTML = `
<div class="item-info">
<h4>${item.name}</h4>
<p>قیمت: ${item.price.toLocaleString()} تومان</p>
</div>
<div class="item-quantity">
<button class="quantity-btn" data-id="${item.id}" data-action="decrease">-</button>
<span>${item.quantity}</span>
<button class="quantity-btn" data-id="${item.id}" data-action="increase">+</button>
</div>
<div class="item-total">
<p>${item.totalPrice.toLocaleString()} تومان</p>
<button class="remove-btn" data-id="${item.id}">حذف</button>
</div>
`;
cartContainer.appendChild(itemElement);
});
// نمایش جمع کل
const totals = this.calculateTotal();
totalsContainer.innerHTML = `
<div class="total-row">
<span>جمع کل:</span>
<span>${totals.subtotal.toLocaleString()} تومان</span>
</div>
<div class="total-row">
<span>تخفیف:</span>
<span>${totals.discount.toLocaleString()} تومان</span>
</div>
<div class="total-row grand-total">
<span>مبلغ قابل پرداخت:</span>
<span>${totals.total.toLocaleString()} تومان</span>
</div>
`;
}

📌 تمرین عملی

تابع calculateDiscount را برای محاسبه تخفیف بر اساس قوانین زیر پیاده‌سازی کنید:

javascript
calculateDiscount(subtotal) {
// قوانین تخفیف:
// 1. اگر جمع کل بیش از 500,000 تومان باشد، 10% تخفیف
// 2. اگر جمع کل بیش از 1,000,000 تومان باشد، 15% تخفیف
// 3. اگر تعداد محصولات بیش از 5 عدد باشد، 5% تخفیف اضافی
// کد خود را اینجا بنویسید
}

راهنمای تمرین:

  1. ابتدا تخفیف بر اساس مبلغ جمع کل محاسبه شود
  2. سپس در صورت وجود شرط تعداد محصولات، تخفیف اضافه اعمال شود
  3. حداکثر تخفیف نباید از 20% بیشتر شود

📌 قدم بعدی

در بخش سوم با اتصال به درگاه پرداخت و تکمیل سفارش آشنا خواهیم شد!