Descubra, avalie e organize seus lugares favoritos em um só lugar.
Uma aplicação full-stack moderna para cadastrar, avaliar e gerenciar cafeterias, restaurantes, bares e outros estabelecimentos. Perfeita para aprender integração frontend-backend com as melhores práticas do mercado.
Principais bibliotecas:
- Radix UI: Componentes acessíveis e sem estilo
- React Router: Roteamento lado do cliente
- Axios: Cliente HTTP
- Zod: Validação de schemas
- Sonner: Notificações estilosas
- Lucide React: Ícones SVG
- React Hook Form: Gerenciamento de formulários
Principais dependências:
- Spring Web: REST APIs
- Spring Data JPA: Acesso ao banco de dados
- Lombok: Reduz boilerplate
- Validation: Validação de dados
- Cloudinary: Armazenamento de imagens
- Node.js 18+ e npm
- Java 21+
- Conta Cloudinary (gratuita) para upload de imagens
Crie o arquivo server/src/main/resources/application-local.properties:
# Cloudinary
cloudinary.cloud-name=seu_cloud_name
cloudinary.api-key=sua_api_key
cloudinary.api-secret=seu_api_secret
# H2 Database (configuração padrão para desenvolvimento)
spring.datasource.url=jdbc:h2:mem:ratehub
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2DialectComo obter as credenciais Cloudinary:
- Acesse cloudinary.com
- Crie uma conta gratuita
- Acesse o dashboard e copie: Cloud Name, API Key e API Secret
cd server
# Compilar e rodar com Maven
./mvnw spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=local"
# Ou compilar apenas
./mvnw clean package
# E rodar o JAR
java -jar target/rate-hub-0.0.1-SNAPSHOT.jar --spring.profiles.active=localO backend estará disponível em: http://localhost:8080
Na pasta client, crie o arquivo .env baseado no .env.example:
cd client
cp .env.example .envSe o arquivo .env.example não existir, crie manualmente client/.env com o seguinte conteúdo:
VITE_API_URL=http://localhost:8080
npm installnpm run devO frontend estará disponível em: http://localhost:5173
npm run build
npm run previewlab-software-engineering-spring-boot/
├── client/ # Frontend React + TypeScript
│ ├── src/
│ │ ├── components/ # Componentes React reutilizáveis
│ │ ├── pages/ # Páginas da aplicação
│ │ ├── lib/
│ │ │ ├── api.ts # Funções de chamadas HTTP
│ │ │ ├── types.ts # Tipos TypeScript
│ │ │ ├── schemas.ts # Validação com Zod
│ │ │ └── axios.ts # Configuração do axios
│ │ └── hooks/ # Hooks customizados
│ ├── .env.example # Template de variáveis de ambiente
│ └── package.json
│
├── server/ # Backend Spring Boot
│ ├── src/main/java/network/webtech/rate_hub/
│ │ ├── controller/ # Controladores REST
│ │ ├── service/ # Lógica de negócio
│ │ ├── repository/ # Acesso ao banco de dados
│ │ ├── entity/ # Modelos JPA
│ │ ├── dto/ # Data Transfer Objects
│ │ └── config/ # Configurações
│ ├── src/main/resources/
│ │ └── application-local.properties # Variáveis locais
│ └── pom.xml # Dependências Maven
│
└── README.md # Este arquivo
- Frontend: Usuário interage com a interface em React
- Axios: Frontend faz requisições HTTP para o backend
- Spring Boot: Backend processa requisições e acessa o banco
- Banco de dados: Persiste os dados dos lugares
- Cloudinary: Armazena imagens enviadas pelo usuário
Se está participando do workshop, consulte o arquivo client/docs/INTEGRACAO.md para um guia passo a passo sobre como implementar a integração frontend-backend.
O backend expõe os seguintes endpoints:
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/places |
Listar todos os lugares |
GET |
/places/{id} |
Buscar um lugar pelo ID |
GET |
/places/favorites |
Listar apenas favoritos |
POST |
/places |
Cadastrar novo lugar |
PUT |
/places/{id} |
Atualizar lugar |
PATCH |
/places/{id}/favorite |
Alternar favorito |
DELETE |
/places/{id} |
Excluir lugar |
Este projeto é fornecido como material educacional.
Feedbacks e sugestões são bem-vindos! Sinta-se livre para abrir issues ou pull requests.
Desenvolvido com ❤️ para ensinar integração frontend-backend moderna