---
sort: 6
---

# **Το τελικό project & επόμενα βήματα**

## **Κεφάλαιο 1: Final Project - Weather App (Εφαρμογή Καιρού)**

**Ο Στόχος:** Να φτιάξουμε μια μικρή, αλλά πλήρως λειτουργική web εφαρμογή από το μηδέν. Η εφαρμογή θα επιτρέπει στον χρήστη να εισάγει το όνομα μιας πόλης και θα εμφανίζει τον τρέχοντα καιρό για αυτή την πόλη, αντλώντας δεδομένα σε πραγματικό χρόνο από ένα δωρεάν API καιρού.

**Γιατί αυτό το Project;**
*   Συνδυάζει **HTML** για τη δομή, **CSS** για το styling και το responsive design.
*   Χρησιμοποιεί **JavaScript DOM Manipulation** για να εμφανίσει τα δεδομένα.
*   Βασίζεται σε **Events** (υποβολή φόρμας).
*   Εφαρμόζει **Asynchronous JavaScript** με `async/await` για να καλέσει ένα εξωτερικό API.
*   Είναι ένα εντυπωσιακό και πρακτικό κομμάτι για το portfolio σου.

**Προετοιμασία:**
1.  **Δημιουργία Νέου Project:** Δημιούργησε έναν νέο φάκελο, π.χ., `weather-app`. Μέσα σε αυτόν, δημιούργησε τα αρχεία `index.html`, `style.css`, και `script.js`.
2.  **`git init`**: Κάνε τον νέο φάκελο ένα Git repository από την αρχή!
3.  **API Key:** Θα χρησιμοποιήσουμε το API του [OpenWeatherMap](https://openweathermap.org/api).
    *   Κάνε μια δωρεάν εγγραφή στον ιστότοπο.
    *   Πήγαινε στο προφίλ σου, στην καρτέλα "API keys".
    *   Θα δεις ένα κλειδί (ένα μακρύ αλφαριθμητικό). Αντέγραψέ το. **Αυτό το κλειδί είναι μυστικό!** Δεν το ανεβάζουμε ποτέ δημόσια στο GitHub.

---

**Βήμα-βήμα η κατασκευή**

**1. Η δομή (HTML - `index.html`)**
```html
<!DOCTYPE html>
<html lang="el">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Εφαρμογή Καιρού</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="app-container">
        <h1>Ο Καιρός Σήμερα</h1>
        <form id="city-form">
            <input type="text" id="city-input" placeholder="Εισάγετε πόλη..." required>
            <button type="submit">Αναζήτηση</button>
        </form>

        <div id="weather-info" class="hidden">
            <h2 id="city-name"></h2>
            <p id="weather-description"></p>
            <p id="temperature"></p>
            <img id="weather-icon" src="" alt="Weather icon">
        </div>
    </div>
    <script src="script.js"></script>
</body>
</html>
```

**2. Η εμφάνιση (CSS - `style.css`)**
*Σημείωση: Παρακάτω δίνεται ένα βασικό styling. Ενθαρρύνεται η πλήρης δημιουργικότητα!*
```css
/* ... Βασικά resets και στυλ για το body ... */
.app-container { max-width: 500px; margin: 50px auto; padding: 20px; background: #f0f8ff; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); text-align: center; }
form { display: flex; margin-bottom: 20px; }
input { flex-grow: 1; padding: 10px; border: 1px solid #ccc; border-radius: 4px 0 0 4px; }
button { padding: 10px; border: none; background: #007bff; color: white; border-radius: 0 4px 4px 0; cursor: pointer; }
#weather-info h2 { margin-bottom: 5px; }
#weather-info p { margin: 5px 0; }
.hidden { display: none; }
```

**3. Η λογική (JavaScript - `script.js`)**
```javascript
// ΣΗΜΑΝΤΙΚΟ: Βάλε εδώ το δικό σου API Key
const apiKey = 'YOUR_SECRET_API_KEY'; 

const cityForm = document.getElementById('city-form');
const cityInput = document.getElementById('city-input');
const weatherInfoDiv = document.getElementById('weather-info');

cityForm.addEventListener('submit', async (event) => {
    event.preventDefault();
    const city = cityInput.value.trim();
    if (!city) return;

    const apiUrl = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric&lang=el`;

    try {
        const response = await fetch(apiUrl);
        if (!response.ok) {
            throw new Error('Η πόλη δεν βρέθηκε.');
        }
        const data = await response.json();
        displayWeatherData(data);

    } catch (error) {
        alert(error.message);
        weatherInfoDiv.classList.add('hidden');
    }
});

function displayWeatherData(data) {
    const { name, weather, main } = data;
    const description = weather[0].description;
    const temp = main.temp;
    const iconCode = weather[0].icon;

    document.getElementById('city-name').textContent = name;
    document.getElementById('weather-description').textContent = description.charAt(0).toUpperCase() + description.slice(1);
    document.getElementById('temperature').textContent = `Θερμοκρασία: ${temp.toFixed(1)}°C`;
    document.getElementById('weather-icon').src = `https://openweathermap.org/img/wn/${iconCode}@2x.png`;
    document.getElementById('weather-icon').alt = description;
    
    weatherInfoDiv.classList.remove('hidden');
}
```

**Βήμα-βήμα η Λειτουργία του JS:**
1.  Αποθηκεύουμε το API key.
2.  Επιλέγουμε τα απαραίτητα στοιχεία από το DOM.
3.  Βάζουμε έναν `event listener` στη φόρμα για το event `'submit'`.
4.  Μέσα στον listener, η συνάρτηση είναι `async`. Ακυρώνουμε την ανανέωση, παίρνουμε την τιμή της πόλης.
5.  Κατασκευάζουμε το `apiUrl` με τη σωστή πόλη, το key, και παραμέτρους για μετρικό σύστημα (`units=metric`) και ελληνικά (`lang=el`).
6.  Χρησιμοποιούμε `fetch` με `try...catch` για να χειριστούμε πιθανά σφάλματα (π.χ., η πόλη δεν βρέθηκε).
7.  Αν η απάντηση είναι επιτυχής (`response.ok`), τη μετατρέπουμε σε `json`.
8.  Καλούμε μια βοηθητική συνάρτηση `displayWeatherData`, περνώντας της τα δεδομένα.
9.  Αυτή η συνάρτηση απλά "γεμίζει" τα HTML στοιχεία μας με τις πληροφορίες από το API και αφαιρεί την κλάση `hidden` για να τα εμφανίσει.

---

## **Κεφάλαιο 2: Deployment (Ανεβάζοντας το Project σου Online)**

Έχεις ένα τέλειο project στον υπολογιστή σου. Τώρα πρέπει να το δει ο κόσμος!

Η διαδικασία του deployment για στατικές σελίδες (HTML, CSS, JS) έχει γίνει απίστευτα εύκολη.
**Η πιο εύκολη μέθοδος: GitHub Pages**
1.  Βεβαιώσου ότι όλος σου ο κώδικας είναι ανεβασμένος (pushed) σε ένα **δημόσιο (public)** repository στο GitHub.
2.  Στη σελίδα του repository στο GitHub, πήγαινε `Settings` -> `Pages`.
3.  Στην ενότητα "Branch", επίλεξε το branch σου (συνήθως το `main`) και πάτα `Save`.
4.  Περίμενε λίγα λεπτά. Το GitHub θα "χτίσει" τη σελίδα σου και θα σου δώσει ένα URL της μορφής `https://your-username.github.io/your-repository-name/`.

**Άλλες εξαιρετικές, δωρεάν πλατφόρμες:**
*   **Netlify** & **Vercel**: Είναι πανίσχυρες, επαγγελματικές πλατφόρμες. Η διαδικασία είναι παρόμοια: συνδέεσαι με τον λογαριασμό σου στο GitHub, επιλέγεις το repository και αυτές αυτόματα το ανεβάζουν. Κάθε φορά που κάνεις `git push` στο GitHub, η Netlify/Vercel αυτόματα ανανεώνει το live site σου!

---

## **Κεφάλαιο 3: Τι ακολουθεί; Ο δρόμος μπροστά**

Συγχαρητήρια! Ολοκλήρωσες αυτό το course. Έχεις πλέον τις θεμελιώδεις γνώσεις ενός Front-End Developer. Το ταξίδι όμως δεν σταματάει εδώ. Ο κόσμος του web development είναι τεράστιος. Να μερικές κατευθύνσεις:

*   **Βάθυνε στις βασικές γνώσεις:** Ποτέ μη σταματάς να εξασκείσαι σε HTML, CSS και (ειδικά) JavaScript. Υπάρχουν πάντα πιο προχωρημένα θέματα να μάθεις.
*   **JavaScript Frameworks/Libraries:** Για μεγάλες, πολύπλοκες εφαρμογές, δεν γράφουμε τα πάντα από την αρχή. Χρησιμοποιούμε εργαλεία. Τα πιο δημοφιλή είναι:
    *   **React:** Η πιο δημοφιλής βιβλιοθήκη, αναπτύχθηκε από το Facebook.
    *   **Angular:** Ένα πλήρες framework, αναπτύχθηκε από την Google.
    *   **Vue.js:** Ένα προοδευτικό framework, γνωστό για την ευκολία εκμάθησής του.
*   **CSS Preprocessors/Frameworks:**
    *   **SASS/SCSS:** Γράψε CSS με μεταβλητές, συναρτήσεις και ένθετους κανόνες.
    *   **Tailwind CSS:** Μια εντελώς διαφορετική, "utility-first" προσέγγιση στο styling.
*   **Back-End Development:** Αν σου άρεσε η λογική της JavaScript και η επικοινωνία με servers, ίσως θέλεις να μάθεις πώς να φτιάχνεις εσύ ο ίδιος τα APIs.
    *   **Node.js & Express:** Σου επιτρέπει να γράφεις back-end κώδικα χρησιμοποιώντας... JavaScript!
    *   **Python (Django/Flask), PHP (Laravel), Ruby (Rails):** Άλλες δημοφιλείς γλώσσες και frameworks για το back-end.
*   **Databases (Βάσεις Δεδομένων):** Μάθε πώς να αποθηκεύεις μόνιμα τα δεδομένα σου (SQL, NoSQL).

Το πιο σημαντικό είναι να **συνεχίσεις να χτίζεις**. Πάρε ιδέες για μικρά projects και φτιάχ' τα. Κάθε project που ολοκληρώνεις, σε κάνει καλύτερο προγραμματιστή.

**Καλή επιτυχία στο ταξίδι σου στον κόσμο του web programming!**
