Aplikacja webowa PWA do zarządzania produktami spożywczymi w domu. Zbudowana w architekturze Clean Architecture z ASP.NET Core (.NET 10), Blazor WebAssembly i SQLite.
- 📦 Magazyn – dodawanie i śledzenie stanu produktów z datami ważności
- 📷 Skaner kodów kreskowych – kamera + ZXing, automatyczne pobieranie danych z Open Food Facts
⚠️ Alerty – powiadomienia o produktach wygasających i niskim stanie- 🛒 Lista zakupów – ręczne dodawanie i automatyczne generowanie z niskiego stanu
- 🌙 Tryb ciemny – Material Design UI (MudBlazor) zoptymalizowane pod tablety/telefony
- 📱 PWA – instalowalna aplikacja z obsługą offline
| Warstwa | Technologia |
|---|---|
| Backend | ASP.NET Core 10, MediatR 14, FluentValidation |
| Baza danych | SQLite + EF Core 10 |
| Frontend | Blazor WASM 10, MudBlazor 9 |
| Barcode | ZXing @zxing/browser |
| Dane zewn. | Open Food Facts API |
| Testy | xUnit, Moq, FluentAssertions |
| Wdrożenie | Docker Compose + nginx |
cd src/FoodManager.Api
dotnet runAPI dostępne pod: https://localhost:7001
Swagger UI: https://localhost:7001/swagger
W oddzielnym terminalu:
cd src/FoodManager.Web
dotnet runOtwórz: https://localhost:5001
Upewnij się, że
wwwroot/appsettings.jsonwskazuje właściwy adres API:{ "ApiBaseUrl": "https://localhost:7001/" }
# Budowanie i uruchomienie
docker compose up --build -d
# Logi
docker compose logs -f api
# Zatrzymanie
docker compose down- Frontend:
http://localhost:8080 - API:
http://localhost:7001 - Swagger:
http://localhost:7001/swagger
Dane SQLite są przechowywane w wolumenie Docker fm_data.
-
Zainstaluj
cloudflared:winget install Cloudflare.cloudflared
-
Zaloguj się:
cloudflared tunnel login
-
Utwórz tunel:
cloudflared tunnel create foodmanager
-
Skonfiguruj plik
~/.cloudflared/config.yml:tunnel: <TUNNEL_ID> credentials-file: ~/.cloudflared/<TUNNEL_ID>.json ingress: - hostname: food.twojadomena.com service: http://localhost:8080 - service: http_status:404
-
Dodaj DNS i uruchom:
cloudflared tunnel route dns foodmanager food.twojadomena.com cloudflared tunnel run foodmanager
Ustaw klucz API w appsettings.json:
{
"ApiKey": "TwojTajnyKlucz"
}Lub przez zmienną środowiskową Docker:
environment:
- ApiKey=TwojTajnyKluczKażde żądanie musi zawierać nagłówek: X-Api-Key: TwojTajnyKlucz
# Testy jednostkowe
dotnet test tests/FoodManager.UnitTests
# Testy integracyjne
dotnet test tests/FoodManager.IntegrationTests
# Wszystkie testy z pokryciem kodu
dotnet test --collect "XPlat Code Coverage"FoodManager/
├── src/
│ ├── FoodManager.Domain/ # Encje, interfejsy, enumy
│ ├── FoodManager.Application/ # CQRS (MediatR), DTOs, walidacja
│ ├── FoodManager.Infrastructure/ # EF Core, repozytoria, usługi zewn.
│ ├── FoodManager.Api/ # REST API (kontrolery, middleware)
│ └── FoodManager.Web/ # Blazor WASM PWA (UI)
├── tests/
│ ├── FoodManager.UnitTests/
│ └── FoodManager.IntegrationTests/
├── docker-compose.yml
└── README.md
Aplikacja używa EnsureCreated() przy starcie — baza i schemat są tworzone automatycznie.
Przy pierwszym uruchomieniu wstawianych jest 10 domyślnych kategorii (Nabiał, Pieczywo, Mięso itd.).
Plik bazy: src/FoodManager.Api/Data/food.db (lokalnie) lub wolumin Docker fm_data.