Aplikacja webowa do współdzielenia katalogu „skilli" (promptów/instrukcji AI). Użytkownicy przeglądają publiczny katalog, tworzą własne skille, oznaczają ulubione, a administrator zarządza użytkownikami i całym katalogiem.
Projekt zaliczeniowy z przedmiotu Wstęp do aplikacji internetowych (WDPAI) — autorski MVC w PHP, bez frameworka i gotowych szablonów.
- Docker / docker-compose — uruchomienie całości
- PostgreSQL (PDO, prepared statements) — baza danych
- PHP 8.3 obiektowy — własny MVC (front controller + routing + kontrolery + repozytoria)
- HTML5 / CSS (responsywne, media queries)
- JavaScript (Fetch API) — komunikacja frontu z REST API
- nginx + php-fpm + pgAdmin
Przeglądarka (HTML/CSS + JS Fetch API)
│ HTTP
▼
index.php ── front controller
│
Routing.php ── tabela tras + trasy regex (np. /skills/{id}) + 404
│
src/controllers/ ── AppController (render/json/redirect/abort, auth, role)
│ SecurityController, SkillsController,
│ FavoritesController, AdminController, ErrorController
▼
src/repositories/ ── Repository (PDO, transakcje) + UsersRepository,
│ SkillsRepository, FavoritesRepository
▼
Database.php (PDO) ──► PostgreSQL
- Widoki:
public/views/*.html+partials/(renderowane przezAppController::render()). - Statyki:
public/styles/main.css,public/scripts/main.js. - Konfiguracja:
config.phpczyta zmienneDB_*ze środowiska.
Wymagany Docker + docker-compose.
cp .env.example .env # opcjonalnie — domyślne wartości i tak działają
docker-compose up --buildPo starcie:
| Usługa | URL / port |
|---|---|
| Aplikacja | http://localhost:8080 |
| PostgreSQL | localhost:5433 (user/pass: docker/docker, baza: db) |
| pgAdmin | http://localhost:5050 (admin@example.com / admin) |
Schemat (docker/db/init/init.sql) i dane przykładowe (docker/db/init/seed.sql) ładują się
automatycznie przy pierwszym starcie kontenera bazy.
DB_HOST=db
DB_NAME=db
DB_USER=docker
DB_PASSWORD=docker
Hasło dla wszystkich kont: password
| Rola | |
|---|---|
| admin@skillhub.local | admin, user |
| ada@skillhub.local | user |
| linus@skillhub.local | user |
(dodatkowe konta user w seed.sql: grace, alan, margaret, donald, …)
- Rejestracja, logowanie, utrzymanie sesji, wylogowanie.
- Role i uprawnienia weryfikowane w trakcie działania (
requireRole('admin'), kontrola właściciela zasobu wSkillsController). - Zarządzanie użytkownikami (panel admina).
- Wybrana funkcjonalność: katalog skilli — CRUD skilli + tagi + ulubione (N:M), publiczny
katalog tylko ze statusem
active. - REST API konsumowane przez Fetch API (
/api/skills*,/api/favorites). - Globalne strony błędów 400 / 403 / 404 / 500.
- Relacje: 1:1 (
users–user_profiles), 1:N (users–skills), N:M (user_roles,skill_tags,favorites). - Widoki:
public_skill_catalog,user_skill_stats(złączenia wielu tabel). - Trigger:
set_updated_at(BEFORE UPDATE nausers,user_profiles,skills). - Funkcje:
set_updated_at(),skill_favorite_count(id). - Transakcje: w repozytoriach na poziomach izolacji
READ COMMITTED/REPEATABLE READ. - FK + akcje:
ON DELETE CASCADE, zapytania zJOIN. Schemat w 3NF, bez redundancji.
Eksport pełnej bazy: database_dump.sql — pg_dump żywej bazy
(schemat: tabele, widoki, funkcje, triggery, klucze obce + komplet danych przykładowych).
Odtworzenie:
docker compose exec -T db psql -U docker -d db < database_dump.sqlDiagram ERD:
Źródło diagramu: docs/ERD.drawio (otwórz na draw.io).
Testy logiki serwisowej (SkillNormalizer — normalizacja statusów i tagów) w katalogu tests/.
PHP dostępny jest w kontenerze php, więc testy uruchamiamy w nim:
# pobierz runner (jednorazowo)
curl -L https://phar.phpunit.de/phpunit-11.phar -o phpunit.phar
# uruchom testy w kontenerze
docker compose exec -w /app php php phpunit.phar -c phpunit.xml --testdoxAlternatywnie, gdy masz lokalnie Composer/PHP: composer install && composer test.
Plik requests.http — przykładowe requesty do backendu (REST Client w VS Code
lub IntelliJ HTTP Client). Pokrywa auth, CRUD skilli, ulubione, panel admina i błędy 401/403/404.
- Rejestracja —
/register, podaj email + hasło + imię → automatyczne zalogowanie, redirect na/skills. - Wylogowanie —
/logout→ redirect na/login. - Logowanie —
/loginjakoada@skillhub.local/password. - Przeglądanie katalogu —
/skillsładuje skille przez Fetch (GET /api/skills). - CRUD skilla — utwórz skill (
/skills/create), edytuj (/skills/{id}/edit), usuń (/skills/{id}/delete). - Uprawnienia (403) — zalogowany jako
adaspróbuj wejść na/admin/users→ strona 403. Spróbuj edytować cudzy skill → 403. - Brak auth (401) — bez sesji wywołaj
POST /api/skills/create→ 401. - Admin — zaloguj jako
admin@skillhub.local, wejdź na/admin/usersi/admin/skills. - Ulubione (N:M) —
POST /api/skills/{id}/favoritetoggle, sprawdź/favorites. - Błąd 404 — wejdź na nieistniejącą ścieżkę → strona 404.
index.php front controller
Routing.php tablica tras + trasy regex
Database.php fabryka PDO
config.php konfiguracja z ENV
docker-compose.yaml nginx + php-fpm + postgres + pgadmin
docker/ Dockerfile'y + init/ (init.sql, seed.sql)
src/controllers/ kontrolery (AppController + reszta)
src/repositories/ repozytoria (Repository + reszta)
public/views/ widoki HTML + partiale + strony błędów
public/styles/ CSS
public/scripts/ JS (Fetch API)
requests.http przykładowe requesty HTTP
- Docker + docker-compose (nginx + php-fpm + PostgreSQL + pgAdmin)
- Repozytorium GIT (publiczne, historia commitów)
- HTML5 / CSS / JavaScript (Fetch API)
- PHP obiektowy, autorski MVC — bez frameworka i gotowych szablonów
- Baza danych PostgreSQL (PDO + prepared statements)
- Architektura warstwowa zapewniająca bezpieczeństwo (front controller → routing → kontrolery → repozytoria → PDO)
- Filary obiektowości + SOLID, brak duplikacji kodu (serwis
SkillNormalizer)
- Estetyczny interfejs graficzny
- Responsywność — CSS media queries (
public/styles/main.css)
- Rejestracja i logowanie
- Utrzymanie sesji
- Uprawnienia użytkowników weryfikowane w trakcie działania (
requireRole, kontrola właściciela zasobu) - Zarządzanie użytkownikami (panel admina)
- Wylogowanie
- Wybrana funkcjonalność: katalog skilli (CRUD + tagi + ulubione)
- Relacja 1:1 (
users–user_profiles) - Relacja 1:N (
users–skills) - Relacja N:M (
user_roles,skill_tags,favorites) - Min. 2 widoki ze złączeniami (
public_skill_catalog,user_skill_stats) - Min. 1 wyzwalacz (
*_updated_atBEFORE UPDATE) - Min. 1 funkcja (
set_updated_at(),skill_favorite_count()) - Transakcje na poziomach izolacji (
READ COMMITTED/REPEATABLE READ) - Akcje na FK (
ON DELETE CASCADE) + zapytania z JOIN - 3 postacie normalne, bez redundancji i anomalii
- Odpowiednie typy danych
- Pełny eksport bazy z danymi (
database_dump.sql)
- README.md
- Diagram ERD (
ERD.png) + link do źródła (docs/ERD.drawio) - Diagram architektury / warstw (
docs/architecture.svg) - Instrukcja uruchomienia (
docker-compose up) +.env.example - Scenariusz testowy krok po kroku
- Screeny aplikacji (web + mobile) (
screens/) - Checklista
- Testy jednostkowe PHPUnit (
tests/SkillNormalizerTest.php) - Testy integracyjne endpointów (
requests.http) - Globalne strony błędów 400 / 403 / 404 / 500







