- HTML 33.6%
- PHP 28.5%
- JavaScript 23%
- CSS 14.9%
| .idea | ||
| .gitignore_example_zmien_nazwe | ||
| config.example.php | ||
| config.php | ||
| index.html | ||
| QUICK_START.txt | ||
| README.md | ||
| script.js | ||
| send-to-discord.php | ||
| style.css | ||
Portfolio Studenta - Tutorial Kompletny
Spis treści
- Wprowadzenie
- Struktura projektu
- Technologie użyte
- Jak działa bezpieczeństwo webhooka
- Konfiguracja Discord Webhook
- Instalacja lokalna
- Wdrożenie na hosting
- Szczegółowy opis plików
- Personalizacja strony
- Rozwiązywanie problemów
- Bezpieczeństwo
- Dalszy rozwój
Wprowadzenie
Ten projekt to prosta, responsywna strona portfolio stworzona z myślą o studentach rozpoczynających przygodę z tworzeniem stron internetowych. Strona wykorzystuje Bootstrap do stylizacji i zawiera w pełni funkcjonalny formularz kontaktowy, który wysyła wiadomości na serwer Discord poprzez webhook.
Kluczowe cechy projektu:
- Responsywny design działający na wszystkich urządzeniach
- Czysty, dobrze skomentowany kod dla celów edukacyjnych
- Bezpieczna implementacja formularza kontaktowego
- Integracja z Discord przez webhook
- Ochrona wrażliwych danych (URL webhooka)
- Walidacja danych po stronie klienta i serwera
- Zgodność z najlepszymi praktykami web development
Struktura projektu
portfolio-student/
│
├── index.html # Główna strona portfolio
├── style.css # Niestandardowe style CSS
├── script.js # Logika JavaScript (walidacja i wysyłanie formularza)
├── send-to-discord.php # Backend PHP obsługujący webhook
├── config.php # Plik konfiguracyjny z URL webhooka (WRAŻLIWY)
├── config.example.php # Przykładowy plik konfiguracyjny
├── .gitignore # Lista plików ignorowanych przez Git - na razie ma nazwę zmienioną - abym mógł Wam wszystkie pliki wysłać.
└── README.md # Ten plik - dokumentacja projektu
Technologie użyte
Frontend (Widoczna część strony)
- HTML5 - Struktura semantyczna strony
- CSS3 - Stylizacja i animacje
- Bootstrap 5.3 - Framework CSS do responsywnego designu
- Bootstrap Icons - Biblioteka ikon
- JavaScript (ES6+) - Interaktywność i komunikacja z backendem
Backend (Serwer)
- PHP 7.4+ - Język programowania po stronie serwera
- cURL - Biblioteka do wysyłania żądań HTTP
Usługi zewnętrzne
- Discord Webhook API - Odbieranie wiadomości z formularza
Jak działa bezpieczeństwo webhooka
Problem
Gdybyśmy umieścili URL webhooka Discord bezpośrednio w kodzie JavaScript:
// BŁĄD! Każdy może zobaczyć ten kod w przeglądarce!
const webhookUrl = "https://discord.com/api/webhooks/123/abc";
To każdy użytkownik może:
- Otworzyć narzędzia deweloperskie przeglądarki (F12)
- Zobaczyć kod JavaScript
- Wykraść URL webhooka
- Wysyłać spam na Twój serwer Discord
Rozwiązanie
Implementujemy architekturę trzywarstwową:
[Przeglądarka] --> [Serwer PHP] --> [Discord]
(publiczna) (prywatny) (API)
Jak to działa krok po kroku:
- Użytkownik wypełnia formularz - JavaScript zbiera dane
- JavaScript wysyła dane do PHP - Bez URL webhooka!
- PHP waliduje dane - Sprawdza poprawność i bezpieczeństwo
- PHP wysyła do Discord - Używa webhooka przechowywanego w config.php
- Discord otrzymuje wiadomość - Wyświetla ją na serwerze
Kluczowe zabezpieczenia:
- URL webhooka przechowywany tylko w pliku
config.phpna serwerze - Plik
config.phpnie jest udostępniany w repozytorium Git (dzięki .gitignore - na tym etapie zmieniłem nazwę - wróćcie do niej) - Walidacja danych po stronie klienta (JavaScript) i serwera (PHP)
- Zabezpieczenie przed atakami XSS, SQL Injection
- Limit długości wiadomości
- Timeout połączeń
- Weryfikacja certyfikatów SSL
Konfiguracja Discord Webhook
Krok 1: Utworzenie webhooka na Discordzie
- Otwórz aplikację Discord (desktop lub web)
- Przejdź do swojego serwera Discord
- Kliknij prawym przyciskiem myszy na kanał, gdzie chcesz otrzymywać wiadomości
- Wybierz opcję "Edytuj kanał"
- W menu bocznym wybierz zakładkę "Integracje"
- Kliknij "Utwórz webhook" lub "Webhooki" a następnie "Nowy webhook"
- Nadaj webhookowi nazwę, np. "Portfolio Kontakt"
- Opcjonalnie: Dodaj avatar dla webhooka
- Kliknij "Kopiuj URL webhooka"
Krok 2: Zapisanie webhooka w projekcie
- Skopiuj plik
config.example.phpjakoconfig.php:
cp config.example.php config.php
-
Otwórz plik
config.phpw edytorze -
Zamień
TWOJ_WEBHOOK_ID/TWOJ_WEBHOOK_TOKENna skopiowany URL:
define('DISCORD_WEBHOOK_URL', 'https://discord.com/api/webhooks/1234567890/abcdefghijklmnop');
- Zapisz plik
Krok 3: Testowanie
Po skonfigurowaniu, wypełnij formularz kontaktowy na stronie i wyślij. Wiadomość powinna pojawić się na Twoim serwerze Discord.
Instalacja lokalna
Wymagania
- Serwer z obsługą PHP (XAMPP, WAMP, MAMP lub podobny)
- PHP w wersji 7.4 lub nowszej
- Rozszerzenie PHP cURL (zazwyczaj włączone domyślnie)
- Przeglądarka internetowa
Instrukcja krok po kroku
Opcja 1: Używając XAMPP (Windows/Mac/Linux)
-
Pobierz i zainstaluj XAMPP
- Pobierz ze strony: https://www.apachefriends.org
- Zainstaluj zgodnie z instrukcjami
-
Umieść projekt w odpowiednim folderze
Windows:
C:\xampp\htdocs\portfolio-student\Mac/Linux:
/Applications/XAMPP/htdocs/portfolio-student/ -
Uruchom XAMPP
- Uruchom XAMPP Control Panel
- Kliknij "Start" przy Apache
-
Skonfiguruj webhook
- Wykonaj kroki z sekcji "Konfiguracja Discord Webhook"
-
Otwórz stronę w przeglądarce
http://localhost/portfolio-student/
Opcja 2: Używając wbudowanego serwera PHP (Linux/Mac)
-
Otwórz terminal w folderze projektu
-
Uruchom serwer PHP
php -S localhost:8000 -
Otwórz stronę w przeglądarce
http://localhost:8000
Weryfikacja instalacji
Po otwarciu strony sprawdź:
- Czy strona się wyświetla poprawnie
- Czy wszystkie sekcje są widoczne
- Czy formularz kontaktowy jest dostępny
- Wyślij testową wiadomość i sprawdź Discord
Wdrożenie na hosting
Przygotowanie projektu
-
Upewnij się, że config.php jest poprawnie skonfigurowany
- URL webhooka Discord jest prawidłowy
- DEBUG_MODE ustawiony na
false
-
Zmień ALLOWED_ORIGIN na produkcji W pliku
config.php:define('ALLOWED_ORIGIN', 'https://twojadomena.pl');
Wymagania hostingu
Upewnij się, że Twój hosting obsługuje:
- PHP 7.4 lub nowszy
- Rozszerzenie cURL
- HTTPS (zalecane dla bezpieczeństwa)
Instrukcja wdrożenia
Metoda 1: FTP
-
Połącz się z hostingiem przez FTP
- Użyj klienta FTP (FileZilla, Cyberduck)
- Wpisz dane dostępowe od hostingu
-
Upload plików
- Prześlij wszystkie pliki projektu
- UWAGA: Plik
config.phpprześlij ręcznie, nie z repozytorium
-
Ustaw odpowiednie uprawnienia
- Pliki: 644 (rw-r--r--)
- Foldery: 755 (rwxr-xr-x)
Metoda 2: Git (jeśli hosting obsługuje)
-
Zainicjuj repozytorium
git init git add . git commit -m "Initial commit" -
Dodaj remote i wypchnij kod
git remote add origin <URL_REPOZYTORIUM> git push -u origin main -
Na serwerze wykonaj pull
git clone <URL_REPOZYTORIUM> -
Ręcznie stwórz plik config.php na serwerze
- NIE commituj go do repozytorium!
Weryfikacja na produkcji
- Otwórz stronę w przeglądarce
- Sprawdź certyfikat SSL (kłódka w pasku adresu)
- Przetestuj formularz kontaktowy
- Sprawdź logi serwera w przypadku błędów
Szczegółowy opis plików
index.html
Przeznaczenie: Główny plik HTML zawierający strukturę strony portfolio.
Kluczowe elementy:
-
Nawigacja (navbar)
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">- Fixed-top: Nawigacja przyklejona do góry podczas przewijania
- Responsive: Zamienia się w hamburger menu na małych ekranach
-
Sekcja Hero
<header id="home" class="hero-section">- Pełnoekranowy baner z imieniem i tytułem
- Call-to-action button do sekcji kontakt
-
Sekcja O mnie
<section id="about" class="py-5">- Krótkie przedstawienie studenta
- Placeholder na zdjęcie
- Linki do social media
-
Sekcja Umiejętności
- Grid kart Bootstrap (4 kolumny)
- Ikony reprezentujące umiejętności
- Responsywny układ
-
Sekcja Projekty
- Karty projektów z opisami
- Tagi technologii
- Linki do GitHub
-
Formularz Kontaktowy
<form id="contactForm" class="contact-form">- Pola: Imię, Email, Temat, Wiadomość
- Atrybuty required dla walidacji HTML5
- Alert do wyświetlania komunikatów
Zależności:
- Bootstrap CSS: Stylizacja komponentów
- Bootstrap Icons: Ikony
- style.css: Niestandardowe style
- script.js: Logika JavaScript
style.css
Przeznaczenie: Niestandardowe style CSS dopasowujące wygląd strony.
Struktura pliku:
-
Zmienne CSS
:root { --primary-color: #0d6efd; }- Centralne zarządzanie kolorami
- Łatwa zmiana motywu kolorystycznego
-
Globalne style
- Smooth scrolling dla płynnego przewijania
- Padding-top dla kompensacji fixed navbar
-
Sekcja Hero
.hero-section { background: linear-gradient(135deg, var(--dark-color) 0%, var(--primary-color) 100%); min-height: 100vh; }- Gradient tła
- Pełna wysokość ekranu (100vh)
- Animacja fadeInUp dla treści
-
Karty (Skills, Projects)
.skill-card:hover { transform: translateY(-5px); }- Efekt hover z podniesieniem karty
- Płynne przejścia (transition)
-
Responsywność
@media (max-width: 767px) { /* Style dla mobile */ }- Breakpointy Bootstrap
- Dostosowanie fontów i odstępów
Techniki CSS użyte w projekcie:
- Flexbox: Wyśrodkowanie elementów
- CSS Grid: Układy wielokolumnowe (przez Bootstrap)
- Transitions: Płynne animacje
- Media Queries: Responsywność
- CSS Variables: Zarządzanie wartościami
- Gradients: Kolorowe tła
- Box-shadow: Efekt głębi
script.js
Przeznaczenie: Obsługa interaktywności strony, walidacja i wysyłanie formularza.
Główne funkcje:
-
Event Listener DOMContentLoaded
document.addEventListener('DOMContentLoaded', function() {- Czeka na pełne załadowanie DOM
- Inicjalizuje wszystkie funkcje
-
showAlert(message, type)
function showAlert(message, type) { contactAlert.classList.add(`alert-${type}`); }- Wyświetla komunikaty sukcesu/błędu
- Auto-ukrywanie po 5 sekundach
- Responsywny design alertów
-
validateEmail(email)
function validateEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); }- Walidacja formatu email
- Wyrażenie regularne (regex)
- Zwraca true/false
-
setButtonLoading(loading)
- Zmienia stan przycisku podczas wysyłania
- Pokazuje spinner
- Dezaktywuje przycisk
-
Obsługa submit formularza
contactForm.addEventListener('submit', function(e) { e.preventDefault(); // Zatrzymuje domyślne działanieProces wysyłania:
1. Zatrzymanie domyślnego działania (e.preventDefault) 2. Walidacja danych po stronie klienta 3. Utworzenie obiektu FormData 4. Wysłanie do PHP przez fetch() 5. Parsowanie odpowiedzi JSON 6. Wyświetlenie komunikatu 7. Reset formularza przy sukcesie -
Smooth scrolling
document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); targetElement.scrollIntoView({ behavior: 'smooth' }); }); });- Płynne przewijanie do sekcji
- Obsługa linków wewnętrznych
-
Active link w nawigacji
- Podświetla aktywny link podczas przewijania
- Scroll event listener
- Obliczanie pozycji sekcji
Koncepcje JavaScript w projekcie:
- Event Listeners: Reagowanie na akcje użytkownika
- DOM Manipulation: Modyfikacja elementów strony
- Fetch API: Nowoczesne żądania HTTP
- Promises: Asynchroniczne operacje
- Arrow Functions: Nowoczesna składnia funkcji
- Template Literals: Łączenie stringów
- Destructuring: Wydobywanie wartości
- Spread Operator: Kopiowanie danych
send-to-discord.php
Przeznaczenie: Backend obsługujący wysyłanie wiadomości na Discord webhook.
Przepływ danych:
[JavaScript] --POST--> [PHP] --Walidacja--> [cURL] --HTTP POST--> [Discord]
Struktura kodu:
-
Konfiguracja nagłówków
header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: ' . ALLOWED_ORIGIN);- Content-Type: JSON dla komunikacji
- CORS: Zezwolenie na żądania cross-origin
- Preflight: Obsługa OPTIONS request
-
Sprawdzenie metody HTTP
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit(); }- Akceptuje tylko POST
- Zwraca błąd 405 dla innych metod
-
Funkcje walidacyjne
validateInput($data, $minLength, $maxLength)
- Usuwa białe znaki (trim)
- Sprawdza czy nie jest pusty
- Weryfikuje długość
validateEmail($email)
- Używa filter_var z filtrem FILTER_VALIDATE_EMAIL
- RFC 5322 compliant
sanitizeText($text)
- htmlspecialchars: Konwersja znaków specjalnych
- ENT_QUOTES: Chroni przed XSS
- UTF-8: Obsługa polskich znaków
-
Pobieranie i walidacja danych
$name = isset($_POST['name']) ? $_POST['name'] : '';- Bezpieczne pobieranie z $_POST
- Walidacja każdego pola
- Zwracanie błędów w formacie JSON
-
Tworzenie wiadomości Discord Embed
$embed = [ 'embeds' => [ [ 'title' => '📬 Nowa wiadomość', 'color' => hexdec('3498db'), 'fields' => [...] ] ] ];Struktura Embed:
- title: Tytuł wiadomości
- color: Kolor paska bocznego (hex -> decimal)
- fields: Tablica pól z danymi
- timestamp: Czas wysłania
- footer: Stopka wiadomości
-
Wysyłanie przez cURL
$ch = curl_init(DISCORD_WEBHOOK_URL); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($embed), CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_TIMEOUT => 10, CURLOPT_SSL_VERIFYPEER => true ]);Kluczowe opcje cURL:
- CURLOPT_RETURNTRANSFER: Zwróć wynik
- CURLOPT_POST: Metoda POST
- CURLOPT_POSTFIELDS: Dane do wysłania (JSON)
- CURLOPT_TIMEOUT: Max czas oczekiwania
- CURLOPT_SSL_VERIFYPEER: Weryfikacja certyfikatu
-
Obsługa odpowiedzi
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode === 204 || $httpCode === 200) { // Sukces }Kody odpowiedzi Discord:
- 200/204: Sukces
- 400: Błędne dane
- 401: Nieprawidłowy webhook
- 404: Webhook nie istnieje
- 429: Rate limit przekroczony
Zabezpieczenia w PHP:
- Walidacja po stronie serwera (nigdy nie ufaj klientowi)
- Sanityzacja danych wejściowych (XSS prevention)
- Limit długości wiadomości (spam prevention)
- Timeout połączeń (DoS prevention)
- Weryfikacja SSL (MITM prevention)
- Tryb debug tylko w development
config.php
Przeznaczenie: Przechowywanie wrażliwej konfiguracji.
Zawartość:
define('DISCORD_WEBHOOK_URL', 'https://discord.com/api/webhooks/...');
define('MAX_MESSAGE_LENGTH', 2000);
define('ALLOWED_ORIGIN', '*');
define('DEBUG_MODE', false);
Bezpieczeństwo:
-
Nie commituj do Git
- Dodany do .gitignore
- Tylko na lokalnym serwerze / produkcji
-
Uprawnienia pliku
- Ustaw 600 (rw-------)
- Tylko właściciel może czytać
-
Używaj zmiennych środowiskowych (zaawansowane)
define('DISCORD_WEBHOOK_URL', getenv('DISCORD_WEBHOOK'));
.gitignore
Przeznaczenie: Lista plików ignorowanych przez Git.
Kategorie:
-
Wrażliwe dane
- config.php (główny cel)
- Kopie zapasowe konfiguracji
-
Pliki systemowe
- .DS_Store (macOS)
- Thumbs.db (Windows)
-
IDE
- .vscode/, .idea/ (ustawienia edytorów)
-
Logi i cache
- *.log, cache/
Użycie:
- Automatycznie stosowany przez Git
git statusnie pokaże ignorowanych plikówgit add .pominie ignorowane pliki
Personalizacja strony
Zmiana danych osobowych
- Otwórz index.html
- Znajdź i zmień:
<!-- Imię i nazwisko -->
<h1 class="display-3 fw-bold mb-3">Jan Kowalski</h1>
<!-- Tytuł -->
<p class="lead mb-4">Student Informatyki | Przyszły Web Developer</p>
<!-- O mnie -->
<p class="lead">
Jestem studentem informatyki na Politechnice XYZ...
</p>
Dodanie własnego zdjęcia
Zamień placeholder na prawdziwe zdjęcie:
<!-- Przed -->
<div class="about-image-placeholder">
<i class="bi bi-person-circle"></i>
</div>
<!-- Po -->
<img src="images/moje-zdjecie.jpg" alt="Jan Kowalski" class="img-fluid rounded">
Zmiana kolorystyki
W pliku style.css:
:root {
--primary-color: #0d6efd; /* Niebieski - zmień na swój */
--secondary-color: #6c757d;
--dark-color: #212529;
}
Przykładowe schematy kolorów:
- Fioletowy:
#6f42c1 - Zielony:
#28a745 - Pomarańczowy:
#fd7e14 - Czerwony:
#dc3545
Dodanie własnych projektów
W sekcji Projekty w index.html:
<div class="col-md-6 col-lg-4">
<div class="card project-card h-100">
<div class="card-img-placeholder">
<i class="bi bi-TWOJA-IKONA"></i>
</div>
<div class="card-body">
<h5 class="card-title">Nazwa projektu</h5>
<p class="card-text">Opis projektu</p>
<div class="project-tags">
<span class="badge bg-primary">HTML</span>
<span class="badge bg-primary">CSS</span>
</div>
</div>
<div class="card-footer">
<a href="LINK_DO_GITHUB" class="btn btn-sm btn-outline-primary">
<i class="bi bi-github"></i> Kod źródłowy
</a>
</div>
</div>
</div>
Zmiana ikony umiejętności
Lista dostępnych ikon Bootstrap: https://icons.getbootstrap.com/
Przykład:
<i class="bi bi-filetype-py skill-icon"></i> <!-- Python -->
<i class="bi bi-database skill-icon"></i> <!-- Bazy danych -->
<i class="bi bi-braces skill-icon"></i> <!-- Programowanie -->
Rozwiązywanie problemów
Problem: Formularz nie wysyła wiadomości
Możliwe przyczyny i rozwiązania:
-
Błędny URL webhooka
- Sprawdź plik
config.php - Upewnij się, że URL jest poprawny
- Przetestuj webhook w Postman lub curl
- Sprawdź plik
-
PHP cURL nie jest włączony
Sprawdź:
<?php phpinfo(); ?>Szukaj sekcji "curl". Jeśli nie ma, włącz w
php.ini:extension=curl -
Błędy CORS
- W konsoli przeglądarki (F12) sprawdź błędy
- Upewnij się, że ALLOWED_ORIGIN jest poprawnie ustawiony
- Na localhost użyj '*'
-
Webhook został usunięty/wygasł
- Utwórz nowy webhook na Discord
- Zaktualizuj config.php
Problem: Strona nie wyświetla się poprawnie
-
Sprawdź konsolę przeglądarki (F12)
- Błędy JavaScript?
- Nie załadowane pliki CSS?
-
Sprawdź ścieżki do plików
<link rel="stylesheet" href="style.css"> <!-- Poprawna ścieżka? --> -
Wyczyść cache przeglądarki
- Ctrl + F5 (Windows)
- Cmd + Shift + R (Mac)
Problem: Wiadomość nie dociera na Discord
-
Włącz tryb debug w config.php
define('DEBUG_MODE', true); -
Sprawdź odpowiedź w konsoli przeglądarki
- Otwórz narzędzia deweloperskie (F12)
- Zakładka "Network"
- Znajdź żądanie do
send-to-discord.php - Sprawdź Response
-
Sprawdź logi serwera
- W XAMPP:
xampp/apache/logs/error.log - Na hostingu: Panel administracyjny
- W XAMPP:
-
Testuj webhook bezpośrednio
Użyj curl w terminalu:
curl -X POST \ -H "Content-Type: application/json" \ -d '{"content":"Test"}' \ https://discord.com/api/webhooks/TWOJ_WEBHOOK
Problem: Rate limit na Discord
Discord ma limity:
- 30 wiadomości na minutę na webhook
- 5 wiadomości na 2 sekundy
Rozwiązanie:
- Nie spamuj formularzem
- Dodaj cooldown w JavaScript
- Użyj queue na serwerze
Bezpieczeństwo
Najlepsze praktyki stosowane w projekcie
-
Walidacja po stronie klienta i serwera
- JavaScript: Szybka informacja zwrotna
- PHP: Właściwa ochrona
-
Sanityzacja danych
- htmlspecialchars() dla XSS
- trim() dla białych znaków
- Limity długości
-
Ochrona wrażliwych danych
- config.php w .gitignore
- Zmienne środowiskowe (advanced)
- HTTPS na produkcji
-
Zabezpieczenie przed spamem
- Limit długości wiadomości
- Walidacja formatów (email)
- Można dodać: CAPTCHA, rate limiting
-
Bezpieczne połączenie z Discord
- Weryfikacja SSL (CURLOPT_SSL_VERIFYPEER)
- Timeout połączeń
- Obsługa błędów
Dodatkowe zabezpieczenia (opcjonalne)
1. Honeypot (pułapka na boty)
Dodaj ukryte pole w formularzu:
<!-- Niewidoczne dla ludzi, widoczne dla botów -->
<input type="text" name="website" style="display:none" tabindex="-1" autocomplete="off">
W PHP:
if (!empty($_POST['website'])) {
// To bot! Odrzuć
exit();
}
2. Rate limiting
Ogranicz liczbę wiadomości z jednego IP:
session_start();
$now = time();
$limit = 60; // sekund
if (isset($_SESSION['last_submit']) && ($now - $_SESSION['last_submit']) < $limit) {
echo json_encode(['success' => false, 'message' => 'Wysyłaj wiadomości maksymalnie raz na minutę']);
exit();
}
$_SESSION['last_submit'] = $now;
3. Google reCAPTCHA
Dodaj reCAPTCHA do formularza:
- https://www.google.com/recaptcha/
- Dokumentacja integracji
Dalszy rozwój
Pomysły na rozbudowę projektu
-
Backend
- Zapisywanie wiadomości w bazie danych (MySQL)
- Panel administracyjny do przeglądania wiadomości
- System odpowiedzi na wiadomości
- Powiadomienia email dla admina
-
Frontend
- Dark mode / Light mode toggle
- Więcej animacji (AOS library)
- Galeria zdjęć z projektami
- Blog z artykułami
- Sekcja z CV do pobrania
-
Funkcjonalności
- Wielojęzyczność (i18n)
- Progressive Web App (PWA)
- Integracja z Google Analytics
- SEO optimization
- Mapa kontaktowa
-
Technologie do nauki
- React.js dla interaktywnych komponentów
- Node.js jako alternatywny backend
- MongoDB jako baza danych
- Docker do konteneryzacji
Sugerowane zasoby do nauki
HTML/CSS:
- MDN Web Docs: https://developer.mozilla.org
- CSS-Tricks: https://css-tricks.com
- W3Schools: https://www.w3schools.com
JavaScript:
- JavaScript.info: https://javascript.info
- freeCodeCamp: https://www.freecodecamp.org
- Eloquent JavaScript (książka): https://eloquentjavascript.net
PHP:
- PHP Manual: https://www.php.net/manual/en/
- PHP: The Right Way: https://phptherightway.com
- Laracasts: https://laracasts.com
Bootstrap:
- Oficjalna dokumentacja: https://getbootstrap.com/docs/
- Bootstrap examples: https://getbootstrap.com/docs/5.3/examples/
Git:
- Pro Git (książka): https://git-scm.com/book/en/v2
- GitHub Learning Lab: https://lab.github.com
Podsumowanie
Ten projekt to kompleksowy przykład prostej, ale profesjonalnej strony portfolio z funkcjonalnym formularzem kontaktowym. Zawiera wszystkie elementy niezbędne do nauki:
- Czysty, skomentowany kod
- Najlepsze praktyki bezpieczeństwa
- Responsywny design
- Integracja z zewnętrznym API
- Dokumentacja techniczna
Gratulacje ukończenia tego tutoriala. Teraz masz solidną podstawę do tworzenia własnych projektów webowych.
Powodzenia w dalszej nauce programowania!
Wersja: 1.0
Ostatnia aktualizacja: 2024
Licencja: MIT (użyj swobodnie w swoich projektach)