Skip to content

Dziennik nastroju

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?

  • 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

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.

  1. Formularz dodawania wpisu Użytkownik wybiera datę, poziom nastroju (np. skala 1-5 lub emotikony) oraz opcjonalnie dodaje krótką notatkę opisującą dzień.

  2. Walidacja danych System sprawdza poprawność wprowadzonych danych - czy data nie jest z przyszłości, czy nastrój jest w dozwolonym zakresie.

  3. Zapis do pliku JSON Każdy wpis jest zapisywany do pliku JSON z unikalnym ID i znacznikiem czasu dodania.

  4. 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:

  • Formularz z polami: data, nastrój (skala 1-5 lub emotikony), notatka
  • Walidacja danych w PHP (wymagane pola, nastrój w zakresie)
  • Zapis wpisu do pliku JSON
  • Lista wszystkich wpisów z wizualizacją nastroju (np. kolory, ikony)
  • Prosty interfejs CSS (czytelny, przyjazny)

Przykładowy scenariusz:

Uż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.

Ocena: 3.0

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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!