# Construirea unei aplicații bancare Partea 2: Crearea unui formular de autentificare și înregistrare
## Chestionar înainte de lecție
[Chestionar înainte de lecție](https://ff-quizzes.netlify.app/web/quiz/43)
Ai completat vreodată un formular online și ți-a respins formatul adresei de email? Sau ai pierdut toate informațiile când ai apăsat pe butonul de trimitere? Cu toții am întâlnit astfel de experiențe frustrante.
Formularele sunt puntea dintre utilizatori și funcționalitatea aplicației tale. Așa cum controlorii de trafic aerian folosesc protocoale precise pentru a ghida avioanele în siguranță la destinație, formularele bine concepute oferă feedback clar și previn erorile costisitoare. Formularele prost realizate, pe de altă parte, pot alunga utilizatorii mai repede decât o comunicare greșită într-un aeroport aglomerat.
În această lecție, vom transforma aplicația bancară statică într-o aplicație interactivă. Vei învăța să construiești formulare care validează datele introduse de utilizatori, comunică cu serverele și oferă feedback util. Gândește-te la asta ca la construirea unei interfețe de control care permite utilizatorilor să navigheze prin funcțiile aplicației tale.
La final, vei avea un sistem complet de autentificare și înregistrare cu validare, care ghidează utilizatorii spre succes, nu spre frustrare.
## Cerințe preliminare
Înainte de a începe să construim formulare, să ne asigurăm că ai totul configurat corect. Această lecție continuă de unde am rămas în cea anterioară, așa că, dacă ai sărit peste, poate vrei să te întorci și să pui bazele mai întâi.
### Configurare necesară
| Componentă | Status | Descriere |
|------------|--------|-----------|
| [Șabloane HTML](../1-template-route/README.md) | ✅ Necesare | Structura de bază a aplicației bancare |
| [Node.js](https://nodejs.org) | ✅ Necesare | Runtime JavaScript pentru server |
| [Server API bancar](../api/README.md) | ✅ Necesare | Serviciu backend pentru stocarea datelor |
> 💡 **Sfat pentru dezvoltare**: Vei rula simultan două servere separate – unul pentru aplicația bancară front-end și altul pentru API-ul backend. Această configurare reflectă dezvoltarea reală, unde serviciile front-end și backend funcționează independent.
### Configurarea serverului
**Mediul tău de dezvoltare va include:**
- **Serverul front-end**: Servește aplicația bancară (de obicei portul `3000`)
- **Serverul API backend**: Se ocupă de stocarea și recuperarea datelor (portul `5000`)
- **Ambele servere** pot funcționa simultan fără conflicte
**Testarea conexiunii API:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Dacă vezi răspunsul cu versiunea API, ești gata să continui!**
---
## Înțelegerea formularelor și controalelor HTML
Formularele HTML sunt modul prin care utilizatorii comunică cu aplicația ta web. Gândește-te la ele ca la sistemul de telegraf care conecta locuri îndepărtate în secolul al XIX-lea – ele sunt protocolul de comunicare între intenția utilizatorului și răspunsul aplicației. Când sunt concepute cu grijă, ele detectează erorile, ghidează formatul de introducere și oferă sugestii utile.
Formularele moderne sunt mult mai sofisticate decât simplele câmpuri de text. HTML5 a introdus tipuri de input specializate care gestionează validarea email-urilor, formatarea numerelor și selecția datelor în mod automat. Aceste îmbunătățiri sunt benefice atât pentru accesibilitate, cât și pentru experiențele utilizatorilor de pe dispozitivele mobile.
### Elemente esențiale ale formularelor
**Elemente de bază necesare fiecărui formular:**
```html
```
**Ce face acest cod:**
- **Creează** un container de formular cu un identificator unic
- **Specifică** metoda HTTP pentru trimiterea datelor
- **Asociază** etichetele cu câmpurile de input pentru accesibilitate
- **Definește** un buton de trimitere pentru procesarea formularului
### Tipuri moderne de input și atribute
| Tip de input | Scop | Exemplu de utilizare |
|--------------|------|----------------------|
| `text` | Introducere text generală | `` |
| `email` | Validare email | `` |
| `password` | Introducere text ascuns | `` |
| `number` | Introducere numerică | `` |
| `tel` | Numere de telefon | `` |
> 💡 **Avantajul HTML5 modern**: Utilizarea tipurilor specifice de input oferă validare automată, tastaturi mobile adecvate și suport mai bun pentru accesibilitate fără a fi nevoie de JavaScript suplimentar!
### Tipuri de butoane și comportament
```html
```
**Ce face fiecare tip de buton:**
- **Butoane de trimitere**: Declanșează trimiterea formularului și trimit datele către endpoint-ul specificat
- **Butoane de resetare**: Resetează toate câmpurile formularului la starea inițială
- **Butoane obișnuite**: Nu au un comportament implicit, necesitând JavaScript personalizat pentru funcționalitate
> ⚠️ **Notă importantă**: Elementul `` este auto-închis și nu necesită un tag de închidere. Practica modernă recomandă scrierea `` fără slash.
### Construirea formularului de autentificare
Acum să creăm un formular practic de autentificare care demonstrează practicile moderne ale formularelor HTML. Vom începe cu o structură de bază și o vom îmbunătăți treptat cu funcții de accesibilitate și validare.
```html
Bank App
Login
```
**Analiză a ceea ce se întâmplă aici:**
- **Structurarea** formularului cu elemente semantice HTML5
- **Gruparea** elementelor conexe folosind containere `div` cu clase semnificative
- **Asocierea** etichetelor cu câmpurile de input folosind atributele `for` și `id`
- **Includerea** atributelor moderne precum `autocomplete` și `placeholder` pentru o experiență mai bună a utilizatorului
- **Adăugarea** atributului `novalidate` pentru a gestiona validarea cu JavaScript în loc de setările implicite ale browserului
### Importanța etichetelor corecte
**De ce contează etichetele pentru dezvoltarea web modernă:**
```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]
```
**Ce realizează etichetele corecte:**
- **Permite** cititoarelor de ecran să anunțe clar câmpurile formularului
- **Extinde** zona clicabilă (clicul pe etichetă focalizează input-ul)
- **Îmbunătățește** utilizarea pe mobil cu ținte tactile mai mari
- **Sprijină** validarea formularului cu mesaje de eroare semnificative
- **Îmbunătățește** SEO prin oferirea de semnificație semantică elementelor formularului
> 🎯 **Obiectiv de accesibilitate**: Fiecare câmp de input al formularului ar trebui să aibă o etichetă asociată. Această practică simplă face ca formularele tale să fie utilizabile de toată lumea, inclusiv de utilizatorii cu dizabilități, și îmbunătățește experiența pentru toți utilizatorii.
### Crearea formularului de înregistrare
Formularul de înregistrare necesită informații mai detaliate pentru a crea un cont complet de utilizator. Să-l construim folosind funcții moderne HTML5 și accesibilitate îmbunătățită.
```html
Register
```
**În codul de mai sus, am:**
- **Organizat** fiecare câmp în div-uri de container pentru o mai bună stilizare și aranjare
- **Adăugat** atribute `autocomplete` adecvate pentru suportul de completare automată al browserului
- **Inclus** text de ajutor în placeholder pentru a ghida introducerea utilizatorului
- **Setat** valori implicite sensibile folosind atributul `value`
- **Aplicat** atribute de validare precum `required`, `maxlength` și `min`
- **Utilizat** `type="number"` pentru câmpul de sold cu suport pentru zecimale
### Explorarea tipurilor de input și comportamentului
**Tipurile moderne de input oferă funcționalități îmbunătățite:**
| Funcție | Beneficiu | Exemplu |
|---------|-----------|---------|
| `type="number"` | Tastatură numerică pe mobil | Introducere mai ușoară a soldului |
| `step="0.01"` | Controlul preciziei zecimale | Permite introducerea centimilor în monedă |
| `autocomplete` | Completare automată în browser | Completare mai rapidă a formularului |
| `placeholder` | Indicii contextuale | Ghidează așteptările utilizatorului |
> 🎯 **Provocare de accesibilitate**: Încearcă să navighezi prin formulare folosind doar tastatura! Folosește `Tab` pentru a te deplasa între câmpuri, `Space` pentru a bifa casetele și `Enter` pentru a trimite. Această experiență te ajută să înțelegi cum utilizatorii de cititoare de ecran interacționează cu formularele tale.
## Înțelegerea metodelor de trimitere a formularelor
Când cineva completează formularul și apasă pe butonul de trimitere, datele trebuie să ajungă undeva – de obicei la un server care le poate salva. Există câteva moduri diferite în care acest lucru se poate întâmpla, iar cunoașterea celui potrivit te poate scuti de unele bătăi de cap mai târziu.
Să vedem ce se întâmplă de fapt când cineva apasă pe butonul de trimitere.
### Comportamentul implicit al formularului
Mai întâi, să observăm ce se întâmplă cu trimiterea de bază a unui formular:
**Testează formularele actuale:**
1. Apasă pe butonul *Înregistrează-te* din formularul tău
2. Observă schimbările din bara de adrese a browserului
3. Observă cum pagina se reîncarcă și datele apar în URL

### Compararea metodelor 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]
```
**Înțelegerea diferențelor:**
| Metodă | Caz de utilizare | Locația datelor | Nivel de securitate | Limită de dimensiune |
|--------|------------------|-----------------|---------------------|----------------------|
| `GET` | Interogări de căutare, filtre | Parametri URL | Scăzut (vizibil) | ~2000 caractere |
| `POST` | Conturi de utilizator, date sensibile | Corpul cererii | Mai ridicat (ascuns) | Fără limită practică |
**Înțelegerea diferențelor fundamentale:**
- **GET**: Adaugă datele formularului la URL ca parametri de interogare (potrivit pentru operațiuni de căutare)
- **POST**: Include datele în corpul cererii (esențial pentru informații sensibile)
- **Limitări GET**: Constrângeri de dimensiune, date vizibile, istoric persistent al browserului
- **Avantaje POST**: Capacitate mare de date, protecția confidențialității, suport pentru încărcarea fișierelor
> 💡 **Practica optimă**: Folosește `GET` pentru formularele de căutare și filtre (recuperarea datelor), folosește `POST` pentru înregistrarea utilizatorilor, autentificare și crearea datelor.
### Configurarea trimiterii formularului
Să configurăm formularul de înregistrare pentru a comunica corect cu API-ul backend folosind metoda POST:
```html
```
**Înțelegerea validării îmbunătățite:**
- **Combină** indicatorii de câmpuri obligatorii cu descrieri utile
- **Include** atribute `pattern` pentru validarea formatului
- **Oferă** atribute `title` pentru accesibilitate și tooltip-uri
- **Adaugă** text de ajutor pentru a ghida introducerea datelor de către utilizator
- **Folosește** structura HTML semantică pentru o mai bună accesibilitate
### Reguli Avansate de Validare
**Ce realizează fiecare regulă de validare:**
| Câmp | Reguli de validare | Beneficiul utilizatorului |
|------|--------------------|---------------------------|
| Nume utilizator | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Asigură identificatori valizi și unici |
| Monedă | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Acceptă simboluri comune ale monedelor |
| Sold | `min="0"`, `step="0.01"`, `type="number"` | Previne soldurile negative |
| Descriere | `maxlength="100"` | Limite rezonabile de lungime |
### Testarea Comportamentului Validării
**Încearcă aceste scenarii de validare:**
1. **Trimite** formularul cu câmpuri obligatorii goale
2. **Introdu** un nume de utilizator mai scurt de 3 caractere
3. **Încearcă** caractere speciale în câmpul de nume utilizator
4. **Introdu** o sumă negativă pentru sold

**Ce vei observa:**
- **Browserul afișează** mesaje native de validare
- **Schimbări de stilizare** bazate pe stările `:valid` și `:invalid`
- **Trimiterea formularului** este împiedicată până când toate validările sunt trecute
- **Focusul se mută automat** pe primul câmp invalid
### Validare pe Client vs Validare pe 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
```
**De ce ai nevoie de ambele straturi:**
- **Validarea pe client**: Oferă feedback imediat și îmbunătățește experiența utilizatorului
- **Validarea pe server**: Asigură securitatea și gestionează regulile complexe de afaceri
- **Abordare combinată**: Creează aplicații robuste, prietenoase și sigure
- **Îmbunătățire progresivă**: Funcționează chiar și când JavaScript este dezactivat
> 🛡️ **Reamintire de securitate**: Nu te baza doar pe validarea pe client! Utilizatorii rău intenționați pot ocoli verificările pe client, așa că validarea pe server este esențială pentru securitate și integritatea datelor.
---
---
## Provocarea Agentului GitHub Copilot 🚀
Folosește modul Agent pentru a finaliza următoarea provocare:
**Descriere:** Îmbunătățește formularul de înregistrare cu validare completă pe client și feedback pentru utilizator. Această provocare te va ajuta să exersezi validarea formularelor, gestionarea erorilor și îmbunătățirea experienței utilizatorului cu feedback interactiv.
**Instrucțiuni:** Creează un sistem complet de validare a formularului pentru înregistrare care să includă: 1) Feedback de validare în timp real pentru fiecare câmp pe măsură ce utilizatorul tastează, 2) Mesaje personalizate de validare care apar sub fiecare câmp de input, 3) Un câmp de confirmare a parolei cu validare de potrivire, 4) Indicatori vizuali (cum ar fi bife verzi pentru câmpuri valide și avertismente roșii pentru cele invalide), 5) Un buton de trimitere care devine activ doar când toate validările sunt trecute. Folosește atributele de validare HTML5, CSS pentru stilizarea stărilor de validare și JavaScript pentru comportamentul interactiv.
Află mai multe despre [modul agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) aici.
## 🚀 Provocare
Afișează un mesaj de eroare în HTML dacă utilizatorul există deja.
Iată un exemplu de cum poate arăta pagina finală de autentificare după un pic de stilizare:

## Test de evaluare post-lectură
[Test de evaluare post-lectură](https://ff-quizzes.netlify.app/web/quiz/44)
## Recapitulare & Studiu Individual
Dezvoltatorii au devenit foarte creativi în eforturile lor de a construi formulare, mai ales în ceea ce privește strategiile de validare. Află despre diferite fluxuri de formulare explorând [CodePen](https://codepen.com); poți găsi formulare interesante și inspiratoare?
## Temă
[Stilizează aplicația ta bancară](assignment.md)
---
**Declinare de responsabilitate**:
Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de oameni. Nu ne asumăm responsabilitatea pentru neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.