Aplicação de controle financeiro com autenticação JWT e MySQL.
- ✅ Autenticação de usuários com JWT
- ✅ Proteção de rotas com middleware
- ✅ Hash de senhas com bcrypt
- ✅ Redirecionamento automático
- ✅ Interface moderna com Tailwind CSS
- ✅ Sistema de perfis (admin/user)
- ✅ Gestão de Saldos - Visualizar e atualizar saldo pessoal
- ✅ Controle de Despesas - Adicionar, listar, filtrar e deletar despesas
- ✅ Gestão de Investimentos - Gerenciar portfólio de investimentos
- ✅ Dashboard Inteligente - Visão geral com estatísticas e gráficos
- ✅ Relatórios Financeiros - Análise de gastos e rendimentos
- ✅ Sistema de Categorias - Organização por categorias de despesas e tipos de investimentos
- Node.js 18+
- MySQL 8.0+
- npm ou yarn
cd finance_app
npm installExecute os comandos SQL do arquivo database_setup.sql no seu servidor MySQL:
mysql -u root -p < database_setup.sqlOu execute manualmente no MySQL Workbench/phpMyAdmin:
-- Criar banco de dados
CREATE DATABASE IF NOT EXISTS finance_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Usar o banco
USE finance_app;
-- Criar tabela usuarios
CREATE TABLE IF NOT EXISTS usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
senha_hash VARCHAR(255) NOT NULL,
perfil ENUM('admin', 'user') NOT NULL DEFAULT 'user',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Inserir usuários de teste
INSERT INTO usuarios (email, senha_hash, perfil) VALUES
('admin@finance.com', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin'),
('user@finance.com', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'user');Copie o arquivo .env.example para .env.local e ajuste as configurações:
cp .env.example .env.localEdite o arquivo .env.local com suas configurações:
DB_HOST=localhost
DB_USER=seu_usuario_mysql
DB_PASSWORD=sua_senha_mysql
DB_NAME=finance_app
DB_PORT=3306
JWT_SECRET=sua_chave_secreta_super_seguranpm run devA aplicação estará disponível em http://localhost:3000
- Admin:
admin@finance.com/ Senha:admin123 - User:
user@finance.com/ Senha:user123
finance_app/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── autentica/ # API de login
│ │ │ ├── cadastro/ # API de cadastro
│ │ │ ├── logout/ # API de logout
│ │ │ ├── balance/ # API de saldo
│ │ │ ├── expenses/ # API de despesas
│ │ │ └── investments/ # API de investimentos
│ │ ├── admin/ # Área administrativa
│ │ ├── balance/edit/ # Editar saldo
│ │ ├── cadastro/ # Página de cadastro
│ │ ├── dashboard/ # Dashboard principal
│ │ ├── expenses/ # Gestão de despesas
│ │ │ └── new/ # Nova despesa
│ │ ├── investments/ # Gestão de investimentos
│ │ │ └── new/ # Novo investimento
│ │ ├── sem_permissao/ # Página de acesso negado
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ └── page.tsx # Página de login
│ ├── components/ui/ # Componentes de interface
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ ├── input.tsx
│ │ ├── label.tsx
│ │ ├── select.tsx
│ │ └── textarea.tsx
│ ├── lib/
│ │ ├── models/ # Modelos TypeScript
│ │ │ ├── Balance.ts
│ │ │ ├── Expense.ts
│ │ │ └── Investment.ts
│ │ ├── auth.ts # Funções de autenticação
│ │ ├── database.ts # Configuração MySQL
│ │ ├── sanitize.ts # Funções de sanitização
│ │ └── session.ts # Gestão de sessões
│ └── middleware.ts # Middleware de proteção de rotas
├── database_setup.sql # Scripts SQL completos
└── README.md
- Senhas são hashadas com bcrypt
- JWT com expiração configurável
- Cookies HTTP-only para tokens
- Middleware de proteção de rotas
- Validação de entrada em todas as APIs
/- Página de login/cadastro- Página de cadastro/dashboard- Dashboard principal com visão geral/expenses- Listagem de despesas/expenses/new- Adicionar nova despesa/investments- Listagem de investimentos/investments/new- Adicionar novo investimento/balance/edit- Atualizar saldo/sem_permissao- Página de acesso negado
/admin- Área administrativa (apenas admins)
/api/autentica- API de autenticação (POST)/api/logout- API de logout (POST)/api/cadastro- API de cadastro (POST)/api/balance- API de saldo (GET, POST, PUT)/api/expenses- API de despesas (GET, POST, PUT, DELETE)/api/investments- API de investimentos (GET, POST, PUT, DELETE)
- Login (index
/)
- Usuário envia email/senha via formulário.
POST /api/autenticavalida credenciais no MySQL, gera JWT e seta cookie httpOnlyauth-token.- Em caso de sucesso, o cliente redireciona para
/dashboard. Em falha, exibe modal com mensagem amigável. - Após 5 tentativas falhas na mesma sessão/IP, a API bloqueia novas tentativas por 15 minutos.
- Middleware (
src/middleware.ts)
- Para páginas protegidas como
/dashboard, verifica a presença/expiração do token (decodificação leve no Edge). - Sem token válido: redireciona para
/(com?from=/dashboard). Se já está logado e acessar/, redireciona para/dashboard.
- Dashboard (
/dashboard)
- Server Component usa
requireAuth()que lê o cookie viacookies()(assíncrono) e valida o token. - Se inválido/expirado: redireciona para
/. - Exibe “Bem-vindo, {email}” com sanitização (escape HTML) para segurança.
- Logout
POST /api/logoutapaga o cookieauth-tokene redireciona para/.
- Cadastro (
/cadastro)
- Formulário cria novo usuário via
POST /api/cadastro(validações, bcrypt, email único). - Após sucesso, redireciona para a tela de login.
Para produção, certifique-se de:
- Alterar
JWT_SECRETpara uma chave segura - Configurar
NODE_ENV=production - Usar HTTPS
- Configurar um servidor MySQL seguro
- Implementar rate limiting
- Configurar logs de auditoria
- Visão geral do saldo, despesas e investimentos
- Estatísticas em tempo real com cálculos automáticos
- Cards informativos com dados financeiros
- Links diretos para adicionar novos itens
- Visualização do saldo atual
- Histórico de alterações
- Atualização manual do saldo
- Interface simples e intuitiva
- Listagem completa de todas as despesas
- Filtros por categoria, data e descrição
- Categorias predefinidas (Alimentação, Transporte, etc.)
- Cálculo automático de totais e médias
- Exclusão de despesas
- Portfólio completo de investimentos
- Diferentes tipos (Renda Fixa, Ações, Fundos, etc.)
- Cálculo automático de rentabilidade
- Acompanhamento de performance individual
- Estatísticas de lucro/prejuízo
- Design responsivo e atrativo
- Componentes reutilizáveis
- Feedback visual para todas as ações
- Navegação intuitiva
- Estados de carregamento e erro
- Autenticação JWT preservada
- Proteção de rotas para todas as novas páginas
- Validação de dados no frontend e backend
- Sanitização de inputs
- Controle de acesso por usuário
Este projeto é para fins educacionais.