Trudny / egzaminacyjny · lekcja 20

Projekt 1: Kalkulator BMI z historią pomiarów (Angular + ASP.NET Core)

Czas na pierwszy z czterech pełnych projektów łączących wszystko, czego się nauczyłeś. Pamiętasz kalkulator BMI z lekcji 4? Tam był to prosty, samodzielny komponent Angular liczący wynik lokalnie. Teraz rozbudujemy go o prawdziwy backend ASP.NET Core — każdy p...

Zacznij tutaj

Po co się tego uczymy?

Czas na pierwszy z czterech pełnych projektów łączących wszystko, czego się nauczyłeś. Pamiętasz kalkulator BMI z lekcji 4? Tam był to prosty, samodzielny komponent Angular liczący wynik lokalnie. Teraz rozbudujemy go o prawdziwy backend ASP.NET Core — każdy pomiar będzie zapisywany w bazie danych, więc historia przetrwa zamknięcie przeglądarki.

Wprowadzenie

Teoria

Wymagania projektu:

  • Formularz Angular (Reactive Forms, lekcja 10) z polami wzrost/waga i walidacją (obie wartości muszą być dodatnie);
  • Po obliczeniu BMI, wynik jest wysyłany do backendu ASP.NET Core i zapisywany w bazie SQLite (Entity Framework Core, lekcje 14-16);
  • Lista poniżej formularza pokazuje HISTORIĘ wszystkich dotychczasowych pomiarów (data, wzrost, waga, wynik, kategoria), pobieraną z backendu przez HttpClient (lekcja 11);
  • Stylowanie całości Bootstrapem (lekcja 7).

Model danych (backend, C#):

public class PomiarBmi
{
    public int Id { get; set; }
    public double WzrostCm { get; set; }
    public double WagaKg { get; set; }
    public double Wynik { get; set; }
    public string Kategoria { get; set; } = "";
    public DateTime DataPomiaru { get; set; } = DateTime.Now;
}

Przepływ danych całego projektu: użytkownik wypełnia formularz Angular → walidacja Reactive Forms (lekcja 11) → kliknięcie "Oblicz i zapisz" → Angular oblicza BMI LOKALNIE (żeby natychmiast pokazać wynik, bez czekania na serwer) I RÓWNOCZEŚNIE wysyła dane przez HttpClient.post() do kontrolera PomiaryController → backend oblicza kategorię, zapisuje przez EF Core, zwraca zapisany rekord (z nadanym Id) → Angular dodaje nowy wpis do lokalnie wyświetlanej listy historii, bez przeładowania całej strony.

Ten projekt ćwiczy WSZYSTKIE elementy z bloku Angular (formularz z walidacją, serwis, HttpClient) połączone z WSZYSTKIMI elementami backendu (kontroler API, EF Core, model danych) — to twoja pierwsza PEŁNA, kompletna aplikacja pełnego stosu (full-stack) w tym kursie.

Zobacz zależności

Schemat

Angular: formularz-bmi.component
   [wzrost, waga] → Reactive Forms + Validators (lekcja 10)
        │  klik "Oblicz i zapisz"
        ▼
   obliczBmiLokalnie() → natychmiastowy wynik na ekranie
        │
        ▼
   this.http.post<PomiarBmi>(".../api/pomiary", {wzrostCm, wagaKg})
        │
        ▼ (CORS, lekcja 11)
ASP.NET Core: PomiaryController
   [HttpPost] Dodaj(PomiarBmi pomiar)
        │
        ├── oblicz Kategoria (serwerowo, "źródło prawdy")
        ├── context.Pomiary.Add(pomiar); SaveChangesAsync();  (EF Core, lekcja 14-15)
        │
        ▼
   return CreatedAtAction(..., pomiar);   → JSON z powrotem do Angular
        │
        ▼
Angular: dopisuje nowy wpis do tablicy historiaPomiarow (bez przeładowania)
        │
        ▼
@for (p of historiaPomiarow) { <tr>...</tr> }   ← lista historii (lekcja 8)

Połącz z praktyką

Przykład z życia

Aplikacja fitness śledząca postępy użytkownika (waga, BMI w czasie) zapisuje KAŻDY pomiar z datą, żeby po miesiącach móc pokazać wykres zmian — dokładnie ten sam mechanizm "oblicz i zapisz z historią" realizuje ten projekt, tylko w uproszczonej, edukacyjnej wersji.