Plataforma de e-commerce para merchandising, desenvolvida com Node.js, TypeScript, Express e MySQL.
Backend: Node.js · TypeScript · Express · MySQL 2 · bcryptjs · express-session · express-rate-limit · validator
Frontend: HTML5 · CSS3 · JavaScript (Vanilla) · Fetch API · ViaCEP API
SMG-Merch-Ecommerce/
├── backend/
│ ├── src/
│ │ ├── config/
│ │ │ └── limiters.ts # Rate limiting
│ │ ├── controllers/
│ │ │ ├── usuarioController.ts
│ │ │ ├── produtoController.ts
│ │ │ ├── pedidoController.ts
│ │ │ └── freteController.ts
│ │ ├── database/
│ │ │ └── index.ts # Pool de conexão MySQL
│ │ ├── middleware/
│ │ │ └── auth.ts # Autenticação e autorização
│ │ ├── routes/
│ │ │ ├── usuarioRoutes.ts
│ │ │ ├── produtoRoutes.ts
│ │ │ ├── pedidoRoutes.ts
│ │ │ └── freteRoutes.ts
│ │ ├── types/
│ │ │ └── index.ts
│ │ ├── utils/
│ │ │ └── validators.ts
│ │ └── server.ts
│ ├── database/
│ │ └── schema.sql # Schema do banco de dados
│ ├── .env.example
│ ├── .gitignore
│ ├── package.json
│ └── tsconfig.json
├── frontend/
│ ├── index.html # Página inicial
│ ├── auth.html # Login / Registro / Recuperação
│ ├── loja.html # Loja e carrinho
│ ├── admin.html # Painel administrativo
│ ├── cliente.html # Perfil do cliente
│ ├── css/
│ │ └── style.css
│ └── js/
│ ├── auth.js
│ ├── loja.js
│ ├── admin.js
│ └── cliente.js
├── start.bat # Inicialização Windows
├── start.sh # Inicialização Linux/Mac
└── .gitignore
- Node.js v18 ou superior
- MySQL Server 8.0 ou superior
mysql -u root -p < backend/database/schema.sqlOu abra o arquivo backend/database/schema.sql no MySQL Workbench e execute.
cp backend/.env.example backend/.envEdite backend/.env com suas credenciais:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=sua_senha_aqui
DB_NAME=smg_merch
DB_PORT=3306
PORT=3000
NODE_ENV=development
# Gere uma chave segura:
# node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
SESSION_SECRET=chave_longa_e_aleatoria_aqui
# DomĂnio do frontend em produção
CORS_ORIGIN=http://localhost:3000cd backend
npm install
npm run dev # desenvolvimento (ts-node)Para produção:
npm run build # compila TypeScript para dist/
npm start # executa o compiladoO servidor ficará disponĂvel em http://localhost:3000
Windows: execute start.bat
Linux/Mac:
chmod +x start.sh && ./start.shApĂłs criar o banco, gere o hash bcrypt da sua senha e insira no banco:
node -e "const b=require('bcryptjs'); b.hash('SUA_SENHA',10).then(h=>console.log(h))"INSERT INTO usuarios (usuario, senha, email)
VALUES ('admin', '<hash_gerado_acima>', 'admin@seudominio.com');| Rota | Descrição | Acesso |
|---|---|---|
/ |
Página inicial | Público |
/auth |
Login, registro e recuperação de senha | Público |
/loja |
Catálogo de produtos e carrinho | Público |
/cliente |
Perfil do usuário logado | Autenticado |
/admin |
Painel administrativo | Admin |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
POST |
/api/usuarios/login |
Fazer login | PĂşblico |
POST |
/api/usuarios/registrar |
Registrar conta | PĂşblico |
POST |
/api/usuarios/logout |
Encerrar sessĂŁo | Autenticado |
GET |
/api/usuarios/me |
Dados do usuário atual | Autenticado |
POST |
/api/usuarios/alterar-senha |
Alterar prĂłpria senha | Autenticado |
PUT |
/api/usuarios/perfil/atualizar |
Atualizar e-mail | Autenticado |
POST |
/api/usuarios/recuperar-senha |
Solicitar recuperação | Público |
POST |
/api/usuarios/resetar-senha |
Redefinir senha | PĂşblico |
GET |
/api/auth/status |
Verificar se está logado | Público |
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/usuarios |
Listar todos os usuários |
PUT |
/api/usuarios/:id |
Atualizar usuário |
DELETE |
/api/usuarios/:id |
Deletar usuário |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
GET |
/api/produtos |
Listar todos | PĂşblico |
GET |
/api/produtos/:id |
Obter um produto | PĂşblico |
POST |
/api/produtos |
Criar produto | Admin |
PUT |
/api/produtos/:id |
Atualizar produto | Admin |
DELETE |
/api/produtos/:id |
Deletar produto | Admin |
| Método | Rota | Descrição | Acesso |
|---|---|---|---|
POST |
/api/pedidos |
Criar pedido | PĂşblico |
GET |
/api/pedidos/meus-pedidos |
Meus pedidos | Autenticado |
GET |
/api/pedidos |
Todos os pedidos | Admin |
GET |
/api/pedidos/:id |
Detalhe do pedido | Autenticado |
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/frete/calcular |
Calcular frete por CEP |
Login:
POST /api/usuarios/login
{ "usuario": "seu_usuario", "senha": "sua_senha" }Criar produto (admin):
POST /api/produtos
{ "nome": "Camiseta SMG", "preco": 89.90, "img": "https://...", "tamanhos": { "P": 10, "M": 15, "G": 8 } }Finalizar pedido:
POST /api/pedidos
{ "produtos": [{ "id": 1, "tamanho": "M", "quantidade": 2 }] }Calcular frete:
POST /api/frete/calcular
{ "cep": "01310100", "peso": 5 }| Campo | Tipo | Descrição |
|---|---|---|
id |
INT PK | Identificador |
usuario |
VARCHAR(50) UNIQUE | Nome de usuário |
senha |
VARCHAR(255) | Hash bcrypt |
cpf |
VARCHAR(20) | CPF |
email |
VARCHAR(100) | |
created_at |
TIMESTAMP | Data de criação |
| Campo | Tipo | Descrição |
|---|---|---|
id |
INT PK | Identificador |
nome |
VARCHAR(100) | Nome do produto |
preco |
DECIMAL(10,2) | Preço |
img |
TEXT | URL da imagem |
tamanhos |
JSON | Estoque por tamanho {"P":0,"M":0,"G":0} |
| Campo | Tipo | Descrição |
|---|---|---|
id |
INT PK | Identificador |
usuario |
VARCHAR(50) | Nome do usuário |
produtos |
JSON | Itens do pedido |
total |
DECIMAL(10,2) | Valor total |
data |
TIMESTAMP | Data do pedido |
| Recurso | Implementação |
|---|---|
| Hash de senhas | bcryptjs com 10 rounds |
| Sessões | HttpOnly cookies, 24h de duração |
| Rate limiting global | 100 req / 15 min por IP |
| Rate limiting login | 5 tentativas / 15 min por IP |
| CORS | Restrito Ă origem configurada em CORS_ORIGIN |
| SQL Injection | Queries parametrizadas (mysql2) |
| Validação de entrada | Classe Validators com 12 validadores |
| Erros em produção | Mensagens genéricas (detalhes ocultados) |
| Variáveis sensĂveis | .env nunca commitado |
Checklist antes de ir para produção:
-
NODE_ENV=production -
SESSION_SECRETcom chave aleatĂłria longa -
CORS_ORIGINcom domĂnio real - HTTPS/SSL configurado no servidor
- Alterar senha do usuário admin padrão
Erro de conexĂŁo ao MySQL
- Verifique se o MySQL está rodando
- Confirme usuário, senha e porta no
backend/.env - Verifique se o banco
smg_merchfoi criado
SessĂŁo nĂŁo persiste
- Certifique-se que
SESSION_SECRETestá definido no.env - Limpe os cookies do navegador
Porta 3000 já está em uso
- Altere
PORTnobackend/.env
npm install falha
- Delete
backend/node_modules/e execute novamente
TypeScript nĂŁo compila
- Verifique se está dentro da pasta
backend/ - Execute
npx tsc --noEmitpara ver os erros
Execute dentro da pasta backend/:
npm run dev # Inicia com ts-node (desenvolvimento)
npm run build # Compila TypeScript para dist/
npm start # Executa o build compilado
npm run watch # Recompila automaticamente ao salvarCaique Crepaldi — 2026