Sistema de gerenciamento logístico para controle de:
- Veículos
- Viagens
- Manutenções
- Regras de conflito de agenda
- API REST com Spring Boot
- Frontend React + TypeScript
- Java 17
- Spring Boot
- Spring Data JPA
- Spring Security
- Hibernate
- MySQL
- Docker
- React
- TypeScript
- Axios
- Framer Motion
- TailwindCSS
- Lucide React
# 📁 Estrutura Completa do Projeto
```bash
LogiTrack/
│
├── Frontend/
│ └── logitrack/
│ │
│ ├── public/
│ │
│ ├── src/
│ │ ├── api/
│ │ │ └── api.ts
│ │ │
│ │ ├── assets/
│ │ │
│ │ ├── components/
│ │ │ ├── Card.tsx
│ │ │ └── Navbar.tsx
│ │ │
│ │ ├── pages/
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Manutencao.tsx
│ │ │ └── Viagem.tsx
│ │ │
│ │ ├── personalizacao/
│ │ │ └── dashboard/
│ │ │ └── index.css
│ │ │
│ │ ├── types/
│ │ │
│ │ ├── App.tsx
│ │ ├── App.css
│ │ ├── main.tsx
│ │ └── index.css
│ │
│ ├── eslint.config.js
│ ├── index.html
│ ├── package.json
│ ├── package-lock.json
│ ├── postcss.config.js
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ ├── tsconfig.app.json
│ ├── tsconfig.node.json
│ ├── vite.config.ts
│ └── README.md
│
├── Api-segura/
│ └── api/
│ │
│ ├── Docker/
│ │ ├── docker-compose.yml
│ │ │
│ │ └── mysql/
│ │ └── init.sql
│ │
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── api/
│ │ │ │ └── seguranca/
│ │ │ │ └── api/
│ │ │ │
│ │ │ │ ├── config/
│ │ │ │ │ ├── DataInitializer.java
│ │ │ │ │ ├── SecurityConfig.java
│ │ │ │ │ └── WebConfig.java
│ │ │ │
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── controller/
│ │ │ │ │ │ └── DashboardController.java
│ │ │ │ │ │
│ │ │ │ │ ├── dto/
│ │ │ │ │ │ ├── DashboardDTO.java
│ │ │ │ │ │ ├── ManutencaoDTO.java
│ │ │ │ │ │ ├── ProjecaoFinanceiraDTO.java
│ │ │ │ │ │ ├── ProjecaoTipoDTO.java
│ │ │ │ │ │ ├── RankingVeiculoDTO.java
│ │ │ │ │ │ └── VolumePorCategoriaDTO.java
│ │ │ │ │ │
│ │ │ │ │ ├── repository/
│ │ │ │ │ │ └── DashboardRepository.java
│ │ │ │ │ │
│ │ │ │ │ └── service/
│ │ │ │ │ └── DashboardService.java
│ │ │ │
│ │ │ │ ├── exception/
│ │ │ │ │ ├── ConflitoViagemException.java
│ │ │ │ │ └── GlobalExceptionHandler.java
│ │ │ │
│ │ │ │ ├── viagem/
│ │ │ │ ├── manutencao/
│ │ │ │ ├── veiculo/
│ │ │ │ │
│ │ │ │ └── ApiApplication.java
│ │ │ │
│ │ │ └── resources/
│ │ │
│ │ └── test/
│ │
│ ├── target/
│ │
│ ├── Dockerfile
│ ├── mvnw
│ ├── mvnw.cmd
│ └── pom.xml
│
└── README.md
Cada veículo possui:
- placa única
- modelo
- tipo
- ano
Um veículo:
✅ pode ter várias viagens
❌ NÃO pode possuir duas viagens no mesmo período.
Exemplo inválido:
| Veículo | Saída | Chegada |
|---|---|---|
| Caminhão 1 | 10:00 | 14:00 |
| Caminhão 1 | 11:00 | 13:00 |
Porque o veículo já está em viagem.
Um veículo:
✅ pode ter várias manutenções
❌ NÃO pode possuir duas manutenções no mesmo período.
Exemplo inválido:
| Veículo | Início | Finalização |
|---|---|---|
| Van 1 | 01/05 | 10/05 |
| Van 1 | 05/05 | 08/05 |
Porque o veículo já está em manutenção.
CREATE TABLE veiculos (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
placa VARCHAR(10) UNIQUE NOT NULL,
modelo VARCHAR(50) NOT NULL,
tipo VARCHAR(20),
ano INTEGER
);CREATE TABLE viagens (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
veiculo_id BIGINT,
data_saida TIMESTAMP NOT NULL,
data_chegada TIMESTAMP,
origem VARCHAR(100),
destino VARCHAR(100),
km_percorrida DECIMAL(10,2),
CONSTRAINT fk_viagem_veiculo
FOREIGN KEY (veiculo_id)
REFERENCES veiculos(id)
ON DELETE CASCADE
);CREATE TABLE manutencoes (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
veiculo_id BIGINT,
data_inicio DATE NOT NULL,
data_finalizacao DATE,
tipo_servico VARCHAR(100),
custo_estimado DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'PENDENTE',
CONSTRAINT fk_manutencao_veiculo
FOREIGN KEY (veiculo_id)
REFERENCES veiculos(id)
ON DELETE CASCADE
);FOREIGN KEY (veiculo_id)
REFERENCES veiculos(id)
ON DELETE CASCADESignifica que:
veiculo_idaponta para um veículo existente- não é possível criar viagens/manutenções para veículos inexistentes
- ao deletar um veículo, todas as viagens e manutenções dele também são removidas automaticamente
@Query("""
SELECT COUNT(v) > 0
FROM ViagemEntity v
WHERE v.veiculo.id = :veiculoId
AND (
:dataSaida BETWEEN v.dataSaida AND v.dataChegada
OR
:dataChegada BETWEEN v.dataSaida AND v.dataChegada
OR
v.dataSaida BETWEEN :dataSaida AND :dataChegada
)
""")
boolean existsConflitoViagem(
Long veiculoId,
LocalDateTime dataSaida,
LocalDateTime dataChegada
);if (viagemRepository.existsConflitoViagem(
dto.veiculoId(),
dto.dataSaida(),
dto.dataChegada()
)) {
throw new ConflitoViagemException(
"Veículo já possui viagem nesse período."
);
}@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ConflitoViagemException.class)
public ResponseEntity<?> handleConflitoViagem(
ConflitoViagemException ex
){
return ResponseEntity.status(HttpStatus.CONFLICT)
.body(Map.of(
"timestamp", LocalDateTime.now(),
"status", 409,
"error","Conflito de Viagem",
"message", ex.getMessage()
));
}
}{
"id": 1,
"origem": "São Paulo",
"destino": "Rio de Janeiro"
}{
"timestamp": "2026-05-10T17:06:02",
"status": 409,
"error": "Conflito de Viagem",
"message": "Veículo já possui viagem nesse período."
}import axios from "axios";
catch (erro) {
if (axios.isAxiosError(erro)) {
const mensagem =
erro.response?.data?.message ||
erro.response?.data?.error ||
"Erro inesperado";
alert(mensagem);
}
}entre na pasta : cd Api-segura/api/Docker e execute:
docker-compose up --buildentre na pasta: cd Frontend/logitrack
npm installnpm run dev| Método | Rota |
|---|---|
| GET | /veiculos |
| GET | /veiculos/{id} |
| POST | /veiculos |
| PUT | /veiculos/{id} |
| DELETE | /veiculos/{id} |
| Método | Rota |
|---|---|
| GET | /viagens |
| GET | /viagens/{id} |
| POST | /viagens |
| PUT | /viagens/{id} |
| DELETE | /viagens/{id} |
| Método | Rota |
|---|---|
| GET | /manutencoes |
| GET | /manutencoes/{id} |
| POST | /manutencoes |
| PUT | /manutencoes/{id} |
| DELETE | /manutencoes/{id} |
O projeto utiliza:
- Spring Security
- HTTPS
- autenticação básica (em desenvolvimento)
- JWT Authentication
- Dashboard analítico
- Controle de motoristas
- Rastreamento em tempo real
- Upload de documentos
- Relatórios PDF
- Logs de auditoria
- Testes automatizados
Projeto desenvolvido para estudo e prática de:
- arquitetura REST
- Spring Boot
- JPA/Hibernate
- React + TypeScript
- Docker
- regras de negócio reais em logística