# Създаване на банково приложение, част 2: Създаване на форма за вход и регистрация
## Предварителен тест
[Предварителен тест](https://ff-quizzes.netlify.app/web/quiz/43)
Случвало ли ви се е да попълните онлайн форма и тя да отхвърли формата на вашия имейл? Или да загубите цялата информация, когато натиснете „Изпрати“? Всички сме се сблъсквали с тези разочароващи ситуации.
Формите са мостът между вашите потребители и функционалността на вашето приложение. Подобно на внимателните протоколи, които авиодиспечерите използват, за да насочват самолетите безопасно към техните дестинации, добре проектираните форми предоставят ясна обратна връзка и предотвратяват скъпи грешки. Лошо проектираните форми, от друга страна, могат да отблъснат потребителите по-бързо от недоразумение на натоварено летище.
В този урок ще трансформираме вашето статично банково приложение в интерактивно приложение. Ще научите как да създавате форми, които валидират потребителския вход, комуникират със сървъри и предоставят полезна обратна връзка. Помислете за това като за изграждане на контролен интерфейс, който позволява на потребителите да навигират функциите на вашето приложение.
До края ще имате пълна система за вход и регистрация с валидиране, която насочва потребителите към успех, вместо към разочарование.
## Предпоставки
Преди да започнем със създаването на форми, нека се уверим, че всичко е настроено правилно. Този урок продължава точно там, където спряхме в предишния, така че ако сте пропуснали напред, може да искате да се върнете и първо да настроите основите.
### Необходима настройка
| Компонент | Статус | Описание |
|-----------|--------|-------------|
| [HTML шаблони](../1-template-route/README.md) | ✅ Задължително | Основната структура на вашето банково приложение |
| [Node.js](https://nodejs.org) | ✅ Задължително | JavaScript среда за сървъра |
| [Bank API Server](../api/README.md) | ✅ Задължително | Бекенд услуга за съхранение на данни |
> 💡 **Съвет за разработка**: Ще стартирате два отделни сървъра едновременно – един за вашето фронтенд банково приложение и друг за бекенд API. Тази настройка отразява реалната разработка, където фронтенд и бекенд услуги работят независимо.
### Конфигурация на сървъра
**Вашата среда за разработка ще включва:**
- **Фронтенд сървър**: Обслужва вашето банково приложение (обикновено порт `3000`)
- **Бекенд API сървър**: Обработва съхранението и извличането на данни (порт `5000`)
- **И двата сървъра** могат да работят едновременно без конфликти
**Тестване на връзката с вашия API:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Ако видите отговор за версията на API, сте готови да продължите!**
---
## Разбиране на HTML форми и контроли
HTML формите са начинът, по който потребителите комуникират с вашето уеб приложение. Помислете за тях като за телеграфната система, която свързваше отдалечени места през 19-ти век – те са комуникационният протокол между намеренията на потребителя и отговора на приложението. Когато са проектирани внимателно, те улавят грешки, насочват форматирането на входа и предоставят полезни предложения.
Съвременните форми са значително по-усъвършенствани от основните текстови входове. HTML5 въведе специализирани типове вход, които автоматично обработват валидирането на имейли, форматирането на числа и избора на дати. Тези подобрения са от полза както за достъпността, така и за мобилното потребителско изживяване.
### Основни елементи на формата
**Строителни блокове, които всяка форма трябва да има:**
```html
```
**Какво прави този код:**
- **Създава** контейнер за форма с уникален идентификатор
- **Определя** HTTP метода за подаване на данни
- **Свързва** етикети с входове за достъпност
- **Определя** бутон за изпращане за обработка на формата
### Съвременни типове вход и атрибути
| Тип вход | Цел | Пример за употреба |
|----------|-----|--------------------|
| `text` | Общ текстов вход | `` |
| `email` | Валидиране на имейл | `` |
| `password` | Скрит текстов вход | `` |
| `number` | Числов вход | `` |
| `tel` | Телефонни номера | `` |
> 💡 **Предимство на съвременния HTML5**: Използването на специфични типове вход предоставя автоматично валидиране, подходящи мобилни клавиатури и по-добра поддръжка за достъпност без допълнителен JavaScript!
### Типове бутони и тяхното поведение
```html
```
**Какво прави всеки тип бутон:**
- **Бутон за изпращане**: Задейства подаването на формата и изпраща данни към посочената крайна точка
- **Бутон за нулиране**: Възстановява всички полета на формата до първоначалното им състояние
- **Обикновен бутон**: Не предоставя стандартно поведение, изисква персонализиран 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` за поддръжка на автоматично попълване от браузъра
- **Включили** полезен текст за подсказка, който да насочва потребителския вход
- **Задавали** разумни стойности по подразбиране, използвайки атрибута `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` за регистрация на потребители, вход и създаване на данни.
### Конфигуриране на подаването на форма
Нека конфигурираме вашата форма за регистрация, за да комуникира правилно с бекенд 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`
- **Изпращането на формата** се предотвратява, докато всички валидации не преминат
- **Фокусът автоматично** се премества към първото невалидно поле
### Клиентска срещу сървърна валидация
```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
```
**Защо са необходими и двата слоя:**
- **Клиентска валидация**: Осигурява незабавна обратна връзка и подобрява потребителското изживяване
- **Сървърна валидация**: Гарантира сигурност и обработва сложни бизнес правила
- **Комбиниран подход**: Създава надеждни, удобни за потребителя и сигурни приложения
- **Прогресивно подобрение**: Работи дори когато JavaScript е деактивиран
> 🛡️ **Напомняне за сигурност**: Никога не се доверявайте само на клиентската валидация! Злонамерени потребители могат да я заобиколят, затова сървърната валидация е от съществено значение за сигурността и интегритета на данните.
---
---
## Предизвикателство с 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)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.