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

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)