Plataforma web full-stack para una bodega mendocina. Catálogo de vinos con filtros, carrito de compras, integración con Mercado Pago y reserva de mesas para el restaurante.
| Capa | Tecnología |
|---|---|
| Frontend | React 19, Vite 8, React Router DOM |
| Backend | Java 21, Spring Boot 4.1.0, Maven |
| Base de datos | MySQL 8 con JPA/Hibernate |
| Pagos | Mercado Pago SDK Java 2.1.7 |
| HTTP | Axios (frontend), Fetch API |
Bodega/
├── bodega-backend/ # API REST Spring Boot
│ └── ecomerce/
│ ├── pom.xml
│ └── src/main/java/com/bodega/ecomerce/
│ ├── EcomerceApplication.java
│ ├── controllers/ # 4 controladores REST
│ ├── services/ # 4 servicios
│ ├── repositories/ # 7 repositorios JPA
│ ├── entities/ # 7 entidades
│ ├── dto/ # CarritoDTO
│ ├── enums/ # MetodoPago, CampoOrdenamientoProducto
│ ├── exceptions/ # Excepciones + GlobalExceptionHandler
│ └── specificaciones/ # VinoSpecification (filtros dinámicos)
│
├── bodega-frontend/ # SPA React + Vite
│ ├── package.json
│ └── src/
│ ├── App.jsx # Orquestador principal
│ ├── hooks/useCarrito.js # Lógica del carrito
│ ├── services/ # VinoService, ReservaService
│ └── components/ # 11 componentes con estilos CSS
│
└── Creacion_de_DB/
└── CREACION_DB.sql # Script SQL inicial
- Paginación (6 vinos por página) con carrusel animado
- Filtros combinados: bodega, categoría, rango de precio
- Ordenamiento por nombre, precio, año o bodega (ASC/DESC)
- Stock en tiempo real con límite por producto
- Modal lateral con lista de productos animada
- Control de cantidades y eliminación de ítems
- Cálculo automático del total
- Persistencia en localStorage durante el flujo de pago
- El backend crea una preferencia de pago redirigiendo al checkout de MP
- Tras el pago exitoso, la página
/pago-exitosodescuenta stock automáticamente - Redirección automática al inicio después de 3 segundos
- Formulario con nombre, teléfono, fecha, horario y cantidad de personas
- Asignación inteligente: el backend busca mesas disponibles con capacidad suficiente
- Validación de disponibilidad en la fecha solicitada
- Gate +18 al cargar la página
- Persistencia en
sessionStoragepara no repetir en la sesión
Esquema MySQL con 7 tablas:
categoria— Tipos de vinovino— Productos con precio, stock y descripciónusuario— Clientes registradospedido/detalle_pedido— Órdenes de compramesa/reserva— Gestión del restaurante
Hibernate configurado con ddl-auto=update para sincronización automática.
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/vinos |
Vinos con filtros, orden y paginación |
| POST | /api/vinos |
Crear vino |
| PUT | /api/vinos/{id} |
Actualizar vino |
| DELETE | /api/vinos/{id} |
Eliminar vino |
| PUT | /api/vinos/{id}/descontar-stock |
Descontar stock post-pago |
| GET | /api/categorias |
Listar categorías |
| POST | /api/categorias |
Crear categoría |
| POST | /api/pedidos/checkout-real |
Crear preferencia de pago MP |
| GET | /api/reservas |
Listar reservas |
| POST | /api/reservas |
Crear reserva (asigna mesa) |
| DELETE | /api/reservas/{id} |
Eliminar reserva |
cd bodega-backend/ecomerce
./mvnw spring-boot:runRequiere MySQL corriendo en localhost:3306 con base bodega.
cd bodega-frontend
npm install
npm run devAbre http://localhost:5173.
Proyecto funcional con flujo completo de navegación, compra y reserva. Pendientes de mejora:
- Persistir pedido en BD durante el flujo de Mercado Pago
- Enviar valores reales del carrito a la preferencia de MP
- Agregar autenticación y seguridad (Spring Security)
- Pasar variables sensibles (token MP) a variables de entorno
- Migrar a HTTPS para producción
- Pruebas unitarias y de integración