QR Menu, küçük işletmeler (kafeler, restoranlar, büfeler vb.) için modern ve kullanıcı dostu dijital menü oluşturma ve QR kod ile paylaşma platformudur. İşletmeler, menülerini hızlıca dijitalleştirip müşterilerine QR kod aracılığıyla sunabilirler.
- Proje Hakkında
- Ekran Görüntüleri
- Özellikler
- Teknoloji Stack
- Proje Yapısı
- Kurulum
- Kullanım
- API Dokümantasyonu
- Mimari Prensipler
- Güvenlik
- Katkıda Bulunma
QR Menu, modern web teknolojileri kullanılarak geliştirilmiş bir SaaS-ready platformdur. İşletmeler, bu platform sayesinde:
- Hızlı Menü Oluşturma: Kategoriler ve menü öğeleri ile detaylı menüler oluşturabilir
- QR Kod Paylaşımı: Oluşturulan menüleri QR kod ile müşterilere sunabilir
- Kolay Yönetim: Drag & drop ile kolayca sıralama yapabilir, menülerini güncelleyebilir
- Modern Arayüz: Responsive tasarım ile hem masaüstü hem mobil cihazlarda mükemmel deneyim
Proje, Clean Architecture ve SOLID prensiplerine uygun olarak geliştirilmiştir. Backend'de .NET 8, frontend'de Next.js 16 ve React 19 kullanılmıştır.
Not: Ekran görüntüleri eklemek için aşağıdaki formatı kullanabilirsiniz. Görselleri
docs/screenshots/klasörüne ekleyip buraya referans verebilirsiniz.
Ana sayfa - Platform tanıtımı ve özellikler
Giriş sayfası - Kullanıcı girişi ve "Beni Hatırla" özelliği
Kayıt sayfası - Yeni kullanıcı kaydı
Ana dashboard ekranı - Menü listesi ve yönetim
Menü detay sayfası - Kategoriler ve menü öğeleri yönetimi
QR kod oluşturma ve paylaşım ekranı
Müşteriler için public menü görüntüleme
Ekran görüntüsü eklemek için:
- Görselleri
docs/screenshots/klasörüne ekleyin - Yukarıdaki formatı kullanarak README'ye ekleyin
- Alternatif olarak, görselleri GitHub'a yükleyip direkt link verebilirsiniz
- JWT tabanlı güvenli kimlik doğrulama
- "Beni Hatırla" özelliği
- Şifre sıfırlama (email ile)
- Oturum yönetimi
- Menü oluşturma, düzenleme ve silme
- Kategori yönetimi (sınırsız kategori)
- Menü öğesi ekleme, düzenleme, silme
- Drag & drop ile kolay sıralama
- Görsel yükleme (menü ve öğe resimleri)
- Fiyat ve açıklama yönetimi
- Dinamik QR kod oluşturma
- Özel QR kod URL'leri
- Public menü görüntüleme
- QR kod ile hızlı erişim
- Modern ve şık tasarım
- Tam responsive (mobil, tablet, desktop)
- Drag & drop ile sürükle-bırak
- Gerçek zamanlı güncellemeler
- Loading states ve error handling
- Touch-friendly mobil deneyim
- Optimize edilmiş database sorguları
- Database indexing
- AsNoTracking ile hızlı okuma
- Lightweight API responses
- Efficient state management
- .NET 8 - Modern C# framework
- Entity Framework Core 8.0.11 - ORM
- SQL Server - Veritabanı
- JWT Authentication - Güvenli kimlik doğrulama
- Swagger/OpenAPI - API dokümantasyonu
- Next.js 16 - React framework (App Router)
- React 19 - UI kütüphanesi
- TypeScript - Type-safe JavaScript
- Tailwind CSS 4 - Utility-first CSS framework
- @dnd-kit - Drag & drop kütüphanesi
QRMenuApp.API/ # REST API endpoints, JWT Authentication
QRMenuApp.Application/ # Business logic, Services, DTOs
QRMenuApp.Domain/ # Entity models, Interfaces
QRMenuApp.Infrastructure/ # EF Core, Repositories, Data Access
QRMenuApp.Tests/ # Unit & Integration Tests
frontend/
├── app/ # Next.js App Router pages
│ ├── dashboard/ # Dashboard sayfaları
│ ├── login/ # Giriş sayfası
│ └── menu/ # Public menü görüntüleme
├── components/ # React component'leri
├── contexts/ # React Context (Auth)
├── hooks/ # Custom React hooks
├── lib/ # Utilities, API client
└── public/ # Static dosyalar
- .NET 8 SDK
- Node.js 18+ ve npm
- SQL Server (LocalDB veya SQL Server)
-
Veritabanı bağlantı string'ini ayarlayın:
QRMenuApp.API/appsettings.jsondosyasındaConnectionStrings:DefaultConnectiondeğerini güncelleyin:"ConnectionStrings": { "DefaultConnection": "Server=YOUR_SERVER;Database=QRMenuDb;Trusted_Connection=True;TrustServerCertificate=True;" }
-
JWT Key'i ayarlayın (ÖNEMLİ!):
appsettings.jsondosyasındaJwt:Keydeğerini güvenli bir random key ile değiştirin:"Jwt": { "Key": "YOUR_SECURE_RANDOM_KEY_HERE_AT_LEAST_32_CHARACTERS", ... }
Key oluşturma yöntemleri:
- PowerShell:
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 })) - Online: https://www.guidgenerator.com/online-guid-generator.aspx
- Manuel: En az 32 karakter uzunluğunda rastgele bir string
Not: Development ortamında key belirtmezseniz, uygulama otomatik olarak bir default key kullanır (sadece development için). Production'da mutlaka kendi key'inizi kullanmalısınız!
- PowerShell:
-
Veritabanını oluşturun:
cd QRMenuApp.API dotnet restore dotnet ef database update --project ../QRMenuApp.Infrastructure -
API'yi çalıştırın:
dotnet run
API varsayılan olarak
https://localhost:7000adresinde çalışacaktır.
-
Bağımlılıkları yükleyin:
cd frontend npm install -
Environment değişkenlerini ayarlayın:
frontend/.env.localdosyası oluşturun:NEXT_PUBLIC_API_URL=http://localhost:5000/api
Not: Backend'inizin çalıştığı port'a göre URL'yi güncelleyin.
-
Frontend'i çalıştırın:
npm run dev
Frontend varsayılan olarak
http://localhost:3000adresinde çalışacaktır.
- Frontend'e gidin:
http://localhost:3000 - "Kayıt Ol" ile yeni bir hesap oluşturun
- Giriş yaptıktan sonra dashboard'a yönlendirileceksiniz
- "Yeni Menü" butonuna tıklayarak ilk menünüzü oluşturun
- Kategoriler ve menü öğeleri ekleyin
- QR kod oluşturarak menünüzü paylaşın
- Kategori Ekleme: Menü detay sayfasında "Kategori Ekle" butonunu kullanın
- Menü Öğesi Ekleme: Kategori seçerek veya kategorisiz olarak öğe ekleyin
- Sıralama: Kategorileri ve öğeleri sürükle-bırak ile sıralayın
- Düzenleme: Öğelere tıklayarak düzenleme modal'ını açın
- Silme: Silme butonuna tıklayarak onaylayın
- Menü detay sayfasında "QR Kod Oluştur" butonuna tıklayın
- QR kod otomatik olarak oluşturulur
- QR kodu indirip yazdırabilir veya paylaşabilirsiniz
- QR kodu tarayan müşteriler menünüzü görüntüleyebilir
API çalışırken Swagger UI'ya erişebilirsiniz: https://localhost:7000/swagger
POST /api/users/register- Kullanıcı kaydıPOST /api/users/login- Kullanıcı girişiPOST /api/users/forgot-password- Şifre sıfırlama isteğiPOST /api/users/reset-password- Şifre sıfırlama
GET /api/menus- Tüm menüleri listeleGET /api/menus/summaries- Menü özetleri (hızlı liste)GET /api/menus/{id}- Menü detayıGET /api/menus/public/{id}- Public menü görüntülemePOST /api/menus- Yeni menü oluşturPUT /api/menus/{id}- Menü güncelleDELETE /api/menus/{id}- Menü sil
POST /api/menus/{menuId}/categories- Kategori eklePUT /api/menus/{menuId}/categories/{categoryId}- Kategori güncelleDELETE /api/menus/{menuId}/categories/{categoryId}- Kategori silPUT /api/menus/{menuId}/categories/reorder- Kategori sıralama
POST /api/menus/{menuId}/items- Menü öğesi eklePUT /api/menus/{menuId}/items/{itemId}- Menü öğesi güncelleDELETE /api/menus/{menuId}/items/{itemId}- Menü öğesi silPUT /api/menus/{menuId}/items/reorder- Menü öğesi sıralama
POST /api/menus/{menuId}/qrcode- QR kod oluştur (Auth Required)GET /api/menus/{menuId}/qrcode/{code}- QR kod detayı (Public)
Proje, modern yazılım geliştirme prensiplerine uygun olarak tasarlanmıştır:
- Clean Architecture: Katmanlı mimari ile concern separation
- SOLID Principles: Tüm SOLID prensiplerine uyum
- Repository Pattern: Data access katmanı soyutlanmış
- Dependency Injection: Tüm bağımlılıklar DI ile yönetiliyor
- DTO Pattern: API request/response'lar için DTO kullanımı
- Service Layer: Business logic service katmanında
- Exception Handling: Merkezi exception handling middleware
- JWT Key: Production ortamında mutlaka güçlü bir JWT key kullanın (en az 32 karakter, random)
- Connection String: Veritabanı bağlantı bilgilerini
appsettings.jsonyerine environment variables veya User Secrets kullanın - Email Credentials: Email ayarlarını production'da environment variables ile yönetin
- Environment Variables: Hassas bilgileri
.envdosyalarında saklayın ve.gitignore'a ekleyin - HTTPS: Production'da mutlaka HTTPS kullanın
- JWT token tabanlı authentication
- Password hashing (SHA256)
- SQL injection koruması (EF Core parameterized queries)
- CORS yapılandırması
- Input validation (service layer)
- Error message sanitization
Katkılarınızı bekliyoruz! Lütfen:
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/amazing-feature) - Commit edin (
git commit -m 'Add some amazing feature') - Push edin (
git push origin feature/amazing-feature) - Pull Request açın
- Clean Code prensiplerine uyun
- SOLID prensiplerini takip edin
- Unit test yazın (mümkünse)
- Gereksiz comment'ler eklemeyin
- TypeScript type safety'ye dikkat edin
Proje, modern web teknolojileri kullanılarak geliştirilmiştir. Sorularınız için issue açabilirsiniz.
Bu proje, modern web geliştirme pratiklerini öğrenmek ve uygulamak için geliştirilmiştir. Production ortamında kullanmadan önce:
- JWT Key:
appsettings.jsondosyasındakiJwt:Keydeğerini güçlü bir random key ile değiştirin (en az 32 karakter) - Connection String: Veritabanı bağlantı bilgilerini environment variables veya Azure Key Vault gibi güvenli bir yerde saklayın
- HTTPS: Mutlaka HTTPS kullanın
- CORS: Production'da CORS ayarlarını sadece gerekli domain'ler için yapılandırın
- Rate Limiting: API'ye rate limiting ekleyin
- Logging: Production'da uygun logging ve monitoring ekleyin
QRMenuApp.API/appsettings.jsondosyasını açınJwt:Keydeğerini bulun- Güçlü bir random key oluşturun (örnek:
openssl rand -base64 32komutu ile) - Değeri değiştirin:
"Jwt": { "Key": "YOUR_SECURE_RANDOM_KEY_HERE_AT_LEAST_32_CHARACTERS", ... }
- Uygulamayı yeniden başlatın
Not: Development ortamında key belirtilmezse, uygulama otomatik olarak bir default key kullanır (sadece development için). Production'da mutlaka kendi key'inizi kullanmalısınız!