# Bygg en bankapp del 2: Skapa ett inloggnings- och registreringsformulär
## Förkunskapsquiz
[Förkunskapsquiz](https://ff-quizzes.netlify.app/web/quiz/43)
Har du någonsin fyllt i ett formulär online och fått ditt e-postformat avvisat? Eller förlorat all information när du klickade på "skicka"? Vi har alla stött på dessa frustrerande upplevelser.
Formulär är bron mellan dina användare och din applikations funktionalitet. Precis som de noggranna protokoll som flygledare använder för att guida flygplan säkert till sina destinationer, ger välutformade formulär tydlig feedback och förhindrar kostsamma misstag. Dåligt utformade formulär kan däremot skrämma bort användare snabbare än en misskommunikation på en hektisk flygplats.
I den här lektionen kommer vi att förvandla din statiska bankapp till en interaktiv applikation. Du kommer att lära dig att skapa formulär som validerar användarinmatning, kommunicerar med servrar och ger användbar feedback. Tänk på det som att bygga kontrollgränssnittet som låter användare navigera i din applikations funktioner.
I slutet kommer du att ha ett komplett inloggnings- och registreringssystem med validering som guidar användarna mot framgång istället för frustration.
## Förutsättningar
Innan vi börjar bygga formulär, låt oss se till att du har allt korrekt inställt. Den här lektionen fortsätter där vi slutade i den föregående, så om du hoppade framåt kan det vara bra att gå tillbaka och få grunderna att fungera först.
### Nödvändig inställning
| Komponent | Status | Beskrivning |
|-----------|--------|-------------|
| [HTML-mallar](../1-template-route/README.md) | ✅ Nödvändig | Grundstrukturen för din bankapp |
| [Node.js](https://nodejs.org) | ✅ Nödvändig | JavaScript-runtime för servern |
| [Bank API-server](../api/README.md) | ✅ Nödvändig | Backend-tjänst för datalagring |
> 💡 **Utvecklingstips**: Du kommer att köra två separata servrar samtidigt – en för din frontend-bankapp och en annan för backend-API:t. Denna inställning speglar verklig utveckling där frontend- och backend-tjänster fungerar oberoende av varandra.
### Serverkonfiguration
**Din utvecklingsmiljö kommer att inkludera:**
- **Frontend-server**: Serverar din bankapp (vanligtvis port `3000`)
- **Backend API-server**: Hanterar datalagring och hämtning (port `5000`)
- **Båda servrarna** kan köras samtidigt utan konflikter
**Testa din API-anslutning:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Om du ser API-versionens svar är du redo att fortsätta!**
---
## Förstå HTML-formulär och kontroller
HTML-formulär är hur användare kommunicerar med din webbapplikation. Tänk på dem som telegrafsystemet som kopplade samman avlägsna platser på 1800-talet – de är kommunikationsprotokollet mellan användarens intention och applikationens svar. När de är genomtänkt designade fångar de fel, guidar inmatningsformat och ger användbara förslag.
Moderna formulär är betydligt mer sofistikerade än grundläggande textinmatningar. HTML5 introducerade specialiserade inmatningstyper som automatiskt hanterar e-postvalidering, nummerformat och datumval. Dessa förbättringar gynnar både tillgänglighet och mobilanvändarupplevelser.
### Grundläggande formulärelement
**Byggstenar som varje formulär behöver:**
```html
```
**Vad denna kod gör:**
- **Skapar** en formulärbehållare med en unik identifierare
- **Anger** HTTP-metoden för dataöverföring
- **Associerar** etiketter med inmatningar för tillgänglighet
- **Definierar** en skicka-knapp för att bearbeta formuläret
### Moderna inmatningstyper och attribut
| Inmatningstyp | Syfte | Exempel på användning |
|---------------|-------|-----------------------|
| `text` | Allmän textinmatning | `` |
| `email` | E-postvalidering | `` |
| `password` | Dold textinmatning | `` |
| `number` | Numerisk inmatning | `` |
| `tel` | Telefonnummer | `` |
> 💡 **Fördel med modern HTML5**: Genom att använda specifika inmatningstyper får du automatisk validering, lämpliga mobiltangentbord och bättre stöd för tillgänglighet utan extra JavaScript!
### Knapptyper och beteende
```html
```
**Vad varje knapptyp gör:**
- **Skicka-knappar**: Startar formuläröverföring och skickar data till den angivna slutpunkten
- **Återställ-knappar**: Återställer alla formulärfält till deras ursprungliga tillstånd
- **Vanliga knappar**: Har inget standardbeteende och kräver anpassad JavaScript för funktionalitet
> ⚠️ **Viktig notering**: ``-elementet är självstängande och kräver ingen avslutande tagg. Modern bästa praxis är att skriva `` utan snedstreck.
### Skapa ditt inloggningsformulär
Nu ska vi skapa ett praktiskt inloggningsformulär som demonstrerar moderna HTML-formulärprinciper. Vi börjar med en grundläggande struktur och förbättrar den gradvis med tillgänglighetsfunktioner och validering.
```html
Bank App
Login
```
**Genomgång av vad som händer här:**
- **Strukturerar** formuläret med semantiska HTML5-element
- **Grupperar** relaterade element med `div`-behållare med meningsfulla klasser
- **Associerar** etiketter med inmatningar med hjälp av attributen `for` och `id`
- **Inkluderar** moderna attribut som `autocomplete` och `placeholder` för bättre användarupplevelse
- **Lägger till** `novalidate` för att hantera validering med JavaScript istället för webbläsarens standardinställningar
### Kraften i korrekta etiketter
**Varför etiketter är viktiga för modern webbutveckling:**
```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]
```
**Vad korrekta etiketter åstadkommer:**
- **Möjliggör** att skärmläsare tydligt kan annonsera formulärfält
- **Utökar** det klickbara området (att klicka på etiketten fokuserar inmatningen)
- **Förbättrar** mobilanvändbarheten med större beröringsmål
- **Stödjer** formulärvalidering med meningsfulla felmeddelanden
- **Förbättrar** SEO genom att ge semantisk betydelse till formulärelement
> 🎯 **Tillgänglighetsmål**: Varje formulärinmatning bör ha en associerad etikett. Denna enkla praxis gör dina formulär användbara för alla, inklusive användare med funktionsnedsättningar, och förbättrar upplevelsen för alla användare.
### Skapa registreringsformuläret
Registreringsformuläret kräver mer detaljerad information för att skapa ett komplett användarkonto. Låt oss bygga det med moderna HTML5-funktioner och förbättrad tillgänglighet.
```html
Register
```
**I ovanstående har vi:**
- **Organiserat** varje fält i behållar-divar för bättre styling och layout
- **Lagt till** lämpliga `autocomplete`-attribut för webbläsarens autofyllstöd
- **Inkluderat** hjälpsam platshållartext för att guida användarinmatning
- **Satt** rimliga standardvärden med hjälp av attributet `value`
- **Använt** valideringsattribut som `required`, `maxlength` och `min`
- **Använt** `type="number"` för balansfältet med decimalsupport
### Utforska inmatningstyper och beteende
**Moderna inmatningstyper ger förbättrad funktionalitet:**
| Funktion | Fördel | Exempel |
|----------|--------|---------|
| `type="number"` | Numeriskt tangentbord på mobil | Enklare balansinmatning |
| `step="0.01"` | Kontroll av decimalprecision | Tillåter cent i valuta |
| `autocomplete` | Webbläsarens autofyll | Snabbare formulärifyllning |
| `placeholder` | Kontextuella tips | Guidar användarens förväntningar |
> 🎯 **Tillgänglighetsutmaning**: Försök navigera i formulären med bara ditt tangentbord! Använd `Tab` för att flytta mellan fält, `Space` för att markera kryssrutor och `Enter` för att skicka. Denna upplevelse hjälper dig att förstå hur skärmläsaranvändare interagerar med dina formulär.
## Förstå metoder för formuläröverföring
När någon fyller i ditt formulär och klickar på "skicka" måste den datan skickas någonstans – vanligtvis till en server som kan spara den. Det finns ett par olika sätt detta kan ske på, och att veta vilket du ska använda kan spara dig från huvudvärk senare.
Låt oss titta på vad som faktiskt händer när någon klickar på skicka-knappen.
### Standardbeteende för formulär
Låt oss först observera vad som händer med grundläggande formuläröverföring:
**Testa dina nuvarande formulär:**
1. Klicka på *Registrera* knappen i ditt formulär
2. Observera förändringarna i webbläsarens adressfält
3. Lägg märke till hur sidan laddas om och data visas i URL:en

### Jämförelse av HTTP-metoder
```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]
```
**Förstå skillnaderna:**
| Metod | Användningsområde | Plats för data | Säkerhetsnivå | Storleksbegränsning |
|-------|-------------------|----------------|---------------|---------------------|
| `GET` | Sökfrågor, filter | URL-parametrar | Låg (synlig) | ~2000 tecken |
| `POST` | Användarkonton, känslig data | Begärans kropp | Högre (dold) | Ingen praktisk gräns |
**Förstå grundläggande skillnader:**
- **GET**: Lägger till formulärdata i URL:en som frågeparametrar (lämpligt för sökoperationer)
- **POST**: Inkluderar data i begärans kropp (nödvändigt för känslig information)
- **Begränsningar med GET**: Storleksbegränsningar, synlig data, ihållande webbläsarhistorik
- **Fördelar med POST**: Stor datakapacitet, skydd av privat information, stöd för filöverföring
> 💡 **Bästa praxis**: Använd `GET` för sökformulär och filter (datahämtning), använd `POST` för användarregistrering, inloggning och dataskapande.
### Konfigurera formuläröverföring
Låt oss konfigurera ditt registreringsformulär för att kommunicera korrekt med backend-API:t med hjälp av POST-metoden:
```html
```
**Förstå den förbättrade valideringen:**
- **Kombinerar** indikatorer för obligatoriska fält med hjälpsamma beskrivningar
- **Inkluderar** `pattern`-attribut för formatvalidering
- **Tillhandahåller** `title`-attribut för tillgänglighet och verktygstips
- **Lägger till** hjälpt text för att vägleda användarinmatning
- **Använder** semantisk HTML-struktur för bättre tillgänglighet
### Avancerade valideringsregler
**Vad varje valideringsregel åstadkommer:**
| Fält | Valideringsregler | Användarfördel |
|------|-------------------|----------------|
| Användarnamn | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Säkerställer giltiga, unika identifierare |
| Valuta | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Accepterar vanliga valutasymboler |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Förhindrar negativa saldon |
| Beskrivning | `maxlength="100"` | Rimliga längdgränser |
### Testa valideringsbeteende
**Prova dessa valideringsscenarier:**
1. **Skicka in** formuläret med tomma obligatoriska fält
2. **Ange** ett användarnamn kortare än 3 tecken
3. **Försök** med specialtecken i användarnamnsfältet
4. **Mata in** ett negativt saldo

**Vad du kommer att observera:**
- **Webbläsaren visar** inbyggda valideringsmeddelanden
- **Stiländringar** baserade på `:valid` och `:invalid`-tillstånd
- **Formulärinlämning** förhindras tills alla valideringar passerar
- **Fokus flyttas automatiskt** till det första ogiltiga fältet
### Klient- vs servervalidering
```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
```
**Varför du behöver båda lagren:**
- **Klientvalidering**: Ger omedelbar feedback och förbättrar användarupplevelsen
- **Servervalidering**: Säkerställer säkerhet och hanterar komplexa affärsregler
- **Kombinerad metod**: Skapar robusta, användarvänliga och säkra applikationer
- **Progressiv förbättring**: Fungerar även när JavaScript är inaktiverat
> 🛡️ **Säkerhetspåminnelse**: Lita aldrig enbart på klientvalidering! Skadliga användare kan kringgå klientkontroller, så servervalidering är avgörande för säkerhet och dataintegritet.
---
---
## GitHub Copilot Agent Challenge 🚀
Använd Agent-läget för att slutföra följande utmaning:
**Beskrivning:** Förbättra registreringsformuläret med omfattande klientvalidering och användarfeedback. Denna utmaning hjälper dig att öva på formulärvalidering, felhantering och att förbättra användarupplevelsen med interaktiv feedback.
**Uppmaning:** Skapa ett komplett valideringssystem för registreringsformuläret som inkluderar: 1) Realtidsvalideringsfeedback för varje fält medan användaren skriver, 2) Anpassade valideringsmeddelanden som visas under varje inmatningsfält, 3) Ett lösenordsbekräftelsefält med matchande validering, 4) Visuella indikatorer (som gröna bockar för giltiga fält och röda varningar för ogiltiga), 5) En skicka-knapp som bara aktiveras när alla valideringar passerar. Använd HTML5-valideringsattribut, CSS för att styla valideringstillstånd och JavaScript för interaktivt beteende.
Läs mer om [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) här.
## 🚀 Utmaning
Visa ett felmeddelande i HTML om användaren redan finns.
Här är ett exempel på hur den slutliga inloggningssidan kan se ut efter lite styling:

## Quiz efter föreläsningen
[Quiz efter föreläsningen](https://ff-quizzes.netlify.app/web/quiz/44)
## Granskning & Självstudier
Utvecklare har blivit mycket kreativa när det gäller sina formulärbyggande insatser, särskilt när det gäller valideringsstrategier. Lär dig om olika formulärflöden genom att titta igenom [CodePen](https://codepen.com); kan du hitta några intressanta och inspirerande formulär?
## Uppgift
[Styla din bankapp](assignment.md)
---
**Ansvarsfriskrivning**:
Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.