316 lines
10 KiB
Markdown
316 lines
10 KiB
Markdown
# 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)
|