Sistema integral de catálogo de productos con autenticación avanzada, gestión de usuarios, panel de administración y sistema de temas dinámicos revolucionario.
El sistema de temas utiliza una arquitectura completamente local que elimina la dependencia de un estado global en la base de datos, permitiendo que cada usuario/dispositivo tenga su propia preferencia de tema.
┌─────────────────────────────────────────────┐
│ FRONTEND │
├─────────────────┬───────────────────────────┤
│ Usuario │ Administrador │
│ (index.html) │ (indexAdmin.html) │
├─────────────────┼───────────────────────────┤
│ Selector Temas │ Editor Completo │
│ (Preferencias) │ (Creación/Edición) │
├─────────────────┴───────────────────────────┤
│ tema-global.js (Universal) │
│ Aplicación automática del tema │
│ activo en TODAS las páginas │
├─────────────────────────────────────────────┤
│ sweetalert-tema.js (Nuevo) │
│ SweetAlert2 con adaptación automática │
│ al tema seleccionado │
├─────────────────────────────────────────────┤
│ localStorage │
│ ✓ temaSeleccionadoId: "tema_id" │
│ ✓ nombreTemaSeleccionado: "Oscuro" │
│ ✓ coloresTema: {...} │
└─────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────┐
│ BACKEND/API │
├─────────────────────────────────────────────┤
│ MongoDB Atlas │
│ Colección: temas │
│ │
│ { │
│ _id: ObjectId, │
│ nombre: "Oscuro", │
│ colores: { │
│ bgPrimary: "#000000", │
│ textPrimary: "#ffffff", │
│ success: "#4caf50", │
│ ...16 variables CSS │
│ }, │
│ fechaCreacion: Date, │
│ fechaModificacion: Date │
│ } │
│ │
│ ❌ Campo "activo" ELIMINADO │
│ (Ahora es preferencia local) │
└─────────────────────────────────────────────┘
// Al cargar cualquier página
tema-global.js →
Verifica localStorage →
Si está vacío: aplica tema "Claro" por defecto →
Aplica variables CSS →
Configura SweetAlert2
// Usuario selecciona tema
Comparación con localStorage →
Si es diferente: actualiza variables CSS →
Guarda en localStorage →
Reconfigura SweetAlert2 →
Emite evento 'temaAplicado'
// Administrador crea nuevo tema
Editor visual →
Nombre + Colores por defecto →
POST /api/temas →
MongoDB →
Recarga lista de temas →
Abre editor para personalizar
// Edición en tiempo real
Sliders RGB + Input HEX →
Cambios inmediatos en CSS →
Botón "Guardar" →
PUT /api/temas/:id →
MongoDB actualizado
El sistema maneja 16 variables CSS que controlan todos los aspectos visuales:
:root {
/* Fondos principales */
--bg-primary: #ffffff; /* Fondo principal de la aplicación */
--bg-secondary: #f8f9fa; /* Fondo de secciones secundarias */
--bg-tertiary: #e9ecef; /* Fondo de elementos terciarios */
/* Textos */
--text-primary: #212529; /* Texto principal (títulos, contenido) */
--text-secondary: #6c757d; /* Texto secundario (subtítulos, ayuda) */
--text-accent: #007bff; /* Texto de acento (enlaces, botones) */
/* Bordes y líneas */
--border-primary: #dee2e6; /* Bordes principales (tarjetas, inputs) */
--border-secondary: #ced4da; /* Bordes secundarios (divisores) */
/* Sombras */
--shadow-light: rgba(0,0,0,0.1); /* Sombra suave (cards, hovers) */
--shadow-medium: rgba(0,0,0,0.2); /* Sombra media (modales, dropdowns) */
/* Estados y feedback */
--success: #28a745; /* Color para acciones exitosas */
--warning: #ffc107; /* Color para advertencias */
--error: #dc3545; /* Color para errores */
--info: #17a2b8; /* Color para información */
/* Elementos especiales */
--modal-bg: rgba(0,0,0,0.5); /* Fondo de modales y overlays */
--hover-overlay: rgba(0,0,0,0.05); /* Overlay para efectos hover */
}
Archivo | Propósito | Ubicación |
---|---|---|
editor-temas.js |
Editor visual completo (Admin) | /js/ |
tema-global.js |
Aplicación universal (Todas las páginas) | /js/ |
sweetalert-tema.js |
SweetAlert2 con temas dinámicos | /js/ |
temasDB.js |
Gestión de base de datos de temas | /js/ |
temasManager.js |
Selector de temas (Usuario) | /js/ |
Tema.js |
Modelo de MongoDB | /models/ |
git clone https://github.com/tu-usuario/CatalogoTienda.git
cd CatalogoTienda
cd backend
npm install
cp .env.example .env
Editar .env
con tus credenciales:
# Base de datos
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/catalogo
# Google OAuth
GOOGLE_CLIENT_ID=tu_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=tu_client_secret
# Email
EMAIL_USER=tu_email@gmail.com
EMAIL_PASS=tu_app_password
# Servidor
PORT=3000
SESSION_SECRET=generar_clave_super_segura
JWT_SECRET=otra_clave_segura
http://localhost:3000
http://localhost:3000/auth/google/callback
npm start
La aplicación estará disponible en: http://localhost:3000
CatalogoTienda/
├── backend/
│ ├── models/ # Modelos de MongoDB
│ │ ├── Tema.js # ⭐ Modelo de temas (sin campo "activo")
│ │ ├── productos.js # Modelo de productos
│ │ ├── perfil.js # Modelo de usuarios
│ │ └── ...
│ ├── public/ # Frontend estático
│ │ ├── index.html # Página principal (usuarios)
│ │ ├── indexAdmin.html # Panel de administración
│ │ ├── css/
│ │ │ ├── style.css # ⭐ Estilos con variables CSS
│ │ │ └── editor-temas.css # Estilos del editor
│ │ ├── js/
│ │ │ ├── tema-global.js # ⭐ Sistema universal de temas
│ │ │ ├── editor-temas.js # ⭐ Editor visual (Admin)
│ │ │ ├── sweetalert-tema.js # ⭐ SweetAlert2 con temas
│ │ │ ├── temasDB.js # Gestión de datos de temas
│ │ │ ├── temasManager.js # Selector de temas (Usuario)
│ │ │ ├── script.js # Lógica principal
│ │ │ └── ...
│ │ └── img/ # Imágenes y avatares
│ ├── data/ # Datos iniciales JSON
│ ├── server.js # ⭐ Servidor principal
│ └── package.json
├── MANUAL_USUARIO.md # ⭐ Manual para usuarios finales
├── README.md # Manual técnico (este archivo)
└── package.json
Archivo | Líneas | Función |
---|---|---|
tema-global.js |
~150 | Aplicación universal de temas |
editor-temas.js |
~1200 | Editor visual completo |
sweetalert-tema.js |
~350 | SweetAlert2 adaptativo |
Tema.js |
~45 | Modelo de datos (sin “activo”) |
GET /api/temas # Obtener todos los temas
GET /api/temas/:id # Obtener tema específico
POST /api/temas # Crear nuevo tema (Admin)
PUT /api/temas/:id # Actualizar tema (Admin)
DELETE /api/temas/:id # Eliminar tema (Admin)
POST /api/crear-cuenta # Registro tradicional
POST /api/iniciar-sesion # Login tradicional
GET /auth/google # Iniciar OAuth Google
GET /auth/google/callback # Callback OAuth
POST /api/recuperar-contrasena # Solicitar reset password
POST /api/restablecer-contrasena # Confirmar reset
GET /api/productos # Listar productos
GET /api/productos/:id # Obtener producto
POST /api/productos # Crear producto (Admin)
PUT /api/productos/:id # Actualizar producto (Admin)
DELETE /api/productos/:id # Eliminar producto (Admin)
PATCH /api/productos/:id/disponibilidad # Cambiar estado
GET /api/usuarios # Listar usuarios (Admin)
GET /api/perfil # Obtener perfil propio
PUT /api/perfil # Actualizar perfil
POST /api/perfil/foto # Subir avatar
PUT /api/usuarios/:correo/rol # Cambiar rol (Admin)
GET /api/usuarios/:correo/carrito # Obtener carrito
PUT /api/usuarios/:correo/carrito # Actualizar carrito
POST /api/pagar # Procesar pago
GET /api/usuarios/:correo/compras # Historial compras
# Gestión de contenido
GET/POST/PUT/DELETE /api/sobre-nosotros
GET/POST/PUT/DELETE /api/terminos-condiciones
GET/POST/PUT/DELETE /api/categorias
GET/POST/PUT/DELETE /api/monedas
GET/POST/PUT/DELETE /api/ubicaciones
GET/POST/PUT/DELETE /api/redes-sociales
# Control de acceso
GET/POST/DELETE /api/ips # Gestión IPs permitidas
GET/POST /api/mensajes # Sistema de contacto
// ✅ Buenas prácticas
app.post('/api/endpoint', async (req, res) => {
try {
// Validar parámetros
const { campo } = req.body;
if (!campo) {
return res.status(400).json({ error: 'Campo requerido' });
}
// Lógica de negocio
const resultado = await Modelo.create({ campo });
// Respuesta exitosa
res.status(201).json(resultado);
} catch (error) {
console.error('Error en endpoint:', error);
res.status(500).json({ error: 'Error interno del servidor' });
}
});
// ✅ Gestión de APIs
async function llamarAPI(endpoint, datos = null) {
try {
const opciones = {
method: datos ? 'POST' : 'GET',
headers: { 'Content-Type': 'application/json' }
};
if (datos) opciones.body = JSON.stringify(datos);
const response = await fetch(endpoint, opciones);
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'Error en la petición');
}
return await response.json();
} catch (error) {
console.error('Error en API:', error);
mostrarToast('error', 'Error', error.message);
throw error;
}
}
/* ✅ Uso de variables del tema */
.mi-componente {
background-color: var(--bg-primary);
color: var(--text-primary);
border: 1px solid var(--border-primary);
box-shadow: 0 2px 4px var(--shadow-light);
}
.mi-componente:hover {
background-color: var(--bg-secondary);
box-shadow: 0 4px 8px var(--shadow-medium);
}
.mi-componente.success {
border-color: var(--success);
color: var(--success);
}
Problema | Síntoma | Solución |
---|---|---|
Temas no se aplican | Variables CSS no cambian | Verificar carga de tema-global.js |
SweetAlert sin tema | Notificaciones con colores por defecto | Verificar carga de sweetalert-tema.js |
Editor no abre | Click en “Editar” no responde | Verificar editor-temas.js y dependencias |
Tema no persiste | Se pierde al recargar | Verificar localStorage y tema-global.js |
Google OAuth falla | Error de redirect URI | Verificar configuración en Google Cloud |
NODE_ENV=production
MONGODB_URI=mongodb+srv://prod-user:secure-pass@cluster.mongodb.net/prod-db
GOOGLE_CLIENT_ID=prod_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=prod_client_secret
GOOGLE_CALLBACK_URL=https://tudominio.com/auth/google/callback
EMAIL_USER=noreply@tudominio.com
EMAIL_PASS=secure_app_password
SESSION_SECRET=clave_super_segura_64_caracteres_minimo
JWT_SECRET=otra_clave_super_segura_diferente
PORT=443
🔒 Importante: En producción, usar variables de entorno del sistema operativo, no archivos
.env
tema-global.js
funciona en todas las páginas automáticamentemostrarToast is not defined
resueltoEste proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
git checkout -b feature/nueva-funcionalidad
git commit -m 'feat: agregar nueva funcionalidad'
git push origin feature/nueva-funcionalidad
⚡ Sistema de Temas Revolucionario - Versión 4.0.0 ⚡
Una experiencia de usuario completamente personalizable con el sistema de temas más avanzado del mercado.
🛍️ ¡Gracias por usar CatalogoTienda! 🛍️
CatalogoTienda es una plataforma completa de e-commerce construida con Node.js y MongoDB que ofrece:
El sistema implementa una estrategia inteligente de notificaciones que mejora significativamente la experiencia del usuario:
// Ejemplo de toast automático
Swal.fire({
toast: true,
position: 'top-end',
icon: 'success',
title: 'Producto agregado al carrito',
showConfirmButton: false,
timer: 3000
});
// Modal de confirmación crítica
const result = await Swal.fire({
title: '¿Eliminar producto?',
text: 'Esta acción no se puede deshacer',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Sí, eliminar',
cancelButtonText: 'Cancelar'
});
.then()
, showCancelButton
, input
, acciones de seguridadLos correos electrónicos del sistema se adaptan automáticamente al tema visual activo:
// Función para obtener tema activo (backend)
async function obtenerTemaActivo() {
try {
const tema = await Tema.findOne({ activo: true });
return tema ? tema.colores : null;
} catch (error) {
console.error('Error al obtener tema activo:', error);
return null;
}
}
// Aplicación en correos
const coloresTema = await obtenerTemaActivo();
const htmlCorreo = generarHTMLCorreo(datos, coloresTema);
┌─────────────────────────────────────────────┐
│ Frontend │
│ index.html │ indexAdmin.html │
│ (Preferencias) │ (Editor de Temas) │
├─────────────────┼───────────────────────────┤
│ script.js │ editor-temas.js │
│ (Modal Prefs) │ (Editor Visual) │
├─────────────────┼───────────────────────────┤
│ tema-global.js (Universal) │
│ (Aplicación automática en todas │
│ las páginas) │
├─────────────────┼───────────────────────────┤
│ sweetalert-tema.js (Nuevo) │
│ (SweetAlert2 con temas dinámicos) │
├─────────────────┴───────────────────────────┤
│ localStorage │
│ - temaSeleccionado (ID) │
│ - nombreTemaSeleccionado │
│ - coloresTema (JSON) │
│ - iconicoTema │
└─────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────┐
│ Backend │
├─────────────────────────────────────────────┤
│ MongoDB Atlas │
│ Colección: temas │
│ │
│ { │
│ _id: ObjectId, │
│ nombre: "Tema Oscuro", │
│ icono: "🌙", │
│ colores: { │
│ bgPrimary: "#1a1a1a", │
│ textPrimary: "#ffffff", │
│ success: "#4caf50", │
│ error: "#f44336", │
│ warning: "#ff9800", │
│ info: "#2196f3", │
│ ... │
│ }, │
│ activo: boolean │
│ } │
└─────────────────────────────────────────────┘
--bg-primary
, --bg-secondary
, --bg-tertiary
--text-primary
, --text-secondary
, --text-accent
--border-primary
, --border-secondary
--shadow-light
, --shadow-medium
--success
, --warning
, --error
, --info
--modal-bg
, --hover-overlay
SwalToast
- Notificaciones toastSwalConfirm
- Modales de confirmaciónSwalAlert
- Alertas simplesSwalSuccess/Error/Warning
- Alertas tipificadas// En indexAdmin.html - Editor visual
EditorTemas.crearNuevoTema() →
API POST /api/temas →
MongoDB →
Renderización inmediata →
Editor visual abierto
// Editor visual con sliders RGB
EditorTemas.editarTema(id) →
Sliders RGB + Input HEX →
Previsualización en vivo →
Guardado en MongoDB →
Aplicación inmediata
// Aplicar tema seleccionado
EditorTemas.aplicarTema(id) →
Variables CSS actualizadas →
localStorage sincronizado →
SweetAlert2 reconfigurado →
Evento 'temaAplicado' emitido
// Al cargar cualquier página
tema-global.js ejecutado →
localStorage consultado →
Variables CSS aplicadas →
sweetalert-tema.js configurado →
Tema listo para usar
// Toast notifications (esquina superior derecha)
window.SwalToast.fire({
icon: 'success',
title: 'Operación exitosa',
text: 'Los datos se guardaron correctamente'
});
// Modal de confirmación
const resultado = await window.SwalConfirm.fire({
title: '¿Eliminar elemento?',
text: 'Esta acción no se puede deshacer'
});
// Alerta simple
window.SwalAlert.fire({
icon: 'info',
title: 'Información',
text: 'Datos actualizados correctamente'
});
// Toast rápido
mostrarToast('success', 'Guardado exitoso');
// Confirmación rápida
const confirmado = await mostrarConfirmacion(
'¿Continuar?',
'Se aplicarán los cambios'
);
// Alerta rápida
mostrarAlerta('error', 'Error', 'No se pudo conectar al servidor');
Archivo | Propósito | Ubicación |
---|---|---|
editor-temas.js |
Editor visual de temas (Admin) | /js/editor-temas.js |
tema-global.js |
Aplicación automática (Universal) | /js/tema-global.js |
sweetalert-tema.js |
[NUEVO] SweetAlert2 con temas | /js/sweetalert-tema.js |
style.css |
Variables CSS y estilos SweetAlert2 | /css/style.css |
:root {
/* Fondos */
--bg-primary: #ffffff; /* Fondo principal */
--bg-secondary: #f8f9fa; /* Fondo secundario */
--bg-tertiary: #e9ecef; /* Fondo terciario */
/* Textos */
--text-primary: #212529; /* Texto principal */
--text-secondary: #6c757d; /* Texto secundario */
--text-accent: #007bff; /* Texto de acento */
/* Bordes */
--border-primary: #dee2e6; /* Borde principal */
--border-secondary: #ced4da; /* Borde secundario */
/* Sombras */
--shadow-light: rgba(0,0,0,0.1); /* Sombra suave */
--shadow-medium: rgba(0,0,0,0.2); /* Sombra media */
/* Estados */
--success: #28a745; /* Color de éxito */
--warning: #ffc107; /* Color de advertencia */
--error: #dc3545; /* Color de error */
--info: #17a2b8; /* Color de información */
/* Especiales */
--modal-bg: rgba(0,0,0,0.5); /* Fondo de modales */
--hover-overlay: rgba(0,0,0,0.05); /* Overlay hover */
}
Clonar el repositorio
git clone https://github.com/tu-usuario/CatalogoTienda.git
cd CatalogoTienda
Instalar dependencias
npm install
cd backend
npm install
Configurar variables de entorno
# backend/.env (usar valores propios)
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/catalogo
JWT_SECRET=generar_clave_secreta_segura_unica
GOOGLE_CLIENT_ID=tu_google_client_id.googleusercontent.com
GOOGLE_CLIENT_SECRET=tu_google_client_secret
EMAIL_USER=tu_email@gmail.com
EMAIL_PASS=tu_app_password_gmail
PORT=3000
⚠️ Importante: Nunca commitear el archivo
.env
con credenciales reales. Usar siempre variables de entorno seguras en producción.
Inicializar la base de datos
node init-idiomas.js # Crear monedas y ubicaciones iniciales
Ejecutar el proyecto
npm start
# o para desarrollo:
npm run dev
CatalogoTienda/
├── backend/
│ ├── models/ # Modelos de MongoDB
│ │ ├── productos.js
│ │ ├── perfil.js
│ │ ├── categoria.js
│ │ └── ...
│ ├── routes/ # Rutas de la API
│ │ └── routes.js
│ ├── public/ # Frontend estático
│ │ ├── index.html # Página principal
│ │ ├── indexAdmin.html # Panel admin
│ │ ├── css/
│ │ │ ├── style.css # Estilos principales
│ │ │ └── editor-temas.css # Estilos del editor
│ │ ├── js/
│ │ │ ├── script.js # Lógica principal
│ │ │ ├── editor-temas.js # Editor de temas
│ │ │ ├── tema-global.js # Sistema global
│ │ │ └── ...
│ │ └── img/ # Imágenes estáticas
│ ├── data/ # Datos iniciales
│ ├── server.js # Servidor principal
│ ├── init-idiomas.js # Script inicialización
│ └── package.json
├── README.md
└── package.json
Clonar el repositorio
git clone https://github.com/tu-usuario/CatalogoTienda.git
cd CatalogoTienda
Instalar dependencias
cd backend
npm install
cp .env.example .env
Editar el archivo .env
con tus credenciales reales:
# Google OAuth
GOOGLE_CLIENT_ID=tu_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=tu_client_secret
GOOGLE_CALLBACK_URL=/auth/google/callback
# MongoDB
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/database
# Email (para envío de correos tematizados)
EMAIL_USER=tu_email@gmail.com
EMAIL_PASS=tu_app_password_gmail
# Servidor
PORT=3000
SESSION_SECRET=generar_session_secret_muy_seguro
JWT_SECRET=generar_jwt_secret_seguro
⚠️ Seguridad: Nunca commitear archivos
.env
con credenciales reales. Usar variables de entorno del sistema en producción.
Configurar Google OAuth
http://localhost:3000
http://localhost:3000/auth/google/callback
Ejecutar el proyecto
npm start
El servidor se ejecutará en http://localhost:3000
CatalogoTienda/
├── backend/
│ ├── models/ # Modelos de MongoDB
│ │ ├── perfil.js # Modelo de usuarios
│ │ ├── productos.js # Modelo de productos
│ │ ├── mensajes.js # Modelo de mensajes/contacto
│ │ └── ...
│ ├── public/ # Archivos estáticos
│ │ ├── css/ # Estilos
│ │ ├── js/ # JavaScript del frontend
│ │ ├── img/ # Imágenes y avatares
│ │ └── productos/ # Imágenes de productos
│ ├── data/ # Archivos de configuración JSON
│ ├── routes/ # Rutas de la API
│ ├── .env.example # Plantilla de variables de entorno
│ ├── server.js # Servidor principal
│ └── package.json # Dependencias
├── .gitignore
└── README.md
POST /api/crear-cuenta # Crear cuenta nueva
POST /api/iniciar-sesion # Iniciar sesión tradicional
GET /auth/google # Iniciar OAuth con Google
GET /auth/google/callback # Callback de Google OAuth
GET /api/auth/user # Obtener usuario autenticado
GET /api/productos # Obtener todos los productos
GET /api/productos/:id # Obtener producto por ID
POST /api/productos # Crear nuevo producto (Admin)
PUT /api/productos/:id # Actualizar producto (Admin)
DELETE /api/productos/:id # Eliminar producto (Admin)
PATCH /api/productos/:id/disponibilidad # Cambiar estado
GET /api/perfil # Obtener perfil del usuario
PUT /api/perfil # Actualizar perfil
POST /api/perfil/foto # Subir foto de perfil
GET /api/usuarios # Obtener todos los usuarios (Admin)
PUT /api/usuarios/:correo/rol # Cambiar rol de usuario (Admin)
GET /api/usuarios/:correo/carrito # Obtener carrito
PUT /api/usuarios/:correo/carrito # Actualizar carrito
DELETE /api/usuarios/:correo/carrito/:id # Eliminar del carrito
POST /api/usuarios/:correo/compras # Registrar compra
POST /api/pagar # Procesar pago
GET /api/sobre-nosotros # Gestión de equipo
POST /api/sobre-nosotros # Crear/actualizar miembro
DELETE /api/sobre-nosotros/:id # Eliminar miembro
GET /api/terminos-condiciones # Términos y condiciones
POST /api/terminos-condiciones # Crear/actualizar término
GET /api/monedas # Gestión de monedas
POST /api/monedas # Crear moneda
PUT /api/monedas/:id # Actualizar moneda
DELETE /api/monedas/:id # Eliminar moneda
GET /api/categorias # Gestión de categorías
POST /api/categorias # Crear categoría
PUT /api/categorias/:id # Actualizar categoría
DELETE /api/categorias/:id # Eliminar categoría
// Productos: /productos/
// Perfiles: /img/perfiles/
// Equipo: /img/
// CSP configurado para recursos necesarios
// CORS habilitado con credenciales
// Protección XSS y clickjacking
Crear modelo (si necesita base de datos)
// backend/models/nuevoModelo.js
const mongoose = require('mongoose');
const nuevoSchema = new mongoose.Schema({
campo: { type: String, required: true }
});
module.exports = mongoose.model('NuevoModelo', nuevoSchema);
Agregar endpoints
// En server.js o routes/
app.get('/api/nuevo-endpoint', async (req, res) => {
try {
// Lógica aquí
res.json({ success: true });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
Frontend JavaScript
// backend/public/js/nuevoArchivo.js
async function nuevaFuncion() {
try {
const response = await fetch('/api/nuevo-endpoint');
const data = await response.json();
// Manejar respuesta
} catch (error) {
console.error('Error:', error);
}
}
Logs del servidor
# Ejecutar con logs detallados
DEBUG=* npm start
Verificar conexión DB
mongoose.connection.on('connected', () => {
console.log('MongoDB conectado');
});
Verificar variables de entorno
console.log('Puerto:', process.env.PORT);
console.log('MongoDB:', process.env.MONGODB_URI ? 'Configurado' : 'No configurado');
# Productos
curl -X GET http://localhost:3000/api/productos
# Login
curl -X POST http://localhost:3000/api/iniciar-sesion \
-H "Content-Type: application/json" \
-d '{"correo":"test@test.com","contrasena":"password"}'
// Verificar configuración en server.js
app.use(cors({
origin: function (origin, callback) {
callback(null, true);
},
credentials: true
}));
// Verificar IP y reset manual si es necesario
authLimiter.store.resetKey(req.ip);
// Verificar permisos de carpetas
// Verificar límites de multer
// Verificar tipos de archivo permitidos
NODE_ENV=production
MONGODB_URI=mongodb+srv://prod-user:secure-pass@cluster.mongodb.net/prod-db
GOOGLE_CLIENT_ID=prod_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=prod_client_secret
GOOGLE_CALLBACK_URL=https://tu-dominio.com/auth/google/callback
EMAIL_USER=noreply@tu-dominio.com
EMAIL_PASS=secure_app_password
SESSION_SECRET=generar_clave_super_segura_produccion
JWT_SECRET=generar_jwt_secret_seguro_produccion
PORT=443
🔒 Importante: En producción, usar variables de entorno del sistema operativo, no archivos
.env
{
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js",
"test": "echo \"No tests specified\"",
"prod": "NODE_ENV=production node server.js"
}
}
obtenerTemaActivo()
: Centralización de lógica de temas en backendswal.fire
CORREOS-TEMATIZADOS.md
: Documentación técnica completa del sistema de correos personalizadosbackend/test-correos-tematizados.js
: Script de prueba para validar temas en correosbackend/public/ejemplo-correo-tematizado.html
: Vista previa visual de correos tematizadosbackend/models/Tema.js
: Estructura de datos para temas y coloresbackend/public/js/sweetalert-tema.js
: Configuración de SweetAlert2 con temasbackend/public/js/tema-global.js
: Sistema universal de aplicación de temasbackend/public/css/style.css
: Variables CSS y estilos de notificacionesbackend/check-config.js
: Verificación de configuración del sistemabackend/migrate-passwords.js
: Migración de contraseñas a bcryptbackend/agregar-tema-global.js
: Utilidad para agregar temas predefinidos💡 Tip: Revisar estos archivos para entender la implementación técnica completa de cada funcionalidad.
git checkout -b feature/nueva-funcionalidad
git commit -m 'Agregar nueva funcionalidad'
git push origin feature/nueva-funcionalidad
Para usuarios finales que necesitan aprender a usar el sistema, consulta el Manual de Usuario que incluye:
📌 Nota: El manual de usuario está diseñado para personas sin conocimientos técnicos y utiliza un lenguaje claro y directo con muchas capturas de pantalla e instrucciones visuales.
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
¡Gracias por contribuir al proyecto CatalogoTienda! 🛍️