پروژه فروشگاه اینترنتی با جاوااسکریپت - بخش دوم
🎯 اهداف این بخش
- پیادهسازی کامل سیستم مدیریت سبد خرید
- افزودن، حذف و بهروزرسانی محصولات در سبد خرید
- محاسبه جمع کل و تخفیفها
- نمایش سبد خرید به کاربر
- ذخیرهسازی سبد خرید در localStorage
📌 پیادهسازی کلاس Cart
برای مدیریت سبد خرید از یک کلاس اختصاصی استفاده میکنیم:
javascript
class Cart { constructor() { this.items = []; this.loadFromLocalStorage(); } // بارگیری سبد خرید از localStorageloadFromLocalStorage() { const cartData = localStorage.getItem('cart'); this.items = cartData ? JSON.parse(cartData) : []; } // ذخیره سبد خرید در localStoragesaveToLocalStorage() { 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% تخفیف اضافی // کد خود را اینجا بنویسید}
راهنمای تمرین:
- ابتدا تخفیف بر اساس مبلغ جمع کل محاسبه شود
- سپس در صورت وجود شرط تعداد محصولات، تخفیف اضافه اعمال شود
- حداکثر تخفیف نباید از 20% بیشتر شود
📌 قدم بعدی
در بخش سوم با اتصال به درگاه پرداخت و تکمیل سفارش آشنا خواهیم شد!