Czego się nauczysz?
- Obsługi formularzy z wyborem (radio buttons, select)
- Pracy z datami i zakresami czasowymi
- Obliczania statystyk i średnich
- Grupowania danych po okresach (dzień, tydzień, miesiąc)
- Prostej wizualizacji danych
This content is not available in your language yet.
Stworzysz Dziennik nastroju - aplikację umożliwiającą codzienne zapisywanie swojego samopoczucia wraz z krótką notatką. System pozwala śledzić zmiany nastroju w czasie, generować podsumowania tygodniowe i miesięczne oraz wizualizować trendy emocjonalne.
Czego się nauczysz?
W prawdziwej pracy...
Aplikacje do śledzenia zdrowia psychicznego i well-being są coraz popularniejsze. Umiejętność projektowania systemów z danymi czasowymi, statystykami i wizualizacjami jest fundamentem dla aplikacji zdrowotnych, HR-owych (ankiety satysfakcji), produktowych (feedback użytkowników) i wielu innych.
Formularz dodawania wpisu Użytkownik wybiera datę, poziom nastroju (np. skala 1-5 lub emotikony) oraz opcjonalnie dodaje krótką notatkę opisującą dzień.
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy data nie jest z przyszłości, czy nastrój jest w dozwolonym zakresie.
Zapis do pliku JSON Każdy wpis jest zapisywany do pliku JSON z unikalnym ID i znacznikiem czasu dodania.
Lista wpisów Użytkownik może przeglądać wszystkie swoje wpisy w formie listy, posortowane od najnowszego.
Przykładowa struktura pliku JSON:
{ "entries": [ { "id": 1, "date": "2026-02-10", "mood": 4, "mood_label": "dobrze", "note": "Dobry dzień w pracy, spotkanie z przyjaciółmi wieczorem", "created_at": "2026-02-10 21:30:00" }, { "id": 2, "date": "2026-02-11", "mood": 2, "mood_label": "źle", "note": "Deszczowy dzień, zmęczenie", "created_at": "2026-02-11 22:15:00" }, { "id": 3, "date": "2026-02-12", "mood": 3, "mood_label": "neutralnie", "note": "", "created_at": "2026-02-12 20:00:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na stronę wieczorem i widzi formularz. Wybiera datę dzisiejszą, nastrój “4 - dobrze” (lub uśmiechniętą buźkę), wpisuje notatkę “Produktywny dzień”. Po zapisie widzi wpis na liście z zieloną ikoną oznaczającą dobry nastrój.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik widzi podsumowanie: “Ten tydzień: średni nastrój 3.4/5, najlepszy dzień: poniedziałek (5), najgorszy: środa (2)”. Widzi też streak: “Wpisy z rzędu: 7 dni”. Lista wpisów ma kolorowe tło zależne od nastroju.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi wykres liniowy pokazujący nastrój w ostatnich 30 dniach. Pod wykresem analiza: “Trend: stabilny, dni powyżej średniej: 18/30”. Może filtrować wpisy po tagach, np. “praca” i zobaczyć, jak wpływa na nastrój.
Mapowanie nastroju na etykiety i kolory:
function getMoodData(int $mood): array { $moods = [ 1 => ['label' => 'bardzo źle', 'color' => '#e74c3c', 'emoji' => '😢'], 2 => ['label' => 'źle', 'color' => '#e67e22', 'emoji' => '😕'], 3 => ['label' => 'neutralnie', 'color' => '#f39c12', 'emoji' => '😐'], 4 => ['label' => 'dobrze', 'color' => '#2ecc71', 'emoji' => '🙂'], 5 => ['label' => 'świetnie', 'color' => '#27ae60', 'emoji' => '😄'], ]; return $moods[$mood] ?? $moods[3];}Obliczanie średniego nastroju:
function calculateAverageMood(array $entries): float { if (empty($entries)) { return 0; }
$sum = array_sum(array_column($entries, 'mood')); return round($sum / count($entries), 1);}Podsumowanie tygodniowe:
function getWeeklySummary(array $entries): array { $weekAgo = date('Y-m-d', strtotime('-7 days')); $today = date('Y-m-d');
$weekEntries = array_filter($entries, function($e) use ($weekAgo, $today) { return $e['date'] >= $weekAgo && $e['date'] <= $today; });
if (empty($weekEntries)) { return ['count' => 0, 'average' => 0, 'best' => null, 'worst' => null]; }
$moods = array_column($weekEntries, 'mood', 'date'); $bestDay = array_search(max($moods), $moods); $worstDay = array_search(min($moods), $moods);
return [ 'count' => count($weekEntries), 'average' => calculateAverageMood($weekEntries), 'best' => ['date' => $bestDay, 'mood' => $moods[$bestDay]], 'worst' => ['date' => $worstDay, 'mood' => $moods[$worstDay]], ];}Liczenie streak (dni z rzędu):
function calculateStreak(array $entries): int { if (empty($entries)) return 0;
// Sortuj po dacie malejąco usort($entries, fn($a, $b) => $b['date'] <=> $a['date']);
$streak = 0; $expectedDate = date('Y-m-d');
foreach ($entries as $entry) { if ($entry['date'] === $expectedDate) { $streak++; $expectedDate = date('Y-m-d', strtotime($expectedDate . ' -1 day')); } else { break; } }
return $streak;}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!