فروشگاه آنلاین مدرن
این پروژه یک فروشگاه آنلاین کامل با قابلیتهای سبد خرید، پرداخت و مدیریت محصولات است که با استفاده از Next.js، Redux و MongoDB پیادهسازی شده است.
Next.jsReduxMongoDBTailwind CSSNextAuth.jsStripeReact Query
صفحه اصلی فروشگاه
صفحه محصول
ویژگیها
- صفحه اصلی با نمایش محصولات ویژه و پرفروش
- صفحه محصولات با قابلیت فیلتر و جستجو
- صفحه جزئیات محصول با گالری تصاویر و نظرات
- سبد خرید با قابلیت افزودن، حذف و تغییر تعداد محصولات
- فرآیند پرداخت چند مرحلهای
- پنل مدیریت برای کنترل محصولات، سفارشات و کاربران
- سیستم احراز هویت کاربران
- طراحی ریسپانسیو برای تمام دستگاهها
جزئیات فنی
این فروشگاه آنلاین با استفاده از Next.js و App Router پیادهسازی شده است. برای مدیریت state از Redux استفاده شده و برای ذخیرهسازی دادهها از MongoDB بهره گرفتهایم. همچنین برای احراز هویت کاربران از NextAuth.js و برای پرداخت آنلاین از Stripe استفاده شده است.
این فروشگاه به صورت کامل ریسپانسیو طراحی شده و در تمام دستگاهها به خوبی نمایش داده میشود. همچنین از قابلیتهای SSR در Next.js برای بهبود عملکرد و SEO استفاده شده است.
کد نمونه
// نمونه کد برای صفحه محصول
import { useState } from 'react';
import { useDispatch } from 'react-redux';
import { addToCart } from '@/redux/cartSlice';
import { useQuery } from 'react-query';
import { getProduct } from '@/lib/api';
export default function ProductPage({ params }) {
const { id } = params;
const [quantity, setQuantity] = useState(1);
const dispatch = useDispatch();
const { data: product, isLoading, error } = useQuery(['product', id], () => getProduct(id));
if (isLoading) return <div>در حال بارگذاری...</div>;
if (error) return <div>خطا در بارگذاری محصول</div>;
const handleAddToCart = () => {
dispatch(addToCart({
id: product._id,
name: product.name,
price: product.price,
image: product.images[0],
quantity
}));
};
return (
<div className="container mx-auto px-4 py-8">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="relative h-96">
<img src={product.images[0] || "/placeholder.svg"} alt={product.name} className="object-cover rounded-lg" />
</div>
<div>
<h1 className="text-3xl font-bold mb-4">{product.name}</h1>
<p className="text-2xl text-blue-600 mb-4">{product.price.toLocaleString()} تومان</p>
<p className="mb-6">{product.description}</p>
<div className="flex items-center mb-6">
<button
onClick={() => setQuantity(q => Math.max(1, q - 1))}
className="px-3 py-1 border border-gray-300 rounded-l-md"
>
-
</button>
<span className="px-4 py-1 border-t border-b border-gray-300">{quantity}</span>
<button
onClick={() => setQuantity(q => q + 1)}
className="px-3 py-1 border border-gray-300 rounded-r-md"
>
+
</button>
</div>
<button
onClick={handleAddToCart}
className="w-full bg-blue-600 text-white py-3 rounded-md hover:bg-blue-700"
>
افزودن به سبد خرید
</button>
</div>
</div>
</div>
);
}