Proyecto full-stack de e-commerce completo para una mueblería. La solución consta de un backend seguro en Express con MongoDB que gestiona autenticación, catálogo de productos y pedidos, junto con un frontend en React + Vite que ofrece navegación multipágina, sistema de autenticación JWT, gestión de estado global con Context API, carrito de compras funcional y proceso completo de checkout.
Para evaluar las funcionalidades de administrador, utilice estas credenciales:
Email: admin@gmail.com
Contraseña: admin
Acceso incluido:
ProtectedRoute para páginas privadashermanosJota_e-commerce/
├── backend/
│ ├── src/
│ │ ├── middleware/
│ │ │ └── logger.js # Logging de requests HTTP
│ │ ├── models/
│ │ │ └── Product.js # Modelo Mongoose de productos
│ │ └── routes/
│ │ └── productosRoutes.js # Rutas de la API de productos
│ ├── data/
│ │ └── productos.js # Datos de ejemplo (legacy)
│ ├── images/
│ │ └── productos/ # Imágenes de productos
│ ├── .env # Variables de entorno (no versionado)
│ ├── .env.example # Plantilla de variables de entorno
│ ├── server.js # Punto de entrada del servidor
│ └── package.json
│
├── client/
│ ├── src/
│ │ ├── components/
│ │ │ ├── AddProductCard.jsx # Tarjeta para agregar productos (admins)
│ │ │ ├── FeaturedProduct.jsx # Productos destacados en home
│ │ │ ├── Footer.jsx # Footer del sitio
│ │ │ ├── Header.jsx # Header con navegación y carrito
│ │ │ ├── ProductCard.jsx # Tarjeta de producto en catálogo
│ │ │ ├── ProductDetail.jsx # Vista detallada de producto
│ │ │ ├── ProtectedRoute.jsx # HOC para rutas protegidas
│ │ │ └── ProductosPage.jsx # Página de catálogo
│ │ ├── pages/
│ │ │ ├── CartPage.jsx # Página del carrito de compras
│ │ │ ├── Catalogo.jsx # Página del catálogo
│ │ │ ├── Contacto.jsx # Formulario de contacto
│ │ │ ├── FormProductoEdit.jsx # Formulario de edición de productos
│ │ │ ├── FormProductoNuevo.jsx # Formulario de creación de productos
│ │ │ ├── HomePage.jsx # Página de inicio
│ │ │ ├── LoginPage.jsx # Página de inicio de sesión
│ │ │ ├── RegisterPage.jsx # Página de registro
│ │ │ └── UserProfile.jsx # Página de perfil de usuario
│ │ ├── context/
│ │ │ ├── CartContext.js # Contexto del carrito
│ │ │ └── CartProvider.jsx # Provider del carrito con persistencia por usuario
│ │ ├── auth/
│ │ │ ├── AuthContext.js # Contexto de autenticación
│ │ │ └── AuthProvider.jsx # Provider de autenticación con JWT
│ │ ├── hooks/
│ │ │ └── useProductos.js # Hook personalizado (legacy)
│ │ ├── config/
│ │ │ └── api.js # Configuración de URLs de API
│ │ ├── css/
│ │ │ ├── variables.css # Variables CSS globales
│ │ │ ├── reset.css # Reset de estilos
│ │ │ ├── global.css # Estilos globales
│ │ │ ├── header.css # Estilos del header
│ │ │ ├── footer.css # Estilos del footer
│ │ │ ├── index.css # Estilos de home
│ │ │ ├── productos.css # Estilos del catálogo
│ │ │ ├── producto.css # Estilos de detalle
│ │ │ ├── contacto.css # Estilos de contacto
│ │ │ └── nuevo-producto.css # Estilos del formulario admin
│ │ ├── App.jsx # Componente principal con rutas
│ │ └── main.jsx # Punto de entrada React
│ ├── public/
│ │ └── assets/
│ │ └── img/ # Imágenes estáticas (logos, banners)
│ ├── .env.production # Variables de entorno de producción
│ ├── netlify.toml # Configuración de Netlify
│ ├── vite.config.js # Configuración de Vite
│ └── package.json
│
├── .gitignore
├── package.json # Scripts raíz del proyecto
└── README.md # Este archivo
git clone https://github.com/FedeLeonardis/hermanosJota_e-commerce.git
cd hermanosJota_e-commerce
cd backend
npm install
Crear archivo .env basado en .env.example:
cp .env.example .env
Editar .env con tus credenciales:
# Puerto del servidor
PORT=5000
# URI de MongoDB Atlas (o local: mongodb://localhost:27017/muebleria)
DB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/muebleria
# Clave secreta para JWT (usa una clave fuerte y única)
JWT_SECRET=tu_clave_super_secreta_y_segura_12345
# URL del frontend (para CORS)
FRONTEND_URL=http://localhost:5173
# Entorno
NODE_ENV=development
Importante:
JWT_SECRET debe ser una cadena larga y aleatoria para mayor seguridad.cd ../client
npm install
Crear archivo .env.local para desarrollo:
echo "VITE_API_URL=http://localhost:5000" > .env.local
Para producción, editar .env.production:
VITE_API_URL=https://tu-backend.onrender.com
Cada subproyecto debe ejecutarse en terminales separadas.
cd backend
npm run dev
El servidor escucha en http://localhost:5000 (o el puerto definido en .env)
cd client
npm run dev
La aplicación se abre en http://localhost:5173
Para probar las funcionalidades de administrador (crear, editar, eliminar productos), puede utilizar las siguientes credenciales:
Email: admin@gmail.com
Contraseña: admin
Con esta cuenta tendrá acceso a:
Nota: Para probar como usuario regular, puede registrarse normalmente desde /registro.
El backend expone los siguientes endpoints:
| Método | Ruta | Protección | Descripción |
|---|---|---|---|
| POST | /api/users/register |
Pública | Registra un nuevo usuario |
| POST | /api/users/login |
Pública | Inicia sesión y devuelve JWT |
| GET | /api/users/profile |
🔒 JWT | Obtiene el perfil del usuario autenticado |
| GET | /api/users/check-session |
🔒 JWT | Verifica si la sesión es válida |
| Método | Ruta | Protección | Descripción |
|---|---|---|---|
| GET | /api/productos |
Pública | Obtiene todos los productos |
| GET | /api/productos/:id |
Pública | Obtiene un producto por ID |
| POST | /api/productos |
🔒 JWT | Crea un nuevo producto |
| PUT | /api/productos/:id |
🔒 JWT | Actualiza un producto existente |
| DELETE | /api/productos/:id |
🔒 JWT | Elimina un producto |
| Método | Ruta | Protección | Descripción |
|---|---|---|---|
| POST | /api/orders |
🔒 JWT | Crea un nuevo pedido (checkout) |
Nota: Los endpoints marcados con 🔒 requieren enviar el JWT en el header:
Authorization: Bearer <token>
/api/users/register - Registrar usuarioRequest:
{
"username": "juanperez",
"email": "juan@example.com",
"password": "miPassword123"
}
Response (201):
{
"_id": "674567890abcdef123456789",
"username": "juanperez",
"email": "juan@example.com",
"roles": ["user"]
}
/api/users/login - Iniciar sesiónRequest:
{
"email": "juan@example.com",
"password": "miPassword123"
}
Response (200):
{
"message": "Login Exitoso",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"usuario": {
"id": "674567890abcdef123456789",
"username": "juanperez",
"email": "juan@example.com",
"roles": ["user"]
}
}
/api/productos/:id - Obtener productoResponse:
{
"_id": "674567890abcdef123456789",
"nombre": "Sofá Moderno",
"descripcion": "Sofá de 3 plazas con diseño contemporáneo",
"precio": 45000,
"stock": 5,
"imagenUrl": "https://example.com/sofa.jpg",
"features": {
"medidas": "200cm x 90cm x 85cm",
"materiales": "Tela premium, estructura de madera",
"tapizado": "Tapizado removible y lavable",
"garantia": "2 años"
}
}
/api/productos - Crear producto (Protegido)Headers:
Authorization: Bearer <token>
Request:
{
"nombre": "Mesa de Comedor",
"descripcion": "Mesa extensible para 6-8 personas",
"precio": 35000,
"stock": 3,
"imagenUrl": "https://example.com/mesa.jpg",
"features": {
"medidas": "160cm x 90cm (extensible a 240cm)",
"materiales": "Madera maciza de roble",
"acabado": "Barniz mate",
"extension": "Sistema de extensión central"
}
}
/api/orders - Crear pedido (Protegido)Headers:
Authorization: Bearer <token>
Request:
{
"items": [
{
"productoId": "674567890abcdef123456789",
"cantidad": 2,
"precioUnitario": 45000
}
],
"total": 90000
}
Response (201):
{
"message": "Pedido creado exitosamente",
"order": {
"_id": "674567890abcdef987654321",
"usuario": "674567890abcdef123456789",
"items": [...],
"total": 90000,
"createdAt": "2025-12-05T10:30:00.000Z"
}
}
El sistema incluye un panel de administración completo para gestionar productos:
Los usuarios con rol admin tienen acceso a funcionalidades especiales:
+ en el catálogo (solo visible para admins)/nuevo-producto (protegida)/productos/:id/editar (protegida)El sistema mantiene un carrito independiente para cada usuario:
cart_user_{id})Las siguientes rutas requieren autenticación:
/nuevo-producto - Crear producto (admin)/productos/:id/editar - Editar producto (admin)/perfil - Perfil de usuario/carrito - Carrito de compras (checkout)Si intentas acceder sin autenticación, serás redirigido a /iniciar-sesion.
{
username: String (required, unique),
email: String (required, unique),
password: String (required, hashed with bcrypt),
roles: [String] (default: ["user"]),
createdAt: Date (auto)
}
{
nombre: String (required),
descripcion: String (required),
precio: Number (required, min: 0),
stock: Number (required, min: 0),
imagenUrl: String (required),
features: {
medidas: String,
materiales: String,
acabado: String,
peso: String,
capacidad: String,
modulares: String,
tapizado: String,
confort: String,
rotacion: String,
garantia: String,
almacenamiento: String,
colchon: String,
sostenibilidad: String,
extension: String,
apilables: String,
incluye: String,
cables: String,
certificación: String,
regulación: String,
caracteristica: String
}
}
Todos los campos de features son opcionales y pueden agregarse dinámicamente desde el formulario de administración.
{
usuario: ObjectId (ref: 'User', required),
items: [{
producto: ObjectId (ref: 'Product', required),
cantidad: Number (required, min: 1),
precioUnitario: Number (required, min: 0)
}],
total: Number (required, min: 0),
createdAt: Date (auto)
}
/backend)npm run dev # Desarrollo con nodemon (recarga automática)
npm start # Producción con Node estándar
/client)npm run dev # Servidor de desarrollo con HMR
npm run build # Build de producción en /dist
npm run preview # Preview del build de producción
npm start # Alias de preview --host (para red local)
cd backend && npm installcd backend && npm startDB_URI: URI de MongoDB AtlasJWT_SECRET: Clave secreta para JWT (diferente a desarrollo)FRONTEND_URL: URL de Netlify/VercelNODE_ENV: productionPORT: (Render lo asigna automáticamente)clientnpm run buildclient/distVITE_API_URL: URL del backend en Renderfeatures acepta cualquier combinación de propiedades, permitiendo productos con características diferentes/productos/:id carga productos individuales, /profile requiere autenticaciónAuthorization: BearerEste proyecto es de uso académico para el curso de Desarrollo de Aplicaciones Web en ITBA.
Para consultas sobre el proyecto, contactar a los integrantes del equipo a través de GitHub.