Telefon ve elektronik cihaz servisleri için geliştirilmiş bir servis yönetim uygulamasıdır. Çözüm; ASP.NET Core Web API, SQL Server/LocalDB, Entity Framework Core, Blazor Web ve .NET MAUI Blazor Hybrid istemcilerinden oluşur.
- Müşteri ve servis hesabı kaydı
- JWT tabanlı kimlik doğrulama ve rol yetkilendirmesi
- Müşteri, cihaz ve servis fişi yönetimi
- Otomatik servis fişi numarası ve güvenli takip kodu oluşturma
- Durum geçmişi, not ve tahmini ücret takibi
- Teslimde teslim alan kişi adı, cihaz ve kimlik belgesinin ön/arka fotoğrafları ile teslim kanıtı
- Yetkili servis için PDF servis fişi indirme
- Takip doğrulaması için telefon numarasının son dört hanesi
- Hatalı takip doğrulamasında deneme sınırı ve geçici kilit
- Servis fişi ve şifre sıfırlama e-postaları için SMTP desteği
- Yeni cihazdan girişte e-posta bildirimi
- Şifre sıfırlama bağlantısı ve şifre değiştirme
- Şifre değiştirildiğinde veya tüm cihazlardan çıkış yapıldığında eski oturumların iptali
- Oturum bitmeden uyarı ve hareketsizlikte otomatik çıkış
- Web, Windows ve Android istemcileri
- İstemcide JWT oturumunu saklayan "Beni hatırla" seçeneği
DeviceService.API: REST API, JWT, Swagger ve SMTP entegrasyonuDeviceService.Core: Entity, enum ve arayüzlerDeviceService.Data: EF Core DbContext ve migration'larDeviceService.Services: Ortak API istemcisi ve iş mantığıDeviceService.Shared: Web ve MAUI tarafından kullanılan Razor bileşenleriDeviceService.Web: Blazor Web uygulamasıDeviceService.Maui: .NET MAUI Blazor Hybrid uygulaması
- .NET 10 SDK
- SQL Server LocalDB veya SQL Server
- Android geliştirme için .NET MAUI workload ve Android SDK
- E-posta özelliği kullanılacaksa SMTP hesabı
Gerçek JWT anahtarı, servis kayıt kodu, SMTP anahtarı ve yayın adresi repoya yazılmamalıdır. Yerel geliştirmede API ayarları için dotnet user-secrets kullanılabilir.
Rastgele bir JWT anahtarı oluştur:
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$bytes = New-Object byte[] 48
$rng.GetBytes($bytes)
$jwtKey = [Convert]::ToBase64String($bytes)
dotnet user-secrets set "Jwt:Key" $jwtKey --project .\DeviceService.API\DeviceService.API.csproj
$rng.Dispose()Servis hesabı kaydı için bir kayıt kodu tanımla:
dotnet user-secrets set "Registration:ServiceCode" "KENDI-GUCLU-KAYIT-KODUN" --project .\DeviceService.API\DeviceService.API.csprojSMTP ve e-posta bağlantıları için gerekli ayarlar:
dotnet user-secrets set "Email:Host" "smtp.example.com" --project .\DeviceService.API\DeviceService.API.csproj
dotnet user-secrets set "Email:Port" "587" --project .\DeviceService.API\DeviceService.API.csproj
dotnet user-secrets set "Email:UserName" "smtp-kullanici" --project .\DeviceService.API\DeviceService.API.csproj
dotnet user-secrets set "Email:Password" "smtp-parolasi-veya-anahtari" --project .\DeviceService.API\DeviceService.API.csproj
dotnet user-secrets set "Email:FromAddress" "no-reply@example.com" --project .\DeviceService.API\DeviceService.API.csproj
dotnet user-secrets set "Email:PublicAppBaseUrl" "https://web-adresin.example.com" --project .\DeviceService.API\DeviceService.API.csprojEmail:PublicAppBaseUrl, şifre sıfırlama e-postasındaki bağlantının açılacağı genel web adresidir.
Varsayılan bağlantı SQL Server LocalDB kullanır. Şemayı oluşturmak veya güncellemek için:
dotnet ef database update --project .\DeviceService.Data\DeviceService.Data.csproj --startup-project .\DeviceService.API\DeviceService.API.csprojTüm yerel kayıtları silip boş şemayı yeniden oluşturmak için:
dotnet ef database drop --force --project .\DeviceService.Data\DeviceService.Data.csproj --startup-project .\DeviceService.API\DeviceService.API.csproj
dotnet ef database update --project .\DeviceService.Data\DeviceService.Data.csproj --startup-project .\DeviceService.API\DeviceService.API.csprojAPI:
dotnet run --project .\DeviceService.API\DeviceService.API.csproj --launch-profile httpSwagger geliştirme ortamında http://localhost:5113/swagger adresinde açılır.
Web:
dotnet run --project .\DeviceService.Web\DeviceService.Web.csprojWindows MAUI:
dotnet run --project .\DeviceService.Maui\DeviceService.Maui.csproj -f net10.0-windows10.0.19041.0Android uygulamasının API adresi kaynak kodda tutulmaz. APK oluştururken DeviceServiceApiBaseUrl parametresiyle verilir. Adresin sonunda / bulunmalıdır.
dotnet publish .\DeviceService.Maui\DeviceService.Maui.csproj -c Release -f net10.0-android -p:AndroidPackageFormat=apk -p:DeviceServiceApiBaseUrl=https://api-adresin.example.com/APK çıktısı:
DeviceService.Maui\bin\Release\net10.0-android\publish\
- Tüm API endpoint'leri varsayılan olarak kimlik doğrulaması ister.
- Servis yönetimi yalnızca
Servicerolüne açıktır. - Müşteriler yalnızca kendi servis fişlerini görüntüleyebilir.
- Giriş, kayıt ve şifre sıfırlama istekleri oran sınırlamasına sahiptir.
- Parolalar PBKDF2-SHA256, rastgele salt ve 210.000 iterasyonla hashlenir.
- Takip tokenları kriptografik olarak rastgele üretilir.
- Telefon numarasının tamamı takip istemcisine gönderilmez.
- Şifre değişimi ve "Tüm Oturumları Kapat" işlemi eski JWT oturumlarını geçersiz kılar.
- SMTP ayarları yapılandırılmadıysa e-posta gönderimi başarısız olur; servis fişi kaydı korunur.
- Teslim kanıtı görselleri
DeviceService.API/App_Data/DeliveryEvidencealtında tutulur; uygulama tarafından public olarak yayınlanmaz ve Git tarafından yok sayılır. - "Teslim Edildi" durumuna geçmek için teslim alan kişi adı ile cihaz ve kimlik belgesinin ön/arka görselleri API tarafında da zorunludur.
Compose yapısı Docker çalıştırabilen tek bir Linux sunucuya dağıtılabilir. Sunucuda .env oluştur, PUBLIC_BASE_URL değerini gerçek HTTPS adresine ayarla ve ardından docker compose up -d --build çalıştır.
Public ortamda Nginx'in önünde HTTPS sağlayan bir load balancer veya alan adı/sertifika yöneten bir reverse proxy kullanılmalıdır. API ve Web container portları doğrudan internete açılmaz; yalnızca proxy servisi yayınlanır.
Android APK'yı production adresine bağlamak için:
dotnet publish .\DeviceService.Maui\DeviceService.Maui.csproj -c Release -f net10.0-android -p:AndroidPackageFormat=apk -p:DeviceServiceApiBaseUrl=https://uygulama-adresin.example.com/