- NextAuth con Google OAuth
- Registro y login con email/contraseña (usuarios normales)
- Sistema de roles (admin/user)
- Protección de rutas automática
- Roles asignados por email del administrador
- Contraseñas hasheadas con bcryptjs
- Soporte multiidioma: Español e Inglés
- Traducciones completas en toda la aplicación
- Selector de idioma en la navbar
- CRUD completo (Crear, Leer, Actualizar, Eliminar)
- Panel de administración exclusivo para admins
- Validación con Yup
- Integración con Cloudinary para imágenes
- Agregar/eliminar productos
- Actualizar cantidades
- Persistencia con localStorage
- Contador en tiempo real en la navbar
- Formulario de contacto funcional
- Email de recordatorio de carrito abandonado (1 minuto)
- Plantillas HTML personalizadas
- Integración con Nodemailer
- Button (con variantes: primary, secondary, outline, danger)
- Input, Textarea (con validación)
- Card (con efectos hover)
- ProductCard, ProductForm
- Layout, Navbar, Footer
- Sistema de notificaciones con react-toastify
- Reemplaza todos los alerts nativos
- Notificaciones para: CRUD de productos, carrito, contacto, autenticación
npm installCrea un archivo .env en la raíz del proyecto:
# NextAuth
NEXTAUTH_SECRET=your-secret-here-generate-with-openssl-rand-base64-32
NEXTAUTH_URL=http://localhost:3000
# Google OAuth
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
# Admin Email (este usuario será admin)
ADMIN_EMAIL=arleipolo15@gmail.com
# Cloudinary
CLOUDINARY_CLOUD_NAME=your-cloud-name
CLOUDINARY_API_KEY=your-api-key
CLOUDINARY_API_SECRET=your-api-secret
# Email (Nodemailer)
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=your-email@gmail.com
EMAIL_PASSWORD=your-app-passwordnpm run devAbre http://localhost:3000 en tu navegador.
- Acceso al panel de administración (
/admin) - Crear, editar y eliminar productos
- Ver botón "Admin" en la navbar
- Email configurado en
ADMIN_EMAIL
- Registrarse con email y contraseña
- Iniciar sesión con email/contraseña o Google
- Ver productos y detalles
- Agregar productos al carrito
- Usar formulario de contacto
- Recibir emails de recordatorio de carrito
- Solo puede ver la página de inicio
- Ver formulario de registro y login
- Redirigido a
/auth/signinal intentar acceder a rutas protegidas
Ecommerce/
├── public/
│ └── locales/
│ ├── es/
│ │ └── common.json
│ └── en/
│ └── common.json
├── src/
│ ├── components/
│ │ ├── ui/
│ │ │ ├── Button.tsx
│ │ │ ├── Input.tsx
│ │ │ ├── Textarea.tsx
│ │ │ └── Card.tsx
│ │ ├── layout/
│ │ │ ├── Layout.tsx
│ │ │ ├── Navbar.tsx
│ │ │ └── Footer.tsx
│ │ ├── products/
│ │ │ ├── ProductCard.tsx
│ │ │ └── ProductForm.tsx
│ │ └── cloudinary/
│ │ └── CloudinaryUpload.tsx
│ ├── contexts/
│ │ └── CartContext.tsx
│ ├── lib/
│ │ ├── cart.ts
│ │ ├── products.ts
│ │ ├── email.ts
│ │ └── cloudinary.ts
│ ├── pages/
│ │ ├── api/
│ │ │ ├── auth/
│ │ │ │ └── [...nextauth].ts
│ │ │ ├── products/
│ │ │ │ ├── index.ts
│ │ │ │ └── [id].ts
│ │ │ ├── contact.ts
│ │ │ └── cart/
│ │ │ └── reminder.ts
│ │ ├── products/
│ │ │ ├── index.tsx
│ │ │ └── [id].tsx
│ │ ├── auth/
│ │ │ ├── signin.tsx
│ │ │ └── register.tsx
│ │ ├── _app.tsx
│ │ ├── _document.tsx
│ │ ├── index.tsx
│ │ ├── contact.tsx
│ │ ├── cart.tsx
│ │ └── admin.tsx
│ ├── styles/
│ │ └── globals.css
│ ├── types/
│ │ ├── index.ts
│ │ └── next-auth.d.ts
│ └── utils/
│ ├── validationSchemas.ts
│ └── authSchemas.ts
├── .env
├── next.config.js
├── next-i18next.config.js
├── tailwind.config.ts
├── tsconfig.json
└── package.json
| Ruta | Acceso | Descripción |
|---|---|---|
/ |
Público | Página de inicio |
/auth/register |
Público | Registro con email/contraseña |
/auth/signin |
Público | Login con email/contraseña o Google |
/products |
Autenticado | Lista de productos |
/products/[id] |
Autenticado | Detalle de producto |
/cart |
Autenticado | Carrito de compras |
/contact |
Público | Formulario de contacto |
/admin |
Admin | Panel de administración |
- Next.js 14.2.0 (Pages Router)
- TypeScript
- Tailwind CSS 3.4.3
- Formik 2.4.6
- Lucide React 0.378.0 (iconos)
- react-toastify 10.0.5 (notificaciones)
- NextAuth 4.24.0 (autenticación)
- bcryptjs (hash de contraseñas)
- Nodemailer 7.0.7 (emails)
- Cloudinary 2.2.0 (imágenes)
- Axios 1.7.0 (HTTP client)
- Yup 1.4.0 (validación)
- next-i18next 15.3.0 (traducciones)
- Ve a Google Cloud Console
- Crea un nuevo proyecto
- Habilita la API de Google+
- Crea credenciales OAuth 2.0
- Autoriza estas URLs de redireccionamiento:
http://localhost:3000/api/auth/callback/googlehttps://tu-dominio.com/api/auth/callback/google(producción)
- Copia el Client ID y Client Secret al
.env
- Ve a tu cuenta de Google
- Habilita la verificación en dos pasos
- Genera una "Contraseña de aplicación"
- Usa esa contraseña en
EMAIL_PASSWORD
- Crea una cuenta en Cloudinary
- Ve al Dashboard
- Copia el Cloud Name, API Key y API Secret
- Pégalos en el
.env
- Registro con email/contraseña funciona
- Login con email/contraseña funciona
- Login con Google funciona
- Usuario admin ve el botón "Admin"
- Usuario normal no ve el botón "Admin"
- Rutas protegidas redirigen a signin
- Botón de "Registro" aparece cuando no estás autenticado
- Admin puede crear productos
- Admin puede editar productos
- Admin puede eliminar productos
- Usuarios pueden ver productos
- Usuarios pueden agregar al carrito
- Agregar productos funciona
- Actualizar cantidad funciona
- Eliminar productos funciona
- Vaciar carrito funciona
- Email de recordatorio llega después de 1 minuto
- Toast aparece al crear producto
- Toast aparece al actualizar producto
- Toast aparece al eliminar producto
- Toast aparece al agregar al carrito
- Toast aparece en formulario de contacto
- Cambiar idioma funciona
- Traducciones se aplican correctamente
- Verifica que
NEXTAUTH_SECRETesté configurado - Genera uno nuevo:
openssl rand -base64 32
- Verifica que las URLs de redireccionamiento estén correctas
- Asegúrate de que el Client ID y Secret sean correctos
- Verifica que
EMAIL_PASSWORDsea la contraseña de aplicación - Revisa que el puerto 587 no esté bloqueado
- Verifica las credenciales de Cloudinary
- Asegúrate de que
remotePatternsesté ennext.config.js
- Los productos actualmente se almacenan en memoria (
src/lib/products.ts) - Para producción, considera usar una base de datos (MongoDB, PostgreSQL, etc.)
- El carrito usa localStorage, se pierde al cambiar de navegador
- El cron job de recordatorio se ejecuta en el cliente (considera un worker en producción)
-
Subir a GitHub
git init git add . git commit -m "Deploy to Vercel" git branch -M main git remote add origin https://github.com/TU-USUARIO/TU-REPO.git git push -u origin main
-
Desplegar en Vercel
- Ve a vercel.com
- Importa tu repositorio de GitHub
- Configura las variables de entorno (ver
.env.example) - Deploy!
-
Actualizar Google OAuth
- Agrega tu URL de Vercel a las URLs autorizadas en Google Cloud Console
- Formato:
https://tu-app.vercel.app/api/auth/callback/google
📖 Guía completa: Lee DEPLOY.md para instrucciones detalladas
- Implementar base de datos (MongoDB/PostgreSQL)
- Sistema de pagos (Stripe/PayPal)
- Historial de pedidos
- Búsqueda y filtros de productos
- Favoritos
- Reseñas y calificaciones
Para cualquier duda o problema, usa el formulario de contacto en /contact.
¡Gracias por usar esta aplicación! 🎉