# Izdelava bančne aplikacije, 2. del: Oblikovanje obrazca za prijavo in registracijo
## Predhodni kviz
[Predhodni kviz](https://ff-quizzes.netlify.app/web/quiz/43)
Ste že kdaj izpolnili obrazec na spletu, ki je zavrnil vaš e-poštni naslov zaradi napačnega formata? Ali pa ste izgubili vse podatke, ko ste kliknili na gumb za pošiljanje? Vsi smo se že srečali s takšnimi frustrirajočimi izkušnjami.
Obrazci so most med uporabniki in funkcionalnostjo vaše aplikacije. Tako kot skrbni protokoli, ki jih uporabljajo kontrolorji zračnega prometa za varno usmerjanje letal, dobro zasnovani obrazci zagotavljajo jasne povratne informacije in preprečujejo drage napake. Slabo zasnovani obrazci pa lahko uporabnike odvrnejo hitreje kot napačna komunikacija na prometnem letališču.
V tej lekciji bomo vašo statično bančno aplikacijo spremenili v interaktivno aplikacijo. Naučili se boste oblikovati obrazce, ki preverjajo vnos uporabnika, komunicirajo s strežniki in zagotavljajo koristne povratne informacije. Pomislite na to kot na gradnjo nadzornega vmesnika, ki uporabnikom omogoča navigacijo po funkcijah vaše aplikacije.
Na koncu boste imeli popoln sistem za prijavo in registracijo z validacijo, ki uporabnike vodi k uspehu namesto frustracijam.
## Predpogoji
Preden začnemo z oblikovanjem obrazcev, se prepričajmo, da imate vse pravilno nastavljeno. Ta lekcija se nadaljuje tam, kjer smo končali prejšnjo, zato če ste preskočili naprej, se morda želite vrniti in najprej urediti osnove.
### Zahtevana nastavitev
| Komponenta | Status | Opis |
|------------|--------|------|
| [HTML predloge](../1-template-route/README.md) | ✅ Zahtevano | Osnovna struktura bančne aplikacije |
| [Node.js](https://nodejs.org) | ✅ Zahtevano | JavaScript okolje za strežnik |
| [Bank API strežnik](../api/README.md) | ✅ Zahtevano | Zaledna storitev za shranjevanje podatkov |
> 💡 **Nasvet za razvoj**: Hkrati boste zagnali dva ločena strežnika – enega za vašo sprednjo bančno aplikacijo in drugega za zaledni API. Ta nastavitev odraža resnično razvojno okolje, kjer sprednje in zaledne storitve delujejo neodvisno.
### Konfiguracija strežnika
**Vaše razvojno okolje bo vključevalo:**
- **Strežnik sprednjega dela**: Strežnik za vašo bančno aplikacijo (običajno vrata `3000`)
- **Strežnik zalednega API-ja**: Upravljanje shranjevanja in pridobivanja podatkov (vrata `5000`)
- **Oba strežnika** lahko delujeta hkrati brez konfliktov
**Testiranje povezave z API-jem:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Če vidite odgovor z različico API-ja, ste pripravljeni nadaljevati!**
---
## Razumevanje HTML obrazcev in kontrol
HTML obrazci so način, kako uporabniki komunicirajo z vašo spletno aplikacijo. Pomislite nanje kot na telegrafski sistem, ki je v 19. stoletju povezoval oddaljene kraje – so komunikacijski protokol med namenom uporabnika in odzivom aplikacije. Ko so premišljeno zasnovani, ujamejo napake, usmerjajo formatiranje vnosa in zagotavljajo koristne predloge.
Sodobni obrazci so bistveno bolj sofisticirani kot osnovni besedilni vnosi. HTML5 je uvedel specializirane tipe vnosov, ki samodejno obravnavajo validacijo e-pošte, formatiranje številk in izbiro datumov. Te izboljšave koristijo tako dostopnosti kot mobilni uporabniški izkušnji.
### Osnovni elementi obrazca
**Gradniki, ki jih potrebuje vsak obrazec:**
```html
```
**Kaj ta koda počne:**
- **Ustvari** vsebnik obrazca z edinstvenim identifikatorjem
- **Določi** HTTP metodo za pošiljanje podatkov
- **Poveže** oznake z vnosi za dostopnost
- **Določi** gumb za pošiljanje obrazca
### Sodobni tipi vnosov in atributi
| Tip vnosa | Namen | Primer uporabe |
|-----------|-------|----------------|
| `text` | Splošni besedilni vnos | `` |
| `email` | Validacija e-pošte | `` |
| `password` | Skriti vnos besedila | `` |
| `number` | Številčni vnos | `` |
| `tel` | Telefonske številke | `` |
> 💡 **Prednost HTML5**: Uporaba specifičnih tipov vnosov omogoča samodejno validacijo, ustrezne mobilne tipkovnice in boljšo podporo dostopnosti brez dodatnega JavaScripta!
### Tipi gumbov in vedenje
```html
```
**Kaj počne vsak tip gumba:**
- **Gumbi za pošiljanje**: Sprožijo pošiljanje obrazca in pošljejo podatke na določeno točko
- **Gumbi za ponastavitev**: Povrnejo vsa polja obrazca v začetno stanje
- **Običajni gumbi**: Nimajo privzetega vedenja, zahtevajo prilagojen JavaScript za funkcionalnost
> ⚠️ **Pomembna opomba**: Element `` je samozapiralni in ne potrebuje zaključnega taga. Sodobna najboljša praksa je pisanje `` brez poševnice.
### Oblikovanje obrazca za prijavo
Zdaj bomo ustvarili praktičen obrazec za prijavo, ki prikazuje sodobne prakse oblikovanja HTML obrazcev. Začeli bomo z osnovno strukturo in jo postopoma izboljšali z dostopnostjo in validacijo.
```html
Bank App
Login
```
**Razčlenitev dogajanja:**
- **Strukturira** obrazec s semantičnimi elementi HTML5
- **Združuje** povezane elemente z uporabo `div` vsebnikov z ustreznimi razredi
- **Povezuje** oznake z vnosi z uporabo atributov `for` in `id`
- **Vključuje** sodobne atribute, kot so `autocomplete` in `placeholder`, za boljšo uporabniško izkušnjo
- **Dodaja** `novalidate` za obravnavo validacije z JavaScriptom namesto privzetih nastavitev brskalnika
### Pomen ustreznih oznak
**Zakaj so oznake pomembne za sodoben spletni razvoj:**
```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]
```
**Kaj dosežejo ustrezne oznake:**
- **Omogočajo** bralnikom zaslona, da jasno napovejo polja obrazca
- **Razširijo** klikabilno območje (klik na oznako osredotoči vnos)
- **Izboljšajo** mobilno uporabniško izkušnjo z večjimi ciljnimi območji
- **Podpirajo** validacijo obrazca z smiselnimi sporočili o napakah
- **Povečajo** SEO z dodajanjem semantičnega pomena elementom obrazca
> 🎯 **Cilj dostopnosti**: Vsak vnos obrazca naj ima povezano oznako. Ta preprosta praksa naredi vaše obrazce dostopne vsem, vključno z uporabniki z invalidnostjo, in izboljša izkušnjo za vse uporabnike.
### Oblikovanje obrazca za registracijo
Obrazec za registracijo zahteva bolj podrobne informacije za ustvarjanje popolnega uporabniškega računa. Zgradimo ga s sodobnimi funkcijami HTML5 in izboljšano dostopnostjo.
```html
Register
```
**V zgornjem primeru smo:**
- **Organizirali** vsako polje v vsebnikih div za boljše oblikovanje in postavitev
- **Dodali** ustrezne atribute `autocomplete` za podporo samodejnemu izpolnjevanju brskalnika
- **Vključili** koristno besedilo za vnos, ki usmerja uporabnika
- **Nastavili** smiselne privzete vrednosti z atributom `value`
- **Uporabili** validacijske atribute, kot so `required`, `maxlength` in `min`
- **Uporabili** `type="number"` za polje stanja z decimalno podporo
### Raziskovanje tipov vnosov in vedenja
**Sodobni tipi vnosov zagotavljajo izboljšano funkcionalnost:**
| Funkcija | Prednost | Primer |
|----------|----------|--------|
| `type="number"` | Številčna tipkovnica na mobilnih napravah | Lažji vnos stanja |
| `step="0.01"` | Nadzor decimalne natančnosti | Omogoča centimetrsko natančnost pri valutah |
| `autocomplete` | Samodejno izpolnjevanje brskalnika | Hitrejše izpolnjevanje obrazca |
| `placeholder` | Kontekstualni namigi | Usmerja pričakovanja uporabnika |
> 🎯 **Izziv dostopnosti**: Poskusite navigirati po obrazcih samo z uporabo tipkovnice! Uporabite `Tab` za premikanje med polji, `Space` za označevanje polj in `Enter` za pošiljanje. Ta izkušnja vam pomaga razumeti, kako uporabniki bralnikov zaslona interagirajo z vašimi obrazci.
## Razumevanje metod pošiljanja obrazcev
Ko nekdo izpolni vaš obrazec in klikne na pošlji, morajo ti podatki nekam iti – običajno na strežnik, ki jih lahko shrani. Obstaja nekaj različnih načinov, kako se to lahko zgodi, in poznavanje, katerega uporabiti, vam lahko prihrani nekaj težav kasneje.
Poglejmo, kaj se dejansko zgodi, ko nekdo klikne na gumb za pošiljanje.
### Privzeto vedenje obrazca
Najprej opazujmo, kaj se zgodi pri osnovnem pošiljanju obrazca:
**Testirajte svoje trenutne obrazce:**
1. Kliknite na gumb *Registriraj* v vašem obrazcu
2. Opazujte spremembe v naslovni vrstici brskalnika
3. Opazite, kako se stran osveži in podatki se pojavijo v URL-ju

### Primerjava HTTP metod
```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]
```
**Razumevanje razlik:**
| Metoda | Primer uporabe | Lokacija podatkov | Raven varnosti | Omejitev velikosti |
|--------|----------------|-------------------|----------------|--------------------|
| `GET` | Iskalne poizvedbe, filtri | Parametri URL-ja | Nizka (vidno) | ~2000 znakov |
| `POST` | Uporabniški računi, občutljivi podatki | Telo zahteve | Višja (skrito) | Brez praktične omejitve |
**Razumevanje temeljnih razlik:**
- **GET**: Dodaja podatke obrazca v URL kot parametre poizvedbe (primerno za iskalne operacije)
- **POST**: Vključuje podatke v telo zahteve (nujno za občutljive informacije)
- **Omejitve GET**: Omejitve velikosti, vidni podatki, trajna zgodovina brskalnika
- **Prednosti POST**: Velika kapaciteta podatkov, zaščita zasebnosti, podpora za nalaganje datotek
> 💡 **Najboljša praksa**: Uporabite `GET` za iskalne obrazce in filtre (pridobivanje podatkov), uporabite `POST` za registracijo uporabnikov, prijavo in ustvarjanje podatkov.
### Konfiguracija pošiljanja obrazca
Konfigurirajmo vaš obrazec za registracijo, da pravilno komunicira z zalednim API-jem z uporabo metode POST:
```html
```
**Razumevanje izboljšane validacije:**
- **Združuje** indikatorje obveznih polj z uporabnimi opisi
- **Vključuje** atribute `pattern` za validacijo formatov
- **Ponuja** atribute `title` za dostopnost in orodja
- **Dodaja** pomožno besedilo za usmerjanje uporabniškega vnosa
- **Uporablja** semantično HTML strukturo za boljšo dostopnost
### Napredna pravila validacije
**Kaj doseže vsako pravilo validacije:**
| Polje | Pravila validacije | Koristi za uporabnika |
|-------|--------------------|-----------------------|
| Uporabniško ime | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Zagotavlja veljavne, unikatne identifikatorje |
| Valuta | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Sprejema običajne simbole valut |
| Stanje | `min="0"`, `step="0.01"`, `type="number"` | Preprečuje negativna stanja |
| Opis | `maxlength="100"` | Razumna omejitev dolžine |
### Testiranje obnašanja validacije
**Preizkusite te scenarije validacije:**
1. **Oddajte** obrazec z praznimi obveznimi polji
2. **Vnesite** uporabniško ime, krajše od 3 znakov
3. **Poskusite** posebne znake v polju za uporabniško ime
4. **Vnesite** negativno stanje zneska

**Kaj boste opazili:**
- **Brskalnik prikaže** naravna sporočila o validaciji
- **Spremembe stiliziranja** na podlagi stanj `:valid` in `:invalid`
- **Oddaja obrazca** je preprečena, dokler vse validacije ne uspejo
- **Fokus se samodejno** premakne na prvo neveljavno polje
### Validacija na strani odjemalca vs. strežnika
```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
```
**Zakaj potrebujete obe plasti:**
- **Validacija na strani odjemalca**: Ponuja takojšnje povratne informacije in izboljša uporabniško izkušnjo
- **Validacija na strežniku**: Zagotavlja varnost in obravnava kompleksna poslovna pravila
- **Kombiniran pristop**: Ustvari robustne, uporabniku prijazne in varne aplikacije
- **Progresivna izboljšava**: Deluje tudi, ko je JavaScript onemogočen
> 🛡️ **Varnostni opomnik**: Nikoli ne zaupajte samo validaciji na strani odjemalca! Zlonamerni uporabniki lahko obidejo preverjanja na strani odjemalca, zato je validacija na strežniku ključna za varnost in celovitost podatkov.
---
---
## Izziv GitHub Copilot Agent 🚀
Uporabite način Agent za dokončanje naslednjega izziva:
**Opis:** Izboljšajte obrazec za registracijo s celovito validacijo na strani odjemalca in povratnimi informacijami za uporabnika. Ta izziv vam bo pomagal vaditi validacijo obrazcev, obravnavo napak in izboljšanje uporabniške izkušnje z interaktivnimi povratnimi informacijami.
**Navodilo:** Ustvarite popoln sistem validacije obrazca za registracijo, ki vključuje: 1) Povratne informacije o validaciji v realnem času za vsako polje med tipkanjem, 2) Prilagojena sporočila o validaciji, ki se prikažejo pod vsakim poljem za vnos, 3) Polje za potrditev gesla z validacijo ujemanja, 4) Vizualne indikatorje (kot so zelene kljukice za veljavna polja in rdeča opozorila za neveljavna), 5) Gumb za oddajo, ki postane omogočen šele, ko vse validacije uspejo. Uporabite HTML5 atribute za validacijo, CSS za stiliziranje stanj validacije in JavaScript za interaktivno obnašanje.
Več o [načinu Agent](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) si preberite tukaj.
## 🚀 Izziv
Prikažite sporočilo o napaki v HTML, če uporabnik že obstaja.
Tukaj je primer, kako lahko izgleda končna stran za prijavo po nekaj stiliziranja:

## Kviz po predavanju
[Kviz po predavanju](https://ff-quizzes.netlify.app/web/quiz/44)
## Pregled in samostojno učenje
Razvijalci so postali zelo kreativni pri svojih prizadevanjih za gradnjo obrazcev, še posebej glede strategij validacije. Spoznajte različne tokove obrazcev z ogledom [CodePen](https://codepen.com); ali lahko najdete zanimive in navdihujoče obrazce?
## Naloga
[Stilizirajte svojo bančno aplikacijo](assignment.md)
---
**Omejitev odgovornosti**:
Ta dokument je bil preveden z uporabo storitve za prevajanje AI [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku naj se šteje za avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne odgovarjamo za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.