10 KiB
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 ✅
-
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
-
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
-
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
-
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
-
Menu nawigacyjne
- Pulpit / Notatnik / Kalendarz
- Dropdown z użytkownikiem
- Wylogowanie
- Aktywna pozycja menu podświetlona
-
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żytkownikauser_login- Login użytkownikalogged_in- Flaga pełnej autoryzacji (po 2FA)pending_user_id- ID podczas weryfikacji 2FApending_user_login- Login podczas weryfikacji 2FAsimulated_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
-
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')
-
Modele z auto-migracją - metoda
ensureTable()w Note i Event automatycznie tworzy tabelę jeśli nie istnieje -
Flash messages - komunikaty błędów/sukcesu przez sesję, czyszczone po wyświetleniu
-
Routing - w
index.phpużywanyswitch(true)zpreg_matchdla dynamicznych URL -
Kolory notatek - dostępne: primary, success, danger, warning, info, secondary
-
Kalendarz - parametry URL:
rok- rok (YYYY)miesiac- miesiąc (1-12)- Format daty w URL:
YYYY-MM-DD
-
Event::countThisWeek() - zlicza wydarzenia od poniedziałku do niedzieli bieżącego tygodnia
-
Event::getThisWeek() - pobiera listę wydarzeń z bieżącego tygodnia (dla pulpitu)