Bu proje, kullanıcıların birlikte alım yaparak toptan fiyatlardan yararlanabileceği bir e-ticaret sistemidir.
- Ortak Sepet Sistemi: Kullanıcılar aynı ürün için ortak sepet oluşturabilir
- Minimum Sipariş Takibi: Her ürün için minimum sipariş adedi belirlenir
- Toptan Fiyat Aktivasyonu: Minimum adede ulaşıldığında toptan fiyat aktif olur
- Gerçek Zamanlı Güncellemeler: WebSocket ile anlık sepet durumu takibi
- Kullanıcı Yönetimi: JWT tabanlı kimlik doğrulama
- Responsive Tasarım: Mobil ve masaüstü uyumlu
- Node.js + Express + TypeScript
- PostgreSQL (Docker container)
- Socket.IO (gerçek zamanlı iletişim)
- JWT (kimlik doğrulama)
- Joi (validasyon)
- React + TypeScript
- Material-UI (UI kütüphanesi)
- React Router (sayfa yönlendirme)
- Axios (API istekleri)
- Socket.IO Client (gerçek zamanlı güncellemeler)
- Docker + Docker Compose
- Nginx (reverse proxy)
- Docker
- Docker Compose
- Projeyi klonlayın
git clone <repo-url>
cd ecommerce-project- Docker konteynerlerini başlatın
docker-compose up -d- Uygulamaya erişin
- Frontend: http://localhost (Nginx üzerinden)
- Backend API: http://localhost/api
- Direkt Frontend: http://localhost:3000
- Direkt Backend: http://localhost:3001
- users: Kullanıcı bilgileri
- categories: Ürün kategorileri (hierarchical)
- products: Ürün bilgileri ve fiyatları
- shared_carts: Ortak sepetler
- cart_participants: Sepet katılımcıları
- orders: Siparişler
- order_items: Sipariş kalemleri
- addresses: Kullanıcı adresleri
- Her kullanıcı aynı sepete sadece bir kez katılabilir
- Sepet sadece 'active' durumunda yeni katılımcı kabul eder
- current_quantity >= target_quantity olduğunda sepet 'completed' olur
- Sipariş sadece 'completed' sepetlerden oluşturulabilir
POST /api/auth/register- Kullanıcı kaydıPOST /api/auth/login- GirişGET /api/auth/profile- Profil bilgisi
GET /api/products- Ürün listesi (filtreleme destekli)GET /api/products/:id- Ürün detayıGET /api/products/categories- Kategori listesiGET /api/products/with-active-carts- Aktif sepeti olan ürünlerPOST /api/products/:id/image- (Auth) Ürün görseli yükleme (multipart/form-data,imagealanı)
POST /api/cart/add- Sepete ürün eklemeGET /api/cart/my-carts- Kullanıcının sepetleriGET /api/cart/:cartId- Sepet detaylarıDELETE /api/cart/:cartId- Sepetten çıkarma
# Backend
cd backend
npm install
npm run dev
# Frontend
cd frontend
npm install
npm start
# PostgreSQL
docker run -d --name postgres -e POSTGRES_DB=ecommerce_db -e POSTGRES_PASSWORD=password123 -p 5432:5432 postgres:15-alpinedocker-compose up -dbackend/.env.exampledosyasını kopyalayarak ihtiyaç duyulan Cloudflare R2 bilgilerini (CLOUDFLARE_R2_*) doldurun.- R2 bucket'ınızı public erişime açın veya
CLOUDFLARE_R2_PUBLIC_BASE_URLile CDN/Worker URL'inizi tanımlayın. MAX_PRODUCT_IMAGE_SIZEile yüklenebilecek maksimum dosya boyutunu byte cinsinden belirleyebilirsiniz (varsayılan ~5MB).- İhtiyaç halinde
CLOUDFLARE_R2_FOLDER_PREFIXile bucket içinde kullanılacak klasör yolunu özelleştirebilirsiniz (varsayılanproducts/...). - Docker Compose kullanıyorsanız,
backend/.envdosyasını oluşturup bilgileri buraya girin;docker-compose.ymliçindekienv_fileayarı sayesinde backend konteyneri bu değerleri otomatik yükler. - Yeni endpoint:
POST /api/products/:id/imageçağrısındamultipart/form-dataiçerisindeimagealanını gönderin. Başarılı yüklemede Cloudflare'a aktarılan görsel URL'i veritabanında saklanır, önceki görsel (varsa) temizlenir. - Cloudflare yapılandırılmadığında backend otomatik olarak
uploads/klasörüne yerel dosya kaydı yapar ve API yanıtlarında görsel yolu/uploads/...olarak döner. Nginx konfigürasyonu bu yolu backend'e proxy'ler, böylece frontend ile aynı origin üzerinden erişilebilir. - Varsayılan yerel klasör
uploads/olupLOCAL_UPLOADS_DIRdeğişkeniyle özelleştirilebilir; bu klasörapp.use('/uploads', ...)aracılığıyla backend'den statik olarak servis edilir.
├── backend/
│ ├── src/
│ │ ├── config/ # Veritabanı konfigürasyonu
│ │ ├── controllers/ # API controller'ları
│ │ ├── middleware/ # Auth, validation middleware
│ │ ├── models/ # Veri modelleri
│ │ ├── routes/ # API route'ları
│ │ ├── services/ # İş mantığı
│ │ ├── types/ # TypeScript tipleri
│ │ └── server.ts # Ana server dosyası
│ └── Dockerfile
├── frontend/
│ ├── src/
│ │ ├── components/ # React bileşenleri
│ │ ├── pages/ # Sayfa bileşenleri
│ │ ├── contexts/ # React context'leri
│ │ ├── services/ # API servisleri
│ │ ├── types/ # TypeScript tipleri
│ │ └── App.tsx # Ana uygulama
│ └── Dockerfile
├── database/
│ └── init.sql # Veritabanı şeması
├── nginx/
│ └── nginx.conf # Nginx konfigürasyonu
└── docker-compose.yml # Docker Compose konfigürasyonu
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/AmazingFeature) - Commit edin (
git commit -m 'Add some AmazingFeature') - Push edin (
git push origin feature/AmazingFeature) - Pull Request oluşturun