Sistema completo de controle de almoxarifado, ferramentas, EPIs, veículos e obras para a empresa Manske.
Frontend React + Backend Node.js + PostgreSQL
- ✅ Frontend completo (React + TypeScript + Tailwind)
- ✅ Backend API REST (Express + Prisma)
- ✅ Banco de dados PostgreSQL (schema completo com 15 tabelas)
- ✅ Autenticação JWT (login, registro, sessão persistente)
- ✅ Validação de dados (Zod em todas as rotas)
- ✅ Tratamento de erros centralizado
- ✅ API Client no frontend com React Query
- ✅ Seed com dados de exemplo
- Node.js 18+
- PostgreSQL 14+ instalado e rodando
- npm (vem com Node.js)
npm installCrie o banco no PostgreSQL:
CREATE DATABASE gestao_obras;Copie o exemplo e ajuste a senha:
cp .env.example .envEdite o .env:
DATABASE_URL="postgresql://postgres:SUA_SENHA@localhost:5432/gestao_obras?schema=public"
PORT=3001
JWT_SECRET="gere_uma_chave_secreta_forte_aqui"npm run db:pushnpm run db:seednpm run serverO servidor roda em http://localhost:3001
npm run devO app abre em http://localhost:5173
- Email:
admin@manske.com.br - Senha:
admin123
├── src/ # Frontend React
│ ├── components/ # Componentes reutilizáveis
│ │ ├── ui/ # Shadcn/UI (botões, inputs, etc.)
│ │ ├── AppLayout.tsx # Layout principal com sidebar
│ │ ├── AppSidebar.tsx # Menu lateral
│ │ └── ...
│ ├── contexts/
│ │ └── AuthContext.tsx # Autenticação (JWT + localStorage)
│ ├── hooks/
│ │ ├── useApi.ts # React Query hooks (CRUD)
│ │ └── use-toast.ts # Notificações
│ ├── lib/
│ │ ├── api.ts # API Client (fetch + token)
│ │ ├── formatters.ts # Formatação BRL, datas
│ │ └── utils.ts # Utilitários
│ ├── pages/ # Páginas da aplicação
│ │ ├── Dashboard.tsx # KPIs, gráficos, alertas
│ │ ├── Insumos.tsx # Materiais de consumo
│ │ ├── Ferramentas.tsx # Patrimônio de ferramentas
│ │ ├── Obras.tsx # Obras ativas/concluídas
│ │ ├── Funcionarios.tsx # Cadastro de funcionários
│ │ ├── Fornecedores.tsx # Fornecedores com avaliação
│ │ ├── EPIs.tsx # Equipamentos de proteção
│ │ ├── Veiculos.tsx # Frota de veículos
│ │ ├── QRCodes.tsx # Geração de QR codes
│ │ └── Login.tsx # Tela de login
│ └── types/
│ └── index.ts # Tipos TypeScript compartilhados
│
├── server/ # Backend Node.js
│ ├── index.ts # Express app (entry point)
│ ├── lib/
│ │ └── prisma.ts # Singleton do PrismaClient
│ ├── middleware/
│ │ ├── auth.ts # JWT middleware
│ │ ├── asyncHandler.ts # Wrapper para erros async
│ │ └── errorHandler.ts # Error handler centralizado
│ ├── routes/
│ │ ├── auth.ts # Login, registro, /me
│ │ ├── items.ts # Insumos + Ferramentas
│ │ ├── employees.ts # Funcionários
│ │ ├── constructionSites.ts # Obras
│ │ ├── suppliers.ts # Fornecedores
│ │ ├── vehicles.ts # Veículos
│ │ ├── ppes.ts # EPIs + Entregas
│ │ └── movements.ts # Movimentações de estoque
│ ├── validators/ # Schemas Zod (validação)
│ │ ├── auth.schema.ts
│ │ ├── items.schema.ts
│ │ ├── employees.schema.ts
│ │ ├── constructionSites.schema.ts
│ │ ├── suppliers.schema.ts
│ │ ├── vehicles.schema.ts
│ │ ├── ppes.schema.ts
│ │ └── movements.schema.ts
│ ├── types/
│ │ └── express.d.ts # Type augmentation
│ ├── seed.ts # Dados iniciais
│ └── README.md # Guia do backend + migração
│
├── prisma/
│ └── schema.prisma # Schema do banco (15 tabelas)
├── .env.example # Template de variáveis
└── package.json # Scripts e dependências
| Tabela | Descrição |
|---|---|
Company |
Empresas cadastradas |
User |
Usuários do sistema (login) |
Item |
Insumos e ferramentas |
Movement |
Entradas/saídas de estoque |
ConstructionSite |
Obras |
Employee |
Funcionários |
Supplier |
Fornecedores |
PriceQuote |
Cotações de preço |
PPE |
EPIs cadastrados |
PPEDelivery |
Entregas de EPI |
ToolCheckout |
Retiradas de ferramentas |
MaintenanceRecord |
Manutenção de ferramentas |
Vehicle |
Veículos da frota |
VehicleMaintenance |
Manutenções de veículos |
VehicleUsage |
Uso de veículos |
DriverLog |
Diário de bordo |
npm run db:push # Sincroniza schema → banco
npm run db:migrate # Cria migration formal (versionada)
npm run db:seed # Popula com dados de exemplo
npm run db:studio # Interface visual (abre no browser)- Método: JWT (JSON Web Token)
- Expiração: 7 dias
- Hash de senha: bcrypt (10 rounds)
- Persistência: localStorage no frontend
- Restauração: ao recarregar, verifica token via
/api/auth/me
| Método | Rota | Descrição |
|---|---|---|
| POST | /api/auth/login |
Login (retorna token + user) |
| POST | /api/auth/register |
Criar usuário |
| GET | /api/auth/me |
Dados do usuário logado (protegido) |
Base URL: http://localhost:3001/api
| Recurso | GET (listar) | GET (detalhe) | POST | PUT | DELETE |
|---|---|---|---|---|---|
| Items | /items |
/items/:id |
/items |
/items/:id |
/items/:id |
| Employees | /employees |
/employees/:id |
/employees |
/employees/:id |
/employees/:id |
| Sites | /construction-sites |
.../:id |
... |
.../:id |
.../:id |
| Suppliers | /suppliers |
.../:id |
... |
.../:id |
.../:id |
| Vehicles | /vehicles |
.../:id |
... |
.../:id |
.../:id |
| PPEs | /ppes |
.../:id |
... |
.../:id |
.../:id |
| Movements | /movements |
— | /movements |
— | .../:id |
GET /items?type=insumo— filtrar por tipoGET /items?companyId=manske— filtrar por empresaGET /construction-sites?status=ativa— filtrar por statusGET /movements?itemId=xxx&type=entrada— filtrar movimentações
| Módulo | Funcionalidades |
|---|---|
| Dashboard | KPIs, gráficos (Recharts), alertas de vencimento, estoque baixo |
| Insumos | CRUD, estoque mínimo, movimentações entrada/saída |
| Ferramentas | Patrimônio, status, retirada/devolução, manutenção |
| Obras | Cadastro com endereço, status ativa/concluída |
| Funcionários | Cadastro, CNH (categoria + vencimento), alertas |
| Fornecedores | CNPJ, categorias, avaliação 1-5 estrelas, cotações |
| EPIs | CA, validade, estoque, entregas com assinatura digital |
| Veículos | Placa, km, documentos, seguro, manutenção, diário |
| QR Codes | Geração para identificação de ferramentas |
| Tecnologia | Uso |
|---|---|
| Vite | Build tool |
| React 18 | UI framework |
| TypeScript | Tipagem estática |
| Tailwind CSS | Estilização |
| Shadcn/UI | Componentes acessíveis |
| React Query | Cache e sync de dados |
| React Router | Navegação SPA |
| Recharts | Gráficos |
| Zod | Validação de formulários |
| date-fns | Manipulação de datas |
| Tecnologia | Uso |
|---|---|
| Express | HTTP server |
| Prisma | ORM + migrations |
| PostgreSQL | Banco relacional |
| Zod | Validação de input |
| bcryptjs | Hash de senhas |
| jsonwebtoken | Autenticação JWT |
| tsx | Runtime TypeScript |
Consulte o guia completo em server/README.md.
- Instale PostgreSQL no servidor Windows
- Crie o banco
gestao_obras - Exporte o banco local:
pg_dump -U postgres -d gestao_obras -f backup.sql - Importe no servidor:
psql -U postgres -d gestao_obras -f backup.sql - Configure o
.envcom a senha do servidor - Rode
npm run server(ou use PM2 para manter rodando) - Faça
npm run builde sirva odist/com Nginx ou IIS
Arquivo backup.bat agendado no Task Scheduler (detalhes em server/README.md).
# Frontend
npm run dev # Servidor de desenvolvimento (Vite)
npm run build # Build de produção
npm run preview # Preview do build
npm run lint # ESLint
# Backend
npm run server # Inicia o Express com tsx
# Banco de dados
npm run db:push # Sincroniza schema com banco
npm run db:migrate # Cria migration versionada
npm run db:seed # Popula dados de exemplo
npm run db:studio # Interface visual do Prisma
# Testes
npm run test # Roda testes (vitest)| Decisão | Motivo |
|---|---|
| PostgreSQL (não MySQL) | Já familiar via Supabase, sem limites, melhor para JSON/arrays |
| Prisma (não Drizzle) | Migrations automáticas, studio visual, tipagem excelente |
| Express (não Fastify) | Ecossistema maduro, mais tutoriais, middleware abundante |
| JWT (não sessions) | Stateless, funciona com mobile futuro, fácil de escalar |
| Zod (não Joi) | Já usado no frontend, inferência de tipos TypeScript |
| React Query (não Redux) | Server state ≠ client state, cache automático, menos boilerplate |