Plataforma para captacao de leads, gestao de produtos e administracao de vendedores. O projeto tem landing page publica, dashboard administrativo, autenticacao JWT e upload de imagens com galeria por produto.
- Front-end de producao: https://stylodesigner.vercel.app/index.html
- API de producao: https://stylodesigner.alwaysdata.net/api
- Uploads de producao: https://stylodesigner.alwaysdata.net/uploads
- Landing page publica com catalogo de produtos.
- Cards de produto com multiplas imagens em carrossel, autoplay e navegacao por setas.
- Dashboard com CRUD de produtos, leads e vendedores.
- Produto com galeria de imagens, remocao de imagens existentes e substituicao por novas imagens.
- Biblioteca de midia no backend para rastrear arquivos enviados.
- Validacao de dados com Zod.
- Autenticacao de areas administrativas com JWT.
- Backend: Node.js, Express 5, MongoDB/Mongoose, Multer, Zod, JWT, Helmet, CORS.
- Frontend: HTML, CSS e JavaScript em componentes nativos.
- Testes manuais/API: Postman.
backend/
src/
frontend/
postman/
Na raiz do projeto, rode:
npm run startEsse comando sobe a API local e serve tambem o frontend pelo mesmo processo:
- frontend:
http://localhost:5000/index.html - dashboard:
http://localhost:5000/dashboard.html - backend:
http://localhost:5000/api
Se quiser acompanhar os logs em tempo real durante o desenvolvimento, use:
npm run devPara encerrar qualquer um dos dois, use Ctrl + C.
cd backend
npm installCrie o arquivo backend/.env com um conteudo parecido com este:
PORT=5000
IP=0.0.0.0
MONGODB_URI=mongodb://localhost:27017/papelaria
ENABLE_AGENT_DEBUG=falseSuba a API:
npm run devAPI local:
http://localhost:5000/api- uploads locais:
http://localhost:5000/uploads
Sirva a pasta frontend/ com Live Server, Vite static preview ou qualquer servidor HTTP simples. Em desenvolvimento, o frontend ja aponta para http://localhost:5000/api quando aberto em localhost ou 127.0.0.1.
Exemplo com VS Code Live Server:
- abra
frontend/index.html - abra
frontend/dashboard.html
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| GET | /api |
Nao | Health basico da API |
| GET | /api/health |
Nao | Estado da API, Mongo e pasta de uploads |
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| POST | /api/login |
Nao | Login do vendedor/dono e retorno do token JWT |
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| GET | /api/produtos |
Nao | Lista produtos ativos para o catalogo |
| GET | /api/produtos?admin=true |
Nao | Lista produtos para administracao |
| POST | /api/produtos |
Sim | Cria produto com multipart/form-data |
| PUT | /api/produtos/:id |
Sim | Atualiza produto e gerencia galeria |
| DELETE | /api/produtos/:id |
Sim | Exclui produto e arquivos associados |
Campos aceitos no cadastro/edicao de produto:
nomecategoriaprecoBaseprazoProducaoDiasdescricaoimagempara uma capa enviada como arquivoimagenspara multiplos arquivos ou URLs ja existentes mantidas na galeria
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| GET | /api/media |
Sim | Lista itens da biblioteca de midia |
| POST | /api/media |
Sim | Envia imagens para a biblioteca com imagens[] |
| DELETE | /api/media/:id |
Sim | Remove item da biblioteca e arquivo fisico |
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| GET | /api/leads |
Sim | Lista leads com paginacao, busca e ordenacao |
| POST | /api/leads |
Nao | Cria lead publico |
| GET | /api/leads/hoje |
Nao | Busca eventos/aniversarios do dia |
| GET | /api/leads/:id |
Sim | Busca um lead |
| PUT | /api/leads/:id |
Sim | Atualiza um lead |
| DELETE | /api/leads/:id |
Sim | Remove um lead |
| Metodo | Rota | Auth | Descricao |
|---|---|---|---|
| GET | /api/vendedores |
Sim | Lista vendedores |
| POST | /api/vendedores |
Nao | Cadastra o dono/vendedor inicial |
| GET | /api/vendedores/:id |
Sim | Busca um vendedor |
| PUT | /api/vendedores/:id |
Sim | Atualiza um vendedor |
| DELETE | /api/vendedores/:id |
Sim | Remove um vendedor |
- O card do produto suporta multiplas imagens.
- O catalogo usa a primeira imagem como slide inicial.
- Se o produto tiver mais de uma imagem, o card mostra:
- setas de navegacao
- indicadores
- autoplay automatico
No formulario de produto agora e possivel:
- selecionar varias imagens novas
- remover imagens atuais antes de salvar
- remover imagens novas antes do envio
- manter parte da galeria e substituir o resto
descricaodo produto: minimo de 10 caracteres.nomedo produto: minimo de 3 caracteres.categoriado produto: minimo de 2 caracteres.precoBase: numero positivo.prazoProducaoDias: inteiro maior ou igual a 0.
Os arquivos recomendados para testes ficam em postman/:
- PI.postman_collection.json
- PI.local.postman_environment.json
- PI.producao.postman_environment.json
- README.md
Fluxo recomendado no Postman:
- Importar a collection e um dos environments.
- Rodar
Health > Health. - Rodar
Auth > Login. - Rodar os requests autenticados de produtos, midia, leads e vendedores.
apiBaseUrl = http://localhost:5000/apiuploadsBaseUrl = http://localhost:5000/uploads
apiBaseUrl = https://stylodesigner.alwaysdata.net/apiuploadsBaseUrl = https://stylodesigner.alwaysdata.net/uploads
O repositório agora inclui um workflow do GitHub Actions em deploy-alwaysdata.yml.
Esse workflow:
- roda em
pushparamain - sincroniza o projeto no AlwaysData via FTP
- reinicia o site Node.js pela API do AlwaysData
Os secrets necessários estão documentados em alwaysdata-secrets.md.
Observacao:
- esse fluxo automatiza bem alteracoes de codigo e arquivos estaticos;
- se
backend/package.jsonmudar, o servidor pode precisar de instalacao manual de dependencias.
- A rota de login real e
/api/login, nao/api/auth/login. - O frontend carrega imagens do mesmo host da API correspondente ao ambiente.
- Em edicao de produto, a remocao de todas as imagens tambem e suportada.