Files
cmspro.it/PROJEKT.md
2026-01-29 21:07:02 +01:00

10 KiB

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

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

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)

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)

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)