# Criando um App Bancário Parte 2: Construindo um Formulário de Login e Registro
## Questionário Pré-Aula
[Questionário pré-aula](https://ff-quizzes.netlify.app/web/quiz/43)
Já preencheu um formulário online e teve seu e-mail rejeitado por estar no formato errado? Ou perdeu todas as informações ao clicar em enviar? Todos nós já passamos por essas experiências frustrantes.
Os formulários são a ponte entre os usuários e a funcionalidade do seu aplicativo. Assim como os protocolos cuidadosos que os controladores de tráfego aéreo usam para guiar aviões com segurança aos seus destinos, formulários bem projetados fornecem feedback claro e evitam erros custosos. Formulários mal feitos, por outro lado, podem afastar os usuários mais rápido do que uma falha de comunicação em um aeroporto movimentado.
Nesta lição, transformaremos seu aplicativo bancário estático em uma aplicação interativa. Você aprenderá a criar formulários que validam entradas de usuários, se comunicam com servidores e fornecem feedback útil. Pense nisso como construir a interface de controle que permite aos usuários navegar pelos recursos do seu aplicativo.
Ao final, você terá um sistema completo de login e registro com validação que guia os usuários para o sucesso, em vez de frustração.
## Pré-requisitos
Antes de começarmos a construir os formulários, vamos garantir que você tenha tudo configurado corretamente. Esta lição continua de onde paramos na anterior, então, se você pulou alguma parte, talvez queira voltar e garantir que os fundamentos estejam funcionando primeiro.
### Configuração Necessária
| Componente | Status | Descrição |
|------------|--------|-----------|
| [Templates HTML](../1-template-route/README.md) | ✅ Necessário | Estrutura básica do aplicativo bancário |
| [Node.js](https://nodejs.org) | ✅ Necessário | Ambiente de execução JavaScript para o servidor |
| [Servidor API Bancária](../api/README.md) | ✅ Necessário | Serviço de backend para armazenamento de dados |
> 💡 **Dica de Desenvolvimento**: Você estará executando dois servidores separados simultaneamente – um para o aplicativo bancário front-end e outro para a API de backend. Essa configuração reflete o desenvolvimento do mundo real, onde os serviços de front-end e backend operam de forma independente.
### Configuração do Servidor
**Seu ambiente de desenvolvimento incluirá:**
- **Servidor Frontend**: Serve seu aplicativo bancário (normalmente na porta `3000`)
- **Servidor API Backend**: Lida com armazenamento e recuperação de dados (porta `5000`)
- **Ambos os servidores** podem ser executados simultaneamente sem conflitos
**Testando sua conexão com a API:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Se você vir a resposta da versão da API, está pronto para prosseguir!**
---
## Entendendo Formulários e Controles HTML
Os formulários HTML são como os usuários se comunicam com seu aplicativo web. Pense neles como o sistema de telégrafo que conectava lugares distantes no século XIX – eles são o protocolo de comunicação entre a intenção do usuário e a resposta do aplicativo. Quando projetados com cuidado, eles capturam erros, orientam a formatação de entrada e fornecem sugestões úteis.
Os formulários modernos são significativamente mais sofisticados do que entradas de texto básicas. O HTML5 introduziu tipos de entrada especializados que lidam automaticamente com validação de e-mail, formatação de números e seleção de datas. Essas melhorias beneficiam tanto a acessibilidade quanto as experiências de usuários móveis.
### Elementos Essenciais de um Formulário
**Blocos de construção que todo formulário precisa:**
```html
```
**O que este código faz:**
- **Cria** um contêiner de formulário com um identificador único
- **Especifica** o método HTTP para envio de dados
- **Associa** rótulos às entradas para acessibilidade
- **Define** um botão de envio para processar o formulário
### Tipos de Entrada Modernos e Atributos
| Tipo de Entrada | Propósito | Exemplo de Uso |
|-----------------|-----------|----------------|
| `text` | Entrada de texto geral | `` |
| `email` | Validação de e-mail | `` |
| `password` | Entrada de texto oculta | `` |
| `number` | Entrada numérica | `` |
| `tel` | Números de telefone | `` |
> 💡 **Vantagem do HTML5 Moderno**: Usar tipos de entrada específicos fornece validação automática, teclados móveis apropriados e melhor suporte à acessibilidade sem necessidade de JavaScript adicional!
### Tipos de Botões e Comportamento
```html
```
**O que cada tipo de botão faz:**
- **Botões de envio**: Disparam o envio do formulário e enviam os dados para o endpoint especificado
- **Botões de reset**: Restauram todos os campos do formulário para seu estado inicial
- **Botões regulares**: Não possuem comportamento padrão, exigindo JavaScript personalizado para funcionalidade
> ⚠️ **Nota Importante**: O elemento `` é auto-fechado e não requer uma tag de fechamento. A prática moderna é escrever `` sem a barra.
### Construindo Seu Formulário de Login
Agora vamos criar um formulário de login prático que demonstra práticas modernas de formulários HTML. Começaremos com uma estrutura básica e gradualmente a aprimoraremos com recursos de acessibilidade e validação.
```html
Bank App
Login
```
**Desmembrando o que acontece aqui:**
- **Estrutura** o formulário com elementos semânticos do HTML5
- **Agrupa** elementos relacionados usando contêineres `div` com classes significativas
- **Associa** rótulos às entradas usando os atributos `for` e `id`
- **Inclui** atributos modernos como `autocomplete` e `placeholder` para melhor experiência do usuário
- **Adiciona** `novalidate` para lidar com validação usando JavaScript em vez dos padrões do navegador
### O Poder dos Rótulos Apropriados
**Por que os rótulos são importantes para o desenvolvimento web moderno:**
```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]
```
**O que os rótulos apropriados realizam:**
- **Permitem** que leitores de tela anunciem claramente os campos do formulário
- **Expandem** a área clicável (clicar no rótulo foca na entrada)
- **Melhoram** a usabilidade móvel com alvos de toque maiores
- **Apoiam** a validação do formulário com mensagens de erro significativas
- **Aprimoram** o SEO ao fornecer significado semântico aos elementos do formulário
> 🎯 **Objetivo de Acessibilidade**: Cada entrada de formulário deve ter um rótulo associado. Essa prática simples torna seus formulários utilizáveis por todos, incluindo usuários com deficiência, e melhora a experiência para todos os usuários.
### Criando o Formulário de Registro
O formulário de registro requer informações mais detalhadas para criar uma conta de usuário completa. Vamos construí-lo com recursos modernos do HTML5 e acessibilidade aprimorada.
```html
Register
```
**No código acima, nós:**
- **Organizamos** cada campo em divs de contêiner para melhor estilo e layout
- **Adicionamos** atributos `autocomplete` apropriados para suporte ao preenchimento automático do navegador
- **Incluímos** texto de placeholder útil para orientar a entrada do usuário
- **Definimos** padrões sensatos usando o atributo `value`
- **Aplicamos** atributos de validação como `required`, `maxlength` e `min`
- **Usamos** `type="number"` para o campo de saldo com suporte a decimais
### Explorando Tipos de Entrada e Comportamento
**Os tipos de entrada modernos oferecem funcionalidade aprimorada:**
| Recurso | Benefício | Exemplo |
|---------|-----------|---------|
| `type="number"` | Teclado numérico em dispositivos móveis | Entrada de saldo mais fácil |
| `step="0.01"` | Controle de precisão decimal | Permite centavos em valores monetários |
| `autocomplete` | Preenchimento automático do navegador | Completação mais rápida do formulário |
| `placeholder` | Dicas contextuais | Orienta as expectativas do usuário |
> 🎯 **Desafio de Acessibilidade**: Tente navegar pelos formulários usando apenas o teclado! Use `Tab` para mover entre os campos, `Espaço` para marcar caixas e `Enter` para enviar. Essa experiência ajuda a entender como os usuários de leitores de tela interagem com seus formulários.
## Entendendo Métodos de Envio de Formulários
Quando alguém preenche seu formulário e clica em enviar, esses dados precisam ir para algum lugar – geralmente para um servidor que pode armazená-los. Existem algumas maneiras diferentes de fazer isso, e saber qual usar pode evitar dores de cabeça no futuro.
Vamos dar uma olhada no que realmente acontece quando alguém clica no botão de envio.
### Comportamento Padrão do Formulário
Primeiro, vamos observar o que acontece com o envio básico de formulários:
**Teste seus formulários atuais:**
1. Clique no botão *Registrar* no seu formulário
2. Observe as mudanças na barra de endereço do seu navegador
3. Note como a página recarrega e os dados aparecem na URL

### Comparação de Métodos 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]
```
**Entendendo as diferenças:**
| Método | Caso de Uso | Localização dos Dados | Nível de Segurança | Limite de Tamanho |
|--------|-------------|-----------------------|--------------------|-------------------|
| `GET` | Consultas de busca, filtros | Parâmetros de URL | Baixo (visível) | ~2000 caracteres |
| `POST` | Contas de usuário, dados sensíveis | Corpo da requisição | Maior (oculto) | Sem limite prático |
**Entendendo as diferenças fundamentais:**
- **GET**: Adiciona os dados do formulário à URL como parâmetros de consulta (apropriado para operações de busca)
- **POST**: Inclui os dados no corpo da requisição (essencial para informações sensíveis)
- **Limitações do GET**: Restrições de tamanho, dados visíveis, histórico persistente do navegador
- **Vantagens do POST**: Grande capacidade de dados, proteção de privacidade, suporte a upload de arquivos
> 💡 **Melhor Prática**: Use `GET` para formulários de busca e filtros (recuperação de dados), use `POST` para registro de usuários, login e criação de dados.
### Configurando o Envio de Formulários
Vamos configurar seu formulário de registro para se comunicar corretamente com a API de backend usando o método POST:
```html
```
**Entendendo a validação aprimorada:**
- **Combina** indicadores de campos obrigatórios com descrições úteis
- **Inclui** atributos `pattern` para validação de formato
- **Fornece** atributos `title` para acessibilidade e dicas
- **Adiciona** texto auxiliar para orientar a entrada do usuário
- **Utiliza** estrutura HTML semântica para melhor acessibilidade
### Regras Avançadas de Validação
**O que cada regra de validação realiza:**
| Campo | Regras de Validação | Benefício para o Usuário |
|-------|---------------------|--------------------------|
| Nome de usuário | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Garante identificadores válidos e únicos |
| Moeda | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Aceita símbolos de moeda comuns |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Impede saldos negativos |
| Descrição | `maxlength="100"` | Limites de comprimento razoáveis |
### Testando o Comportamento de Validação
**Experimente esses cenários de validação:**
1. **Envie** o formulário com campos obrigatórios vazios
2. **Insira** um nome de usuário com menos de 3 caracteres
3. **Tente** caracteres especiais no campo de nome de usuário
4. **Digite** um valor de saldo negativo

**O que você observará:**
- **O navegador exibe** mensagens nativas de validação
- **Mudanças de estilo** baseadas nos estados `:valid` e `:invalid`
- **Envio do formulário** é impedido até que todas as validações sejam aprovadas
- **O foco se move automaticamente** para o primeiro campo inválido
### Validação no Cliente vs Validação no Servidor
```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
```
**Por que você precisa de ambas as camadas:**
- **Validação no cliente**: Fornece feedback imediato e melhora a experiência do usuário
- **Validação no servidor**: Garante segurança e lida com regras de negócios complexas
- **Abordagem combinada**: Cria aplicativos robustos, amigáveis e seguros
- **Aprimoramento progressivo**: Funciona mesmo quando o JavaScript está desativado
> 🛡️ **Lembrete de Segurança**: Nunca confie apenas na validação do lado do cliente! Usuários mal-intencionados podem ignorar verificações no cliente, então a validação no servidor é essencial para segurança e integridade dos dados.
---
---
## Desafio do Agente GitHub Copilot 🚀
Use o modo Agente para completar o seguinte desafio:
**Descrição:** Aprimore o formulário de registro com validação abrangente no cliente e feedback ao usuário. Este desafio ajudará você a praticar validação de formulários, tratamento de erros e melhoria da experiência do usuário com feedback interativo.
**Prompt:** Crie um sistema completo de validação de formulário para o registro que inclua: 1) Feedback de validação em tempo real para cada campo enquanto o usuário digita, 2) Mensagens de validação personalizadas que aparecem abaixo de cada campo de entrada, 3) Um campo de confirmação de senha com validação de correspondência, 4) Indicadores visuais (como marcas verdes para campos válidos e avisos vermelhos para inválidos), 5) Um botão de envio que só se torna habilitado quando todas as validações forem aprovadas. Use atributos de validação HTML5, CSS para estilizar os estados de validação e JavaScript para o comportamento interativo.
Saiba mais sobre o [modo agente](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) aqui.
## 🚀 Desafio
Exiba uma mensagem de erro no HTML se o usuário já existir.
Aqui está um exemplo de como a página de login final pode parecer após um pouco de estilização:

## Quiz Pós-Aula
[Quiz pós-aula](https://ff-quizzes.netlify.app/web/quiz/44)
## Revisão & Autoestudo
Os desenvolvedores têm sido muito criativos em seus esforços de construção de formulários, especialmente em relação às estratégias de validação. Aprenda sobre diferentes fluxos de formulários explorando o [CodePen](https://codepen.com); você consegue encontrar alguns formulários interessantes e inspiradores?
## Tarefa
[Estilize seu aplicativo bancário](assignment.md)
---
**Aviso Legal**:
Este documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.