# Construir uma Aplicação Bancária Parte 2: Construir um Formulário de Login e Registo
```mermaid
journey
title A Sua Jornada de Desenvolvimento de Formulários
section Fundamentos de HTML
Compreender elementos de formulário: 3: Student
Aprender tipos de input: 4: Student
Dominar acessibilidade: 4: Student
section Integração com JavaScript
Gerir submissão de formulários: 4: Student
Implementar comunicação AJAX: 5: Student
Processar respostas do servidor: 5: Student
section Sistemas de Validação
Criar validação em múltiplas camadas: 5: Student
Melhorar a experiência do utilizador: 5: Student
Assegurar integridade dos dados: 5: Student
```
## Questionário Pré-aula
[Questionário pré-aula](https://ff-quizzes.netlify.app/web/quiz/43)
Alguma vez preencheu um formulário online e este rejeitou o formato do seu email? Ou perdeu toda a sua informação quando clicou em submeter? Todos nós já passámos por essas experiências frustrantes.
Os formulários são a ponte entre os seus utilizadores e a funcionalidade da sua aplicação. Tal como os protocolos cuidadosos que os controladores de tráfego aéreo usam para guiar aviões em segurança até aos seus destinos, os formulários bem concebidos fornecem um feedback claro e evitam erros dispendiosos. Formulários maus, por outro lado, podem afastar os utilizadores mais rapidamente do que uma má comunicação num aeroporto movimentado.
Nesta aula, vamos transformar a sua app bancária estática numa aplicação interativa. Vai aprender a criar formulários que validam a entrada do utilizador, comunicam com servidores e fornecem feedback útil. Pense nisso como construir a interface de controlo que permite aos utilizadores navegar pelas funcionalidades da sua aplicação.
No final, terá um sistema completo de login e registo com validação que orienta os utilizadores para o sucesso em vez da frustração.
```mermaid
mindmap
root((Desenvolvimento de Formulários))
HTML Foundation
Elementos Semânticos
Tipos de Entrada
Acessibilidade
Associação de Etiquetas
User Experience
Feedback de Validação
Prevenção de Erros
Estados de Carregamento
Mensagens de Sucesso
JavaScript Integration
Gestão de Eventos
Comunicação AJAX
Processamento de Dados
Gestão de Erros
Validation Layers
Validação HTML5
Lógica do Lado do Cliente
Segurança do Lado do Servidor
Aperfeiçoamento Progressivo
Modern Patterns
Fetch API
Async/Await
Form Data API
Gestão de Promessas
```
## Pré-requisitos
Antes de começarmos a construir formulários, vamos garantir que tem tudo configurado corretamente. Esta lição retoma exatamente de onde parámos na anterior, por isso, se saltou essa parte, pode querer voltar atrás e fazer funcionar o básico primeiro.
### Configuração Necessária
| Componente | Estado | Descrição |
|-----------|--------|-------------|
| [Templates HTML](../1-template-route/README.md) | ✅ Obrigatório | A sua estrutura básica da app bancária |
| [Node.js](https://nodejs.org) | ✅ Obrigatório | Ambiente JavaScript para o servidor |
| [Servidor API Bancária](../api/README.md) | ✅ Obrigatório | Serviço backend para armazenamento de dados |
> 💡 **Dica de Desenvolvimento**: Vai correr dois servidores separados simultaneamente – um para o front-end da sua app bancária e outro para a API backend. Esta configuração espelha o desenvolvimento no mundo real, onde os serviços de frontend e backend funcionam independentemente.
### Configuração do Servidor
**O seu ambiente de desenvolvimento incluirá:**
- **Servidor frontend**: Serve a sua app bancária (tipicamente na porta `3000`)
- **Servidor API backend**: Trata o armazenamento e recuperação de dados (porta `5000`)
- **Ambos os servidores** podem correr simultaneamente sem conflitos
**Testar a ligação à sua API:**
```bash
curl http://localhost:5000/api
# Resposta esperada: "Bank API v1.0.0"
```
**Se vir a resposta da versão da API, está pronto para avançar!**
---
## Compreender Formulários HTML e Controlo
Os formulários HTML são a forma como os utilizadores comunicam com a sua aplicação web. Pense neles como o sistema de telégrafo que ligava lugares distantes no século XIX – são o protocolo de comunicação entre a intenção do utilizador e a resposta da aplicação. Quando desenhados com atenção, apanharem erros, orientam o formato de entrada e fornecem sugestões úteis.
Os formulários modernos são significativamente mais sofisticados do que simples inputs de texto. O HTML5 introduziu tipos de input especializados que tratam automaticamente a validação de email, formatação numérica e seleção de datas. Estas melhorias beneficiam tanto a acessibilidade como as experiências móveis.
### Elementos Essenciais do Formulário
**Blocos construtores que cada formulário precisa:**
```html
```
**Isto é o que este código faz:**
- **Cria** um contentor de formulário com um identificador único
- **Especifica** o método HTTP para submissão dos dados
- **Associa** labels aos inputs para acessibilidade
- **Define** um botão de submissão para processar o formulário
### Tipos e Atributos Modernos de Input
| Tipo de Input | Propósito | Exemplo de Uso |
|------------|---------|---------------|
| `text` | Entrada de texto geral | `` |
| `email` | Validação de email | `` |
| `password` | Entrada de texto oculta | `` |
| `number` | Entrada numérica | `` |
| `tel` | Números de telefone | `` |
> 💡 **Vantagem do HTML5 Moderno**: Usar tipos específicos de input fornece validação automática, teclados móveis apropriados e melhor suporte a acessibilidade sem JavaScript adicional!
### Tipos de Botões e Comportamento
```html
```
**Isto é o que cada tipo de botão faz:**
- **Botões de submit**: Disparam a submissão do formulário e enviam os dados para o endpoint especificado
- **Botões de reset**: Restauram todos os campos do formulário ao estado inicial
- **Botões normais**: Não têm comportamento padrão, exigindo JavaScript personalizado para funcionar
> ⚠️ **Nota Importante**: O elemento `` é auto-fechável e não necessita de uma tag de fecho. A boa prática moderna é escrever `` sem a barra.
### Construir o Seu Formulário de Login
Agora vamos criar um formulário de login prático que demonstra as práticas modernas de formulários HTML. Começaremos com uma estrutura básica e vamos melhorando com características de acessibilidade e validação.
```html
Bank App
Login
```
**Analisando o que acontece aqui:**
- **Estrutura** o formulário com elementos semânticos HTML5
- **Agrupa** elementos relacionados usando contentores `div` com classes significativas
- **Associa** labels aos inputs usando atributos `for` e `id`
- **Inclui** atributos modernos como `autocomplete` e `placeholder` para melhor UX
- **Adiciona** `novalidate` para tratar a validação com JavaScript em vez dos padrões do browser
### O Poder das Labels Apropriadas
**Porque é que as labels são importantes para o desenvolvimento web moderno:**
```mermaid
graph TD
A[Elemento de Etiqueta] --> B[Suporte a Leitores de Ecrã]
A --> C[Expansão do Alvo de Clique]
A --> D[Validação de Formulário]
A --> E[Benefícios SEO]
B --> F[Acessível a todos os utilizadores]
C --> G[Melhor experiência móvel]
D --> H[Mensagens de erro claras]
E --> I[Melhor posicionamento em pesquisas]
```
**O que as labels apropriadas conseguem:**
- **Permitem** que leitores de ecrã anunciem claramente os campos do formulário
- **Expandem** a área clicável (clicar no label foca o input)
- **Melhoram** a usabilidade móvel com alvos de toque maiores
- **Suportam** a validação do formulário com mensagens de erro significativas
- **Aumentam** o SEO ao fornecer significado semântico aos elementos do formulário
> 🎯 **Objetivo de Acessibilidade**: Cada input do formulário deve ter uma label associada. Esta prática simples torna os seus formulários utilizáveis por todos, incluindo utilizadores com deficiência, e melhora a experiência para todos os utilizadores.
### Criar o Formulário de Registo
O formulário de registo requer informação mais detalhada para criar uma conta completa de utilizador. Vamos construí-lo com funcionalidades modernas do HTML5 e acessibilidade melhorada.
```html
Register
```
**No exemplo acima, nós:**
- **Organizámos** cada campo em divs contentoras para melhor estilo e layout
- **Adicionámos** atributos `autocomplete` apropriados para suporte ao preenchimento automático do navegador
- **Incluímos** texto de placeholder útil para orientar a entrada do utilizador
- **Definimos** valores padrão sensatos usando o atributo `value`
- **Aplicámos** atributos de validação como `required`, `maxlength` e `min`
- **Usámos** `type="number"` para o campo de saldo com suporte a decimais
### Explorar Tipos e Comportamento de Input
**Tipos modernos de input fornecem funcionalidades avançadas:**
| Característica | Benefício | Exemplo |
|---------|---------|----------|
| `type="number"` | Teclado numérico em dispositivos móveis | Entrada mais fácil do saldo |
| `step="0.01"` | Controlo da precisão decimal | Permite cêntimos na moeda |
| `autocomplete` | Preenchimento automático do navegador | Preenchimento mais rápido do formulário |
| `placeholder` | Dicas contextuais | Orienta as expectativas do utilizador |
> 🎯 **Desafio de Acessibilidade**: Experimente navegar pelos formulários usando apenas o seu teclado! Use `Tab` para mover entre campos, `Space` para marcar caixas e `Enter` para submeter. Esta experiência ajuda a entender como utilizadores com leitores de ecrã interagem com os seus formulários.
### 🔄 **Verificação Pedagógica**
**Compreensão da Base dos Formulários**: Antes de implementar JavaScript, assegure-se de que compreende:
- ✅ Como o HTML semântico cria estruturas acessíveis de formulários
- ✅ Por que os tipos de input são importantes para teclados móveis e validação
- ✅ A relação entre labels e controlos do formulário
- ✅ Como os atributos do formulário afetam o comportamento padrão do browser
**Auto-teste Rápido**: O que acontece se submeter um formulário sem manipulação JavaScript?
*Resposta: O browser faz a submissão padrão, normalmente redirecionando para a URL da ação*
**Benefícios dos Formulários HTML5**: Os formulários modernos fornecem:
- **Validação incorporada**: Verificação automática do formato de email e números
- **Otimização para móvel**: Teclados apropriados para diferentes tipos de input
- **Acessibilidade**: Suporte a leitores de ecrã e navegação por teclado
- **Melhoria progressiva**: Funciona mesmo quando JavaScript está desativado
## Compreender Métodos de Submissão de Formulários
Quando alguém preenche o seu formulário e carrega em submeter, esses dados precisam de ir para algum lado – normalmente para um servidor que pode guardá-los. Existem algumas formas diferentes de o fazer, e saber qual usar pode poupar-lhe dores de cabeça mais tarde.
Vamos ver o que acontece de facto quando alguém carrega nesse botão de submeter.
### Comportamento Padrão do Formulário
Primeiro, observe o que acontece com a submissão básica do formulário:
**Teste os seus formulários atuais:**
1. Clique no botão *Registar* no seu formulário
2. Observe as mudanças na barra de endereço do navegador
3. Repare como a página recarrega e os dados aparecem na URL

### Comparação dos Métodos HTTP
```mermaid
graph TD
A[Envio de Formulário] --> B{Método HTTP}
B -->|GET| C[Dados na URL]
B -->|POST| D[Dados no Corpo do Pedido]
C --> E[Visível na barra de endereços]
C --> F[Tamanho de dados limitado]
C --> G[Marcável]
D --> H[Escondido da URL]
D --> I[Grande capacidade de dados]
D --> J[Mais seguro]
```
**Compreender as diferenças:**
| Método | Caso de Uso | Localização dos Dados | Nível de Segurança | Limite de Tamanho |
|--------|----------|---------------|----------------|-------------|
| `GET` | Consultas de pesquisa, filtros | Parâmetros na URL | Baixo (visível) | ~2000 caracteres |
| `POST` | Contas de utilizador, dados sensíveis | Corpo do pedido | Maior (oculto) | Sem limite prático |
**Compreender as diferenças fundamentais:**
- **GET**: Acrescenta os dados do formulário à URL como parâmetros de consulta (adequado para operações de pesquisa)
- **POST**: Inclui os dados no corpo do pedido (essencial para informações sensíveis)
- **Limitações do GET**: Restrições de tamanho, dados visíveis, histórico persistente no navegador
- **Vantagens do POST**: Grande capacidade de dados, proteção de privacidade, suporte a upload de ficheiros
> 💡 **Boa prática**: Use `GET` para formulários de pesquisa e filtros (recuperação de dados), use `POST` para registo de utilizadores, login e criação de dados.
### Configurar a Submissão do Formulário
Vamos configurar o seu formulário de registo para comunicar corretamente com a API backend usando o método POST:
```html
```
**Compreender a validação melhorada:**
- **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 introdução do utilizador
- **Usa** 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 Utilizador |
|-------|---------------------|-----------------------------|
| Nome de utilizador | `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 comuns de moeda |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Evita saldos negativos |
| Descrição | `maxlength="100"` | Limites razoáveis de comprimento |
### Testar o Comportamento da Validação
**Experimente estes cenários de validação:**
1. **Submeta** o formulário com campos obrigatórios vazios
2. **Introduza** um nome de utilizador com menos de 3 caracteres
3. **Tente** caracteres especiais no campo do nome de utilizador
4. **Introduza** um valor negativo no saldo

**O que irá observar:**
- **O navegador exibe** mensagens de validação nativas
- **Mudanças de estilo** baseadas nos estados `:valid` e `:invalid`
- **Submissão do formulário** é bloqueada até todas as validações passarem
- **O foco move-se automaticamente** para o primeiro campo inválido
### Validação no Cliente vs Validação no Servidor
```mermaid
graph LR
A[Validação do Lado do Cliente] --> B[Feedback Instantâneo]
A --> C[Melhor Experiência do Utilizador]
A --> D[Redução da Carga no Servidor]
E[Validação do Lado do Servidor] --> F[Segurança]
E --> G[Integridade dos Dados]
E --> H[Regras de Negócio]
A -.-> I[Ambos Necessários]
E -.-> I
```
**Porquê precisar de ambas as camadas:**
- **Validação no cliente**: Fornece feedback imediato e melhora a experiência do utilizador
- **Validação no servidor**: Garante segurança e lida com regras de negócio complexas
- **Abordagem combinada**: Cria aplicações robustas, amigáveis e seguras
- **Melhoria progressiva**: Funciona mesmo quando o JavaScript está desativado
> 🛡️ **Lembrete de Segurança**: Nunca confie apenas na validação do lado do cliente! Utilizadores maliciosos podem contornar essas validações, por isso a validação no servidor é essencial para segurança e integridade dos dados.
### ⚡ **O Que Pode Fazer Nos Próximos 5 Minutos**
- [ ] Testar o seu formulário com dados inválidos para ver as mensagens de validação
- [ ] Tentar submeter o formulário com JavaScript desativado para ver a validação HTML5
- [ ] Abrir as ferramentas de desenvolvimento do navegador e inspecionar dados do formulário enviados ao servidor
- [ ] Experimentar diferentes tipos de entrada para ver as alterações no teclado móvel
### 🎯 **O Que Pode Realizar Nesta Hora**
- [ ] Completar o questionário pós-aula e entender conceitos de manipulação de formulários
- [ ] Implementar o desafio de validação abrangente com feedback em tempo real
- [ ] Adicionar estilização CSS para criar formulários profissionais
- [ ] Criar tratamento de erro para nomes de utilizador duplicados e erros do servidor
- [ ] Adicionar campos de confirmação de password com validação de correspondência
### 📅 **A Sua Jornada de Domínio de Formulários ao Longo da Semana**
- [ ] Completar a aplicação bancária completa com funcionalidades avançadas de formulários
- [ ] Implementar capacidades de upload de ficheiros para fotos de perfil ou documentos
- [ ] Adicionar formulários multi-etapas com indicadores de progresso e gestão de estado
- [ ] Criar formulários dinâmicos que se adaptam com base nas seleções do utilizador
- [ ] Implementar autosave e recuperação de formulários para melhor experiência do utilizador
- [ ] Adicionar validação avançada como verificação de email e formatação de número de telefone
### 🌟 **O Seu Domínio do Desenvolvimento Frontend ao Longo do Mês**
- [ ] Construir aplicações complexas de formulários com lógica condicional e fluxos de trabalho
- [ ] Aprender bibliotecas e frameworks para desenvolvimento rápido de formulários
- [ ] Dominar guidelines de acessibilidade e princípios de design inclusivo
- [ ] Implementar internacionalização e localização para formulários globais
- [ ] Criar bibliotecas de componentes reutilizáveis e sistemas de design para formulários
- [ ] Contribuir para projetos open source de formulários e partilhar boas práticas
## 🎯 O Seu Cronograma de Domínio do Desenvolvimento de Formulários
```mermaid
timeline
title Desenvolvimento de Formulários & Progressão na Aprendizagem da Experiência do Utilizador
section Fundamentos de HTML (15 minutos)
Formulários Semânticos: Elementos de formulário
: Tipos de input
: Etiquetas e acessibilidade
: Aprimoramento progressivo
section Integração JavaScript (25 minutos)
Gestão de Eventos: Submissão de formulários
: Recolha de dados
: Comunicação AJAX
: Padrões async/await
section Sistemas de Validação (35 minutos)
Segurança Multi-camadas: Validação HTML5
: Lógica do lado cliente
: Verificação do lado servidor
: Gestão de erros
section Experiência do Utilizador (45 minutos)
Acabamento da Interface: Estados de carregamento
: Mensagens de sucesso
: Recuperação de erros
: Funcionalidades de acessibilidade
section Padrões Avançados (1 semana)
Formulários Profissionais: Validação dinâmica
: Fluxos de trabalho multi-etapas
: Upload de ficheiros
: Feedback em tempo real
section Competências Empresariais (1 mês)
Aplicações de Produção: Bibliotecas de formulários
: Estratégias de teste
: Otimização de desempenho
: Melhores práticas de segurança
```
### 🛠️ Resumo da Sua Caixa de Ferramentas para Desenvolvimento de Formulários
Após completar esta lição, dominou:
- **Formulários HTML5**: Estrutura semântica, tipos de entrada, e funcionalidades de acessibilidade
- **Manipulação de Formulários em JavaScript**: Gestão de eventos, recolha de dados e comunicação AJAX
- **Arquitetura de Validação**: Validação em múltiplas camadas para segurança e experiência do utilizador
- **Programação Assíncrona**: Fetch API moderna e padrões async/await
- **Gestão de Erros**: Tratamento abrangente de erros e sistemas de feedback ao utilizador
- **Design de Experiência do Utilizador**: Estados de carregamento, mensagens de sucesso, e recuperação de erros
- **Melhoria Progressiva**: Formulários que funcionam em todos os navegadores e capacidades
**Aplicações no Mundo Real**: As suas competências em desenvolvimento de formulários aplicam-se diretamente a:
- **Aplicações de Comércio Eletrónico**: Processos de checkout, registo de conta e formulários de pagamento
- **Software Empresarial**: Sistemas de inserção de dados, interfaces de relatórios e aplicações de fluxos de trabalho
- **Gestão de Conteúdos**: Plataformas de publicação, conteúdos gerados pelos utilizadores e interfaces administrativas
- **Aplicações Financeiras**: Interfaces bancárias, plataformas de investimento e sistemas de transação
- **Sistemas de Saúde**: Portais de pacientes, agendamento de consultas e formulários de registos médicos
- **Plataformas Educativas**: Registo de cursos, ferramentas de avaliação e gestão da aprendizagem
**Competências Profissionais Adquiridas**: Agora pode:
- **Projetar** formulários acessíveis que funcionam para todos os utilizadores, incluindo pessoas com deficiência
- **Implementar** validação segura de formulários que previne corrupção de dados e vulnerabilidades de segurança
- **Criar** interfaces responsivas que fornecem feedback claro e orientação
- **Depurar** interações complexas de formulários usando ferramentas de desenvolvimento de navegador e análise de rede
- **Otimizar** o desempenho dos formulários através de recolha eficiente de dados e estratégias de validação
**Conceitos de Desenvolvimento Frontend Dominados**:
- **Arquitetura Orientada a Eventos**: Gestão de interação do utilizador e sistemas de resposta
- **Programação Assíncrona**: Comunicação com servidor sem bloqueios e manipulação de erros
- **Validação de Dados**: Verificações de segurança e integridade no cliente e no servidor
- **Design de Experiência do Utilizador**: Interfaces intuitivas que guiam o utilizador para o sucesso
- **Engenharia de Acessibilidade**: Design inclusivo que funciona para necessidades diversas
**Próximo Nível**: Está pronto para explorar bibliotecas avançadas de formulários, implementar regras de validação complexas, ou construir sistemas empresariais de recolha de dados!
🌟 **Conquista Desbloqueada**: Construiu um sistema completo de manipulação de formulários com validação profissional, tratamento de erros e padrões de experiência do utilizador!
---
---
## Desafio GitHub Copilot Agent 🚀
Use o modo Agente para completar o seguinte desafio:
**Descrição:** Reforce o formulário de registo com validação abrangente do lado do cliente e feedback ao utilizador. Este desafio irá ajudá-lo a praticar validação de formulários, tratamento de erros e melhorar a experiência do utilizador com feedback interativo.
**Prompt:** Crie um sistema completo de validação de formulário para o formulário de registro que inclua: 1) Feedback de validação em tempo real para cada campo enquanto o utilizador escreve, 2) Mensagens de validação personalizadas que aparecem abaixo de cada campo de entrada, 3) Um campo de confirmação de palavra-passe com validação de correspondência, 4) Indicadores visuais (como marcas de verificação verdes para campos válidos e avisos vermelhos para inválidos), 5) Um botão de envio que só fica ativado quando todas as validações são aprovadas. Utilize 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
Mostre uma mensagem de erro no HTML se o utilizador já existir.
Aqui está um exemplo de como pode ficar a página de login final após alguma estilização:

## Quiz Pós-Lição
[Quiz pós-lição](https://ff-quizzes.netlify.app/web/quiz/44)
## Revisão & Autoestudo
Os programadores têm estado muito criativos nos seus esforços de construção de formulários, especialmente no que toca a estratégias de validação. Aprenda sobre diferentes fluxos de formulários explorando o [CodePen](https://codepen.com); consegue encontrar alguns formulários interessantes e inspiradores?
## Tarefa
[Estilize a sua app bancária](assignment.md)
---
**Aviso Legal**:
Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos por garantir a precisão, por favor tenha em consideração que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.