# Δημιουργία Εφαρμογής Τραπεζικής Μέρος 2: Δημιουργία Φόρμας Εισόδου και Εγγραφής
## Ερωτηματολόγιο Πριν το Μάθημα
[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/43)
Έχετε συμπληρώσει ποτέ μια φόρμα online και σας έχει απορρίψει τη μορφή του email σας; Ή έχετε χάσει όλες τις πληροφορίες σας όταν πατήσατε υποβολή; Όλοι έχουμε αντιμετωπίσει αυτές τις απογοητευτικές εμπειρίες.
Οι φόρμες είναι η γέφυρα μεταξύ των χρηστών σας και της λειτουργικότητας της εφαρμογής σας. Όπως τα προσεκτικά πρωτόκολλα που χρησιμοποιούν οι ελεγκτές εναέριας κυκλοφορίας για να καθοδηγήσουν τα αεροπλάνα με ασφάλεια στον προορισμό τους, οι καλά σχεδιασμένες φόρμες παρέχουν σαφή ανατροφοδότηση και αποτρέπουν δαπανηρά λάθη. Κακές φόρμες, από την άλλη, μπορούν να διώξουν τους χρήστες πιο γρήγορα από μια παρεξήγηση σε ένα πολυσύχναστο αεροδρόμιο.
Σε αυτό το μάθημα, θα μετατρέψουμε την στατική τραπεζική σας εφαρμογή σε μια διαδραστική εφαρμογή. Θα μάθετε να δημιουργείτε φόρμες που επικυρώνουν την εισαγωγή δεδομένων από τους χρήστες, επικοινωνούν με τους διακομιστές και παρέχουν χρήσιμη ανατροφοδότηση. Σκεφτείτε το σαν να δημιουργείτε τη διεπαφή ελέγχου που επιτρέπει στους χρήστες να πλοηγούνται στις λειτουργίες της εφαρμογής σας.
Στο τέλος, θα έχετε ένα πλήρες σύστημα εισόδου και εγγραφής με επικύρωση που καθοδηγεί τους χρήστες προς την επιτυχία αντί για την απογοήτευση.
## Προαπαιτούμενα
Πριν ξεκινήσουμε να δημιουργούμε φόρμες, ας βεβαιωθούμε ότι έχετε όλα όσα χρειάζονται. Αυτό το μάθημα συνεχίζει από εκεί που σταματήσαμε στο προηγούμενο, οπότε αν το παραλείψατε, ίσως θέλετε να επιστρέψετε και να εξασφαλίσετε ότι έχετε ρυθμίσει τα βασικά πρώτα.
### Απαιτούμενη Ρύθμιση
| Συστατικό | Κατάσταση | Περιγραφή |
|-----------|-----------|-----------|
| [HTML Templates](../1-template-route/README.md) | ✅ Απαιτείται | Η βασική δομή της τραπεζικής σας εφαρμογής |
| [Node.js](https://nodejs.org) | ✅ Απαιτείται | Περιβάλλον εκτέλεσης JavaScript για τον διακομιστή |
| [Bank API Server](../api/README.md) | ✅ Απαιτείται | Υπηρεσία backend για αποθήκευση δεδομένων |
> 💡 **Συμβουλή Ανάπτυξης**: Θα εκτελείτε δύο ξεχωριστούς διακομιστές ταυτόχρονα – έναν για την τραπεζική εφαρμογή στο front-end και έναν για το backend API. Αυτή η ρύθμιση αντικατοπτρίζει την πραγματική ανάπτυξη όπου οι υπηρεσίες του front-end και του backend λειτουργούν ανεξάρτητα.
### Ρύθμιση Διακομιστή
**Το περιβάλλον ανάπτυξής σας θα περιλαμβάνει:**
- **Διακομιστή front-end**: Εξυπηρετεί την τραπεζική σας εφαρμογή (συνήθως στη θύρα `3000`)
- **Διακομιστή API backend**: Χειρίζεται την αποθήκευση και την ανάκτηση δεδομένων (θύρα `5000`)
- **Και οι δύο διακομιστές** μπορούν να λειτουργούν ταυτόχρονα χωρίς συγκρούσεις
**Δοκιμή της σύνδεσης με το API:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Αν δείτε την απάντηση της έκδοσης του API, είστε έτοιμοι να προχωρήσετε!**
---
## Κατανόηση των Φορμών και των Ελέγχων HTML
Οι φόρμες HTML είναι ο τρόπος με τον οποίο οι χρήστες επικοινωνούν με την εφαρμογή σας. Σκεφτείτε τις σαν το σύστημα τηλεγράφου που συνέδεε απομακρυσμένα μέρη τον 19ο αιώνα – είναι το πρωτόκολλο επικοινωνίας μεταξύ της πρόθεσης του χρήστη και της απόκρισης της εφαρμογής. Όταν σχεδιάζονται προσεκτικά, εντοπίζουν λάθη, καθοδηγούν τη μορφοποίηση εισόδου και παρέχουν χρήσιμες προτάσεις.
Οι σύγχρονες φόρμες είναι σημαντικά πιο εξελιγμένες από τις βασικές εισόδους κειμένου. Το HTML5 εισήγαγε εξειδικευμένους τύπους εισόδου που χειρίζονται αυτόματα την επικύρωση email, τη μορφοποίηση αριθμών και την επιλογή ημερομηνίας. Αυτές οι βελτιώσεις ωφελούν τόσο την προσβασιμότητα όσο και την εμπειρία των χρηστών κινητών.
### Βασικά Στοιχεία Φόρμας
**Βασικά στοιχεία που χρειάζεται κάθε φόρμα:**
```html
```
**Τι κάνει αυτός ο κώδικας:**
- **Δημιουργεί** ένα κοντέινερ φόρμας με μοναδικό αναγνωριστικό
- **Καθορίζει** τη μέθοδο HTTP για την υποβολή δεδομένων
- **Συνδέει** ετικέτες με εισόδους για προσβασιμότητα
- **Ορίζει** ένα κουμπί υποβολής για την επεξεργασία της φόρμας
### Σύγχρονοι Τύποι Εισόδου και Ιδιότητες
| Τύπος Εισόδου | Σκοπός | Παράδειγμα Χρήσης |
|---------------|--------|-------------------|
| `text` | Γενική εισαγωγή κειμένου | `` |
| `email` | Επικύρωση email | `` |
| `password` | Κρυφή εισαγωγή κειμένου | `` |
| `number` | Εισαγωγή αριθμών | `` |
| `tel` | Τηλεφωνικοί αριθμοί | `` |
> 💡 **Πλεονέκτημα Σύγχρονου HTML5**: Η χρήση συγκεκριμένων τύπων εισόδου παρέχει αυτόματη επικύρωση, κατάλληλα πληκτρολόγια για κινητά και καλύτερη υποστήριξη προσβασιμότητας χωρίς επιπλέον JavaScript!
### Τύποι Κουμπιών και Συμπεριφορά
```html
```
**Τι κάνει κάθε τύπος κουμπιού:**
- **Κουμπιά υποβολής**: Ενεργοποιούν την υποβολή της φόρμας και στέλνουν δεδομένα στο καθορισμένο endpoint
- **Κουμπιά επαναφοράς**: Επαναφέρουν όλα τα πεδία της φόρμας στην αρχική τους κατάσταση
- **Κανονικά κουμπιά**: Δεν παρέχουν προεπιλεγμένη συμπεριφορά, απαιτώντας προσαρμοσμένη λειτουργικότητα με JavaScript
> ⚠️ **Σημαντική Σημείωση**: Το στοιχείο `` είναι αυτοκλειόμενο και δεν απαιτεί ετικέτα κλεισίματος. Η σύγχρονη βέλτιστη πρακτική είναι να γράφετε `` χωρίς την κάθετο.
### Δημιουργία Φόρμας Εισόδου
Ας δημιουργήσουμε τώρα μια πρακτική φόρμα εισόδου που δείχνει τις σύγχρονες πρακτικές HTML φόρμας. Θα ξεκινήσουμε με μια βασική δομή και θα την βελτιώσουμε σταδιακά με χαρακτηριστικά προσβασιμότητας και επικύρωσης.
```html
Bank App
Login
```
**Ανάλυση του τι συμβαίνει εδώ:**
- **Δομεί** τη φόρμα με σημασιολογικά στοιχεία HTML5
- **Ομαδοποιεί** σχετικά στοιχεία χρησιμοποιώντας κοντέινερ `div` με ουσιαστικές κλάσεις
- **Συνδέει** ετικέτες με εισόδους χρησιμοποιώντας τις ιδιότητες `for` και `id`
- **Περιλαμβάνει** σύγχρονες ιδιότητες όπως `autocomplete` και `placeholder` για καλύτερη εμπειρία χρήστη
- **Προσθέτει** `novalidate` για να χειριστεί την επικύρωση με JavaScript αντί για τις προεπιλογές του προγράμματος περιήγησης
### Η Δύναμη των Σωστών Ετικετών
**Γιατί οι ετικέτες είναι σημαντικές για τη σύγχρονη ανάπτυξη ιστού:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**Τι επιτυγχάνουν οι σωστές ετικέτες:**
- **Επιτρέπουν** στους αναγνώστες οθόνης να ανακοινώνουν τα πεδία της φόρμας με σαφήνεια
- **Επεκτείνουν** την περιοχή κλικ (κλικ στην ετικέτα εστιάζει στην είσοδο)
- **Βελτιώνουν** τη χρηστικότητα σε κινητά με μεγαλύτερους στόχους αφής
- **Υποστηρίζουν** την επικύρωση της φόρμας με ουσιαστικά μηνύματα σφάλματος
- **Ενισχύουν** το SEO παρέχοντας σημασιολογική σημασία στα στοιχεία της φόρμας
> 🎯 **Στόχος Προσβασιμότητας**: Κάθε είσοδος φόρμας πρέπει να έχει μια συνδεδεμένη ετικέτα. Αυτή η απλή πρακτική κάνει τις φόρμες σας προσβάσιμες σε όλους, συμπεριλαμβανομένων των χρηστών με αναπηρίες, και βελτιώνει την εμπειρία για όλους τους χρήστες.
### Δημιουργία Φόρμας Εγγραφής
Η φόρμα εγγραφής απαιτεί πιο λεπτομερείς πληροφορίες για τη δημιουργία ενός πλήρους λογαριασμού χρήστη. Ας την κατασκευάσουμε με σύγχρονα χαρακτηριστικά HTML5 και βελτιωμένη προσβασιμότητα.
```html
Register
```
**Στο παραπάνω, έχουμε:**
- **Οργανώσει** κάθε πεδίο σε κοντέινερ div για καλύτερη μορφοποίηση και διάταξη
- **Προσθέσει** κατάλληλες ιδιότητες `autocomplete` για υποστήριξη αυτόματης συμπλήρωσης από το πρόγραμμα περιήγησης
- **Συμπεριλάβει** χρήσιμο κείμενο placeholder για καθοδήγηση της εισαγωγής από τον χρήστη
- **Ορίσει** λογικές προεπιλογές χρησιμοποιώντας την ιδιότητα `value`
- **Εφαρμόσει** ιδιότητες επικύρωσης όπως `required`, `maxlength` και `min`
- **Χρησιμοποιήσει** `type="number"` για το πεδίο ισοζυγίου με υποστήριξη δεκαδικών
### Εξερεύνηση Τύπων Εισόδου και Συμπεριφοράς
**Οι σύγχρονοι τύποι εισόδου παρέχουν βελτιωμένη λειτουργικότητα:**
| Χαρακτηριστικό | Όφελος | Παράδειγμα |
|----------------|--------|-----------|
| `type="number"` | Αριθμητικό πληκτρολόγιο σε κινητά | Εύκολη εισαγωγή ισοζυγίου |
| `step="0.01"` | Έλεγχος ακρίβειας δεκαδικών | Επιτρέπει λεπτομέρειες σε νομίσματα |
| `autocomplete` | Αυτόματη συμπλήρωση από το πρόγραμμα περιήγησης | Γρηγορότερη συμπλήρωση φόρμας |
| `placeholder` | Συμφραζόμενες υποδείξεις | Καθοδηγεί τις προσδοκίες του χρήστη |
> 🎯 **Πρόκληση Προσβασιμότητας**: Δοκιμάστε να πλοηγηθείτε στις φόρμες χρησιμοποιώντας μόνο το πληκτρολόγιό σας! Χρησιμοποιήστε το `Tab` για να μετακινηθείτε μεταξύ των πεδίων, το `Space` για να επιλέξετε κουτάκια και το `Enter` για να υποβάλετε. Αυτή η εμπειρία σας βοηθά να κατανοήσετε πώς οι χρήστες αναγνωστών οθόνης αλληλεπιδρούν με τις φόρμες σας.
## Κατανόηση Μεθόδων Υποβολής Φόρμας
Όταν κάποιος συμπληρώνει τη φόρμα σας και πατάει υποβολή, αυτά τα δεδομένα πρέπει να πάνε κάπου – συνήθως σε έναν διακομιστή που μπορεί να τα αποθηκεύσει. Υπάρχουν μερικοί διαφορετικοί τρόποι με τους οποίους αυτό μπορεί να συμβεί, και η γνώση του ποιον να χρησιμοποιήσετε μπορεί να σας γλιτώσει από κάποιους πονοκεφάλους αργότερα.
Ας δούμε τι πραγματικά συμβαίνει όταν κάποιος πατάει το κουμπί υποβολής.
### Προεπιλεγμένη Συμπεριφορά Φόρμας
Πρώτα, ας παρατηρήσουμε τι συμβαίνει με την βασική υποβολή φόρμας:
**Δοκιμάστε τις τρέχουσες φόρμες σας:**
1. Πατήστε το κουμπί *Εγγραφή* στη φόρμα σας
2. Παρατηρήστε τις αλλαγές στη γραμμή διεύθυνσης του προγράμματος περιήγησης
3. Δείτε πώς η σελίδα ανανεώνεται και τα δεδομένα εμφανίζονται στη διεύθυνση URL

### Σύγκριση Μεθόδων HTTP
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**Κατανόηση των διαφορών:**
| Μέθοδος | Περίπτωση Χρήσης | Τοποθεσία Δεδομένων | Επίπεδο Ασφάλειας | Όριο Μεγέθους |
|---------|------------------|---------------------|-------------------|---------------|
| `GET` | Ερωτήματα αναζήτησης, φίλτρα | Παράμετροι URL | Χαμηλό (ορατό) | ~2000 χαρακτήρες |
| `POST` | Λογαριασμοί χρηστών, ευαίσθητα δεδομένα | Σώμα αιτήματος | Υψηλότερο (κρυφό) | Χωρίς πρακτικό όριο |
**Κατανόηση των θεμελιωδών διαφορών:**
- **GET**: Προσθέτει δεδομένα φόρμας στη διεύθυνση URL ως παραμέτρους ερωτήματος (κατάλληλο για λειτουργίες αναζήτησης)
- **POST**: Περιλαμβάνει δεδομένα στο σώμα του αιτήματος (απαραίτητο για ευαίσθητες πληροφορίες)
- **Περιορισμοί GET**: Περιορισμοί μεγέθους, ορατά δεδομένα, επίμονη ιστορία προγράμματος περιήγησης
- **Πλεονεκτήματα POST**: Μεγάλη χωρητικότητα δεδομένων, προστασία ιδιωτικότητας, υποστήριξη μεταφόρτωσης αρχείων
> 💡 **Βέλτιστη Πρακτική**: Χρησιμοποιήστε `GET` για φόρμες αναζήτησης και φίλτρα (ανάκτηση δεδομένων), χρησιμοποιήστε `POST` για εγγραφή χρηστών, είσοδο και δημιουργία δεδομένων.
### Ρύθμιση Υποβολής Φόρμας
Ας ρυθμίσουμε τη φόρμα εγγραφής σας ώστε να επικοινωνεί σωστά με το backend API χρησιμοποιώντας τη μέθοδο POST:
```html
```
**Κατανόηση της βελτιωμένης επικύρωσης:**
- **Συνδυάζει** δείκτες υποχρεωτικών πεδίων με χρήσιμες περιγραφές
- **Περιλαμβάνει** χαρακτηριστικά `pattern` για επικύρωση μορφής
- **Παρέχει** χαρακτηριστικά `title` για προσβασιμότητα και συμβουλές
- **Προσθέτει** βοηθητικό κείμενο για καθοδήγηση εισόδου χρήστη
- **Χρησιμοποιεί** δομή HTML με νόημα για καλύτερη προσβασιμότητα
### Προχωρημένοι Κανόνες Επικύρωσης
**Τι επιτυγχάνει κάθε κανόνας επικύρωσης:**
| Πεδίο | Κανόνες Επικύρωσης | Όφελος Χρήστη |
|-------|--------------------|---------------|
| Όνομα χρήστη | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Εξασφαλίζει έγκυρους, μοναδικούς αναγνωριστές |
| Νόμισμα | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Δέχεται κοινά σύμβολα νομισμάτων |
| Υπόλοιπο | `min="0"`, `step="0.01"`, `type="number"` | Αποτρέπει αρνητικά υπόλοιπα |
| Περιγραφή | `maxlength="100"` | Λογικά όρια μήκους |
### Δοκιμή Συμπεριφοράς Επικύρωσης
**Δοκιμάστε αυτά τα σενάρια επικύρωσης:**
1. **Υποβάλετε** τη φόρμα με κενά υποχρεωτικά πεδία
2. **Εισάγετε** ένα όνομα χρήστη μικρότερο από 3 χαρακτήρες
3. **Δοκιμάστε** ειδικούς χαρακτήρες στο πεδίο ονόματος χρήστη
4. **Εισάγετε** αρνητικό ποσό υπολοίπου

**Τι θα παρατηρήσετε:**
- **Το πρόγραμμα περιήγησης εμφανίζει** εγγενή μηνύματα επικύρωσης
- **Οι αλλαγές στυλ** βασίζονται στις καταστάσεις `:valid` και `:invalid`
- **Η υποβολή φόρμας** αποτρέπεται μέχρι να περάσουν όλες οι επικυρώσεις
- **Η εστίαση μετακινείται αυτόματα** στο πρώτο μη έγκυρο πεδίο
### Επικύρωση από Πελάτη vs Επικύρωση από Server
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**Γιατί χρειάζεστε και τα δύο επίπεδα:**
- **Επικύρωση από πελάτη**: Παρέχει άμεση ανατροφοδότηση και βελτιώνει την εμπειρία χρήστη
- **Επικύρωση από server**: Εξασφαλίζει ασφάλεια και χειρίζεται σύνθετους επιχειρηματικούς κανόνες
- **Συνδυασμένη προσέγγιση**: Δημιουργεί εφαρμογές φιλικές προς τον χρήστη και ασφαλείς
- **Προοδευτική βελτίωση**: Λειτουργεί ακόμα και όταν η JavaScript είναι απενεργοποιημένη
> 🛡️ **Υπενθύμιση Ασφαλείας**: Μην βασίζεστε μόνο στην επικύρωση από πελάτη! Οι κακόβουλοι χρήστες μπορούν να παρακάμψουν τους ελέγχους από τον πελάτη, επομένως η επικύρωση από τον server είναι απαραίτητη για την ασφάλεια και την ακεραιότητα των δεδομένων.
---
---
## Πρόκληση GitHub Copilot Agent 🚀
Χρησιμοποιήστε τη λειτουργία Agent για να ολοκληρώσετε την παρακάτω πρόκληση:
**Περιγραφή:** Βελτιώστε τη φόρμα εγγραφής με ολοκληρωμένη επικύρωση από πελάτη και ανατροφοδότηση χρήστη. Αυτή η πρόκληση θα σας βοηθήσει να εξασκηθείτε στην επικύρωση φόρμας, τη διαχείριση σφαλμάτων και τη βελτίωση της εμπειρίας χρήστη με διαδραστική ανατροφοδότηση.
**Εντολή:** Δημιουργήστε ένα πλήρες σύστημα επικύρωσης φόρμας για τη φόρμα εγγραφής που περιλαμβάνει: 1) Ανατροφοδότηση επικύρωσης σε πραγματικό χρόνο για κάθε πεδίο καθώς ο χρήστης πληκτρολογεί, 2) Προσαρμοσμένα μηνύματα επικύρωσης που εμφανίζονται κάτω από κάθε πεδίο εισόδου, 3) Ένα πεδίο επιβεβαίωσης κωδικού πρόσβασης με επικύρωση αντιστοίχισης, 4) Οπτικούς δείκτες (όπως πράσινα σημάδια ελέγχου για έγκυρα πεδία και κόκκινες προειδοποιήσεις για μη έγκυρα), 5) Ένα κουμπί υποβολής που ενεργοποιείται μόνο όταν περάσουν όλες οι επικυρώσεις. Χρησιμοποιήστε χαρακτηριστικά επικύρωσης HTML5, CSS για στυλ των καταστάσεων επικύρωσης και JavaScript για τη διαδραστική συμπεριφορά.
Μάθετε περισσότερα για τη [λειτουργία agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) εδώ.
## 🚀 Πρόκληση
Εμφανίστε ένα μήνυμα σφάλματος στο HTML αν ο χρήστης υπάρχει ήδη.
Ακολουθεί ένα παράδειγμα του πώς μπορεί να φαίνεται η τελική σελίδα σύνδεσης μετά από λίγο στυλιζάρισμα:

## Κουίζ μετά το μάθημα
[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/44)
## Ανασκόπηση & Αυτοδιδασκαλία
Οι προγραμματιστές έχουν γίνει πολύ δημιουργικοί όσον αφορά τις προσπάθειες δημιουργίας φορμών, ειδικά σχετικά με στρατηγικές επικύρωσης. Μάθετε για διαφορετικές ροές φορμών κοιτάζοντας το [CodePen](https://codepen.com); μπορείτε να βρείτε ενδιαφέρουσες και εμπνευσμένες φόρμες;
## Εργασία
[Στυλιζάρετε την εφαρμογή της τράπεζάς σας](assignment.md)
---
**Αποποίηση ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.