# Projekt: System 2FA z Notatnikiem i Kalendarzem ## Informacje ogólne - **Technologie:** PHP 8+, SQLite, Bootstrap 5.3, Bootstrap Icons - **Architektura:** Uproszczone MVC (kontrolery, modele, widoki w PHP) - **Routing:** Przyjazne linki (SEO-friendly URLs) przez .htaccess --- ## Struktura projektu ``` projektphp2/ ├── .htaccess # Reguły mod_rewrite ├── index.php # Front controller (routing) ├── init.php # Inicjalizacja bazy danych ├── PROJEKT.md # Ten plik - dokumentacja ├── app/ │ ├── controllers/ │ │ ├── AuthController.php # Logowanie, 2FA, wylogowanie │ │ ├── NoteController.php # CRUD notatek │ │ └── EventController.php # CRUD wydarzeń kalendarza │ ├── models/ │ │ ├── Database.php # Singleton PDO SQLite │ │ ├── User.php # Model użytkownika + kody weryfikacyjne │ │ ├── Note.php # Model notatek (auto-migracja) │ │ └── Event.php # Model wydarzeń (auto-migracja) │ └── views/ │ ├── layout.php # Główny szablon (z/bez menu) │ ├── login.php # Formularz logowania │ ├── verify.php # Weryfikacja kodu 2FA │ ├── dashboard.php # Pulpit użytkownika │ ├── notes/ │ │ ├── index.php # Lista notatek (karty) │ │ └── form.php # Formularz dodawania/edycji notatki │ └── calendar/ │ ├── index.php # Widok kalendarza miesięcznego │ ├── day.php # Lista wydarzeń danego dnia │ └── form.php # Formularz dodawania/edycji wydarzenia └── database/ └── app.db # Baza SQLite (tworzona przez init.php) ``` --- ## Routing (przyjazne linki) ### Autoryzacja | URL | Metoda | Akcja | |-----|--------|-------| | `/` lub `/logowanie` | GET | Formularz logowania | | `/zaloguj` | POST | Weryfikacja login/hasło | | `/weryfikacja` | GET | Formularz kodu 2FA | | `/zweryfikuj` | POST | Weryfikacja kodu 2FA | | `/panel` | GET | Pulpit (wymaga auth) | | `/wyloguj-sie` | GET | Wylogowanie | ### Notatnik (wymaga zalogowania) | URL | Metoda | Akcja | |-----|--------|-------| | `/notatnik` | GET | Lista wszystkich notatek | | `/notatnik/nowa` | GET | Formularz nowej notatki | | `/notatnik/dodaj` | POST | Zapisanie nowej notatki | | `/notatnik/edytuj/{id}` | GET | Formularz edycji | | `/notatnik/zapisz/{id}` | POST | Zapisanie zmian | | `/notatnik/usun/{id}` | POST | Usunięcie notatki | ### Kalendarz (wymaga zalogowania) | URL | Metoda | Akcja | |-----|--------|-------| | `/kalendarz` | GET | Widok kalendarza miesięcznego | | `/kalendarz?rok=2024&miesiac=12` | GET | Kalendarz dla konkretnego miesiąca | | `/kalendarz/dzien/{YYYY-MM-DD}` | GET | Lista wydarzeń danego dnia | | `/kalendarz/nowe` | GET | Formularz nowego wydarzenia | | `/kalendarz/nowe/{YYYY-MM-DD}` | GET | Formularz z predefiniowaną datą | | `/kalendarz/dodaj` | POST | Zapisanie nowego wydarzenia | | `/kalendarz/edytuj/{id}` | GET | Formularz edycji wydarzenia | | `/kalendarz/zapisz/{id}` | POST | Zapisanie zmian | | `/kalendarz/usun/{id}` | POST | Usunięcie wydarzenia | --- ## Baza danych (SQLite) ### Tabela: users ```sql CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, login VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, -- password_hash() email VARCHAR(100), created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ### Tabela: verification_codes ```sql CREATE TABLE verification_codes ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, code VARCHAR(6) NOT NULL, expires_at DATETIME NOT NULL, -- +10 minut created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), UNIQUE(user_id) ); ``` ### Tabela: notes (auto-tworzona przy pierwszym użyciu) ```sql CREATE TABLE notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, title VARCHAR(255) NOT NULL, content TEXT, color VARCHAR(20) DEFAULT 'primary', -- primary/success/danger/warning/info/secondary created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); ``` ### Tabela: events (auto-tworzona przy pierwszym użyciu) ```sql CREATE TABLE events ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, title VARCHAR(255) NOT NULL, content TEXT, event_date DATE NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); ``` --- ## Dane testowe - **Login:** `projectpro` - **Hasło:** `testowehaslo` - **Inicjalizacja:** wywołać `/init.php` --- ## Funkcjonalności ### Zrealizowane ✅ 1. **Logowanie dwuskładnikowe (2FA)** - Formularz login/hasło - Generowanie 6-cyfrowego kodu - Symulacja wysyłki email (kod wyświetlany na stronie) - Weryfikacja kodu z czasem wygaśnięcia (10 min) - Sesje PHP 2. **Panel użytkownika (Pulpit)** - Powitanie użytkownika - Statystyki (status 2FA, liczba notatek, wydarzenia tego tygodnia, sesja) - Szybkie akcje (nowa notatka, nowe wydarzenie, kalendarz) - Lista nadchodzących wydarzeń z tego tygodnia - Informacje o logowaniu 3. **Notatnik** - Lista notatek jako kolorowe karty - Dodawanie notatek (tytuł, treść, kolor) - Edycja notatek - Usuwanie z potwierdzeniem (modal Bootstrap) - 6 kolorów do wyboru - Auto-migracja tabeli 4. **Kalendarz** - Widok miesięczny z nawigacją (poprzedni/następny miesiąc) - Podgląd wydarzeń na poszczególnych dniach - Kliknięcie w dzień otwiera listę wydarzeń - Dodawanie wydarzeń (tytuł, treść, data) - Edycja wydarzeń - Usuwanie z potwierdzeniem (modal Bootstrap) - Wyróżnienie dzisiejszego dnia - Wyróżnienie dni z wydarzeniami - Szybkie dodawanie z predefiniowaną datą - Auto-migracja tabeli 5. **Menu nawigacyjne** - Pulpit / Notatnik / Kalendarz - Dropdown z użytkownikiem - Wylogowanie - Aktywna pozycja menu podświetlona 6. **Wygląd** - Bootstrap 5.3 + Bootstrap Icons - Gradient fioletowy jako tło - Karty z cieniami i zaokrągleniami - Responsywność (mobile-friendly) - Animacje hover --- ## Wymagania serwera - PHP 8.0+ - Rozszerzenie PDO SQLite - Apache z mod_rewrite - Uprawnienia do zapisu w katalogu `database/` --- ## Sesje PHP Używane klucze sesji: - `user_id` - ID zalogowanego użytkownika - `user_login` - Login użytkownika - `logged_in` - Flaga pełnej autoryzacji (po 2FA) - `pending_user_id` - ID podczas weryfikacji 2FA - `pending_user_login` - Login podczas weryfikacji 2FA - `simulated_code` - Kod 2FA (tylko do testów!) - `error` - Komunikat błędu (flash message) - `success` - Komunikat sukcesu (flash message) --- ## Bezpieczeństwo - Hasła hashowane przez `password_hash()` / `password_verify()` - Prepared statements (PDO) - ochrona przed SQL injection - `htmlspecialchars()` - ochrona przed XSS - Kody 2FA z czasem wygaśnięcia - Usuwanie kodów po użyciu - Sprawdzanie właściciela notatki/wydarzenia przy każdej operacji --- ## Do zrobienia w przyszłości (pomysły) - [ ] Prawdziwa wysyłka emaili (PHPMailer / SMTP) - [ ] Rejestracja nowych użytkowników - [ ] Przypomnienie hasła - [ ] Wyszukiwanie notatek - [ ] Kategorie/tagi dla notatek - [ ] Eksport notatek (PDF/TXT) - [ ] Limit prób logowania (brute-force protection) - [ ] Zapamiętaj mnie (persistent login) - [ ] Logi aktywności użytkownika - [ ] Tryb ciemny (dark mode) - [ ] API REST dla notatek i wydarzeń - [ ] Przypomnienia o wydarzeniach - [ ] Powtarzające się wydarzenia (cykliczne) - [ ] Widok tygodniowy/dzienny kalendarza - [ ] Drag & drop dla wydarzeń - [ ] Eksport kalendarza (iCal) --- ## Historia zmian ### v1.0 (początkowa wersja) - System logowania z 2FA - Baza SQLite z użytkownikiem testowym - Widoki: logowanie, weryfikacja, dashboard - Bootstrap 5.3 + gradient design ### v1.1 (przyjazne linki) - Routing przez .htaccess (mod_rewrite) - Przeniesienie do katalogu głównego (bez /public/) - SEO-friendly URLs (/logowanie, /panel, etc.) ### v1.2 (notatnik) - Menu nawigacyjne (Pulpit, Notatnik) - Pełny CRUD notatek - Kolorowe karty z podglądem - Modal potwierdzenia usunięcia - Statystyki na pulpicie - Auto-migracja tabeli notes ### v1.3 (kalendarz) - Nowa pozycja menu: Kalendarz - Widok kalendarza miesięcznego z nawigacją - Widok dnia z listą wydarzeń - Pełny CRUD wydarzeń (tytuł, treść, data) - Podgląd wydarzeń bezpośrednio w kalendarzu - Wyróżnienie dzisiejszego dnia i dni z wydarzeniami - Statystyki wydarzeń na pulpicie (ten tydzień) - Lista nadchodzących wydarzeń na pulpicie - Szybkie akcje: nowe wydarzenie, otwórz kalendarz - Auto-migracja tabeli events --- ## Notatki dla Claude 1. **Layout** - funkcja `renderLayout()` przyjmuje parametry: - `$title` - tytuł strony - `$content` - zawartość - `$showMenu` - czy pokazać menu (domyślnie false) - `$activeMenu` - która pozycja menu jest aktywna ('pulpit'/'notatnik'/'kalendarz') - `$containerSize` - klasa Bootstrap dla kontenera (domyślnie 'col-md-5') 2. **Modele z auto-migracją** - metoda `ensureTable()` w Note i Event automatycznie tworzy tabelę jeśli nie istnieje 3. **Flash messages** - komunikaty błędów/sukcesu przez sesję, czyszczone po wyświetleniu 4. **Routing** - w `index.php` używany `switch(true)` z `preg_match` dla dynamicznych URL 5. **Kolory notatek** - dostępne: primary, success, danger, warning, info, secondary 6. **Kalendarz - parametry URL:** - `rok` - rok (YYYY) - `miesiac` - miesiąc (1-12) - Format daty w URL: `YYYY-MM-DD` 7. **Event::countThisWeek()** - zlicza wydarzenia od poniedziałku do niedzieli bieżącego tygodnia 8. **Event::getThisWeek()** - pobiera listę wydarzeń z bieżącego tygodnia (dla pulpitu)