ASP.NET Core 8 MVC ile geliştirilmiş, çok katmanlı mimari üzerine kurulu kapsamlı bir turizm ve rezervasyon yönetim sistemi. Kullanıcılar tur rotalarını inceleyip rezervasyon oluştururken, adminler ve rehberler sistemi yönetebilmektedir.
TraversalCoreProje/
├── EntityLayer/ # Veritabanı entity sınıfları
├── DataAccessLayer/ # EF Core repository ve migration'lar
├── BusinessLayer/ # Servis ve iş mantığı katmanı
├── DTOLayer/ # Veri transfer nesneleri (DTO)
├── TraversalCoreProje/ # Ana MVC web projesi
├── SignalRApi/ # SignalR + PostgreSQL API projesi
└── SignalRConsume/ # SignalR istemci (MVC) projesi
| Teknoloji | Versiyon | Kullanım Amacı |
|---|---|---|
| ASP.NET Core MVC | 8.0 | Web framework |
| Entity Framework Core | 8.x | ORM, veritabanı işlemleri |
| ASP.NET Core Identity | 8.x | Kullanıcı kimlik doğrulama ve rol yönetimi |
| AutoMapper | 12.x | Entity-DTO dönüşümleri |
| FluentValidation | 12.x | Model doğrulama |
| SignalR | 8.x | Gerçek zamanlı ziyaretçi istatistikleri |
| PostgreSQL + Npgsql | 16 | SignalR API veritabanı |
| SQL Server | - | Ana uygulama veritabanı |
| Serilog | - | Dosya tabanlı loglama |
| EPPlus / ClosedXML | - | Excel rapor oluşturma |
| RapidAPI (Booking.com) | - | Otel arama entegrasyonu |
- Ana sayfa: popüler rotalar, rehberler, testimonial, bülten aboneliği
- Tur rotaları listeleme ve detay sayfası (Cover image, açıklama, program detayları)
- Rehberlerimiz sayfası
- Hakkımızda sayfası (dinamik
Abouts+About2stabloları) - İletişim sayfası (Google Maps embed, form ile mesaj gönderme)
- Yorum sistemi (giriş yapmış kullanıcılar yorum yapabilir, herkes görebilir)
- Rezervasyon yap butonu
- Profil sayfası (fotoğraf yükleme, bilgi güncelleme)
- Tur rotaları listeleme ve detay görüntüleme
- Rezervasyon oluşturma
- Mevcut ve geçmiş rezervasyonlarını görüntüleme
- Dashboard (son rotalar, istatistikler, profil bilgisi, rehber listesi)
- Destinasyon yönetimi: Tur rotası ekleme, güncelleme, silme (soft delete), detay görüntüleme
- Rehber yönetimi: Rehber ekleme, düzenleme, aktif/pasif yapma
- Yorum yönetimi: Tüm yorumları listeleme, silme
- Duyuru yönetimi: Duyuru ekleme, güncelleme, silme (FluentValidation ile)
- Şehir yönetimi (AJAX): Dinamik şehir CRUD işlemleri
- Rezervasyon yönetimi: Onaylama, reddetme, geçmiş olarak işaretleme
- Kullanıcı yorum sayfası: Belirli kullanıcının tüm yorumlarını görüntüleme
- İletişim yönetimi: Siteye gelen mesajların yönetimi
- Excel raporlama: EPPlus ve ClosedXML ile destinasyon Excel raporları
- Booking.com entegrasyonu: RapidAPI üzerinden otel arama (şehir → otel listesi)
- Ziyaretçi istatistikleri API: HTTP Client ile SignalR API entegrasyonu
- Gerçek zamanlı ziyaretçi verisi (şehir bazlı, tarih bazlı)
- PostgreSQL
crosstabile pivot tablo - Google Charts ile sütun grafik görselleştirmesi
- WebSocket bağlantısı ile anlık güncelleme
Presentation Layer (TraversalCoreProje MVC)
↓
Business Layer (Manager sınıfları, FluentValidation)
↓
Data Access Layer (EF Core Generic Repository)
↓
Entity Layer (POCO sınıfları)
↓
DTOLayer (ViewModel/DTO sınıfları)
public interface IGenericDal<T>
{
void Insert(T t);
void Update(T t);
void Delete(T t);
T GetByID(int id);
List<T> GetList();
}Tüm servis kayıtları BusinessLayer/Container/Extensions.cs dosyasında merkezi olarak yönetilmektedir.
| Tablo | Açıklama |
|---|---|
Destinations |
Tur rotaları (şehir, açıklama, resimler, fiyat, kapasite, rehber ilişkisi) |
Guides |
Rehber bilgileri (isim, açıklama, resim, sosyal medya linkleri) |
Comments |
Kullanıcı yorumları (AppUser FK, Destination FK) |
Reservations |
Rezervasyonlar (kullanıcı, destinasyon, kişi sayısı, durum) |
Contacts |
Şirket iletişim bilgileri (mail, adres, telefon, harita) |
ContactUs |
Kullanıcıların gönderdiği mesajlar |
Announcements |
Duyurular |
Newsletters |
Bülten aboneleri |
Abouts |
Hakkımızda içeriği |
About2s |
Hakkımızda alt grid içeriği |
AspNetUsers |
Identity kullanıcı tablosu (AppUser) |
AspNetRoles |
Identity rol tablosu (Admin, Member) |
- ASP.NET Core Identity tabanlı kullanıcı yönetimi
- Rol bazlı yetkilendirme:
AdminveMemberrolleri - Giriş sonrası rol kontrolüyle otomatik yönlendirme:
Adminrolü →/Admin/Dashboard/Index- Diğer kullanıcılar →
/Member/Dashboard/Index
- Yetkisiz erişimde özel
/ErrorPage/AccessDeniedsayfası (403) - Özel
CustomIdentityValidatorile Türkçe hata mesajları - Cookie tabanlı oturum yönetimi
Areas/
├── Admin/
│ ├── Controllers/
│ │ ├── BaseAdminController.cs ← [Authorize(Roles = "Admin")]
│ │ ├── DestinationController.cs
│ │ ├── GuideController.cs
│ │ ├── CommentController.cs
│ │ ├── AnnouncementController.cs
│ │ ├── ReservationController.cs
│ │ ├── ExcelController.cs
│ │ ├── BookingHotelSearchController.cs
│ │ └── VisitorApiController.cs
│ └── Views/
└── Member/
├── Controllers/
│ ├── BaseMemberController.cs ← [Authorize]
│ ├── DashboardController.cs
│ ├── ProfileController.cs
│ ├── ReservationController.cs
│ └── DestinationController.cs
└── Views/
| ViewComponent | Açıklama |
|---|---|
_CommentList |
Destinasyon yorumlarını listeler (kullanıcı avatarı ile) |
_AddComment |
Yorum ekleme formu (giriş durumuna göre gösterir) |
_ProfileInformation |
Üye profil bilgisi özeti |
_GuideList |
Rehber listesi (dashboard) |
_LastDestinations |
Son eklenen 4 tur rotası |
_PopularDestinations |
Popüler rotalar |
_Statistics |
İstatistik kartları |
_DashboardBanner |
Dashboard banner alanı |
_SliderPartial |
Ana sayfa slider |
_Testimonial |
Müşteri yorumları carousel |
_SubAbout |
Alt hakkımızda bölümü |
_Feature |
Özellikler bölümü |
_AdminDashboardHeader |
Admin profil header |
_AdminGuideList |
Admin rehber istatistikleri |
_Cards1Statistic |
İstatistik kartı 1 |
_Cards2Statistics |
İstatistik kartı 2 |
_DestinationStatistic |
Destinasyon istatistikleri |
_TotalRevenue |
Toplam gelir grafiği |
Admin panelinde otel arama özelliği, iki aşamalı bir akışla çalışır:
- Şehir Arama:
searchDestinationendpoint'i ile şehir adındandest_idbulunur - Otel Listeleme:
searchHotelsendpoint'i ile otel listesi (isim, resim, fiyat, puan) çekilir
SignalRApi projesi, PostgreSQL üzerinde çalışan bağımsız bir API sunucusudur:
POST /api/Visitor→ Yeni ziyaretçi verisi eklerGET /api/Visitor→ Ziyaretçi listesini döner/VisitorHub→ SignalR Hub endpoint'i
SignalRConsume projesi bu Hub'a bağlanarak Google Charts ile gerçek zamanlı sütun grafik çizer.
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Microsoft.AspNetCore.Identity.EntityFrameworkCore
AutoMapper
FluentValidation.AspNetCore
Serilog.AspNetCore
Serilog.Sinks.File
EPPlus
ClosedXML
Newtonsoft.Json
Npgsql.EntityFrameworkCore.PostgreSQL
Microsoft.AspNetCore.SignalR
- .NET 8 SDK
- SQL Server (ana uygulama)
- PostgreSQL 16 (SignalR API)
- Visual Studio 2022
- Repoyu klonla:
git clone https://github.com/nrglelml/TraversalCoreProje.git
cd TraversalCoreProjeTraversalCoreProje/appsettings.jsondosyasında SQL Server bağlantı string'ini güncelle:
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=TraversalDB;Trusted_Connection=True;"
}SignalRApi/appsettings.jsondosyasında PostgreSQL bağlantı string'ini güncelle:
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=SignalRDB;Username=postgres;Password=sifren"
}- Migration'ları uygula:
# Ana proje (Package Manager Console - DataAccessLayer seçili)
Update-Database
# SignalRApi (SignalRApi projesi seçili)
Update-Database- PostgreSQL'de
tablefuncextension'ını etkinleştir:
CREATE EXTENSION IF NOT EXISTS tablefunc;- Admin rolü oluştur ve kullanıcıya ata:
INSERT INTO AspNetRoles (Id, Name, NormalizedName, ConcurrencyStamp)
VALUES (NEWID(), 'Admin', 'ADMIN', NEWID())
INSERT INTO AspNetUserRoles (UserId, RoleId)
VALUES ('kullanici_id', 'admin_rol_id')- Solution'ı çalıştır:
TraversalCoreProje→ Ana web uygulamasıSignalRApi→ SignalR API sunucusu (port 5023)SignalRConsume→ SignalR istemcisi
wwwroot/
├── destinationImages/ # Tur rotası görselleri
├── guideImages/ # Rehber profil fotoğrafları
├── userImages/ # Kullanıcı profil fotoğrafları
└── project_logo.png # Site logosu / favicon
Bu proje Murat Yücedağ Traversal ASP.Net Core eğitimi ile birlikte geliştirilmiştir.
Youtube kursu: Traversal Rezervasyon Asp.Net Core 5.0 Mini Proje
Nurgül — @nrglelml