Modularización de GKACHELE SaaS
This commit is contained in:
182
memoria/COMO_CONECTAR_DB.md
Normal file
182
memoria/COMO_CONECTAR_DB.md
Normal file
@@ -0,0 +1,182 @@
|
||||
# 🔌 CÓMO CONECTARSE A LA BASE DE DATOS DE CLIENTES
|
||||
|
||||
**GKACHELE™ - Guía de Conexión a Base de Datos**
|
||||
© 2025 GKACHELE™. Todos los derechos reservados.
|
||||
|
||||
## 📍 Ubicación de la Base de Datos
|
||||
|
||||
La base de datos **`main.db`** contiene TODOS los clientes (sistema multi-tenant).
|
||||
|
||||
### Ubicaciones:
|
||||
|
||||
1. **Local (Desarrollo):**
|
||||
```
|
||||
C:\word\demo\database\main.db
|
||||
```
|
||||
|
||||
2. **Raspberry Pi (Producción):**
|
||||
```
|
||||
/home/pi/gkachele-saas/database/main.db
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ OPCIÓN 1: DB Browser for SQLite (GUI - Recomendado)
|
||||
|
||||
Ya tienes **DB Browser for SQLite** abierto. Sigue estos pasos:
|
||||
|
||||
### Para Base de Datos Local:
|
||||
|
||||
1. En DB Browser, haz clic en **"Abrir base de datos"** (botón en la barra superior)
|
||||
2. Navega a: `C:\word\demo\database\`
|
||||
3. Selecciona `main.db`
|
||||
4. ¡Listo! Verás todas las tablas
|
||||
|
||||
### Para Base de Datos de Raspberry (Copiar primero):
|
||||
|
||||
1. **Copiar DB desde Raspberry:**
|
||||
```bash
|
||||
# Desde PowerShell o WSL:
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry.db"
|
||||
```
|
||||
|
||||
2. **Abrir en DB Browser:**
|
||||
- Abre `C:\word\demo\database\main_raspberry.db`
|
||||
|
||||
---
|
||||
|
||||
## 📊 Tablas Disponibles
|
||||
|
||||
Una vez conectado, verás estas tablas:
|
||||
|
||||
### 👥 **users** - Todos los clientes
|
||||
```sql
|
||||
SELECT * FROM users;
|
||||
```
|
||||
- `id`, `email`, `password` (hash), `plan`, `rubro`, `created_at`
|
||||
|
||||
### 🌐 **sites** - Todos los sitios
|
||||
```sql
|
||||
SELECT * FROM sites;
|
||||
```
|
||||
- `id`, `user_id`, `slug`, `theme`, `status`, `content_json`, `created_at`
|
||||
|
||||
### 📋 **menus** - Menús dinámicos
|
||||
```sql
|
||||
SELECT * FROM menus;
|
||||
```
|
||||
- `id`, `user_id`, `site_id`, `location`, `title`, `url`, `order_index`, `parent_id`
|
||||
|
||||
### 🧩 **widgets** - Widgets dinámicos
|
||||
```sql
|
||||
SELECT * FROM widgets;
|
||||
```
|
||||
- `id`, `user_id`, `site_id`, `area`, `type`, `title`, `content`, `order_index`
|
||||
|
||||
### 📝 **content** - Contenido por sección
|
||||
```sql
|
||||
SELECT * FROM content;
|
||||
```
|
||||
|
||||
### ⚙️ **settings** - Configuraciones
|
||||
```sql
|
||||
SELECT * FROM settings;
|
||||
```
|
||||
|
||||
### 📤 **requests** - Solicitudes de publicación
|
||||
```sql
|
||||
SELECT * FROM requests;
|
||||
```
|
||||
|
||||
### 📁 **media** - Archivos subidos
|
||||
```sql
|
||||
SELECT * FROM media;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐍 OPCIÓN 2: Script Python (Terminal)
|
||||
|
||||
### Ver Usuarios y Sitios:
|
||||
|
||||
```bash
|
||||
cd C:\word\demo
|
||||
python ver_usuarios.py
|
||||
```
|
||||
|
||||
### Limpiar Base de Datos:
|
||||
|
||||
```bash
|
||||
cd C:\word\demo
|
||||
python limpiar_db.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Consultas Útiles
|
||||
|
||||
### Ver todos los clientes con sus sitios:
|
||||
```sql
|
||||
SELECT
|
||||
u.id AS user_id,
|
||||
u.email,
|
||||
u.plan,
|
||||
u.rubro,
|
||||
COUNT(s.id) AS num_sitios
|
||||
FROM users u
|
||||
LEFT JOIN sites s ON u.id = s.user_id
|
||||
GROUP BY u.id
|
||||
ORDER BY u.id;
|
||||
```
|
||||
|
||||
### Ver sitios de un cliente específico:
|
||||
```sql
|
||||
SELECT * FROM sites WHERE user_id = 1;
|
||||
```
|
||||
|
||||
### Ver menús de un sitio:
|
||||
```sql
|
||||
SELECT * FROM menus WHERE site_id = 1 ORDER BY location, order_index;
|
||||
```
|
||||
|
||||
### Ver widgets de un sitio:
|
||||
```sql
|
||||
SELECT * FROM widgets WHERE site_id = 1 ORDER BY area, order_index;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Sincronizar DB desde Raspberry
|
||||
|
||||
Si quieres trabajar con la base de datos más actualizada (de producción):
|
||||
|
||||
```bash
|
||||
# Script para copiar DB desde Raspberry
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry.db && echo '✅ DB copiada desde Raspberry'"
|
||||
```
|
||||
|
||||
Luego abre `main_raspberry.db` en DB Browser.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ IMPORTANTE
|
||||
|
||||
- **NO edites directamente la DB de producción** sin hacer backup primero
|
||||
- **Usa los scripts** (`ver_usuarios.py`, `limpiar_db.py`) para operaciones comunes
|
||||
- **Haz backup** antes de cambios importantes (usa `backup_completo.sh`)
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Script Rápido: Copiar DB desde Raspberry
|
||||
|
||||
Ejecuta este comando para copiar la DB más reciente:
|
||||
|
||||
```bash
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no pi@192.168.1.134:/home/pi/gkachele-saas/database/main.db /mnt/c/word/demo/database/main_raspberry_$(date +%Y%m%d_%H%M%S).db"
|
||||
```
|
||||
|
||||
Esto creará una copia con timestamp para no sobrescribir.
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
48
memoria/CREDENCIALES_CLIENTES.md
Normal file
48
memoria/CREDENCIALES_CLIENTES.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# 🔐 Credenciales de Clientes - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## ⚠️ ARCHIVO CONFIDENCIAL
|
||||
|
||||
Este archivo contiene credenciales de acceso de clientes para administración.
|
||||
|
||||
**MANTENER PRIVADO Y SEGURO**
|
||||
|
||||
---
|
||||
|
||||
## 📋 Credenciales Registradas
|
||||
|
||||
### Usuario Administrador Principal
|
||||
- **ID:** 1
|
||||
- **Email:** `admin@gkachele.com`
|
||||
- **Password:** `admin123` ⚠️ **CAMBIAR DESPUÉS**
|
||||
- **Rol:** `administrator`
|
||||
- **Estado:** `active`
|
||||
|
||||
---
|
||||
|
||||
## 👥 Clientes Registrados
|
||||
|
||||
| ID | Email | Password | Plan | Rubro | Fecha Registro | Estado |
|
||||
|----|-------|----------|------|-------|----------------|--------|
|
||||
| - | - | - | - | - | - | - |
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notas
|
||||
|
||||
- Las contraseñas están hasheadas en la base de datos
|
||||
- Este archivo es solo para referencia administrativa
|
||||
- **NUNCA** compartir estas credenciales
|
||||
- Cambiar contraseñas después del primer acceso
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Actualización
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-credenciales-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
457
memoria/CUSTOMIZER_WORDPRESS_COMPLETO.md
Normal file
457
memoria/CUSTOMIZER_WORDPRESS_COMPLETO.md
Normal file
@@ -0,0 +1,457 @@
|
||||
# 🎯 CUSTOMIZER WORDPRESS COMPLETO - DEMO PARA ADAPTAR
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Hash:** `gkachele-customizer-wordpress-completo-20250115-001`
|
||||
**Estado:** ✅ **DEMO COMPLETO CREADO - LISTO PARA ANALIZAR Y ADAPTAR**
|
||||
|
||||
---
|
||||
|
||||
## 📋 ARCHIVO DEMO
|
||||
|
||||
**Ubicación:** `c:\word\demo\templates\customizer-wordpress-COMPLETO.html`
|
||||
|
||||
**Tipo:** Archivo HTML independiente (no toca código actual)
|
||||
|
||||
**Para verlo:** Abrir directamente en navegador o usar `file:///C:/word/demo/templates/customizer-wordpress-COMPLETO.html`
|
||||
|
||||
---
|
||||
|
||||
## ✅ FUNCIONALIDADES IMPLEMENTADAS (TODO LO DE WORDPRESS)
|
||||
|
||||
### 1. 🎨 **DISEÑO VISUAL EXACTO WORDPRESS**
|
||||
|
||||
- ✅ Header: Fondo #23282d, logo "W", título "Personalizar", botón cerrar
|
||||
- ✅ Sidebar: 300px de ancho, fondo blanco, borde #ddd
|
||||
- ✅ Footer: Sticky, fondo #f6f7f7, botones estilo WordPress
|
||||
- ✅ Colores oficiales WordPress: #2271b1 (azul), #f0f0f1 (gris), #23282d (header)
|
||||
- ✅ Tipografía: -apple-system, Segoe UI, Roboto
|
||||
- ✅ Scroll suave en sidebar
|
||||
|
||||
---
|
||||
|
||||
### 2. 📑 **PANELES Y SECCIONES COLAPSABLES**
|
||||
|
||||
**Panel: General Options** (colapsable)
|
||||
- Identidad del sitio
|
||||
- Top Bar Setting
|
||||
- Menu Bar Setting
|
||||
- Page Header Setting
|
||||
- Top Scroller Setting
|
||||
- Blog Setting
|
||||
- Footer Setting
|
||||
- Body Typography Setting
|
||||
|
||||
**Secciones individuales:**
|
||||
- Colores
|
||||
- Contenido
|
||||
- Medios
|
||||
- Contacto
|
||||
- Redes Sociales
|
||||
- Widgets
|
||||
- Menús
|
||||
|
||||
**Funcionalidad:**
|
||||
- Paneles se pueden colapsar/expandir
|
||||
- Navegación lateral con menú
|
||||
- Secciones activas se resaltan con borde azul izquierdo
|
||||
|
||||
---
|
||||
|
||||
### 3. 🎛️ **CONTROLES IMPLEMENTADOS**
|
||||
|
||||
#### **Toggle Switches (Enable/Disable)**
|
||||
- Estilo WordPress exacto
|
||||
- Slider animado
|
||||
- Color azul cuando activo (#2271b1)
|
||||
- Usado para: Enable Top Header, Enable Info 1/2/3, WhatsApp flotante
|
||||
|
||||
#### **Range Sliders**
|
||||
- Deslizadores para valores numéricos
|
||||
- Muestra valor actual (ej: "150px", "24px", "1.6")
|
||||
- Usado para: Logo Size, Font Sizes, Line Height
|
||||
- Estilo WordPress: thumb azul, track gris
|
||||
|
||||
#### **Color Pickers**
|
||||
- Input type="color" + input texto sincronizado
|
||||
- Muestra hex code
|
||||
- Usado para: Color primario, secundario, texto, fondo
|
||||
|
||||
#### **Media Uploaders**
|
||||
- Botón "Seleccionar imagen"
|
||||
- Preview de imagen seleccionada
|
||||
- Usado para: Logo, Hero Image, Favicon
|
||||
- (En WordPress real abre biblioteca de medios)
|
||||
|
||||
#### **Text Inputs**
|
||||
- Inputs de texto estándar
|
||||
- Focus: borde azul + box-shadow
|
||||
- Usado para: Nombres, títulos, URLs, emails, teléfonos
|
||||
|
||||
#### **Textareas**
|
||||
- Áreas de texto multilínea
|
||||
- Resizable verticalmente
|
||||
- Usado para: Descripciones, contenido largo
|
||||
|
||||
#### **Selects (Dropdowns)**
|
||||
- Selects estándar
|
||||
- Estilo WordPress
|
||||
- Usado para: Font Family, tipos de redes sociales
|
||||
|
||||
#### **Repeater Controls**
|
||||
- Añadir/eliminar elementos repetidos
|
||||
- Cada elemento tiene sus propios controles
|
||||
- Botón "Eliminar" por elemento
|
||||
- Botón "+ Añadir" para crear nuevos
|
||||
- Usado para: Redes sociales múltiples
|
||||
|
||||
#### **Icon Pickers**
|
||||
- Grid de iconos visual
|
||||
- Click para seleccionar
|
||||
- Visual feedback (selected state)
|
||||
- Usado para: Seleccionar iconos Font Awesome
|
||||
|
||||
#### **Hidden Controls**
|
||||
- Controles ocultos (solo labels)
|
||||
- Usado para: Separadores de sección ("Info 1", "Info 2", "Setting")
|
||||
|
||||
#### **Dividers**
|
||||
- Líneas separadoras horizontales
|
||||
- Usado para: Separar grupos de controles
|
||||
|
||||
---
|
||||
|
||||
### 4. 📱 **SECCIONES ESPECÍFICAS IMPLEMENTADAS**
|
||||
|
||||
#### **Identidad del sitio**
|
||||
- Nombre del sitio (text)
|
||||
- Descripción corta (textarea)
|
||||
- Logo Size (range slider)
|
||||
- Site Title Font Size (range slider)
|
||||
- Site Description Font Size (range slider)
|
||||
|
||||
#### **Top Bar Setting**
|
||||
- Enable/Disable toggle
|
||||
- Info 1: Enable toggle, Icon picker, Title, Link
|
||||
- Info 2: Enable toggle, Icon, Title, Link
|
||||
- Info 3: Enable toggle, Icon, Title, Link
|
||||
|
||||
#### **Colores**
|
||||
- Color primario (color picker)
|
||||
- Color secundario (color picker)
|
||||
- Color de texto (color picker)
|
||||
- Color de fondo (color picker)
|
||||
|
||||
#### **Body Typography Setting**
|
||||
- Font Family (select)
|
||||
- Font Size (range slider)
|
||||
- Line Height (range slider)
|
||||
|
||||
#### **Medios**
|
||||
- Logo (media uploader + preview)
|
||||
- Imagen Hero (media uploader + preview)
|
||||
- Favicon (media uploader + preview)
|
||||
|
||||
#### **Redes Sociales**
|
||||
- WhatsApp Flotante (toggle)
|
||||
- Número de WhatsApp (tel input)
|
||||
- Repeater de redes sociales (añadir/eliminar)
|
||||
- Tipo (select: Facebook, Instagram, Twitter, YouTube, LinkedIn)
|
||||
- URL (url input)
|
||||
|
||||
#### **Contenido**
|
||||
- Título principal (text)
|
||||
- Descripción (textarea)
|
||||
|
||||
#### **Contacto**
|
||||
- Dirección (text)
|
||||
- Teléfono (tel)
|
||||
- Email (email)
|
||||
|
||||
---
|
||||
|
||||
### 5. 💾 **SISTEMA DE GUARDADO (ESTILO WORDPRESS)**
|
||||
|
||||
#### **Botones Footer:**
|
||||
- **"Descartar cambios"** (gris, solo visible si hay cambios)
|
||||
- **"Guardar y Publicar"** (azul, siempre visible)
|
||||
|
||||
#### **Estados:**
|
||||
- **"Listo"** - Sin cambios
|
||||
- **"Guardando..."** - Mientras guarda (azul)
|
||||
- **"Guardado"** - Guardado exitoso (verde)
|
||||
- **Error** - Si falla (rojo)
|
||||
|
||||
#### **Indicador de cambios sin guardar:**
|
||||
- Punto rojo pequeño junto a estado
|
||||
- Solo visible si hay cambios sin guardar
|
||||
|
||||
#### **Comportamiento:**
|
||||
- **NO guarda automáticamente** (solo preview en tiempo real)
|
||||
- **Solo guarda cuando presionas "Guardar y Publicar"**
|
||||
- **"Descartar"** restaura valores originales
|
||||
- **Confirmación antes de salir** si hay cambios sin guardar
|
||||
|
||||
---
|
||||
|
||||
### 6. 🔄 **FUNCIONALIDADES JAVASCRIPT**
|
||||
|
||||
#### **Navegación:**
|
||||
- `showSection(sectionId)` - Mostrar sección específica
|
||||
- `togglePanel(element)` - Colapsar/expandir panel
|
||||
- Navegación lateral actualiza sección activa
|
||||
|
||||
#### **Detección de cambios:**
|
||||
- `markAsChanged()` - Marca que hay cambios sin guardar
|
||||
- Detecta cambios en todos los inputs
|
||||
- Actualiza indicador visual
|
||||
|
||||
#### **Guardado:**
|
||||
- `saveChanges()` - Guarda cambios y actualiza estado
|
||||
- Simula guardado (1 segundo)
|
||||
- Actualiza valores originales
|
||||
- Muestra "Guardado" temporalmente
|
||||
|
||||
#### **Descartar:**
|
||||
- `discardChanges()` - Restaura valores originales
|
||||
- Confirmación antes de descartar
|
||||
- Sincroniza todos los controles (colors, ranges, toggles)
|
||||
|
||||
#### **Preview:**
|
||||
- `updatePreview()` - Actualiza preview en tiempo real
|
||||
- Se llama automáticamente al cambiar cualquier control
|
||||
- (En implementación real, actualizaría iframe)
|
||||
|
||||
#### **Repeater:**
|
||||
- `addRepeaterItem()` - Añade nuevo elemento
|
||||
- `removeRepeaterItem(button)` - Elimina elemento
|
||||
- Confirmación antes de eliminar
|
||||
|
||||
#### **Media Uploader:**
|
||||
- `openMediaUploader(type)` - Abre selector de medios
|
||||
- (En WordPress real, abre biblioteca de medios)
|
||||
- Preview de imagen seleccionada
|
||||
|
||||
#### **Icon Picker:**
|
||||
- Click en icono selecciona y actualiza input
|
||||
- Visual feedback (selected state)
|
||||
- Sincroniza con input de icono
|
||||
|
||||
---
|
||||
|
||||
### 7. 🎨 **ESTILOS CSS (COLORES WORDPRESS)**
|
||||
|
||||
```css
|
||||
/* Colores principales */
|
||||
Header: #23282d
|
||||
Sidebar fondo: #fff
|
||||
Sidebar borde: #ddd
|
||||
Footer fondo: #f6f7f7
|
||||
Botón primario: #2271b1
|
||||
Botón primario hover: #135e96
|
||||
Botón secundario: #f0f0f1
|
||||
Botón secundario hover: #dcdcde
|
||||
Texto: #23282d
|
||||
Texto secundario: #646970
|
||||
Borde inputs: #8c8f94
|
||||
Focus inputs: #2271b1 (borde + box-shadow)
|
||||
Toggle activo: #2271b1
|
||||
Toggle inactivo: #c3c4c7
|
||||
Range thumb: #2271b1
|
||||
Estado guardado: #00a32a
|
||||
Estado error: #d63638
|
||||
Indicador cambios: #d63638
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. 📐 **ESTRUCTURA HTML**
|
||||
|
||||
```
|
||||
customizer-header (fixed top)
|
||||
├─ customizer-header-left
|
||||
│ ├─ customizer-logo (W)
|
||||
│ └─ customizer-title (Personalizar)
|
||||
└─ customizer-close (×)
|
||||
|
||||
customizer-container (flex)
|
||||
├─ customizer-sidebar (300px)
|
||||
│ ├─ customizer-nav (menú lateral)
|
||||
│ │ ├─ customizer-nav-panel (colapsable)
|
||||
│ │ │ ├─ customizer-nav-panel-title
|
||||
│ │ │ └─ customizer-nav-panel-items
|
||||
│ │ │ └─ customizer-nav-item (secciones)
|
||||
│ │ └─ customizer-nav-item-single (secciones individuales)
|
||||
│ └─ customizer-sidebar-content
|
||||
│ └─ customizer-section (contenido de cada sección)
|
||||
│ ├─ customizer-section-title
|
||||
│ └─ customizer-control (cada control)
|
||||
│ ├─ customizer-control-label
|
||||
│ ├─ [tipo de control]
|
||||
│ └─ customizer-control-description
|
||||
└─ customizer-preview (flex: 1)
|
||||
└─ preview-iframe
|
||||
|
||||
customizer-footer (fixed bottom)
|
||||
├─ customizer-footer-left
|
||||
│ ├─ customizer-unsaved-indicator
|
||||
│ └─ customizer-status
|
||||
└─ customizer-footer-right
|
||||
├─ btn-discard
|
||||
└─ btn-save
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. 🔧 **TIPOS DE CONTROLES Y SUS CLASES CSS**
|
||||
|
||||
| Tipo | Clase CSS | Uso |
|
||||
|------|-----------|-----|
|
||||
| Toggle Switch | `.customizer-toggle` | Enable/Disable |
|
||||
| Range Slider | `.customizer-range` | Valores numéricos |
|
||||
| Color Picker | `.customizer-color-picker` | Colores |
|
||||
| Text Input | `.customizer-control-input` | Texto |
|
||||
| Textarea | `.customizer-control-textarea` | Texto largo |
|
||||
| Select | `.customizer-control-select` | Dropdowns |
|
||||
| Media Button | `.customizer-media-button` | Subir imágenes |
|
||||
| Repeater | `.customizer-repeater` | Elementos repetidos |
|
||||
| Icon Picker | `.customizer-icon-picker` | Seleccionar iconos |
|
||||
| Hidden | `.customizer-control-hidden` | Separadores |
|
||||
|
||||
---
|
||||
|
||||
### 10. 📝 **ATRIBUTOS DATA-SETTING**
|
||||
|
||||
Todos los controles tienen `data-setting="nombre_setting"` para:
|
||||
- Identificar qué control es
|
||||
- Guardar/restaurar valores
|
||||
- Sincronizar con backend
|
||||
|
||||
Ejemplos:
|
||||
- `data-setting="site_name"`
|
||||
- `data-setting="enable_top_header"`
|
||||
- `data-setting="color_primary"`
|
||||
- `data-setting="logo_size"`
|
||||
|
||||
---
|
||||
|
||||
### 11. 🎯 **COMPORTAMIENTO EXACTO WORDPRESS**
|
||||
|
||||
1. **Preview en tiempo real:**
|
||||
- Cambios se ven inmediatamente en preview
|
||||
- NO se guardan hasta presionar "Guardar y Publicar"
|
||||
|
||||
2. **Detección de cambios:**
|
||||
- Cualquier cambio marca como "sin guardar"
|
||||
- Muestra punto rojo + botón "Descartar"
|
||||
|
||||
3. **Guardado:**
|
||||
- Solo cuando presionas botón
|
||||
- Muestra "Guardando..." mientras guarda
|
||||
- Muestra "Guardado" cuando termina
|
||||
|
||||
4. **Descartar:**
|
||||
- Restaura TODOS los valores originales
|
||||
- Sincroniza todos los controles
|
||||
- Oculta indicador de cambios
|
||||
|
||||
5. **Salir:**
|
||||
- Si hay cambios sin guardar, pregunta confirmación
|
||||
- Si no hay cambios, sale directamente
|
||||
|
||||
---
|
||||
|
||||
### 12. 🔄 **SINCRONIZACIÓN DE CONTROLES**
|
||||
|
||||
#### **Color Pickers:**
|
||||
- Color picker → Input texto (hex)
|
||||
- Ambos sincronizados bidireccionalmente
|
||||
|
||||
#### **Range Sliders:**
|
||||
- Range slider → Span con valor
|
||||
- Muestra unidad (px, etc.)
|
||||
|
||||
#### **Toggles:**
|
||||
- Checkbox → Slider visual
|
||||
- Estado sincronizado
|
||||
|
||||
---
|
||||
|
||||
### 13. 📦 **FUNCIONALIDADES ADICIONALES**
|
||||
|
||||
- ✅ Scroll suave en sidebar
|
||||
- ✅ Paneles colapsables
|
||||
- ✅ Navegación rápida entre secciones
|
||||
- ✅ Preview iframe (preparado)
|
||||
- ✅ Responsive (sidebar fijo 300px)
|
||||
- ✅ Confirmaciones antes de acciones destructivas
|
||||
- ✅ Estados visuales claros
|
||||
- ✅ Tooltips y descripciones
|
||||
- ✅ Validación de inputs (type="email", "tel", "url")
|
||||
|
||||
---
|
||||
|
||||
### 14. 🎨 **DETALLES VISUALES WORDPRESS**
|
||||
|
||||
- Border radius: 4px (botones, inputs)
|
||||
- Transitions: 0.2s (hover, focus)
|
||||
- Box shadow en focus: `0 0 0 1px #2271b1`
|
||||
- Font sizes: 13px (labels), 14px (inputs), 12px (descriptions)
|
||||
- Padding: 8px 12px (inputs), 8px 16px (botones)
|
||||
- Gap: 10px (entre elementos)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PRÓXIMOS PASOS PARA ADAPTAR
|
||||
|
||||
1. **Analizar qué funcionalidades necesitamos:**
|
||||
- Revisar demo completo
|
||||
- Identificar qué secciones/controles usar
|
||||
- Decidir qué adaptar y qué no
|
||||
|
||||
2. **Adaptar al customizer actual:**
|
||||
- Copiar diseño visual
|
||||
- Implementar controles necesarios
|
||||
- Integrar con backend existente
|
||||
- Mantener funcionalidad actual
|
||||
|
||||
3. **Implementar funcionalidades faltantes:**
|
||||
- Mapa automático desde dirección
|
||||
- WhatsApp flotante funcional
|
||||
- Upload de archivos real
|
||||
- Preview iframe funcional
|
||||
|
||||
4. **Testing:**
|
||||
- Probar todos los controles
|
||||
- Verificar guardado/descartar
|
||||
- Verificar preview en tiempo real
|
||||
- Verificar todas las secciones
|
||||
|
||||
---
|
||||
|
||||
## 📌 NOTAS IMPORTANTES
|
||||
|
||||
- **Este es un DEMO independiente** - No toca código actual
|
||||
- **Todo está implementado** - Listo para copiar/adaptar
|
||||
- **Estilo WordPress exacto** - Colores, tipografía, espaciado
|
||||
- **Funcionalidades completas** - Toggles, sliders, repeaters, etc.
|
||||
- **Sistema de guardado correcto** - Como WordPress (no auto-guarda)
|
||||
|
||||
---
|
||||
|
||||
## 🔗 REFERENCIAS
|
||||
|
||||
- **Archivo demo:** `customizer-wordpress-COMPLETO.html`
|
||||
- **Código WordPress analizado:** `wp-content/themes/abiz/core/customizer/`
|
||||
- **Documentación problemas:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Hash:** `gkachele-customizer-wordpress-completo-20250115-001`
|
||||
**Estado:** ✅ **DEMO COMPLETO - LISTO PARA ANALIZAR Y ADAPTAR**
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
218
memoria/DOCUMENTACION_PROYECTO.md
Normal file
218
memoria/DOCUMENTACION_PROYECTO.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# 📖 Documentación del Proyecto - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 ¿Qué Estamos Construyendo?
|
||||
|
||||
Un **SaaS (Software as a Servicio)** para que clientes creen y gestionen sus propios sitios web, similar a sistemas populares pero mejorado y personalizado.
|
||||
|
||||
### Funcionalidad Principal:
|
||||
- Clientes se registran → Crean su sitio → Lo personalizan → Lo publican
|
||||
- Todo desde una interfaz web simple
|
||||
- Sistema multi-tenant (todos los clientes en una sola base de datos)
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Arquitectura Técnica
|
||||
|
||||
### ¿Por qué Python/Flask y NO Docker?
|
||||
|
||||
**Sí, es por la Raspberry Pi:**
|
||||
- Raspberry Pi tiene recursos limitados
|
||||
- Docker consume más memoria y CPU
|
||||
- Python directo es más ligero y eficiente
|
||||
- Más fácil de depurar y mantener
|
||||
- **En VPS podrías usar Docker si quieres**, pero Python directo también funciona perfecto
|
||||
|
||||
### Stack Tecnológico:
|
||||
- **Backend:** Flask (Python 3)
|
||||
- **Base de Datos:** SQLite (`main.db` - multi-tenant)
|
||||
- **Frontend:** HTML, CSS, JavaScript
|
||||
- **Servidor Web:** Nginx (reverse proxy)
|
||||
- **Hosting:** Raspberry Pi 3 (actual) / VPS (recomendado para producción)
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Base de Datos
|
||||
|
||||
### Estructura Multi-tenant:
|
||||
**TODO en una sola base de datos (`main.db`):**
|
||||
- `users` - Todos los usuarios/clientes
|
||||
- `sites` - Todos los sitios (filtrados por `user_id`)
|
||||
- `menus` - Menús dinámicos
|
||||
- `widgets` - Widgets dinámicos
|
||||
- `content` - Contenido
|
||||
- `settings` - Configuraciones
|
||||
- `requests` - Solicitudes de publicación
|
||||
- `media` - Archivos subidos
|
||||
|
||||
### Acceso a Base de Datos:
|
||||
- **Tu acceso:** Panel `/admin` (solo rol `administrator`)
|
||||
- **Acceso clientes:** Solo ven SUS datos (filtrado por `user_id`)
|
||||
- **Herramientas:** DB Browser for SQLite, scripts Python (`ver_usuarios.py`, `limpiar_db.py`)
|
||||
|
||||
---
|
||||
|
||||
## 👥 Sistema de Usuarios y Roles
|
||||
|
||||
### Roles (desde Base de Datos):
|
||||
- `administrator` - Acceso total (tú)
|
||||
- `editor` - Puede editar contenido
|
||||
- `author` - Puede crear contenido
|
||||
- `subscriber` - Solo lectura
|
||||
|
||||
### Admin para Clientes:
|
||||
- **Panel `/dashboard`** - Cliente ve SUS sitios
|
||||
- **Panel `/customizer/{site_id}`** - Personalizar sitio
|
||||
- **Panel `/dashboard/admin`** - Admin del cliente (media, config)
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Limitaciones por Plan
|
||||
|
||||
### Sistema Actual:
|
||||
- **Planes:** `base`, `premium`, etc. (campo en tabla `users`)
|
||||
- **Limitaciones posibles:**
|
||||
- Número de sitios
|
||||
- Subida de fotos (tamaño, cantidad)
|
||||
- Modificaciones (frecuencia, tipo)
|
||||
- Funcionalidades avanzadas
|
||||
|
||||
### Implementación:
|
||||
- Verificar plan antes de acciones
|
||||
- Contar recursos usados vs. límites del plan
|
||||
- Bloquear acciones si excede límite
|
||||
|
||||
---
|
||||
|
||||
## 📊 Detección de Movimientos
|
||||
|
||||
### Sistema Actual:
|
||||
- **No hay detección automática** de movimientos aún
|
||||
- **Registros disponibles:**
|
||||
- `created_at` - Fecha de creación
|
||||
- `updated_at` - Fecha de actualización
|
||||
- Logs del servidor (journalctl)
|
||||
|
||||
### Posibles Mejoras:
|
||||
- Tabla `activity_log` para registrar acciones
|
||||
- Notificaciones de cambios
|
||||
- Historial de modificaciones
|
||||
- Auditoría de cambios
|
||||
|
||||
---
|
||||
|
||||
## 🚀 VPS vs Raspberry Pi
|
||||
|
||||
### Raspberry Pi (Actual):
|
||||
- ✅ Bajo costo
|
||||
- ✅ Suficiente para desarrollo/pruebas
|
||||
- ❌ Recursos limitados
|
||||
- ❌ Puede ser lento con muchos clientes
|
||||
|
||||
### VPS (Recomendado para Producción):
|
||||
- ✅ Más recursos (CPU, RAM, disco)
|
||||
- ✅ Mejor rendimiento
|
||||
- ✅ Más confiable
|
||||
- ✅ Mejor para escalar
|
||||
- ✅ Puedes usar Docker si quieres
|
||||
- ✅ Mismo código funciona (solo cambiar configuración)
|
||||
|
||||
### Migración a VPS:
|
||||
1. Copiar código completo
|
||||
2. Instalar Python3, Nginx
|
||||
3. Copiar configuración
|
||||
4. Cambiar dominio
|
||||
5. Configurar SSL (Let's Encrypt)
|
||||
6. **Mismo código, más potencia**
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Flujo Completo del Sistema
|
||||
|
||||
```
|
||||
1. Cliente → Landing Page
|
||||
2. Cliente → Registro (/register)
|
||||
├── Crea usuario en `users`
|
||||
├── Crea sitio automático en `sites`
|
||||
└── Crea menús por defecto en `menus`
|
||||
3. Cliente → Login (/login)
|
||||
└── Redirige a `/customizer/{site_id}` (directo)
|
||||
4. Cliente → Customizer
|
||||
├── Personaliza contenido
|
||||
├── Cambia colores, tipografía
|
||||
└── Gestiona menús y widgets
|
||||
5. Cliente → Envía para aprobación
|
||||
└── Crea solicitud en `requests`
|
||||
6. Admin → Aprueba desde `/admin`
|
||||
└── Cambia status a `published`
|
||||
7. Sitio → Público en `/site/{slug}`
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Estructura del Proyecto
|
||||
|
||||
```
|
||||
c:\word\
|
||||
├── demo/ # Código principal
|
||||
│ ├── app.py # Flask backend (TODO aquí)
|
||||
│ ├── database/
|
||||
│ │ └── main.db # Base de datos multi-tenant
|
||||
│ ├── themes/ # Templates
|
||||
│ │ ├── _gkachele/ # Sistema modular (header.php, footer.php, sidebar.php)
|
||||
│ │ └── {tema}/ # Temas específicos
|
||||
│ ├── templates/ # HTML templates
|
||||
│ └── static/ # CSS, JS
|
||||
├── memoria/ # 📚 TODA LA DOCUMENTACIÓN
|
||||
└── backups/ # Backups automáticos
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Estado Actual
|
||||
|
||||
### ✅ Funcionando:
|
||||
- Registro de clientes
|
||||
- Login (redirige a customizer)
|
||||
- Dashboard del cliente
|
||||
- Customizer (personalización)
|
||||
- Sistema de menús y widgets
|
||||
- Panel admin (ver/eliminar usuarios)
|
||||
- Sistema de roles basado en DB
|
||||
|
||||
### ⚠️ Pendiente:
|
||||
- Limitaciones por plan
|
||||
- Detección de movimientos/actividad
|
||||
- Mejorar landing page
|
||||
- Integración Gitea
|
||||
- UI completa para gestionar menús
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Seguridad
|
||||
|
||||
- Passwords hasheados (Werkzeug)
|
||||
- Sesiones Flask
|
||||
- Filtrado por `user_id` (cada cliente solo ve sus datos)
|
||||
- Roles desde base de datos (no hardcodeados)
|
||||
- Verificación de permisos en cada ruta
|
||||
|
||||
---
|
||||
|
||||
## 📝 Próximos Pasos
|
||||
|
||||
1. **Implementar limitaciones por plan**
|
||||
2. **Sistema de actividad/logs**
|
||||
3. **Mejorar UI del customizer**
|
||||
4. **Optimizar para VPS**
|
||||
5. **Añadir más funcionalidades**
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-documentacion-completa-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
280
memoria/EDITOR_VISUAL_PREVIEW.md
Normal file
280
memoria/EDITOR_VISUAL_PREVIEW.md
Normal file
@@ -0,0 +1,280 @@
|
||||
# 🎨 Editor Visual en Preview - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 📋 ANÁLISIS: Edición en Preview vs Sidebar
|
||||
|
||||
**Hash:** `gkachele-editor-visual-20250114-1425`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 OBJETIVO
|
||||
|
||||
Permitir editar el contenido del sitio de dos formas:
|
||||
1. **Desde el sidebar** (actual) - Controles organizados
|
||||
2. **Directamente en el preview** (nuevo) - Click to edit, como sistemas modernos
|
||||
|
||||
---
|
||||
|
||||
## 🔍 ANÁLISIS DE OPCIONES
|
||||
|
||||
### Opción A: Click to Edit en Preview (Recomendado)
|
||||
|
||||
**Cómo funciona:**
|
||||
- Usuario hace click en cualquier elemento del preview (título, texto, imagen)
|
||||
- Se abre un modal o inline editor
|
||||
- Cambios se reflejan inmediatamente
|
||||
- Similar a WordPress Gutenberg o Elementor
|
||||
|
||||
**Ventajas:**
|
||||
- ✅ Más intuitivo y visual
|
||||
- ✅ El usuario ve exactamente qué está editando
|
||||
- ✅ Experiencia moderna y profesional
|
||||
- ✅ Reduce la necesidad de buscar en el sidebar
|
||||
|
||||
**Desventajas:**
|
||||
- ⚠️ Requiere JavaScript más complejo
|
||||
- ⚠️ Necesita identificar elementos editables
|
||||
- ⚠️ Puede ser más lento en sitios grandes
|
||||
|
||||
**Implementación:**
|
||||
```javascript
|
||||
// Agregar atributos data-editable a elementos del preview
|
||||
<div data-editable="hero_title" data-type="text">
|
||||
{{ hero_title }}
|
||||
</div>
|
||||
|
||||
// JavaScript para detectar clicks y abrir editor
|
||||
document.querySelectorAll('[data-editable]').forEach(el => {
|
||||
el.addEventListener('click', (e) => {
|
||||
openInlineEditor(el);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Opción B: Mejorar Sidebar Actual
|
||||
|
||||
**Cómo funciona:**
|
||||
- Mantener sidebar actual
|
||||
- Añadir más controles específicos
|
||||
- Mejorar organización y UX
|
||||
- Añadir previews visuales en el sidebar
|
||||
|
||||
**Ventajas:**
|
||||
- ✅ Más fácil de implementar
|
||||
- ✅ Ya funciona
|
||||
- ✅ Controles organizados
|
||||
|
||||
**Desventajas:**
|
||||
- ⚠️ Menos intuitivo
|
||||
- ⚠️ Usuario debe buscar en el sidebar
|
||||
- ⚠️ Menos visual
|
||||
|
||||
---
|
||||
|
||||
### Opción C: Híbrido (Mejor Opción)
|
||||
|
||||
**Cómo funciona:**
|
||||
- **Sidebar:** Controles avanzados, configuración, colores, etc.
|
||||
- **Preview:** Click to edit para contenido principal (títulos, textos, imágenes)
|
||||
- **Ambos sincronizados:** Cambios en uno se reflejan en el otro
|
||||
|
||||
**Ventajas:**
|
||||
- ✅ Lo mejor de ambos mundos
|
||||
- ✅ Usuario elige cómo editar
|
||||
- ✅ Flexible y potente
|
||||
- ✅ Experiencia profesional
|
||||
|
||||
**Implementación:**
|
||||
1. Sidebar para configuración avanzada
|
||||
2. Preview con click to edit para contenido
|
||||
3. Sincronización bidireccional
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PLAN DE IMPLEMENTACIÓN (Opción C - Híbrido)
|
||||
|
||||
### Fase 1: Click to Edit en Preview
|
||||
|
||||
**Elementos editables:**
|
||||
- `hero_title` - Título principal
|
||||
- `hero_description` - Descripción
|
||||
- `site_name` - Nombre del sitio (en header)
|
||||
- Textos de secciones (menú, horarios, etc.)
|
||||
- Imágenes (click para cambiar URL)
|
||||
|
||||
**Funcionalidad:**
|
||||
1. Agregar `data-editable` a elementos del template
|
||||
2. JavaScript detecta clicks
|
||||
3. Abre editor inline (modal o input overlay)
|
||||
4. Guarda cambios automáticamente
|
||||
5. Actualiza preview en tiempo real
|
||||
|
||||
### Fase 2: Sincronización Bidireccional
|
||||
|
||||
**Cómo funciona:**
|
||||
- Cambio en sidebar → Actualiza preview
|
||||
- Cambio en preview → Actualiza sidebar
|
||||
- Todo se guarda en `content_json`
|
||||
|
||||
### Fase 3: Mejoras del Sidebar
|
||||
|
||||
- Agregar previews visuales
|
||||
- Mejor organización
|
||||
- Búsqueda de controles
|
||||
- Atajos de teclado
|
||||
|
||||
---
|
||||
|
||||
## 📝 ESTRUCTURA TÉCNICA
|
||||
|
||||
### Template HTML (con data-editable)
|
||||
|
||||
```html
|
||||
<!-- En template.html -->
|
||||
<h1 data-editable="hero_title" data-type="text" class="editable">
|
||||
{{ hero_title or 'Bienvenido' }}
|
||||
</h1>
|
||||
|
||||
<p data-editable="hero_description" data-type="textarea" class="editable">
|
||||
{{ hero_description or '' }}
|
||||
</p>
|
||||
|
||||
<img data-editable="media.hero_image" data-type="image"
|
||||
src="{{ media.hero_image or '' }}" class="editable">
|
||||
```
|
||||
|
||||
### JavaScript (Click to Edit)
|
||||
|
||||
```javascript
|
||||
// Detectar clicks en elementos editables
|
||||
document.querySelectorAll('[data-editable]').forEach(el => {
|
||||
el.addEventListener('click', function(e) {
|
||||
if (e.target.closest('.editable')) {
|
||||
const field = this.dataset.editable;
|
||||
const type = this.dataset.type;
|
||||
openEditor(this, field, type);
|
||||
}
|
||||
});
|
||||
|
||||
// Indicador visual de que es editable
|
||||
el.style.cursor = 'pointer';
|
||||
el.title = 'Click para editar';
|
||||
});
|
||||
|
||||
function openEditor(element, field, type) {
|
||||
// Crear overlay con input
|
||||
const overlay = createEditorOverlay(element, field, type);
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
|
||||
function createEditorOverlay(element, field, type) {
|
||||
// Modal o input inline
|
||||
// Guardar al hacer blur o Enter
|
||||
// Actualizar preview
|
||||
}
|
||||
```
|
||||
|
||||
### Backend (Guardar cambios)
|
||||
|
||||
```python
|
||||
@app.route('/api/customizer/update-field', methods=['POST'])
|
||||
def update_field():
|
||||
"""Actualizar un campo específico desde preview"""
|
||||
data = request.get_json()
|
||||
site_id = data.get('site_id')
|
||||
field = data.get('field') # 'hero_title', 'horarios.lunes_viernes', etc.
|
||||
value = data.get('value')
|
||||
|
||||
# Actualizar content_json
|
||||
# Retornar éxito
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 UX/UI
|
||||
|
||||
### Indicadores Visuales
|
||||
|
||||
- **Hover:** Borde punteado o sombra
|
||||
- **Cursor:** Pointer
|
||||
- **Tooltip:** "Click para editar"
|
||||
- **Icono:** ✏️ en esquina del elemento
|
||||
|
||||
### Editor Inline
|
||||
|
||||
- **Input/Textarea:** Aparece sobre el elemento
|
||||
- **Botones:** Guardar, Cancelar
|
||||
- **Atajos:** Enter = Guardar, Esc = Cancelar
|
||||
- **Auto-save:** Guardar después de 2 segundos sin escribir
|
||||
|
||||
---
|
||||
|
||||
## ✅ CHECKLIST DE IMPLEMENTACIÓN
|
||||
|
||||
### Fase 1: Click to Edit
|
||||
- [ ] Agregar `data-editable` a elementos del template
|
||||
- [ ] JavaScript para detectar clicks
|
||||
- [ ] Crear editor inline/modal
|
||||
- [ ] Guardar cambios automáticamente
|
||||
- [ ] Actualizar preview en tiempo real
|
||||
|
||||
### Fase 2: Sincronización
|
||||
- [ ] Sidebar → Preview (ya funciona)
|
||||
- [ ] Preview → Sidebar (nuevo)
|
||||
- [ ] Validar que ambos estén sincronizados
|
||||
|
||||
### Fase 3: Mejoras
|
||||
- [ ] Indicadores visuales de elementos editables
|
||||
- [ ] Tooltips y ayuda contextual
|
||||
- [ ] Atajos de teclado
|
||||
- [ ] Búsqueda en sidebar
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLUJO COMPLETO
|
||||
|
||||
```
|
||||
1. Usuario abre customizer
|
||||
2. Ve preview con elementos editables (indicados visualmente)
|
||||
3. Click en "Bienvenido" (hero_title)
|
||||
4. Se abre editor inline
|
||||
5. Usuario escribe nuevo título
|
||||
6. Presiona Enter o hace blur
|
||||
7. Cambio se guarda en content_json
|
||||
8. Preview se actualiza automáticamente
|
||||
9. Sidebar también se actualiza (si tiene ese campo)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 COMPARACIÓN CON SISTEMAS SIMILARES
|
||||
|
||||
| Característica | WordPress | Elementor | GKACHELE™ (Propuesto) |
|
||||
|----------------|-----------|-----------|------------------------|
|
||||
| Click to Edit | ✅ | ✅ | ✅ (Fase 1) |
|
||||
| Sidebar Controls | ✅ | ✅ | ✅ (Actual) |
|
||||
| Preview en Tiempo Real | ✅ | ✅ | ✅ (Actual) |
|
||||
| Sincronización Bidireccional | ✅ | ✅ | ✅ (Fase 2) |
|
||||
| Editor Inline | ✅ | ✅ | ✅ (Fase 1) |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 DECISIÓN
|
||||
|
||||
**Implementar Opción C (Híbrido):**
|
||||
- Mantener sidebar actual (funciona bien)
|
||||
- Añadir click to edit en preview
|
||||
- Sincronización bidireccional
|
||||
- Mejoras progresivas
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025 - 14:25
|
||||
**Hash:** `gkachele-editor-visual-20250114-1425`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
133
memoria/ESTADO_ACTUAL.md
Normal file
133
memoria/ESTADO_ACTUAL.md
Normal file
@@ -0,0 +1,133 @@
|
||||
# 📊 Estado Actual del Proyecto - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 Hash Actual
|
||||
|
||||
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Estado:** ✅ **Demo WordPress completo creado - Listo para copiar y adaptar**
|
||||
|
||||
---
|
||||
|
||||
## ✅ FUNCIONANDO
|
||||
|
||||
### Flujo Completo:
|
||||
1. ✅ **Landing** - Funciona correctamente
|
||||
2. ✅ **Registro** - Crea usuario + sitio automático
|
||||
3. ✅ **Login** - Redirige DIRECTAMENTE a `/customizer/{site_id}`
|
||||
4. ✅ **Customizer** - Personalización funcional
|
||||
- Cambiar contenido
|
||||
- Cambiar colores
|
||||
- Cambiar tipografía
|
||||
- **✅ Añadir bloques (video, imagen, texto, redes sociales, mapa)**
|
||||
- **✅ Eliminar bloques**
|
||||
- **✅ Ver lista de bloques añadidos**
|
||||
- Guardar cambios (draft)
|
||||
- Enviar solicitud (pending)
|
||||
5. ✅ **Dashboard Cliente** - `/dashboard` - Ve sus sitios
|
||||
6. ✅ **Dashboard Admin** - `/admin` - Gestión completa
|
||||
- Ver usuarios
|
||||
- Eliminar usuarios
|
||||
- Ver solicitudes
|
||||
- Aprobar/rechazar sitios
|
||||
|
||||
### Sistema de Base de Datos:
|
||||
- ✅ Multi-tenant en `main.db`
|
||||
- ✅ Tablas: users, sites, menus, widgets, content, settings, requests, media
|
||||
- ✅ Sistema de roles basado en DB (administrator, editor, author, subscriber)
|
||||
- ✅ Filtrado por `user_id` (cada cliente solo ve sus datos)
|
||||
|
||||
### Templates:
|
||||
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
|
||||
- ✅ Menús dinámicos (header, footer, sidebar)
|
||||
- ✅ Widgets dinámicos
|
||||
- ✅ Temas: restaurante-moderno, restaurante-elegante, gimnasio-claro
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ PENDIENTE
|
||||
|
||||
### Funcionalidades Core:
|
||||
- [x] **Añadir bloques (COMPLETADO)**
|
||||
- [x] **Eliminar bloques (COMPLETADO)**
|
||||
- [x] **Lista de bloques en sidebar (COMPLETADO)**
|
||||
- [ ] Editar contenido de bloques existentes
|
||||
- [ ] Mover bloques (drag & drop) en customizer
|
||||
- [ ] Editar inline (contenteditable)
|
||||
- [ ] UI completa para gestionar menús desde customizer
|
||||
|
||||
### Infraestructura:
|
||||
- [ ] Subdominios automáticos
|
||||
- [ ] Integración pagos Nominalia
|
||||
- [ ] Gitea y workflows
|
||||
- [ ] Control de versiones Git
|
||||
|
||||
### Mejoras:
|
||||
- [ ] Landing optimizada para Argentina
|
||||
- [ ] Limitaciones por plan
|
||||
- [ ] Sistema de actividad/logs
|
||||
- [ ] Mejorar UI/UX
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PRÓXIMOS PASOS
|
||||
|
||||
1. **Probar con 1 rubro completo** (restaurante)
|
||||
2. **Mejorar customizer** (mover bloques, editar inline)
|
||||
3. **Gitea y workflows** (despliegues automáticos)
|
||||
4. **Subdominios** (con tu dominio)
|
||||
5. **Pagos Nominalia** (comodines)
|
||||
|
||||
---
|
||||
|
||||
## 📍 DEPLOYMENT
|
||||
|
||||
### Actual: Raspberry Pi 3
|
||||
- ✅ Funcionando
|
||||
- ✅ Login → Customizer funciona
|
||||
- ✅ Todo operativo
|
||||
|
||||
### Futuro: VPS
|
||||
- Si funciona 1 rubro bien → Migrar a VPS
|
||||
- Mismo código
|
||||
- Más recursos
|
||||
- Dominio propio
|
||||
|
||||
---
|
||||
|
||||
## 🔄 ÚLTIMA ACTUALIZACIÓN
|
||||
|
||||
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Logro:** ✅ **Demo WordPress completo creado - Listo para copiar y adaptar**
|
||||
|
||||
### Cambios en este Hash:
|
||||
- ✅ Creado demo completo WordPress: `customizer-wordpress-COMPLETO.html`
|
||||
- ✅ Todas las funcionalidades de WordPress implementadas (paneles, toggles, sliders, repeaters, etc.)
|
||||
- ✅ Documentación completa: `CUSTOMIZER_WORDPRESS_COMPLETO.md`
|
||||
- ✅ Objetivo claro documentado: `OBJETIVO_CUSTOMIZER_ADAPTADO.md`
|
||||
- ✅ Identificados problemas críticos: `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
|
||||
|
||||
### Plan para Próxima Sesión:
|
||||
1. **COPIAR WordPress** (demo completo)
|
||||
2. **AUTOMATIZAR** procesos (guardado, preview, etc.)
|
||||
3. **CAMBIAR branding** a GKACHELE™ (logo, nombres, colores)
|
||||
4. **ADAPTAR** funcionalidades con lo que ya sabemos
|
||||
5. **INTEGRAR** con backend Flask existente
|
||||
|
||||
### Archivos Creados:
|
||||
- `customizer-wordpress-COMPLETO.html` - Demo completo independiente
|
||||
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Documentación completa
|
||||
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro
|
||||
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
|
||||
|
||||
### Estado:
|
||||
- ✅ Demo WordPress completo (funcional, independiente)
|
||||
- ✅ Documentación completa
|
||||
- ✅ Objetivo claro definido
|
||||
- ⏳ Pendiente: Copiar y adaptar al customizer real
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
71
memoria/ESTRUCTURA_RUTAS.md
Normal file
71
memoria/ESTRUCTURA_RUTAS.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 🗂️ Estructura de Rutas - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 📍 RUTAS DEFINIDAS
|
||||
|
||||
### Cliente (Usuario Normal):
|
||||
|
||||
1. **`/customizer/{site_id}`** - Editar antes de publicar
|
||||
- Siempre disponible
|
||||
- Personalizar sitio (draft)
|
||||
- Guardar cambios o Enviar solicitud
|
||||
- Botón "Volver" → `/admin` del cliente
|
||||
|
||||
2. **`/admin`** - Panel del cliente (su área de administración)
|
||||
- Se crea automáticamente al aprobar sitio
|
||||
- Gestionar sitio publicado
|
||||
- Editar sitio publicado (con limitaciones por plan)
|
||||
- Ver estadísticas
|
||||
- Gestionar media, configuraciones
|
||||
|
||||
### Admin Principal (Tú):
|
||||
|
||||
3. **`/dashboard`** - Tu panel principal
|
||||
- Gestión de todo el sistema
|
||||
- Ver todas las solicitudes
|
||||
- Aprobar/rechazar sitios
|
||||
- Ver todos los usuarios
|
||||
- Eliminar usuarios
|
||||
- Gestionar subdominios
|
||||
- Gestionar pagos
|
||||
- Estadísticas generales
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLUJO COMPLETO
|
||||
|
||||
```
|
||||
1. Cliente → Registro → Crea sitio (draft)
|
||||
2. Cliente → Login → Customizer
|
||||
3. Cliente → Customizer → Edita → Envía solicitud
|
||||
4. Tú → Dashboard → Apruebas → Se crea automáticamente /admin del cliente
|
||||
5. Cliente → /admin → Edita sitio publicado (con limitaciones por plan)
|
||||
6. Si no paga → Workflow cancela/elimina
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ IMPORTANTE
|
||||
|
||||
- **`/customizer`** = Editar antes de publicar (siempre)
|
||||
- **`/admin`** = Panel del cliente (se crea al aprobar)
|
||||
- **`/dashboard`** = Tu panel principal (gestión del sistema)
|
||||
|
||||
---
|
||||
|
||||
## 🔒 LIMITACIONES POR PLAN
|
||||
|
||||
En `/admin` del cliente:
|
||||
- Limitar subidas de fotos según plan
|
||||
- Limitar movimientos/modificaciones según plan
|
||||
- Verificar plan antes de cada acción
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025 - 11:40
|
||||
**Hash:** `gkachele-estructura-rutas-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
108
memoria/FUNCIONALIDADES_COMPLETAS.md
Normal file
108
memoria/FUNCIONALIDADES_COMPLETAS.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# 🎯 Funcionalidades Completas - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## ✅ FLUJO CORRECTO (Como Sistemas Similares)
|
||||
|
||||
### 1. Landing → Registro → Login → Customizer
|
||||
|
||||
```
|
||||
Cliente → Landing
|
||||
↓
|
||||
Registro (crea usuario + sitio automático)
|
||||
↓
|
||||
Login (redirige DIRECTAMENTE a customizer)
|
||||
↓
|
||||
Customizer (personalizar sitio)
|
||||
├── Guardar cambios (draft)
|
||||
└── Enviar solicitud (pending)
|
||||
↓
|
||||
Admin Dashboard → Ver solicitudes → Aprobar
|
||||
↓
|
||||
Sitio publicado → /site/{slug}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 FUNCIONALIDADES REQUERIDAS
|
||||
|
||||
### 1. **Subdominios**
|
||||
- **Opción A:** Subdominio con tu dominio (ej: `cliente1.tudominio.com`)
|
||||
- **Opción B:** Cliente compra dominio (cobrar gestión)
|
||||
- Configurar DNS automáticamente
|
||||
- SSL automático (Let's Encrypt)
|
||||
|
||||
### 2. **Pagos - Nominalia**
|
||||
- Integración con Nominalia para pagos
|
||||
- Comodines para pagos recurrentes
|
||||
- Gestión de suscripciones
|
||||
- Facturación automática
|
||||
|
||||
### 3. **Dashboard Cliente**
|
||||
- Ver sus sitios
|
||||
- Acceder a customizer
|
||||
- Ver estado de solicitudes
|
||||
- Gestionar su admin (media, config)
|
||||
|
||||
### 4. **Customizer (Como Sistemas Similares)**
|
||||
- Mover bloques (drag & drop)
|
||||
- Editar contenido inline
|
||||
- Cambiar colores, tipografía
|
||||
- Gestionar menús
|
||||
- Gestionar widgets
|
||||
- **Guardar** (draft) o **Enviar solicitud** (pending)
|
||||
|
||||
### 5. **Dashboard Admin (Tú)**
|
||||
- Ver todas las solicitudes
|
||||
- Aprobar/rechazar sitios
|
||||
- Ver todos los usuarios
|
||||
- Eliminar usuarios
|
||||
- Gestionar subdominios
|
||||
- Gestionar pagos
|
||||
- Estadísticas
|
||||
|
||||
---
|
||||
|
||||
## 🎯 ESTADO ACTUAL
|
||||
|
||||
### ✅ Funcionando:
|
||||
- Landing
|
||||
- Registro (crea usuario + sitio)
|
||||
- Login (debería redirigir a customizer)
|
||||
- Dashboard cliente (`/dashboard`)
|
||||
- Customizer (`/customizer/{site_id}`)
|
||||
- Dashboard admin (`/admin`)
|
||||
|
||||
### ✅ CORREGIDO:
|
||||
- **✅ Login redirige correctamente a customizer**
|
||||
- Funciona como sistemas similares: Login → Customizer directo
|
||||
|
||||
### 🔧 PENDIENTE:
|
||||
- Subdominios
|
||||
- Pagos Nominalia
|
||||
- Mover bloques en customizer
|
||||
- Editar inline
|
||||
- Workflows Gitea
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST FUNCIONALIDAD
|
||||
|
||||
- [x] Login → Customizer (✅ FUNCIONANDO)
|
||||
- [x] Customizer: Guardar cambios (✅ Funciona)
|
||||
- [x] Customizer: Enviar solicitud (✅ Funciona)
|
||||
- [x] Admin: Ver solicitudes (✅ Funciona)
|
||||
- [x] Admin: Aprobar/rechazar (✅ Funciona)
|
||||
- [ ] Subdominios automáticos (PENDIENTE)
|
||||
- [ ] Pagos Nominalia (PENDIENTE)
|
||||
- [ ] Mover bloques (PENDIENTE)
|
||||
- [ ] Editar inline (PENDIENTE)
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-funcionalidades-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
100
memoria/GESTION_USUARIOS.md
Normal file
100
memoria/GESTION_USUARIOS.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# 👥 Gestión de Usuarios - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 Objetivo
|
||||
|
||||
Sistema completo para ver, gestionar y eliminar usuarios registrados desde el panel de administración.
|
||||
|
||||
## 📍 Ubicación
|
||||
|
||||
**Ruta:** `/admin` (solo usuarios con rol `administrator`)
|
||||
|
||||
## 🔍 Funcionalidades
|
||||
|
||||
### 1. Ver Todos los Usuarios
|
||||
|
||||
El panel muestra:
|
||||
- ID del usuario
|
||||
- Email
|
||||
- Plan (base, premium, etc.)
|
||||
- Rubro
|
||||
- Fecha de registro
|
||||
- Número de sitios creados
|
||||
- Sitios publicados
|
||||
- Solicitudes enviadas
|
||||
|
||||
### 2. Eliminar Usuarios
|
||||
|
||||
**Ruta:** `POST /admin/users/delete/<user_id>`
|
||||
|
||||
**Protección:**
|
||||
- Solo usuarios con rol `administrator`
|
||||
- No se puede eliminar al usuario ID=1 (admin principal)
|
||||
|
||||
**Proceso de eliminación:**
|
||||
1. Elimina widgets del usuario
|
||||
2. Elimina menús del usuario
|
||||
3. Elimina media del usuario
|
||||
4. Elimina contenido del usuario
|
||||
5. Elimina configuraciones del usuario
|
||||
6. Elimina solicitudes del usuario
|
||||
7. Elimina sitios del usuario
|
||||
8. Elimina el usuario
|
||||
|
||||
**Todo en una transacción** - Si falla algo, se revierte todo.
|
||||
|
||||
## 🛡️ Seguridad
|
||||
|
||||
- Verificación de rol desde la base de datos (no hardcodeado)
|
||||
- Confirmación antes de eliminar
|
||||
- Transacciones para integridad de datos
|
||||
- Protección del admin principal
|
||||
|
||||
## 📊 Consultas Útiles
|
||||
|
||||
### Ver usuarios con estadísticas:
|
||||
```sql
|
||||
SELECT
|
||||
u.id,
|
||||
u.email,
|
||||
u.plan,
|
||||
u.rubro,
|
||||
u.role,
|
||||
u.status,
|
||||
u.created_at,
|
||||
COUNT(DISTINCT s.id) as num_sitios,
|
||||
COUNT(DISTINCT CASE WHEN s.status = 'published' THEN s.id END) as sitios_publicados,
|
||||
COUNT(DISTINCT r.id) as num_solicitudes
|
||||
FROM users u
|
||||
LEFT JOIN sites s ON u.id = s.user_id
|
||||
LEFT JOIN requests r ON u.id = r.user_id
|
||||
GROUP BY u.id
|
||||
ORDER BY u.id DESC;
|
||||
```
|
||||
|
||||
### Filtrar usuarios inactivos:
|
||||
```sql
|
||||
SELECT * FROM users WHERE status != 'active';
|
||||
```
|
||||
|
||||
### Ver usuarios sin sitios:
|
||||
```sql
|
||||
SELECT u.* FROM users u
|
||||
LEFT JOIN sites s ON u.id = s.user_id
|
||||
WHERE s.id IS NULL;
|
||||
```
|
||||
|
||||
## 🚀 Próximas Mejoras
|
||||
|
||||
- [ ] Filtros por rol, plan, estado
|
||||
- [ ] Búsqueda de usuarios
|
||||
- [ ] Editar usuario (cambiar rol, plan, estado)
|
||||
- [ ] Suspender usuario (sin eliminar)
|
||||
- [ ] Exportar lista de usuarios
|
||||
- [ ] Estadísticas de usuarios
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-gestion-usuarios-20250114`
|
||||
143
memoria/GITEA_WORKFLOWS.md
Normal file
143
memoria/GITEA_WORKFLOWS.md
Normal file
@@ -0,0 +1,143 @@
|
||||
# 🔄 Gitea y Workflows - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 OBJETIVO
|
||||
|
||||
Integrar Gitea para automatizar despliegues, workflows y gestión de repositorios por cliente.
|
||||
|
||||
---
|
||||
|
||||
## 📋 FUNCIONALIDADES PLANEADAS
|
||||
|
||||
### 1. **Repositorios por Cliente**
|
||||
- Crear repo automático al registrar cliente
|
||||
- Un repo por sitio del cliente
|
||||
- Versionado automático de cambios
|
||||
- Historial completo
|
||||
|
||||
### 2. **Workflows Automáticos**
|
||||
|
||||
#### Workflow: Aceptar Petición
|
||||
```
|
||||
Cliente envía sitio → Admin aprueba → Workflow Gitea:
|
||||
1. Commit cambios al repo del cliente
|
||||
2. Generar build del sitio
|
||||
3. Desplegar automáticamente
|
||||
4. Notificar al cliente
|
||||
```
|
||||
|
||||
#### Workflow: Despliegue Automático
|
||||
```
|
||||
Cambios en customizer → Auto-commit → Auto-deploy
|
||||
```
|
||||
|
||||
#### Workflow: Rollback
|
||||
```
|
||||
Admin selecciona versión → Workflow restaura versión anterior
|
||||
```
|
||||
|
||||
### 3. **Integración con Dashboard Admin**
|
||||
- Ver repositorios de clientes
|
||||
- Aceptar/rechazar peticiones desde workflows
|
||||
- Ver historial de cambios
|
||||
- Gestionar despliegues
|
||||
- Control de versiones
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ ARQUITECTURA
|
||||
|
||||
### Componentes:
|
||||
1. **Gitea Server** - Gestión de repositorios
|
||||
2. **API Gitea** - Integración con Flask
|
||||
3. **Workflows** - Automatización
|
||||
4. **Dashboard Admin** - Interfaz de gestión
|
||||
|
||||
### Flujo:
|
||||
```
|
||||
Cliente → Customizer → Cambios → Gitea API → Commit → Workflow → Deploy
|
||||
Admin → Dashboard → Aprobar → Gitea API → Workflow → Deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 IMPLEMENTACIÓN
|
||||
|
||||
### 1. Instalación Gitea
|
||||
- En Raspberry Pi o VPS
|
||||
- Configurar dominio
|
||||
- API habilitada
|
||||
|
||||
### 2. Integración Flask
|
||||
- Cliente Gitea API
|
||||
- Funciones helper para repos
|
||||
- Workflows automáticos
|
||||
|
||||
### 3. Dashboard Admin
|
||||
- Sección Gitea
|
||||
- Ver repositorios
|
||||
- Gestionar workflows
|
||||
- Control de versiones
|
||||
|
||||
---
|
||||
|
||||
## 📝 WORKFLOWS ESPECÍFICOS
|
||||
|
||||
### Workflow: Nuevo Cliente
|
||||
```
|
||||
1. Cliente se registra
|
||||
2. Crear repo automático: cliente-{user_id}
|
||||
3. Commit template inicial
|
||||
4. Configurar webhook
|
||||
```
|
||||
|
||||
### Workflow: Aprobar Sitio
|
||||
```
|
||||
1. Admin aprueba desde dashboard
|
||||
2. Workflow Gitea se activa
|
||||
3. Commit cambios finales
|
||||
4. Build del sitio
|
||||
5. Deploy a producción
|
||||
6. Notificar cliente
|
||||
```
|
||||
|
||||
### Workflow: Cambios en Customizer
|
||||
```
|
||||
1. Cliente guarda cambios
|
||||
2. Auto-commit a repo
|
||||
3. Workflow opcional: preview automático
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 BENEFICIOS
|
||||
|
||||
- ✅ Versionado automático
|
||||
- ✅ Historial completo
|
||||
- ✅ Rollback fácil
|
||||
- ✅ Despliegues automáticos
|
||||
- ✅ Repositorios organizados
|
||||
- ✅ Integración completa
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST
|
||||
|
||||
- [ ] Instalar Gitea
|
||||
- [ ] Configurar API
|
||||
- [ ] Integrar con Flask
|
||||
- [ ] Crear repos automáticos
|
||||
- [ ] Workflow: Aprobar petición
|
||||
- [ ] Workflow: Despliegue automático
|
||||
- [ ] Dashboard admin: Sección Gitea
|
||||
- [ ] Testing completo
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-gitea-workflows-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
98
memoria/HASH_20250115_002.md
Normal file
98
memoria/HASH_20250115_002.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# 📌 HASH: gkachele-customizer-wordpress-adaptado-20250115-002
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 ESTADO ACTUAL
|
||||
|
||||
### ✅ COMPLETADO
|
||||
|
||||
1. **Demo WordPress Completo Creado**
|
||||
- Archivo: `customizer-wordpress-COMPLETO.html`
|
||||
- Todas las funcionalidades de WordPress implementadas
|
||||
- Paneles, secciones, controles (toggles, sliders, repeaters, icon pickers, etc.)
|
||||
- Sistema de guardado correcto (como WordPress)
|
||||
- Diseño visual exacto WordPress
|
||||
|
||||
2. **Documentación Completa**
|
||||
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Todas las funcionalidades documentadas
|
||||
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro definido
|
||||
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
|
||||
|
||||
3. **Sistema de Bloques Funcional**
|
||||
- `addNewBlock()` - Añadir bloques
|
||||
- `removeBlock()` - Eliminar bloques
|
||||
- `loadBlocksList()` - Cargar lista
|
||||
- Integrado con backend
|
||||
|
||||
---
|
||||
|
||||
## 🎯 OBJETIVO CLARO (PLAN ORIGINAL)
|
||||
|
||||
### **COPIAR WORDPRESS Y ADAPTAR:**
|
||||
|
||||
**⚠️ ESTE FUE EL PLAN DESDE EL PRINCIPIO - DEBERÍA ESTAR YA HECHO**
|
||||
|
||||
1. ⏳ **COPIAR** el demo completo de WordPress (pendiente)
|
||||
2. ⏳ **AUTOMATIZAR** procesos (guardado, preview, etc.) (pendiente)
|
||||
3. ⏳ **CAMBIAR branding** a GKACHELE™ (logo, nombres, colores) (pendiente)
|
||||
4. ⏳ **ADAPTAR** con lo que ya sabemos (pendiente)
|
||||
5. ⏳ **INTEGRAR** con backend Flask existente (pendiente)
|
||||
|
||||
### **Principios:**
|
||||
- Similar a WordPress pero con branding GKACHELE™
|
||||
- Automatizado (procesos automáticos)
|
||||
- Adaptar, no copiar exactamente
|
||||
- **DEBERÍA ESTAR YA IMPLEMENTADO** (pero no está)
|
||||
|
||||
---
|
||||
|
||||
## 📋 ARCHIVOS CLAVE
|
||||
|
||||
### **Demos:**
|
||||
- `customizer-wordpress-COMPLETO.html` - Demo completo WordPress (referencia)
|
||||
- `customizer-wordpress-demo.html` - Demo básico (anterior)
|
||||
|
||||
### **Documentación:**
|
||||
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Funcionalidades completas
|
||||
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro
|
||||
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
|
||||
|
||||
### **Código Actual:**
|
||||
- `customizer.html` - Customizer actual (a reemplazar/adaptar)
|
||||
- `app.py` - Backend Flask (endpoints listos)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PRÓXIMOS PASOS
|
||||
|
||||
1. **Analizar más** (investigación adicional)
|
||||
2. **Copiar WordPress** (demo completo)
|
||||
3. **Automatizar** (procesos automáticos)
|
||||
4. **Cambiar branding** (GKACHELE™)
|
||||
5. **Adaptar** (con lo que ya sabemos)
|
||||
6. **Integrar** (con backend Flask)
|
||||
|
||||
---
|
||||
|
||||
## 📌 NOTAS
|
||||
|
||||
- **Demo WordPress completo** está listo y funcional
|
||||
- **Documentación completa** de todas las funcionalidades
|
||||
- **Objetivo claro** definido
|
||||
- **Pendiente:** Copiar y adaptar al customizer real
|
||||
- **Hablamos luego** para continuar
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
|
||||
**Estado:** ✅ **LISTO PARA COPIAR Y ADAPTAR**
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
51
memoria/HISTORIAL_CAMBIOS.md
Normal file
51
memoria/HISTORIAL_CAMBIOS.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# 📝 Historial de Cambios - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🔄 Historial de Versiones
|
||||
|
||||
### Hash: `gkachele-login-customizer-20250114-v3`
|
||||
**Fecha:** 14 Enero 2025 - 11:34
|
||||
**Estado:** ✅ Funcionando
|
||||
|
||||
#### Cambios:
|
||||
- ✅ **Login redirige correctamente a customizer**
|
||||
- ✅ Añadido debugging completo (backend + frontend)
|
||||
- ✅ Content-Type JSON explícito en respuesta
|
||||
- ✅ Flush=True en todos los prints
|
||||
- ✅ Console.log en frontend para debugging
|
||||
- ✅ Verificación de sitios del usuario antes de redirigir
|
||||
|
||||
#### Funcionalidad:
|
||||
- Login → Busca primer sitio del usuario
|
||||
- Si tiene sitio → `/customizer/{site_id}`
|
||||
- Si no tiene sitio → `/dashboard`
|
||||
- Frontend recibe y procesa correctamente el redirect
|
||||
|
||||
---
|
||||
|
||||
### Hash: `gkachele-argentina-20250114-v2`
|
||||
**Fecha:** 14 Enero 2025 - 11:15
|
||||
|
||||
#### Cambios:
|
||||
- Documentación objetivos Argentina
|
||||
- Gitea y workflows documentados
|
||||
- Subdominios y pagos documentados
|
||||
|
||||
---
|
||||
|
||||
### Hash: `gkachele-template-system-20250114-v1`
|
||||
**Fecha:** 14 Enero 2025 - 08:50
|
||||
|
||||
#### Cambios:
|
||||
- Sistema modular de templates
|
||||
- Menús y widgets dinámicos
|
||||
- Sistema de roles basado en DB
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025 - 11:34
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
237
memoria/INDICE.md
Normal file
237
memoria/INDICE.md
Normal file
@@ -0,0 +1,237 @@
|
||||
# 📚 ÍNDICE DE DOCUMENTACIÓN - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 IMPORTANTE: LEER SIEMPRE ESTA CARPETA ANTES DE HACER CAMBIOS
|
||||
|
||||
Esta carpeta contiene **TODA** la documentación del proyecto. **SIEMPRE** consulta estos archivos antes de modificar código.
|
||||
|
||||
---
|
||||
|
||||
## 📋 DOCUMENTOS PRINCIPALES
|
||||
|
||||
### 1. ⚠️ **REGLA_IMPORTANTE.md** - LEER PRIMERO
|
||||
- **🚫 NUNCA mencionar "WordPress" en el código**
|
||||
- Reglas de branding y nomenclatura
|
||||
- Reemplazos correctos
|
||||
- **LEER ANTES DE ESCRIBIR CUALQUIER CÓDIGO**
|
||||
|
||||
### 2. 📖 **MEMORIA_PROYECTO_COMPLETA.md**
|
||||
- Documentación completa del proyecto
|
||||
- Arquitectura del sistema
|
||||
- Flujos y rutas
|
||||
- Estado actual
|
||||
- **Referencia principal del proyecto**
|
||||
|
||||
### 3. 🔐 **SISTEMA_ROLES.md**
|
||||
- Sistema de roles y permisos basado en DB
|
||||
- Jerarquía de roles (administrator, editor, author, subscriber)
|
||||
- Funciones helper: `user_has_role()`, `user_can()`
|
||||
- Migración automática
|
||||
- **NUNCA hardcodear permisos**
|
||||
|
||||
### 4. 👥 **GESTION_USUARIOS.md**
|
||||
- Sistema de gestión de usuarios
|
||||
- Ver usuarios registrados
|
||||
- Eliminar usuarios (con cascada)
|
||||
- Consultas SQL útiles
|
||||
- Panel `/admin`
|
||||
|
||||
### 5. 🔌 **COMO_CONECTAR_DB.md**
|
||||
- Cómo conectarse a la base de datos
|
||||
- DB Browser for SQLite
|
||||
- Scripts Python
|
||||
- Consultas útiles
|
||||
- Sincronización con Raspberry
|
||||
|
||||
### 6. 🖥️ **MEMORIA_RASPBERRY_SAAS.md**
|
||||
- Configuración de Raspberry Pi
|
||||
- Servicio systemd
|
||||
- Nginx
|
||||
- DuckDNS
|
||||
- Deployment
|
||||
|
||||
### 7. 🔄 **MEMORIA_SINCRONIZACION.md**
|
||||
- Sincronización entre local y Raspberry
|
||||
- Scripts de actualización
|
||||
- Cron jobs
|
||||
- Verificación
|
||||
|
||||
### 8. 🔐 **CREDENCIALES_CLIENTES.md**
|
||||
- Credenciales de acceso de clientes
|
||||
- Usuario administrador
|
||||
- **ARCHIVO CONFIDENCIAL** - Mantener privado
|
||||
|
||||
### 9. 🎯 **METODOLOGIA_TRABAJO.md**
|
||||
- Regla: Primero funcionalidad, después limpieza
|
||||
- Checklist de trabajo
|
||||
- Principios de desarrollo
|
||||
|
||||
### 10. 📖 **DOCUMENTACION_PROYECTO.md**
|
||||
- Documentación completa del proyecto
|
||||
- ¿Qué estamos construyendo?
|
||||
- Arquitectura técnica
|
||||
- Flujo completo del sistema
|
||||
- Estado actual
|
||||
|
||||
### 11. ❓ **RESPUESTAS_PREGUNTAS.md**
|
||||
- Respuestas a preguntas frecuentes
|
||||
- Python vs Docker
|
||||
- VPS vs Raspberry Pi
|
||||
- Acceso a base de datos
|
||||
- Limitaciones por plan
|
||||
|
||||
### 12. 🇦🇷 **OBJETIVOS_ARGENTINA.md**
|
||||
- Objetivos para lanzamiento en Argentina
|
||||
- Criterio de éxito (Raspberry → VPS)
|
||||
- Checklist pre-argentina
|
||||
- Plan de acción completo
|
||||
|
||||
### 13. 🔄 **GITEA_WORKFLOWS.md**
|
||||
- Integración Gitea
|
||||
- Workflows automáticos
|
||||
- Repositorios por cliente
|
||||
- Integración con dashboard admin
|
||||
- Despliegues automáticos
|
||||
|
||||
### 14. 🎯 **FUNCIONALIDADES_COMPLETAS.md**
|
||||
- Flujo correcto del sistema
|
||||
- Funcionalidades requeridas
|
||||
- Estado actual
|
||||
- Checklist funcionalidad
|
||||
|
||||
### 15. 🌐 **SUBDOMINIOS_PAGOS.md**
|
||||
- Sistema de subdominios
|
||||
- Integración pagos Nominalia
|
||||
- Comodines para pagos
|
||||
- Gestión de dominios
|
||||
|
||||
### 16. 📊 **ESTADO_ACTUAL.md**
|
||||
- Estado actual del proyecto
|
||||
- Hash actual
|
||||
- Funcionando vs Pendiente
|
||||
- Próximos pasos
|
||||
|
||||
### 17. 📝 **HISTORIAL_CAMBIOS.md**
|
||||
- Historial de versiones
|
||||
- Hash de cada cambio
|
||||
- Log de funcionalidades
|
||||
|
||||
### 18. 🗂️ **ESTRUCTURA_RUTAS.md**
|
||||
- Estructura de rutas acordada
|
||||
- /customizer - Editar antes de publicar
|
||||
- /admin - Panel del cliente
|
||||
- /dashboard - Panel principal admin
|
||||
- Flujo completo
|
||||
|
||||
### 19. 🎨 **SISTEMA_TEMPLATES.md**
|
||||
- Sistema de templates estilo WordPress
|
||||
- Cómo añadir nuevos templates fácilmente
|
||||
- Estructura de carpetas y config.json
|
||||
- Endpoints API para templates
|
||||
- Uso en customizer
|
||||
|
||||
### 20. ✏️ **EDITOR_VISUAL_PREVIEW.md**
|
||||
- Análisis: Edición en preview vs sidebar
|
||||
- Click to edit en preview (como WordPress)
|
||||
- Sincronización bidireccional
|
||||
- Plan de implementación híbrido
|
||||
- Hash: `gkachele-editor-visual-20250114-1425`
|
||||
|
||||
### 21. 🧩 **SISTEMA_BLOQUES_EDITABLES.md**
|
||||
- Sistema de bloques añadibles/eliminables
|
||||
- Drag & drop para reordenar
|
||||
- Videos, imágenes, texto, redes sociales, mapas
|
||||
- Iconos SVG para redes sociales
|
||||
- Mapa embed sin API key
|
||||
- Hash: `gkachele-bloques-editables-20250115-001`
|
||||
|
||||
### 22. 📋 **PENDIENTES_MEJORAS.md**
|
||||
- Lista de mejoras pendientes
|
||||
- Bugs a arreglar
|
||||
- Funcionalidades por implementar
|
||||
- Prioridades y checklist
|
||||
- Hash: `gkachele-pendientes-20250115-004`
|
||||
|
||||
### 23. 🚨 **PROBLEMAS_CRITICOS_CUSTOMIZER.md**
|
||||
- **PROBLEMAS CRÍTICOS DEL CUSTOMIZER**
|
||||
- Análisis completo de problemas
|
||||
- Cómo funciona WordPress Customizer
|
||||
- Plan para rehacer completamente
|
||||
- **LEER ANTES DE TRABAJAR EN CUSTOMIZER**
|
||||
- Hash: `gkachele-problemas-customizer-20250115-001`
|
||||
|
||||
### 24. 🎯 **CUSTOMIZER_WORDPRESS_COMPLETO.md**
|
||||
- **DEMO COMPLETO DE WORDPRESS CUSTOMIZER**
|
||||
- Todas las funcionalidades implementadas
|
||||
- Paneles, secciones, controles (toggles, sliders, repeaters, etc.)
|
||||
- Sistema de guardado correcto
|
||||
- Diseño visual exacto WordPress
|
||||
- **ARCHIVO DEMO:** `customizer-wordpress-COMPLETO.html`
|
||||
- **LEER PARA ADAPTAR AL CUSTOMIZER REAL**
|
||||
- Hash: `gkachele-customizer-wordpress-completo-20250115-001`
|
||||
|
||||
### 25. 🎯 **OBJETIVO_CUSTOMIZER_ADAPTADO.md**
|
||||
- **OBJETIVO CLARO: CUSTOMIZER ADAPTADO**
|
||||
- Similar a WordPress pero con branding GKACHELE™
|
||||
- AUTOMATIZADO (procesos automáticos)
|
||||
- Ver WordPress y solo ADAPTARLO (no copiar)
|
||||
- Principios: Similar no igual, Automatizado, Adaptar no copiar
|
||||
- **LEER ANTES DE EMPEZAR A IMPLEMENTAR**
|
||||
- Hash: `gkachele-objetivo-customizer-adaptado-20250115-001`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PRINCIPIOS DEL PROYECTO
|
||||
|
||||
1. **Todo en Base de Datos**: Sin lógica hardcodeada
|
||||
2. **Sistema Multi-tenant**: Todos los clientes en `main.db`
|
||||
3. **Roles Dinámicos**: Basados en DB, no hardcodeados
|
||||
4. **Branding GKACHELE™**: Sin referencias a otros sistemas
|
||||
5. **Modular**: Código organizado y reutilizable
|
||||
|
||||
---
|
||||
|
||||
## 📍 ESTRUCTURA DEL PROYECTO
|
||||
|
||||
```
|
||||
c:\word\
|
||||
├── demo/ # Código del SaaS
|
||||
│ ├── app.py # Flask backend
|
||||
│ ├── database/ # main.db (multi-tenant)
|
||||
│ ├── themes/ # Templates
|
||||
│ ├── templates/ # HTML templates
|
||||
│ └── static/ # CSS, JS
|
||||
├── memoria/ # 📚 TODA LA DOCUMENTACIÓN AQUÍ
|
||||
│ ├── INDICE.md # Este archivo
|
||||
│ ├── REGLA_IMPORTANTE.md # ⚠️ LEER PRIMERO
|
||||
│ ├── MEMORIA_PROYECTO_COMPLETA.md
|
||||
│ ├── SISTEMA_ROLES.md
|
||||
│ ├── GESTION_USUARIOS.md
|
||||
│ ├── COMO_CONECTAR_DB.md
|
||||
│ ├── MEMORIA_RASPBERRY_SAAS.md
|
||||
│ └── MEMORIA_SINCRONIZACION.md
|
||||
└── backups/ # Backups del proyecto
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ CHECKLIST ANTES DE HACER CAMBIOS
|
||||
|
||||
- [ ] Leer `REGLA_IMPORTANTE.md` (nunca mencionar WordPress)
|
||||
- [ ] Consultar `MEMORIA_PROYECTO_COMPLETA.md` para entender arquitectura
|
||||
- [ ] Verificar `SISTEMA_ROLES.md` si toca permisos
|
||||
- [ ] Revisar documentación relevante según el cambio
|
||||
- [ ] Verificar que no haya lógica hardcodeada
|
||||
- [ ] Asegurar que todo esté basado en DB
|
||||
|
||||
---
|
||||
|
||||
## 🔄 ACTUALIZACIÓN
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-docs-consolidated-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
478
memoria/MEMORIA_PROYECTO_COMPLETA.md
Normal file
478
memoria/MEMORIA_PROYECTO_COMPLETA.md
Normal file
@@ -0,0 +1,478 @@
|
||||
# 🎯 MEMORIA COMPLETA DEL PROYECTO - SaaS PageBuilder
|
||||
|
||||
**Fecha:** 13 Enero 2025
|
||||
**Hash:** `gkachele-login-customizer-20250114-v3`
|
||||
**Última actualización:** 14 Enero 2025 - 11:35
|
||||
|
||||
## 🇦🇷 OBJETIVO ARGENTINA
|
||||
|
||||
**Meta:** Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa y profesional.
|
||||
|
||||
**Criterio de Éxito:** Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS
|
||||
|
||||
**Dominio:** Ya tienes dominio configurado
|
||||
|
||||
**Ver:** `OBJETIVOS_ARGENTINA.md` y `GITEA_WORKFLOWS.md` para detalles completos
|
||||
|
||||
## 🎯 OBJETIVOS ACTUALES (Memorizado)
|
||||
|
||||
### 🚀 PRIORIDAD: ARGENTINA 🇦🇷
|
||||
**Objetivo:** Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa.
|
||||
|
||||
**Criterio de Éxito:** Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS
|
||||
|
||||
### Objetivos Inmediatos:
|
||||
|
||||
1. **✅ Template y Menús Profesionales (COMPLETADO):**
|
||||
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
|
||||
- ✅ Sistema de menús dinámicos
|
||||
- ✅ Sistema de widgets
|
||||
- ⚠️ UI completa para gestionar menús (pendiente)
|
||||
|
||||
2. **🔧 Funcionalidad Core (EN PROGRESO):**
|
||||
- ✅ Registro de clientes
|
||||
- ✅ **Login → Customizer directo (FUNCIONANDO - Hash v3)**
|
||||
- ✅ Dashboard del cliente (`/dashboard`)
|
||||
- ✅ Customizer básico (`/customizer/{site_id}`)
|
||||
- ✅ Panel admin (`/admin`)
|
||||
|
||||
3. **🔄 Gitea y Workflows (PENDIENTE):**
|
||||
- Integración Gitea para repos por cliente
|
||||
- Workflows automáticos:
|
||||
- Aceptar peticiones desde dashboard admin
|
||||
- Desplegar sitios automáticamente
|
||||
- Generar repositorios por cliente
|
||||
- Versionado automático
|
||||
- Integración con dashboard admin
|
||||
|
||||
4. **📝 Control de Versiones:**
|
||||
- Git para landing page
|
||||
- Versionado de templates
|
||||
- Historial de cambios
|
||||
- Rollback de versiones
|
||||
|
||||
5. **🎨 Mejorar Landing (PENDIENTE):**
|
||||
- Diseño optimizado para Argentina
|
||||
- Mejor UX/UI
|
||||
- Optimización de conversión
|
||||
- Performance optimizado
|
||||
- Responsive mejorado
|
||||
|
||||
6. **📊 Workflows Dashboard Admin:**
|
||||
- Aceptar/rechazar peticiones
|
||||
- Gestionar usuarios
|
||||
- Ver estadísticas
|
||||
- Gestionar despliegues
|
||||
- Control de versiones
|
||||
- Integración con Gitea
|
||||
|
||||
## ⚠️ REQUISITOS PRINCIPALES (MEMORIZAR)
|
||||
|
||||
1. **Sincronización con Hash:** Raspberry y Local deben estar sincronizados con hash
|
||||
2. **Modularizado:** Código debe estar modularizado
|
||||
3. **PRIMERO copiar funcionalidad similar:** NO inventar, copiar funcionalidad similar primero en Raspberry, luego ver qué sirve y qué no
|
||||
4. **Iterar:** Probar → Ver qué sirve → Eliminar lo que no sirve → Mejorar
|
||||
|
||||
**Ver:** `MEMORIA_SINCRONIZACION.md` para detalles
|
||||
|
||||
## 📍 CONEXIÓN RASPBERRY PI
|
||||
|
||||
**Credenciales SSH:**
|
||||
- **Host:** `komkida.duckdns.org` o `192.168.1.134`
|
||||
- **Puerto:** `2222`
|
||||
- **Usuario:** `pi`
|
||||
- **Password:** `Gdk1983gdk45@`
|
||||
|
||||
**Comandos de conexión (CON sshpass):**
|
||||
```bash
|
||||
# Desde WSL - CONECTAR
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134"
|
||||
|
||||
# COPIAR ARCHIVOS
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no /mnt/c/word/demo/app.py pi@192.168.1.134:/home/pi/gkachele-saas/app.py"
|
||||
|
||||
# EJECUTAR COMANDO REMOTO
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'comando aqui'"
|
||||
```
|
||||
|
||||
## 🏗️ ARQUITECTURA
|
||||
|
||||
### Stack Tecnológico
|
||||
- **Backend:** Flask (Python 3) - NO Docker, directo
|
||||
- **Base de datos:** SQLite (main.db + cliente-X.db)
|
||||
- **Web Server:** Nginx (reverse proxy)
|
||||
- **Dominio:** `gk-saas.komkida.duckdns.org`
|
||||
- **Puerto Flask:** 5001
|
||||
- **Puerto Nginx:** 80
|
||||
|
||||
### Estructura en Raspberry Pi
|
||||
```
|
||||
/home/pi/gkachele-saas/
|
||||
├── app.py # Flask backend principal
|
||||
├── database/
|
||||
│ ├── main.db # DB principal (users, sites, requests, media)
|
||||
│ └── sites/ # DBs por cliente
|
||||
│ ├── cliente-1.db
|
||||
│ └── cliente-2.db
|
||||
├── sites/ # Sitios compilados/publicados
|
||||
├── themes/ # Templates (como WordPress)
|
||||
│ ├── gimnasio-claro/
|
||||
│ ├── restaurante-moderno/
|
||||
│ └── restaurante-elegante/
|
||||
├── static/ # CSS, JS, imágenes
|
||||
├── templates/ # HTML templates
|
||||
│ ├── landing_real.html # Landing GKACHELE™
|
||||
│ ├── register.html
|
||||
│ ├── login.html
|
||||
│ ├── dashboard.html # Dashboard CLIENTE
|
||||
│ ├── customizer.html # Personalizador WordPress-like
|
||||
│ ├── admin.html # Dashboard PRINCIPAL (tuyo)
|
||||
│ └── client_admin.html # Admin del cliente
|
||||
└── uploads/ # Media subida por clientes
|
||||
```
|
||||
|
||||
### Estructura en Local (Desarrollo)
|
||||
```
|
||||
C:\word\
|
||||
├── demo/ # Código del SaaS
|
||||
│ ├── app.py
|
||||
│ ├── database/
|
||||
│ ├── themes/
|
||||
│ ├── templates/
|
||||
│ └── static/
|
||||
├── update-raspberry.sh # Script para actualizar Raspberry
|
||||
└── MEMORIA_PROYECTO_COMPLETA.md # Este archivo
|
||||
```
|
||||
|
||||
## 🔄 FLUJO COMPLETO
|
||||
|
||||
```
|
||||
1. Cliente → Landing (gk-saas.komkida.duckdns.org)
|
||||
2. Cliente elige plan + rubro → /register?plan=base&rubro=restaurante
|
||||
3. Cliente se registra → POST /register
|
||||
├── Crea usuario en main.db (tabla users)
|
||||
├── Crea sitio automático (tema según rubro) en main.db (tabla sites)
|
||||
└── Guarda sesión → Redirige a /dashboard (equivalente a wp-admin)
|
||||
4. Dashboard → Cliente ve SUS sitios
|
||||
5. Customizer → /customizer/{site_id} (sidebar + preview)
|
||||
6. Cliente envía → POST /dashboard/submit/{site_id}
|
||||
7. Admin → /admin (solo user_id=1) aprueba
|
||||
8. Publicado → /site/{slug}
|
||||
```
|
||||
|
||||
## 🗄️ BASES DE DATOS
|
||||
|
||||
### main.db (SQLite) - TODO EN UNA SOLA BASE DE DATOS (Multi-tenant como WordPress)
|
||||
|
||||
**✅ Sistema Multi-tenant:** Todos los clientes en una sola base de datos, cada cliente solo ve SUS datos a través de `/dashboard` (equivalente a wp-admin)
|
||||
|
||||
**Tabla: users**
|
||||
- id, email (UNIQUE), password (hash), plan, rubro, created_at
|
||||
- Todos los usuarios/clientes están aquí
|
||||
|
||||
**Tabla: sites**
|
||||
- id, user_id (FK), slug (UNIQUE), theme, status (draft/pending/published), content_json, created_at
|
||||
- Todos los sitios, filtrados por user_id (cada cliente solo ve los suyos)
|
||||
|
||||
**Tabla: requests**
|
||||
- id, site_id (FK), user_id (FK), status (pending/approved/rejected), created_at
|
||||
- Solicitudes de publicación
|
||||
|
||||
**Tabla: media**
|
||||
- id, user_id (FK), site_id (FK), filename, filepath, file_type, uploaded_at
|
||||
- Archivos subidos por clientes, filtrados por user_id
|
||||
|
||||
**Tabla: content**
|
||||
- id, user_id (FK), site_id (FK), section, data_json, updated_at
|
||||
- Contenido por sección (futuro uso), filtrado por user_id y site_id
|
||||
|
||||
**Tabla: settings**
|
||||
- id, user_id (FK), site_id, key, value, created_at, updated_at
|
||||
- Configuraciones (como wp_options en WordPress), filtrado por user_id y site_id
|
||||
|
||||
**Tabla: menus**
|
||||
- id, user_id (FK), site_id (FK), location (header/footer/sidebar), title, url, order_index, parent_id, created_at
|
||||
- Sistema de menús dinámicos por ubicación, filtrado por user_id y site_id
|
||||
|
||||
**Tabla: widgets**
|
||||
- id, user_id (FK), site_id (FK), area (sidebar/footer/etc), type, title, content, order_index, created_at, updated_at
|
||||
- Sistema de widgets dinámicos por área, filtrado por user_id y site_id
|
||||
|
||||
## 🎨 TEMPLATES (Sistema WordPress-like)
|
||||
|
||||
### Templates Disponibles
|
||||
- **gimnasio-claro:** Tema para gimnasios (rojo/negro)
|
||||
- **restaurante-moderno:** Tema moderno (rojo/naranja) - 2 variantes
|
||||
- **restaurante-elegante:** Tema elegante (marrón/dorado)
|
||||
|
||||
### Estructura de Template (Sistema Modular GKACHELE™)
|
||||
```
|
||||
themes/
|
||||
├── _gkachele/ # Sistema base modular (como WordPress)
|
||||
│ ├── header.php # Header con menús dinámicos
|
||||
│ ├── footer.php # Footer con copyright GKACHELE™
|
||||
│ └── sidebar.php # Sidebar con widgets dinámicos
|
||||
├── {nombre}/ # Temas específicos
|
||||
│ ├── config.json # Configuración (colores, tipografía, secciones)
|
||||
│ ├── template.html # HTML del template (contenido principal)
|
||||
│ └── style.css # CSS (opcional)
|
||||
```
|
||||
|
||||
**Sistema de Renderizado:**
|
||||
- `render_gkachele_template()` concatena: `header.php` + `template.html` + `sidebar.php` + `footer.php`
|
||||
- Menús y widgets se cargan dinámicamente desde la base de datos
|
||||
- Soporte para múltiples ubicaciones de menú (header, footer, sidebar)
|
||||
- Widgets por área (sidebar, footer, etc.)
|
||||
|
||||
### Asignación Automática
|
||||
- **restaurante:** Aleatorio entre `restaurante-moderno` y `restaurante-elegante`
|
||||
- **gimnasio/gimnasios:** `gimnasio-claro`
|
||||
- **Otros:** `default`
|
||||
|
||||
## 🔧 CONFIGURACIÓN NGINX
|
||||
|
||||
**Archivo:** `/etc/nginx/sites-available/gk-saas.komkida.duckdns.org.conf`
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name gk-saas.komkida.duckdns.org;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:5001;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Comandos:**
|
||||
```bash
|
||||
sudo nginx -t # Verificar configuración
|
||||
sudo systemctl reload nginx # Recargar
|
||||
tail -f /var/log/nginx/gk-saas-error.log # Ver logs
|
||||
```
|
||||
|
||||
## 🔄 SERVICIO SYSTEMD
|
||||
|
||||
**Archivo:** `/etc/systemd/system/gkachele-saas.service`
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=GKACHELE SaaS Flask App
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=pi
|
||||
WorkingDirectory=/home/pi/gkachele-saas
|
||||
Environment="PATH=/usr/bin:/usr/local/bin:/home/pi/.local/bin"
|
||||
ExecStart=/usr/bin/python3 /home/pi/gkachele-saas/app.py
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
**Comandos:**
|
||||
```bash
|
||||
sudo systemctl start gkachele-saas # Iniciar
|
||||
sudo systemctl stop gkachele-saas # Detener
|
||||
sudo systemctl restart gkachele-saas # Reiniciar
|
||||
sudo systemctl status gkachele-saas # Estado
|
||||
journalctl -u gkachele-saas -f # Ver logs
|
||||
```
|
||||
|
||||
## 🚀 ACTUALIZAR CÓDIGO EN RASPBERRY
|
||||
|
||||
### Método Correcto (con sshpass desde WSL):
|
||||
```bash
|
||||
# 1. Copiar código actualizado
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no /mnt/c/word/demo/app.py pi@192.168.1.134:/home/pi/gkachele-saas/app.py"
|
||||
|
||||
# 2. Reiniciar app (matar proceso y reiniciar)
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'pkill -f \"python3 app.py\" && cd ~/gkachele-saas && nohup python3 app.py > /tmp/app.log 2>&1 &'"
|
||||
```
|
||||
|
||||
### Instalar Servicio Systemd (una vez):
|
||||
```bash
|
||||
# Copiar servicio
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no gkachele-saas.service pi@192.168.1.134:/tmp/"
|
||||
|
||||
# Instalar servicio
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'sudo mv /tmp/gkachele-saas.service /etc/systemd/system/ && sudo systemctl daemon-reload && sudo systemctl enable gkachele-saas && sudo systemctl start gkachele-saas'"
|
||||
```
|
||||
|
||||
### Configurar Cron en Raspberry (actualizar automáticamente):
|
||||
```bash
|
||||
# 1. Crear script de actualización
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' scp -P 2222 -o StrictHostKeyChecking=no update-app-raspberry.sh pi@192.168.1.134:~/scripts/update-app.sh"
|
||||
|
||||
# 2. Dar permisos
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'chmod +x ~/scripts/update-app.sh'"
|
||||
|
||||
# 3. Agregar a crontab (cada hora) - requiere permisos
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'echo \"0 * * * * /home/pi/scripts/update-app.sh\" | crontab -'"
|
||||
|
||||
# Verificar cron
|
||||
wsl bash -c "sshpass -p 'Gdk1983gdk45@' ssh -p 2222 -o StrictHostKeyChecking=no pi@192.168.1.134 'crontab -l'"
|
||||
```
|
||||
|
||||
**NOTA:** El cron actualiza cada hora. Para actualizar manualmente el código, usar el método de SCP arriba.
|
||||
|
||||
## 📋 RUTAS PRINCIPALES
|
||||
|
||||
### Públicas
|
||||
- `GET /` - Landing page
|
||||
- `GET /register` - Formulario registro
|
||||
- `POST /register` - Crear usuario (JSON)
|
||||
- `GET /login` - Formulario login
|
||||
- `POST /login` - Iniciar sesión (JSON)
|
||||
- `GET /site/{slug}` - Sitio público publicado
|
||||
|
||||
### Cliente (requiere sesión)
|
||||
- `GET /dashboard` - Dashboard del cliente
|
||||
- `GET /customizer/{site_id}` - Personalizador
|
||||
- `POST /api/customizer/save` - Guardar cambios
|
||||
- `GET /api/customizer/preview-frame/{site_id}` - Preview iframe
|
||||
- `POST /dashboard/submit/{site_id}` - Enviar para aprobación
|
||||
- `GET /dashboard/admin` - Admin del cliente (media, config)
|
||||
|
||||
### APIs de Menús y Widgets
|
||||
- `GET /api/menus/<site_id>` - Obtener menús del sitio
|
||||
- `POST /api/menus/<site_id>` - Guardar/actualizar menús
|
||||
- `GET /api/widgets/<site_id>` - Obtener widgets del sitio
|
||||
- `POST /api/widgets/<site_id>` - Guardar/actualizar widgets
|
||||
|
||||
### Admin Principal (solo user_id=1)
|
||||
- `GET /admin` - Dashboard principal
|
||||
- `POST /admin/approve/{request_id}` - Aprobar solicitud
|
||||
- `POST /admin/reject/{request_id}` - Rechazar solicitud
|
||||
|
||||
## 🔐 SEGURIDAD
|
||||
|
||||
### Sesiones
|
||||
- Flask `session` con `secret_key`
|
||||
- Cookie `SESSION_COOKIE_SAMESITE = 'Lax'`
|
||||
- Sesión se guarda después de login exitoso
|
||||
|
||||
### Acceso
|
||||
- **Clientes:** Solo ven SUS sitios (filtrado por `user_id` en sesión)
|
||||
- **Admin:** Solo `user_id = 1` puede acceder a `/admin`
|
||||
- **Passwords:** Hash con `werkzeug.security.generate_password_hash`
|
||||
|
||||
## 🎯 ESTADO ACTUAL
|
||||
|
||||
### ✅ Funcionando
|
||||
- Landing page (GKACHELE™ original)
|
||||
- Registro de clientes → Redirige a `/login` (sin sesión automática)
|
||||
- Login de clientes → Redirige a `/dashboard`
|
||||
- Dashboard del cliente
|
||||
- Customizer básico (sidebar + preview)
|
||||
- Templates: gimnasio-claro, restaurante-moderno, restaurante-elegante
|
||||
- **Sistema modular de templates (_gkachele/header.php, footer.php, sidebar.php)**
|
||||
- **Sistema de menús dinámicos (header, footer, sidebar)**
|
||||
- **Sistema de widgets dinámicos (sidebar, footer, etc.)**
|
||||
- **Función `render_gkachele_template()` para renderizado completo**
|
||||
- **APIs para gestionar menús y widgets**
|
||||
- Base de datos SQLite multi-tenant (main.db con tablas menus y widgets)
|
||||
- Nginx reverse proxy
|
||||
- Systemd service
|
||||
- DuckDNS para dominio remoto
|
||||
- Scripts de gestión: `ver_usuarios.py`, `limpiar_db.py`
|
||||
|
||||
### ⚠️ Pendiente
|
||||
- Drag & drop de secciones (SortableJS)
|
||||
- Edición inline (contenteditable)
|
||||
- Gitea para repos por cliente + automatización
|
||||
- Dashboard principal para aprobar solicitudes
|
||||
- Plugins sencillos (colores, tipografía avanzada)
|
||||
- SSL/HTTPS (Let's Encrypt)
|
||||
|
||||
### 🎯 PRÓXIMOS OBJETIVOS (PRIORITARIOS)
|
||||
1. **✅ Template y Menús Profesionales (COMPLETADO):**
|
||||
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
|
||||
- ✅ Sistema de menús dinámicos (header, footer, sidebar)
|
||||
- ✅ Múltiples ubicaciones de menú
|
||||
- ✅ Sistema de widgets/áreas
|
||||
- ⚠️ **PENDIENTE:** UI completa para gestionar menús desde customizer (actualmente solo placeholder)
|
||||
|
||||
2. **Mejorar Landing:**
|
||||
- Diseño más profesional
|
||||
- Mejor UX/UI
|
||||
- Optimización de conversión
|
||||
|
||||
3. **Automatización con Gitea:**
|
||||
- Integración Gitea para repos por cliente
|
||||
- Automatización de despliegues
|
||||
- Workflows automáticos
|
||||
- Integración con n8n (futuro)
|
||||
|
||||
## 📦 DEPENDENCIAS
|
||||
|
||||
**Python:**
|
||||
- Flask
|
||||
- Werkzeug (password hashing)
|
||||
- SQLite3 (built-in)
|
||||
|
||||
**Instalación:**
|
||||
```bash
|
||||
pip3 install Flask Werkzeug
|
||||
```
|
||||
|
||||
## 🌐 DUCKDNS
|
||||
|
||||
**Dominios:**
|
||||
- **komkida.duckdns.org:** Token `9c5cff88-b6d7-4704-9b10-4a69afdff797`
|
||||
- **gkachele.duckdns.org:** Token `578331b3-ad7b-4154-835d-e496465257b0`
|
||||
|
||||
**Actualizar IP:**
|
||||
```bash
|
||||
python3 update-komkida-duckdns.py
|
||||
```
|
||||
|
||||
## 🚀 MIGRACIÓN A VPS
|
||||
|
||||
**Pasos:**
|
||||
1. Copiar `/home/pi/gkachele-saas/` completo
|
||||
2. Instalar Python3, Nginx en VPS
|
||||
3. Copiar configuración Nginx
|
||||
4. Copiar servicio systemd
|
||||
5. Cambiar dominio (DuckDNS o dominio real)
|
||||
6. Configurar SSL (Let's Encrypt)
|
||||
|
||||
**Ventajas:**
|
||||
- ✅ Mismo código (sin cambios)
|
||||
- ✅ Misma estructura
|
||||
- ✅ Más recursos
|
||||
- ✅ Mejor rendimiento
|
||||
|
||||
## 📝 NOTAS IMPORTANTES
|
||||
|
||||
- **NO usar Docker:** Todo corre directamente (Python + Nginx)
|
||||
- **NO usar GitHub:** Todo es independiente en Raspberry
|
||||
- **SQLite es suficiente:** Para SaaS pequeño, no necesita MySQL
|
||||
- **Raspberry Pi 3:** Recursos limitados, pero suficiente para desarrollo
|
||||
- **VPS recomendado:** Para producción con muchos clientes
|
||||
|
||||
## 📦 BACKUP Y VERSIONADO
|
||||
|
||||
**Hash Actual:** `gkachele-template-system-20250114-v1`
|
||||
|
||||
**Estado Verificado:**
|
||||
- ✅ Templates _gkachele en Raspberry: header.php, footer.php, sidebar.php
|
||||
- ✅ Función render_gkachele_template en app.py
|
||||
- ✅ Tablas menus y widgets en main.db
|
||||
- ✅ Servicio gkachele-saas activo
|
||||
- ✅ Flujo de registro: Registro → Login → Dashboard → Customizer
|
||||
|
||||
**Scripts de Gestión:**
|
||||
- `ver_usuarios.py` - Ver usuarios y sitios registrados
|
||||
- `limpiar_db.py` - Limpiar base de datos (con confirmación)
|
||||
- `verificar_raspberry.sh` - Verificar estado en Raspberry
|
||||
|
||||
---
|
||||
**Última actualización:** 14 Enero 2025 - 08:50
|
||||
133
memoria/MEMORIA_RASPBERRY_SAAS.md
Normal file
133
memoria/MEMORIA_RASPBERRY_SAAS.md
Normal file
@@ -0,0 +1,133 @@
|
||||
# 🎯 MEMORIA: SaaS en Raspberry Pi 3 - Estado Actual
|
||||
|
||||
**Fecha:** 13 Enero 2025
|
||||
**Hash:** `raspberry-pi3-saas-setup-20250113`
|
||||
|
||||
## ✅ LO QUE ESTÁ FUNCIONANDO
|
||||
|
||||
### 1. Flask SaaS en Raspberry Pi
|
||||
- **Ubicación:** `/home/pi/gkachele-saas/`
|
||||
- **Puerto:** 5001
|
||||
- **Estado:** ✅ Corriendo (2 procesos)
|
||||
- **Landing:** `landing_real.html` (GKACHELE™ original)
|
||||
- **Base de datos:** SQLite (`database/main.db`)
|
||||
|
||||
### 2. Nginx Configurado
|
||||
- **Configuración activa:** `gk-saas.komkida.duckdns.org`
|
||||
- **Ubicación:** `/etc/nginx/sites-available/gk-saas.komkida.duckdns.org`
|
||||
- **Proxy:** `localhost:5001` (SIN GitHub)
|
||||
- **Estado:** ✅ Funcionando
|
||||
|
||||
### 3. Dominio Remoto
|
||||
- **URL:** `http://gk-saas.komkida.duckdns.org`
|
||||
- **DuckDNS Token:** `9c5cff88-b6d7-4704-9b10-4a69afdff797`
|
||||
- **IP Raspberry:** `213.195.104.66`
|
||||
- **NOTA:** Este dominio NO tiene relación con GitHub
|
||||
|
||||
## 📁 ESTRUCTURA EN RASPBERRY
|
||||
|
||||
```
|
||||
/home/pi/gkachele-saas/
|
||||
├── app.py # Flask backend
|
||||
├── database/
|
||||
│ ├── main.db # DB principal
|
||||
│ └── sites/ # DBs por cliente
|
||||
├── sites/ # Sitios compilados
|
||||
├── themes/ # Templates
|
||||
│ ├── gimnasio-claro/
|
||||
│ └── restaurante-moderno/
|
||||
├── static/
|
||||
│ └── style.css # CSS landing real
|
||||
└── templates/
|
||||
├── landing_real.html # Landing GKACHELE™
|
||||
├── register.html
|
||||
├── login.html
|
||||
├── dashboard.html
|
||||
├── customizer.html
|
||||
└── admin.html
|
||||
```
|
||||
|
||||
## 🔧 CONFIGURACIÓN NGINX
|
||||
|
||||
### Archivo activo:
|
||||
`/etc/nginx/sites-available/gk-saas.komkida.duckdns.org`
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name gk-saas.komkida.duckdns.org;
|
||||
location / {
|
||||
proxy_pass http://localhost:5001;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔐 CREDENCIALES
|
||||
|
||||
### Raspberry Pi
|
||||
- **Host:** `komkida.duckdns.org` o `192.168.1.134`
|
||||
- **Puerto SSH:** 2222
|
||||
- **Usuario:** `pi`
|
||||
- **Password:** `Gdk1983gdk45@`
|
||||
|
||||
### DuckDNS
|
||||
- **komkida.duckdns.org:** Token `9c5cff88-b6d7-4704-9b10-4a69afdff797`
|
||||
- **gkachele.duckdns.org:** Token `578331b3-ad7b-4154-835d-e496465257b0`
|
||||
|
||||
## 🚀 COMANDOS ÚTILES
|
||||
|
||||
### Actualizar DuckDNS
|
||||
```bash
|
||||
python3 -c "import urllib.request; print(urllib.request.urlopen('https://www.duckdns.org/update?domains=komkida&token=9c5cff88-b6d7-4704-9b10-4a69afdff797&ip=').read())"
|
||||
```
|
||||
|
||||
### Verificar Flask
|
||||
```bash
|
||||
curl http://localhost:5001/
|
||||
```
|
||||
|
||||
### Recargar Nginx
|
||||
```bash
|
||||
sudo nginx -t && sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
### Ver logs
|
||||
```bash
|
||||
tail -f /var/log/nginx/gk-saas-access.log
|
||||
tail -f /var/log/nginx/gk-saas-error.log
|
||||
```
|
||||
|
||||
## ⚠️ IMPORTANTE
|
||||
|
||||
- **NO usar GitHub:** Todo es independiente en Raspberry
|
||||
- **Dominio principal:** `gk-saas.komkida.duckdns.org` (NO `gkachele.duckdns.org`)
|
||||
- **Raspberry Pi 3:** Recursos suficientes para SaaS pequeño
|
||||
- **SQLite:** Base de datos ligera, perfecta para Pi
|
||||
|
||||
## 📝 PRÓXIMOS PASOS
|
||||
|
||||
1. ✅ Instalar Gitea en Raspberry (opcional)
|
||||
2. ✅ Automatizar DuckDNS (cron cada 5 min)
|
||||
3. ✅ Crear servicio systemd para Flask
|
||||
4. ✅ Configurar SSL/HTTPS (Let's Encrypt)
|
||||
|
||||
## 🎯 FLUJO COMPLETO
|
||||
|
||||
```
|
||||
Cliente → gk-saas.komkida.duckdns.org
|
||||
↓
|
||||
Nginx (puerto 80)
|
||||
↓
|
||||
Flask (puerto 5001)
|
||||
↓
|
||||
SQLite (database/)
|
||||
↓
|
||||
Landing/SaaS funcionando
|
||||
```
|
||||
|
||||
---
|
||||
**Última actualización:** 13 Enero 2025 - 15:58
|
||||
97
memoria/MEMORIA_SINCRONIZACION.md
Normal file
97
memoria/MEMORIA_SINCRONIZACION.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# 🔄 MEMORIA: Sincronización y Modularización
|
||||
|
||||
**Fecha:** 13 Enero 2025
|
||||
**Hash:** `sincronizacion-modular-wordpress-20250113`
|
||||
|
||||
## ✅ REQUISITOS PRINCIPALES
|
||||
|
||||
### 1. Sincronización con Hash
|
||||
- **Raspberry y Local deben estar sincronizados**
|
||||
- **Usar hash para verificar versiones**
|
||||
- **Siempre verificar antes de actualizar**
|
||||
|
||||
### 2. Modularizado
|
||||
- **Código debe estar modularizado**
|
||||
- **Fácil de mantener y actualizar**
|
||||
- **Separar responsabilidades**
|
||||
|
||||
### 3. PRIMERO: Copiar WordPress Similar en Raspberry
|
||||
- **NO empezar desde cero**
|
||||
- **Copiar funcionalidad similar a WordPress primero**
|
||||
- **Luego ver qué sirve y qué no**
|
||||
- **Iterar sobre lo que funciona**
|
||||
|
||||
## 🎯 PLAN DE TRABAJO
|
||||
|
||||
### FASE 1: Copiar WordPress Similar (AHORA)
|
||||
1. Implementar registro simple como WordPress
|
||||
2. Implementar login simple
|
||||
3. Implementar dashboard básico
|
||||
4. Implementar customizer básico
|
||||
5. **TODO en Raspberry primero**
|
||||
|
||||
### FASE 2: Verificar qué Sirve
|
||||
1. Probar cada funcionalidad
|
||||
2. Identificar qué funciona bien
|
||||
3. Identificar qué no sirve
|
||||
4. Eliminar lo que no sirve
|
||||
|
||||
### FASE 3: Modularizar
|
||||
1. Separar en módulos
|
||||
2. Crear hash de versión
|
||||
3. Sincronizar Raspberry ↔ Local
|
||||
|
||||
## 🔄 SISTEMA DE HASH
|
||||
|
||||
**Cada versión debe tener:**
|
||||
- Hash único (ej: `v1.0.0-abc123`)
|
||||
- Fecha de actualización
|
||||
- Lista de cambios
|
||||
|
||||
**Verificar sincronización:**
|
||||
```bash
|
||||
# En local
|
||||
md5sum demo/app.py > local.hash
|
||||
|
||||
# En Raspberry
|
||||
md5sum /home/pi/gkachele-saas/app.py > raspberry.hash
|
||||
|
||||
# Comparar
|
||||
diff local.hash raspberry.hash
|
||||
```
|
||||
|
||||
## 📋 PRÓXIMOS PASOS
|
||||
|
||||
1. ✅ Memorizar requisitos
|
||||
2. [ ] Copiar WordPress similar en Raspberry
|
||||
3. [ ] Probar funcionalidades
|
||||
4. [ ] Eliminar lo que no sirve
|
||||
5. [ ] Modularizar código
|
||||
6. [ ] Implementar sistema de hash
|
||||
|
||||
## 🖥️ INDEPENDENCIA DEL PC
|
||||
|
||||
**✅ SÍ, funciona aunque apagues el PC:**
|
||||
|
||||
- **Flask:** Corre como servicio systemd en la Raspberry (auto-inicia al arrancar)
|
||||
- **Nginx:** Corre como servicio systemd en la Raspberry (auto-inicia al arrancar)
|
||||
- **Todo está en la Raspberry:** No depende del PC para funcionar
|
||||
|
||||
**El PC solo se usa para:**
|
||||
- Editar código localmente
|
||||
- Copiar archivos a la Raspberry (SSH/SCP)
|
||||
- **NO es necesario que esté encendido para que la página funcione**
|
||||
|
||||
**Servicios configurados para auto-iniciar:**
|
||||
- `gkachele-saas.service` → `enabled` (inicia automáticamente)
|
||||
- `nginx.service` → `enabled` (inicia automáticamente)
|
||||
|
||||
**Verificar:**
|
||||
```bash
|
||||
# En Raspberry
|
||||
systemctl is-enabled gkachele-saas # Debe decir "enabled"
|
||||
systemctl is-enabled nginx # Debe decir "enabled"
|
||||
```
|
||||
|
||||
---
|
||||
**IMPORTANTE:** Primero copiar WordPress similar, luego iterar. No inventar desde cero.
|
||||
74
memoria/METODOLOGIA_TRABAJO.md
Normal file
74
memoria/METODOLOGIA_TRABAJO.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# 🎯 Metodología de Trabajo - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## ⚠️ REGLA DE TRABAJO
|
||||
|
||||
### Orden de Prioridades:
|
||||
|
||||
1. **PRIMERO: Hacer que funcione bien**
|
||||
- Implementar funcionalidad
|
||||
- Probar que funciona
|
||||
- Verificar en producción (Raspberry)
|
||||
|
||||
2. **DESPUÉS: Limpieza**
|
||||
- Optimizar código
|
||||
- Refactorizar
|
||||
- Mejorar estructura
|
||||
- Documentar
|
||||
|
||||
### ⚠️ NO hacer limpieza antes de que funcione
|
||||
|
||||
**Flujo correcto:**
|
||||
```
|
||||
Funcionalidad → Probar → Funciona → Limpieza → Documentar
|
||||
```
|
||||
|
||||
**Flujo incorrecto:**
|
||||
```
|
||||
Funcionalidad → Limpieza → Probar → ❌ No funciona
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Checklist de Trabajo
|
||||
|
||||
### Fase 1: Funcionalidad
|
||||
- [ ] Implementar funcionalidad básica
|
||||
- [ ] Probar localmente
|
||||
- [ ] Desplegar a Raspberry
|
||||
- [ ] Verificar que funciona en producción
|
||||
- [ ] Confirmar con usuario
|
||||
|
||||
### Fase 2: Limpieza (SOLO después de que funcione)
|
||||
- [ ] Optimizar código
|
||||
- [ ] Refactorizar si es necesario
|
||||
- [ ] Mejorar estructura
|
||||
- [ ] Documentar cambios
|
||||
- [ ] Actualizar memoria
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Principios
|
||||
|
||||
1. **Funcionalidad primero, perfección después**
|
||||
2. **Probar en producción antes de limpiar**
|
||||
3. **No optimizar prematuramente**
|
||||
4. **Iterar: Funciona → Mejora → Funciona mejor**
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notas
|
||||
|
||||
- Siempre verificar que funciona antes de hacer limpieza
|
||||
- La limpieza es importante, pero no es prioridad sobre funcionalidad
|
||||
- Documentar después de que todo funcione
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-metodologia-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
163
memoria/OBJETIVOS_ARGENTINA.md
Normal file
163
memoria/OBJETIVOS_ARGENTINA.md
Normal file
@@ -0,0 +1,163 @@
|
||||
# 🇦🇷 OBJETIVOS PARA ARGENTINA - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🎯 OBJETIVO PRINCIPAL
|
||||
|
||||
**Lanzar GKACHELE™ SaaS en Argentina con funcionalidad completa y profesional.**
|
||||
|
||||
---
|
||||
|
||||
## ✅ CRITERIO DE ÉXITO
|
||||
|
||||
**Si funciona 1 rubro bien en Raspberry Pi → PAGAR VPS**
|
||||
|
||||
---
|
||||
|
||||
## 🚀 OBJETIVOS PRIORITARIOS
|
||||
|
||||
### 1. **Funcionalidad Core (PRIMERO)**
|
||||
- ✅ Registro de clientes
|
||||
- ✅ **Login → Customizer directo (FUNCIONANDO - Hash v3)**
|
||||
- ✅ Dashboard del cliente (`/dashboard` - ver sus sitios)
|
||||
- ✅ Customizer funcional (`/customizer/{site_id}`)
|
||||
- ✅ Panel admin (`/admin` - gestión completa)
|
||||
- ✅ Flujo completo: Landing → Registro → Login → Customizer → Enviar → Admin → Publicado
|
||||
|
||||
### 2. **Gitea - Despliegues y Workflows**
|
||||
- Integración Gitea para repositorios por cliente
|
||||
- Workflows automáticos:
|
||||
- Aceptar peticiones de publicación
|
||||
- Desplegar sitios automáticamente
|
||||
- Generar repositorios por cliente
|
||||
- Versionado automático
|
||||
- Integración con dashboard admin para gestionar workflows
|
||||
|
||||
### 3. **Control de Versiones**
|
||||
- Git para landing page
|
||||
- Versionado de templates
|
||||
- Historial de cambios
|
||||
- Rollback de versiones
|
||||
|
||||
### 4. **Mejoras Landing Page**
|
||||
- Diseño optimizado para Argentina
|
||||
- Mejor UX/UI
|
||||
- Optimización de conversión
|
||||
- Responsive mejorado
|
||||
- Performance optimizado
|
||||
|
||||
### 5. **Workflows Dashboard Admin**
|
||||
- Aceptar/rechazar peticiones
|
||||
- Gestionar usuarios
|
||||
- Ver estadísticas
|
||||
- Gestionar despliegues
|
||||
- Control de versiones
|
||||
- Integración con Gitea
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ INFRAESTRUCTURA
|
||||
|
||||
### Actual: Raspberry Pi 3
|
||||
- Desarrollo y pruebas
|
||||
- Si funciona bien → Migrar a VPS
|
||||
|
||||
### Futuro: VPS
|
||||
- Más recursos
|
||||
- Mejor rendimiento
|
||||
- Dominio propio (ya tienes)
|
||||
- SSL/HTTPS
|
||||
- Escalabilidad
|
||||
|
||||
---
|
||||
|
||||
## 📋 CHECKLIST PRE-ARGENTINA
|
||||
|
||||
### Funcionalidad Básica:
|
||||
- [x] Registro funciona correctamente (✅)
|
||||
- [x] Login redirige a customizer (✅ FUNCIONANDO)
|
||||
- [x] Dashboard del cliente visible y funcional (✅)
|
||||
- [x] Customizer básico funcional (✅)
|
||||
- [x] Panel admin funcional (✅)
|
||||
- [ ] Al menos 1 rubro funcionando perfecto (EN PROGRESO)
|
||||
|
||||
### Gitea y Workflows:
|
||||
- [ ] Gitea instalado y configurado
|
||||
- [ ] Repositorios automáticos por cliente
|
||||
- [ ] Workflows de despliegue
|
||||
- [ ] Integración con dashboard admin
|
||||
- [ ] Aceptar peticiones desde workflows
|
||||
|
||||
### Control de Versiones:
|
||||
- [ ] Git configurado
|
||||
- [ ] Landing en repositorio
|
||||
- [ ] Versionado de templates
|
||||
- [ ] Historial de cambios
|
||||
|
||||
### Landing Mejorada:
|
||||
- [ ] Diseño optimizado
|
||||
- [ ] UX/UI mejorada
|
||||
- [ ] Performance optimizado
|
||||
- [ ] Responsive completo
|
||||
- [ ] Optimización conversión
|
||||
|
||||
### Testing:
|
||||
- [ ] Probar con 1 rubro completo
|
||||
- [ ] Verificar en Raspberry
|
||||
- [ ] Si funciona → Preparar VPS
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PLAN DE ACCIÓN
|
||||
|
||||
### Fase 1: Funcionalidad Core (AHORA)
|
||||
1. Verificar dashboard del cliente
|
||||
2. Completar customizer
|
||||
3. Probar con 1 rubro completo
|
||||
4. Verificar que todo funcione
|
||||
|
||||
### Fase 2: Gitea y Workflows
|
||||
1. Instalar/configurar Gitea
|
||||
2. Integrar con sistema
|
||||
3. Crear workflows automáticos
|
||||
4. Conectar con dashboard admin
|
||||
|
||||
### Fase 3: Control de Versiones
|
||||
1. Configurar Git
|
||||
2. Versionar landing
|
||||
3. Versionar templates
|
||||
4. Sistema de rollback
|
||||
|
||||
### Fase 4: Landing Mejorada
|
||||
1. Rediseñar landing
|
||||
2. Optimizar para Argentina
|
||||
3. Mejorar conversión
|
||||
4. Testing completo
|
||||
|
||||
### Fase 5: VPS (Si funciona en Raspberry)
|
||||
1. Preparar VPS
|
||||
2. Migrar código
|
||||
3. Configurar dominio
|
||||
4. SSL/HTTPS
|
||||
5. Lanzamiento
|
||||
|
||||
---
|
||||
|
||||
## 📝 NOTAS IMPORTANTES
|
||||
|
||||
- **Prioridad:** Funcionalidad primero, perfección después
|
||||
- **Testing:** Probar cada funcionalidad antes de avanzar
|
||||
- **Documentación:** Todo en carpeta `memoria/`
|
||||
- **Control de Versiones:** Git desde el inicio
|
||||
- **Argentina:** Optimizar para mercado argentino
|
||||
|
||||
---
|
||||
|
||||
## 🔄 ACTUALIZACIÓN
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-objetivos-argentina-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
91
memoria/OBJETIVO_CUSTOMIZER_ADAPTADO.md
Normal file
91
memoria/OBJETIVO_CUSTOMIZER_ADAPTADO.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# 🎯 OBJETIVO: CUSTOMIZER ADAPTADO DE WORDPRESS
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Hash:** `gkachele-objetivo-customizer-adaptado-20250115-001`
|
||||
|
||||
**⚠️ IMPORTANTE:** Este fue el plan desde el principio. Debería estar ya hecho.
|
||||
|
||||
---
|
||||
|
||||
## ✅ OBJETIVO CLARO (PLAN ORIGINAL)
|
||||
|
||||
### **COPIAR Y ADAPTAR WORDPRESS:**
|
||||
1. ✅ **COPIAR WordPress** (funcionalidades completas)
|
||||
2. ✅ **AUTOMATIZAR** (procesos automáticos, no manual)
|
||||
3. ✅ **Cambiar branding a GKACHELE™** (logo, nombres, colores)
|
||||
4. ✅ **ADAPTAR** con lo que ya sabemos
|
||||
5. ⚠️ **DEBERÍA ESTAR YA HECHO** (pero no está implementado aún)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PRINCIPIOS
|
||||
|
||||
### 1. **SIMILAR, NO IGUAL**
|
||||
- ✅ Usar WordPress como **referencia visual y funcional**
|
||||
- ✅ Adaptar diseño con **branding GKACHELE™**
|
||||
- ✅ Mantener funcionalidades pero con **nuestro estilo**
|
||||
- ❌ NO copiar WordPress exactamente
|
||||
- ❌ NO usar nombres/colores de WordPress
|
||||
|
||||
### 2. **AUTOMATIZADO**
|
||||
- ✅ Procesos automáticos (no manual)
|
||||
- ✅ Guardado automático de preview
|
||||
- ✅ Sincronización automática
|
||||
- ✅ Validación automática
|
||||
- ✅ Generación automática (mapas, WhatsApp, etc.)
|
||||
|
||||
### 3. **ADAPTAR, NO COPIAR**
|
||||
- ✅ Ver cómo funciona WordPress
|
||||
- ✅ Entender la lógica
|
||||
- ✅ Adaptar a nuestras necesidades
|
||||
- ✅ Mejorar donde sea posible
|
||||
- ✅ Personalizar con GKACHELE™
|
||||
|
||||
---
|
||||
|
||||
## 📋 LO QUE TENEMOS
|
||||
|
||||
### **Referencia:**
|
||||
- ✅ Demo completo WordPress: `customizer-wordpress-COMPLETO.html`
|
||||
- ✅ Documentación: `CUSTOMIZER_WORDPRESS_COMPLETO.md`
|
||||
- ✅ Código WordPress real en: `wp-content/themes/abiz/core/customizer/`
|
||||
|
||||
### **Objetivo:**
|
||||
- ✅ Customizer GKACHELE™ similar a WordPress
|
||||
- ✅ Funcionalidades automáticas
|
||||
- ✅ Diseño adaptado con branding GKACHELE™
|
||||
|
||||
---
|
||||
|
||||
## 🚀 PROCESO (PLAN ORIGINAL)
|
||||
|
||||
1. ✅ **Analizar WordPress** (ya hecho - demo completo)
|
||||
2. ⏳ **COPIAR WordPress** (demo completo al customizer real)
|
||||
3. ⏳ **AUTOMATIZAR** (procesos automáticos)
|
||||
4. ⏳ **Cambiar branding** (GKACHELE™ en lugar de WordPress)
|
||||
5. ⏳ **ADAPTAR** (con lo que ya sabemos)
|
||||
6. ⏳ **Integrar con backend** (Flask/Python)
|
||||
7. ⏳ **Testing y pulido**
|
||||
|
||||
**Estado:** Pendiente de implementar (debería estar ya hecho)
|
||||
|
||||
---
|
||||
|
||||
## 📌 NOTAS IMPORTANTES
|
||||
|
||||
- **NO mencionar "WordPress"** en el código (ver REGLA_IMPORTANTE.md)
|
||||
- **Usar "GKACHELE™ Customizer"** o "Sistema GKACHELE™"
|
||||
- **Adaptar, no copiar**
|
||||
- **Automatizar todo lo posible**
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Hash:** `gkachele-objetivo-customizer-adaptado-20250115-001`
|
||||
**Estado:** ✅ **OBJETIVO CLARO - LISTO PARA IMPLEMENTAR**
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
307
memoria/PENDIENTES_MEJORAS.md
Normal file
307
memoria/PENDIENTES_MEJORAS.md
Normal file
@@ -0,0 +1,307 @@
|
||||
# 📋 Pendientes y Mejoras - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Hash:** `gkachele-pendientes-20250115-004`
|
||||
|
||||
**Fecha:** 2025-01-15
|
||||
|
||||
**⚠️ VER:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - **REHACER COMPLETAMENTE EL CUSTOMIZER**
|
||||
|
||||
---
|
||||
|
||||
## ✅ FUNCIONALIDADES COMPLETADAS
|
||||
|
||||
1. ✅ **Sistema de bloques añadibles COMPLETO** (video, imagen, texto, redes sociales, mapa)
|
||||
- ✅ Función `addNewBlock()` implementada
|
||||
- ✅ Función `removeBlock()` implementada
|
||||
- ✅ Función `loadBlocksList()` implementada
|
||||
- ✅ Lista de bloques en sidebar funcional
|
||||
- ✅ Integración completa con backend
|
||||
- ✅ Notificaciones de éxito/error
|
||||
2. ✅ Iconos SVG para redes sociales
|
||||
3. ✅ Click to edit en preview
|
||||
4. ✅ Gestión de platos del menú (añadir/eliminar)
|
||||
5. ✅ Actualización en tiempo real del preview
|
||||
6. ✅ Drag & drop básico para bloques
|
||||
|
||||
---
|
||||
|
||||
## 🔧 MEJORAS PENDIENTES
|
||||
|
||||
### 1. 🗺️ Mapa Automático desde Dirección
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Requisito:**
|
||||
- El mapa debe generarse automáticamente usando la dirección del campo "Dirección"
|
||||
- No debe requerir URL manual
|
||||
- Usar Google Maps Embed API sin API key (o geocoding simple)
|
||||
|
||||
**Implementación:**
|
||||
```javascript
|
||||
// Cuando cambie la dirección, generar automáticamente el mapa
|
||||
function generateMapFromAddress(address) {
|
||||
// Convertir dirección a URL de Google Maps embed
|
||||
const encodedAddress = encodeURIComponent(address);
|
||||
const mapUrl = `https://www.google.com/maps/embed/v1/place?key=AIzaSy...&q=${encodedAddress}`;
|
||||
// O usar iframe con búsqueda directa
|
||||
const mapUrl = `https://www.google.com/maps?q=${encodedAddress}&output=embed`;
|
||||
return mapUrl;
|
||||
}
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/templates/customizer.html` - Auto-generar mapa_url cuando cambie dirección
|
||||
- `demo/themes/restaurante-moderno/template.html` - Usar dirección si no hay mapa_url
|
||||
|
||||
---
|
||||
|
||||
### 2. 📁 Upload de Archivos (Drag & Drop)
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Requisito:**
|
||||
- Arrastrar y soltar archivos en campos de Media
|
||||
- O abrir navegador de archivos
|
||||
- No usar URLs manuales
|
||||
- Subir a servidor y guardar ruta
|
||||
|
||||
**Implementación:**
|
||||
```html
|
||||
<!-- En customizer.html -->
|
||||
<div class="media-upload-area" ondrop="handleFileDrop(event)" ondragover="allowDrop(event)">
|
||||
<input type="file" id="media_upload" style="display: none;" onchange="handleFileSelect(event)">
|
||||
<button onclick="document.getElementById('media_upload').click()">📁 Seleccionar archivo</button>
|
||||
<p>O arrastra y suelta aquí</p>
|
||||
</div>
|
||||
```
|
||||
|
||||
```python
|
||||
# En app.py
|
||||
@app.route('/api/upload', methods=['POST'])
|
||||
def upload_file():
|
||||
if 'file' not in request.files:
|
||||
return jsonify({'error': 'No file'}), 400
|
||||
file = request.files['file']
|
||||
if file.filename == '':
|
||||
return jsonify({'error': 'No file selected'}), 400
|
||||
filename = secure_filename(file.filename)
|
||||
filepath = os.path.join(UPLOAD_FOLDER, filename)
|
||||
file.save(filepath)
|
||||
return jsonify({'url': f'/uploads/{filename}'})
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/templates/customizer.html` - Añadir drag & drop a campos Media
|
||||
- `demo/app.py` - Endpoint de upload
|
||||
- `demo/static/` - Carpeta para uploads
|
||||
|
||||
---
|
||||
|
||||
### 3. ✏️ Editar Contenido de Bloques Existentes
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Problema:**
|
||||
- Los bloques se pueden añadir y eliminar, pero no editar su contenido
|
||||
- No hay forma de modificar el contenido de un bloque después de crearlo
|
||||
|
||||
**Solución:**
|
||||
```javascript
|
||||
// En template.html - función debe estar disponible globalmente
|
||||
function removeBlockFromPreview(blockId) {
|
||||
if (window.parent !== window) {
|
||||
window.parent.postMessage({
|
||||
type: 'remove-block',
|
||||
block_id: blockId
|
||||
}, '*');
|
||||
} else {
|
||||
// Si no está en iframe, llamar directamente
|
||||
removeBlock(blockId);
|
||||
}
|
||||
}
|
||||
|
||||
// En customizer.html - escuchar mensaje
|
||||
window.addEventListener('message', function(e) {
|
||||
if (e.data && e.data.type === 'remove-block') {
|
||||
removeBlock(e.data.block_id);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/templates/customizer.html` - Añadir función `editBlock(blockId)` que abra modal según tipo
|
||||
- `demo/templates/customizer.html` - Hacer bloques clickeables en la lista para editar
|
||||
- `demo/app.py` - Endpoint `/api/customizer/update-block` para actualizar contenido
|
||||
|
||||
---
|
||||
|
||||
### 4. 🧩 Eliminar Zonas/Secciones (Como WordPress)
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Requisito:**
|
||||
- Poder eliminar secciones completas (Hero, Menú, Horarios, Contacto, etc.)
|
||||
- Como WordPress: cada sección puede ocultarse/eliminarse
|
||||
- Guardar estado en content_json
|
||||
|
||||
**Implementación:**
|
||||
```json
|
||||
{
|
||||
"sections": {
|
||||
"hero": {"visible": true, "enabled": true},
|
||||
"menu": {"visible": true, "enabled": true},
|
||||
"horarios": {"visible": false, "enabled": false},
|
||||
"contacto": {"visible": true, "enabled": true}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```html
|
||||
<!-- En template.html -->
|
||||
{% if sections.hero.enabled %}
|
||||
<section id="hero" class="section hero">
|
||||
<!-- Contenido -->
|
||||
<button class="section-delete" onclick="toggleSection('hero')">🗑️ Ocultar sección</button>
|
||||
</section>
|
||||
{% endif %}
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/templates/customizer.html` - Añadir controles para secciones
|
||||
- `demo/themes/restaurante-moderno/template.html` - Renderizar condicionalmente
|
||||
- `demo/app.py` - Endpoint para toggle de secciones
|
||||
|
||||
---
|
||||
|
||||
### 5. ✏️ Edición de Contenido de Bloques
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Requisito:**
|
||||
- Cada bloque añadido debe ser editable
|
||||
- Click en bloque → editar contenido
|
||||
- Modal o inline editor según tipo
|
||||
|
||||
**Implementación:**
|
||||
```javascript
|
||||
function editBlock(blockId) {
|
||||
const block = blocks.find(b => b.id === blockId);
|
||||
if (!block) return;
|
||||
|
||||
// Abrir modal según tipo
|
||||
if (block.type === 'texto') {
|
||||
openTextEditor(block);
|
||||
} else if (block.type === 'video') {
|
||||
openVideoEditor(block);
|
||||
} else if (block.type === 'redes_sociales') {
|
||||
openSocialEditor(block);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/templates/customizer.html` - Añadir función editBlock
|
||||
- `demo/themes/restaurante-moderno/template.html` - Hacer bloques clickeables
|
||||
|
||||
---
|
||||
|
||||
### 6. 🔄 Guardado Automático de Orden (Drag & Drop)
|
||||
|
||||
**Estado:** Pendiente
|
||||
|
||||
**Requisito:**
|
||||
- Al arrastrar y soltar bloques, guardar orden automáticamente
|
||||
- No esperar a añadir/eliminar
|
||||
|
||||
**Implementación:**
|
||||
```javascript
|
||||
function handleDrop(e) {
|
||||
e.preventDefault();
|
||||
// Reordenar bloques
|
||||
const newOrder = Array.from(document.querySelectorAll('.gk-block'))
|
||||
.map(block => block.dataset.blockId);
|
||||
|
||||
// Guardar orden inmediatamente
|
||||
fetch('/api/customizer/reorder-blocks', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({
|
||||
site_id: siteId,
|
||||
block_ids: newOrder
|
||||
})
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
**Archivos a modificar:**
|
||||
- `demo/themes/restaurante-moderno/template.html` - Mejorar drag & drop
|
||||
- `demo/templates/customizer.html` - Guardar orden automáticamente
|
||||
|
||||
---
|
||||
|
||||
## 🚨 PROBLEMAS CRÍTICOS (REHACER COMPLETAMENTE)
|
||||
|
||||
**Ver documento completo:** `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
|
||||
|
||||
### Problemas Identificados:
|
||||
1. ❌ **Diseño horrible** - No se parece a WordPress
|
||||
2. ❌ **Colores horribles** - No usa paleta WordPress
|
||||
3. ❌ **Guardado inconsistente** - Algunas cosas guardan, otras no
|
||||
4. ❌ **No hay botón Cancelar** - Hay que refrescar o salir
|
||||
5. ❌ **Mapa no funciona**
|
||||
6. ❌ **No hay WhatsApp flotante**
|
||||
7. ❌ **No hay scroll suave**
|
||||
8. ❌ **No hay iconos a elegir** (solo emojis)
|
||||
|
||||
**Solución:** REHACER COMPLETAMENTE copiando EXACTAMENTE WordPress Customizer
|
||||
|
||||
---
|
||||
|
||||
## 📝 CHECKLIST DE IMPLEMENTACIÓN
|
||||
|
||||
### Prioridad CRÍTICA (REHACER TODO)
|
||||
- [ ] **Rehacer diseño visual** - Copiar EXACTAMENTE WordPress
|
||||
- [ ] **Rehacer sistema de guardado** - Botón "Guardar y Publicar" + "Descartar"
|
||||
- [ ] **Arreglar mapa** - Generar automáticamente desde dirección
|
||||
- [ ] **Añadir WhatsApp flotante** - Configurable desde sidebar
|
||||
- [ ] **Añadir selector de iconos** - Dashicons o Font Awesome
|
||||
- [ ] **Añadir scroll suave** - Mejorar navegación
|
||||
|
||||
### Prioridad Alta
|
||||
- [ ] Editar contenido de bloques existentes
|
||||
- [ ] Upload de archivos (drag & drop)
|
||||
|
||||
### Prioridad Media
|
||||
- [ ] Eliminar/ocultar secciones
|
||||
- [ ] Edición de contenido de bloques
|
||||
- [ ] Guardado automático de orden
|
||||
|
||||
### Prioridad Baja
|
||||
- [ ] Mejoras de UI/UX
|
||||
- [ ] Validaciones adicionales
|
||||
- [ ] Optimizaciones de rendimiento
|
||||
|
||||
---
|
||||
|
||||
## 🔗 REFERENCIAS
|
||||
|
||||
- WordPress: Sistema de secciones ocultables
|
||||
- Elementor: Drag & drop de bloques
|
||||
- Google Maps: Embed sin API key (búsqueda directa)
|
||||
|
||||
---
|
||||
|
||||
## 📌 NOTAS
|
||||
|
||||
- El menú de platos ya funciona correctamente (añadir/eliminar) ✅
|
||||
- Los iconos de redes sociales ya están implementados ✅
|
||||
- **El sistema de bloques está COMPLETAMENTE funcional (añadir/eliminar/listar) ✅**
|
||||
- **Hash de implementación:** `gkachele-bloques-funcionales-20250115-001`
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Hash:** `gkachele-pendientes-20250115-004`
|
||||
**Próxima sesión:** **REHACER COMPLETAMENTE EL CUSTOMIZER** - Ver `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
|
||||
249
memoria/PROBLEMAS_CRITICOS_CUSTOMIZER.md
Normal file
249
memoria/PROBLEMAS_CRITICOS_CUSTOMIZER.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# 🚨 PROBLEMAS CRÍTICOS DEL CUSTOMIZER - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Fecha:** 15 Enero 2025
|
||||
**Hash:** `gkachele-problemas-customizer-20250115-001`
|
||||
**Prioridad:** 🔴 **CRÍTICA - REHACER COMPLETAMENTE**
|
||||
|
||||
---
|
||||
|
||||
## 📋 PROBLEMAS IDENTIFICADOS
|
||||
|
||||
### 1. 🎨 **DISEÑO Y UI/UX HORRIBLE**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ Formulario horrible - No se parece a WordPress
|
||||
- ❌ Colores horribles - No usa la paleta de WordPress
|
||||
- ❌ No hay scroll suave en sidebar
|
||||
- ❌ Falta espaciado y padding adecuado
|
||||
- ❌ Tipografía incorrecta
|
||||
- ❌ Botones mal diseñados
|
||||
- ❌ No hay iconos a elegir (solo emojis)
|
||||
|
||||
**Solución:**
|
||||
- ✅ Copiar EXACTAMENTE el diseño de WordPress Customizer
|
||||
- ✅ Usar colores oficiales de WordPress (#2271b1, #f0f0f1, etc.)
|
||||
- ✅ Implementar scroll suave
|
||||
- ✅ Usar iconos Dashicons o Font Awesome
|
||||
- ✅ Mejorar tipografía y espaciado
|
||||
|
||||
---
|
||||
|
||||
### 2. 💾 **GUARDADO INCONSISTENTE**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ Algunas cosas guardan automáticamente
|
||||
- ❌ Otras cosas NO guardan automáticamente
|
||||
- ❌ No hay botón "Cancelar" - hay que refrescar o salir
|
||||
- ❌ No hay botón "Descartar cambios"
|
||||
- ❌ No hay indicador de cambios sin guardar
|
||||
- ❌ No hay confirmación antes de salir con cambios sin guardar
|
||||
|
||||
**Solución (copiar WordPress):**
|
||||
- ✅ **Botón "Guardar y Publicar"** (siempre visible en footer)
|
||||
- ✅ **Botón "Descartar cambios"** (solo visible si hay cambios)
|
||||
- ✅ **Indicador de cambios sin guardar** (punto rojo o badge)
|
||||
- ✅ **Confirmación antes de salir** si hay cambios sin guardar
|
||||
- ✅ **Auto-guardado** solo para preview, NO para guardar definitivamente
|
||||
- ✅ **Estado de guardado** visible (guardado, guardando, error)
|
||||
|
||||
---
|
||||
|
||||
### 3. 🗺️ **MAPA NO FUNCIONA**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ Mapa no se muestra
|
||||
- ❌ No genera automáticamente desde dirección
|
||||
- ❌ Requiere URL manual (muy complicado)
|
||||
|
||||
**Solución:**
|
||||
- ✅ Generar mapa automáticamente desde campo "Dirección"
|
||||
- ✅ Usar Google Maps Embed sin API key
|
||||
- ✅ Mostrar preview del mapa en tiempo real
|
||||
- ✅ Permitir editar posición manualmente si es necesario
|
||||
|
||||
---
|
||||
|
||||
### 4. 📱 **WHATSAPP FLOTANTE NO EXISTE**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ No hay botón flotante de WhatsApp
|
||||
- ❌ No se puede configurar número
|
||||
- ❌ No aparece en el sitio
|
||||
|
||||
**Solución:**
|
||||
- ✅ Añadir opción en sidebar: "Activar WhatsApp flotante"
|
||||
- ✅ Campo para número de WhatsApp
|
||||
- ✅ Botón flotante en esquina inferior derecha
|
||||
- ✅ Icono de WhatsApp
|
||||
- ✅ Mensaje predefinido editable
|
||||
|
||||
---
|
||||
|
||||
### 5. 🧩 **FUNCIONALIDADES FALTANTES**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ No hay iconos a elegir (solo emojis)
|
||||
- ❌ No hay selector de iconos
|
||||
- ❌ No hay biblioteca de iconos
|
||||
|
||||
**Solución:**
|
||||
- ✅ Integrar Dashicons (como WordPress)
|
||||
- ✅ O Font Awesome
|
||||
- ✅ Selector visual de iconos
|
||||
- ✅ Búsqueda de iconos
|
||||
- ✅ Preview del icono seleccionado
|
||||
|
||||
---
|
||||
|
||||
### 6. 📜 **SCROLL Y NAVEGACIÓN**
|
||||
|
||||
**Problemas:**
|
||||
- ❌ No hay scroll suave
|
||||
- ❌ Sidebar no tiene scroll independiente
|
||||
- ❌ No hay navegación entre secciones
|
||||
- ❌ No hay menú lateral de secciones (como WordPress)
|
||||
|
||||
**Solución:**
|
||||
- ✅ Scroll suave en sidebar
|
||||
- ✅ Menú lateral de secciones (como WordPress)
|
||||
- ✅ Navegación rápida entre secciones
|
||||
- ✅ Scroll independiente para sidebar y preview
|
||||
|
||||
---
|
||||
|
||||
## 🎯 CÓMO FUNCIONA WORDPRESS CUSTOMIZER (ANÁLISIS)
|
||||
|
||||
### Estructura Visual:
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Header: Logo + "Personalizar" + X (cerrar) │
|
||||
├──────────┬───────────────────────────────────────┤
|
||||
│ │ │
|
||||
│ SIDEBAR │ PREVIEW IFRAME │
|
||||
│ (350px) │ (flex: 1) │
|
||||
│ │ │
|
||||
│ ┌──────┐ │ │
|
||||
│ │Menú │ │ │
|
||||
│ │Sec. │ │ │
|
||||
│ └──────┘ │ │
|
||||
│ │ │
|
||||
│ Sección │ │
|
||||
│ Contenido│ │
|
||||
│ │ │
|
||||
│ Sección │ │
|
||||
│ Colores │ │
|
||||
│ │ │
|
||||
│ Sección │ │
|
||||
│ Media │ │
|
||||
│ │ │
|
||||
│ ... │ │
|
||||
│ │ │
|
||||
├──────────┴───────────────────────────────────────┤
|
||||
│ Footer: [Descartar] [Guardar y Publicar] │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Características Clave de WordPress:
|
||||
|
||||
1. **Header:**
|
||||
- Logo WordPress a la izquierda
|
||||
- Título "Personalizar" centrado
|
||||
- Botón X para cerrar (arriba derecha)
|
||||
- Fondo: #23282d
|
||||
|
||||
2. **Sidebar:**
|
||||
- Ancho fijo: 300px (no 350px)
|
||||
- Menú lateral de secciones (colapsable)
|
||||
- Scroll independiente
|
||||
- Fondo: #fff
|
||||
- Borde derecho: 1px solid #ddd
|
||||
|
||||
3. **Controles:**
|
||||
- Cada control tiene label arriba
|
||||
- Inputs con bordes suaves
|
||||
- Color primario: #2271b1
|
||||
- Hover: #135e96
|
||||
- Focus: box-shadow azul
|
||||
|
||||
4. **Footer:**
|
||||
- Siempre visible (sticky)
|
||||
- Botón "Descartar" (gris, solo si hay cambios)
|
||||
- Botón "Guardar y Publicar" (azul, siempre visible)
|
||||
- Indicador de estado (guardando...)
|
||||
|
||||
5. **Preview:**
|
||||
- Iframe a pantalla completa
|
||||
- Actualización en tiempo real
|
||||
- No se recarga completo, solo cambia CSS/HTML
|
||||
|
||||
6. **Guardado:**
|
||||
- **NO guarda automáticamente** (solo preview)
|
||||
- **Solo guarda cuando presionas "Guardar y Publicar"**
|
||||
- Muestra "Guardando..." mientras guarda
|
||||
- Muestra "Guardado" cuando termina
|
||||
- Si hay cambios sin guardar, muestra punto rojo
|
||||
|
||||
---
|
||||
|
||||
## ✅ PLAN DE REHACER CUSTOMIZER
|
||||
|
||||
### Fase 1: Diseño Visual (Copiar WordPress)
|
||||
- [ ] Cambiar colores a paleta WordPress
|
||||
- [ ] Rediseñar header (logo + título + cerrar)
|
||||
- [ ] Rediseñar sidebar (300px, scroll suave)
|
||||
- [ ] Rediseñar controles (inputs, labels, botones)
|
||||
- [ ] Rediseñar footer (sticky, botones correctos)
|
||||
- [ ] Añadir menú lateral de secciones
|
||||
|
||||
### Fase 2: Sistema de Guardado (Copiar WordPress)
|
||||
- [ ] Eliminar auto-guardado (solo preview)
|
||||
- [ ] Implementar botón "Guardar y Publicar"
|
||||
- [ ] Implementar botón "Descartar cambios"
|
||||
- [ ] Indicador de cambios sin guardar
|
||||
- [ ] Confirmación antes de salir
|
||||
- [ ] Estado de guardado visible
|
||||
|
||||
### Fase 3: Funcionalidades Faltantes
|
||||
- [ ] Mapa automático desde dirección
|
||||
- [ ] WhatsApp flotante configurable
|
||||
- [ ] Selector de iconos (Dashicons/Font Awesome)
|
||||
- [ ] Scroll suave
|
||||
- [ ] Navegación entre secciones
|
||||
|
||||
### Fase 4: Testing y Pulido
|
||||
- [ ] Probar todo el flujo
|
||||
- [ ] Verificar que guarda correctamente
|
||||
- [ ] Verificar que descarta correctamente
|
||||
- [ ] Verificar preview en tiempo real
|
||||
- [ ] Verificar todas las funcionalidades
|
||||
|
||||
---
|
||||
|
||||
## 📝 NOTAS IMPORTANTES
|
||||
|
||||
1. **NO inventar nada nuevo** - Copiar EXACTAMENTE WordPress
|
||||
2. **Colores oficiales WordPress:**
|
||||
- Azul primario: #2271b1
|
||||
- Azul hover: #135e96
|
||||
- Gris fondo: #f0f0f1
|
||||
- Gris borde: #c3c4c7
|
||||
- Texto: #1d2327
|
||||
- Header: #23282d
|
||||
|
||||
3. **Comportamiento de guardado:**
|
||||
- Preview = Cambios visibles pero NO guardados
|
||||
- Guardar = Cambios guardados en base de datos
|
||||
- Descartar = Volver al último estado guardado
|
||||
|
||||
4. **Referencias:**
|
||||
- WordPress Customizer: `/wp-admin/customize.php`
|
||||
- Código fuente: `wp-content/themes/*/inc/customizer/`
|
||||
- JavaScript: `wp.customize` API
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Prioridad:** 🔴 **CRÍTICA - REHACER COMPLETAMENTE**
|
||||
**Próxima acción:** Rehacer customizer copiando EXACTAMENTE WordPress
|
||||
25
memoria/README.md
Normal file
25
memoria/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 📚 MEMORIA DEL PROYECTO - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## ⚠️ IMPORTANTE: LEER SIEMPRE ESTA CARPETA
|
||||
|
||||
**Esta carpeta contiene TODA la documentación del proyecto.**
|
||||
|
||||
**SIEMPRE consulta estos archivos antes de modificar código.**
|
||||
|
||||
👉 **Ver `INDICE.md` para la lista completa de documentos**
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Principios del Proyecto
|
||||
|
||||
1. **Todo en Base de Datos**: Sin lógica hardcodeada
|
||||
2. **Sistema Multi-tenant**: Todos los clientes en `main.db`
|
||||
3. **Roles Dinámicos**: Basados en DB, no hardcodeados
|
||||
4. **Branding GKACHELE™**: Sin referencias a otros sistemas
|
||||
5. **Modular**: Código organizado y reutilizable
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
36
memoria/REGLA_IMPORTANTE.md
Normal file
36
memoria/REGLA_IMPORTANTE.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# ⚠️ REGLA CRÍTICA - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🚫 NUNCA MENCIONAR "WORDPRESS" EN EL CÓDIGO
|
||||
|
||||
### Regla Absoluta:
|
||||
- ❌ **NO** escribir "WordPress", "wordpress", "WP", "wp-" en ningún archivo de código
|
||||
- ❌ **NO** usar referencias como "estilo WordPress", "como WordPress", etc.
|
||||
- ✅ **SÍ** usar "GKACHELE™", "sistema GKACHELE™", "inspirado pero mejorado"
|
||||
|
||||
### Razón:
|
||||
Este es un sistema **propio e independiente** inspirado en funcionalidades similares, pero **mejorado y personalizado** para GKACHELE™.
|
||||
|
||||
### Reemplazos Correctos:
|
||||
|
||||
| ❌ Incorrecto | ✅ Correcto |
|
||||
|--------------|------------|
|
||||
| "estilo WordPress" | "sistema GKACHELE™" |
|
||||
| "como WordPress" | "sistema modular GKACHELE™" |
|
||||
| "wp-admin" | "/dashboard" |
|
||||
| "wp_options" | "tabla settings" |
|
||||
| "WordPress-like" | "GKACHELE™ template system" |
|
||||
|
||||
### Verificación:
|
||||
Antes de cada commit o cambio, buscar:
|
||||
```bash
|
||||
grep -ri "wordpress\|WordPress\|WP\|wp-" --exclude-dir=wp-content .
|
||||
```
|
||||
|
||||
Si encuentra algo, **ELIMINARLO INMEDIATAMENTE**.
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-no-wordpress-20250114`
|
||||
118
memoria/RESPUESTAS_PREGUNTAS.md
Normal file
118
memoria/RESPUESTAS_PREGUNTAS.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# ❓ Respuestas a Preguntas - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🐍 ¿Por qué Python y NO Docker?
|
||||
|
||||
**Sí, es por la Raspberry Pi:**
|
||||
- Raspberry Pi tiene recursos limitados (RAM, CPU)
|
||||
- Docker consume más memoria y CPU
|
||||
- Python directo es más ligero y eficiente
|
||||
- Más fácil de depurar y mantener
|
||||
- **En VPS podrías usar Docker si quieres**, pero Python directo también funciona perfecto y es más simple
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ ¿VPS es Buena Opción?
|
||||
|
||||
**SÍ, altamente recomendado para producción:**
|
||||
|
||||
### Ventajas VPS:
|
||||
- ✅ Más recursos (CPU, RAM, disco)
|
||||
- ✅ Mejor rendimiento
|
||||
- ✅ Más confiable
|
||||
- ✅ Mejor para escalar
|
||||
- ✅ Puedes usar Docker si quieres
|
||||
- ✅ Mismo código funciona (solo cambiar configuración)
|
||||
|
||||
### Migración:
|
||||
- Copiar código completo
|
||||
- Instalar Python3, Nginx
|
||||
- Copiar configuración
|
||||
- Cambiar dominio
|
||||
- Configurar SSL
|
||||
- **Mismo código, más potencia**
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Acceso a Base de Datos
|
||||
|
||||
### Tu Acceso:
|
||||
- **Panel `/admin`** - Ver/eliminar usuarios, aprobar sitios
|
||||
- **DB Browser for SQLite** - Acceso directo a `main.db`
|
||||
- **Scripts Python** - `ver_usuarios.py`, `limpiar_db.py`
|
||||
|
||||
### Acceso Clientes:
|
||||
- **Solo ven SUS datos** (filtrado por `user_id`)
|
||||
- Panel `/dashboard` - Sus sitios
|
||||
- Panel `/customizer` - Personalizar sus sitios
|
||||
- Panel `/dashboard/admin` - Su media y config
|
||||
|
||||
---
|
||||
|
||||
## 👤 Admin para Clientes
|
||||
|
||||
**Sí, ya existe:**
|
||||
- Panel `/dashboard` - Cliente ve SUS sitios
|
||||
- Panel `/customizer/{site_id}` - Personalizar sitio
|
||||
- Panel `/dashboard/admin` - Admin del cliente (media, config)
|
||||
|
||||
**Futuro:**
|
||||
- Más opciones de administración
|
||||
- Estadísticas del cliente
|
||||
- Gestión avanzada
|
||||
|
||||
---
|
||||
|
||||
## 📊 ¿Detecta Movimientos?
|
||||
|
||||
### Actualmente:
|
||||
- **NO hay detección automática** de movimientos
|
||||
- **Sí hay registros:**
|
||||
- `created_at` - Fecha de creación
|
||||
- `updated_at` - Fecha de actualización
|
||||
- Logs del servidor (journalctl)
|
||||
|
||||
### Posible Implementar:
|
||||
- Tabla `activity_log` para registrar acciones
|
||||
- Notificaciones de cambios
|
||||
- Historial de modificaciones
|
||||
- Auditoría completa
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Limitaciones por Plan
|
||||
|
||||
### Sistema Actual:
|
||||
- **Planes:** `base`, `premium`, etc. (campo en tabla `users`)
|
||||
- **Limitaciones posibles:**
|
||||
- ✅ Número de sitios
|
||||
- ✅ Subida de fotos (tamaño, cantidad)
|
||||
- ✅ Modificaciones (frecuencia, tipo)
|
||||
- ✅ Funcionalidades avanzadas
|
||||
|
||||
### Implementación:
|
||||
```python
|
||||
# Ejemplo:
|
||||
if user_plan == 'base':
|
||||
max_sites = 1
|
||||
max_photos = 10
|
||||
max_photo_size = 5MB
|
||||
elif user_plan == 'premium':
|
||||
max_sites = 5
|
||||
max_photos = 100
|
||||
max_photo_size = 20MB
|
||||
```
|
||||
|
||||
### Verificar Antes de Acciones:
|
||||
- Contar recursos usados vs. límites del plan
|
||||
- Bloquear acciones si excede límite
|
||||
- Mostrar mensaje al cliente
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
247
memoria/SISTEMA_BLOQUES_EDITABLES.md
Normal file
247
memoria/SISTEMA_BLOQUES_EDITABLES.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# 🧩 Sistema de Bloques Editables - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
**Hash:** `gkachele-bloques-editables-20250115-001`
|
||||
|
||||
---
|
||||
|
||||
## 📋 OBJETIVO
|
||||
|
||||
Implementar sistema completo de bloques editables similar a WordPress Gutenberg:
|
||||
- ✅ Añadir/eliminar bloques (videos, imágenes, texto, redes sociales)
|
||||
- ✅ Mover bloques (drag & drop)
|
||||
- ✅ Edición inline (click con lápiz) + sidebar
|
||||
- ✅ Iconos de redes sociales automáticos
|
||||
- ✅ Mapa embed sin API key
|
||||
- ✅ Todo sincronizado en tiempo real
|
||||
|
||||
---
|
||||
|
||||
## 🎯 FUNCIONALIDADES REQUERIDAS
|
||||
|
||||
### 1. Añadir Bloques
|
||||
- Botón "➕ Añadir Bloque" en sidebar
|
||||
- Tipos: Video (YouTube/Vimeo), Imagen, Texto, Redes Sociales, Mapa
|
||||
- Cada bloque se añade al preview y al sidebar
|
||||
|
||||
### 2. Eliminar Bloques
|
||||
- Botón "🗑️" en cada bloque del preview
|
||||
- Confirmación antes de eliminar
|
||||
- Sincronización automática
|
||||
|
||||
### 3. Mover Bloques
|
||||
- Drag & drop usando HTML5 Drag API
|
||||
- Indicadores visuales al arrastrar
|
||||
- Guardado automático del orden
|
||||
|
||||
### 4. Redes Sociales con Iconos
|
||||
- Al añadir URL de red social, mostrar icono automático
|
||||
- Iconos: Facebook, Instagram, Twitter/X, WhatsApp, YouTube
|
||||
- Usar Font Awesome o SVG inline
|
||||
|
||||
### 5. Mapa Embed
|
||||
- Campo para URL de Google Maps (compartir → insertar mapa)
|
||||
- Renderizar iframe sin necesidad de API key
|
||||
- Validación de URL
|
||||
|
||||
### 6. Edición Híbrida
|
||||
- Click en elemento → editar inline (modal)
|
||||
- Cambios en sidebar → actualizar preview
|
||||
- Bidireccional siempre
|
||||
|
||||
---
|
||||
|
||||
## 🔧 IMPLEMENTACIÓN
|
||||
|
||||
### Estructura de Datos
|
||||
|
||||
```json
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"id": "block_1234567890",
|
||||
"type": "video",
|
||||
"content": {
|
||||
"url": "https://www.youtube.com/embed/...",
|
||||
"title": "Video Tutorial"
|
||||
},
|
||||
"order": 0
|
||||
},
|
||||
{
|
||||
"id": "block_1234567891",
|
||||
"type": "redes_sociales",
|
||||
"content": {
|
||||
"facebook": "https://facebook.com/...",
|
||||
"instagram": "https://instagram.com/..."
|
||||
},
|
||||
"order": 1
|
||||
},
|
||||
{
|
||||
"id": "block_1234567892",
|
||||
"type": "mapa",
|
||||
"content": {
|
||||
"url": "https://www.google.com/maps/embed?pb=..."
|
||||
},
|
||||
"order": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Backend (app.py)
|
||||
|
||||
```python
|
||||
# Endpoint para añadir bloque
|
||||
@app.route('/api/customizer/add-block', methods=['POST'])
|
||||
def add_block():
|
||||
# Añadir nuevo bloque a content_json['blocks']
|
||||
pass
|
||||
|
||||
# Endpoint para eliminar bloque
|
||||
@app.route('/api/customizer/remove-block', methods=['POST'])
|
||||
def remove_block():
|
||||
# Eliminar bloque por ID
|
||||
pass
|
||||
|
||||
# Endpoint para reordenar bloques
|
||||
@app.route('/api/customizer/reorder-blocks', methods=['POST'])
|
||||
def reorder_blocks():
|
||||
# Actualizar orden de bloques
|
||||
pass
|
||||
```
|
||||
|
||||
### Frontend (customizer.html)
|
||||
|
||||
```javascript
|
||||
// Añadir bloque
|
||||
function addBlock(type) {
|
||||
const blockId = 'block_' + Date.now();
|
||||
const newBlock = {
|
||||
id: blockId,
|
||||
type: type,
|
||||
content: getDefaultContentForType(type),
|
||||
order: blocks.length
|
||||
};
|
||||
// Añadir a preview y sidebar
|
||||
renderBlock(newBlock);
|
||||
saveBlocks();
|
||||
}
|
||||
|
||||
// Eliminar bloque
|
||||
function removeBlock(blockId) {
|
||||
if (confirm('¿Eliminar este bloque?')) {
|
||||
// Remover del DOM y del array
|
||||
saveBlocks();
|
||||
}
|
||||
}
|
||||
|
||||
// Drag & Drop
|
||||
function initDragDrop() {
|
||||
document.querySelectorAll('.gk-block').forEach(block => {
|
||||
block.draggable = true;
|
||||
block.addEventListener('dragstart', handleDragStart);
|
||||
block.addEventListener('dragover', handleDragOver);
|
||||
block.addEventListener('drop', handleDrop);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Template (template.html)
|
||||
|
||||
```html
|
||||
<!-- Renderizar bloques dinámicamente -->
|
||||
{% if blocks %}
|
||||
{% for block in blocks|sort(attribute='order') %}
|
||||
{% if block.type == 'video' %}
|
||||
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
|
||||
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
|
||||
<iframe src="{{ block.content.url }}" frameborder="0"></iframe>
|
||||
</div>
|
||||
{% elif block.type == 'redes_sociales' %}
|
||||
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
|
||||
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
|
||||
<div class="social-icons">
|
||||
{% if block.content.facebook %}
|
||||
<a href="{{ block.content.facebook }}"><i class="fab fa-facebook"></i></a>
|
||||
{% endif %}
|
||||
<!-- Más redes... -->
|
||||
</div>
|
||||
</div>
|
||||
{% elif block.type == 'mapa' %}
|
||||
<div class="gk-block" data-block-id="{{ block.id }}" draggable="true">
|
||||
<button class="gk-block-delete" onclick="removeBlock('{{ block.id }}')">🗑️</button>
|
||||
<iframe src="{{ block.content.url }}" width="100%" height="450" frameborder="0"></iframe>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 CHECKLIST
|
||||
|
||||
- [ ] Sistema de bloques en backend (añadir/eliminar/reordenar)
|
||||
- [ ] UI para añadir bloques en sidebar
|
||||
- [ ] Renderizado de bloques en template
|
||||
- [ ] Drag & drop funcional
|
||||
- [ ] Iconos de redes sociales (Font Awesome o SVG)
|
||||
- [ ] Mapa embed sin API
|
||||
- [ ] Edición inline de bloques
|
||||
- [ ] Sincronización bidireccional
|
||||
- [ ] Guardado automático
|
||||
- [ ] Indicadores visuales (hover, drag)
|
||||
|
||||
---
|
||||
|
||||
## 🎨 ESTILOS
|
||||
|
||||
```css
|
||||
.gk-block {
|
||||
position: relative;
|
||||
margin: 20px 0;
|
||||
padding: 15px;
|
||||
border: 2px dashed transparent;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.gk-block:hover {
|
||||
border-color: var(--primary);
|
||||
}
|
||||
|
||||
.gk-block.dragging {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.gk-block-delete {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
background: #d63638;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 5px 10px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.gk-block:hover .gk-block-delete {
|
||||
opacity: 1;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔗 REFERENCIAS
|
||||
|
||||
- WordPress Gutenberg: Sistema de bloques
|
||||
- Elementor: Drag & drop visual
|
||||
- Google Maps Embed: Sin API key necesario
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 2025-01-15
|
||||
**Estado:** En desarrollo
|
||||
77
memoria/SISTEMA_ROLES.md
Normal file
77
memoria/SISTEMA_ROLES.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# 🔐 Sistema de Roles y Permisos - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 📋 Arquitectura Basada en Base de Datos
|
||||
|
||||
Todo el sistema de roles y permisos está **100% en la base de datos**, sin lógica hardcodeada.
|
||||
|
||||
### Tabla: `users`
|
||||
|
||||
**Campos relacionados con roles:**
|
||||
- `role` (TEXT): Rol del usuario
|
||||
- Valores posibles: `administrator`, `editor`, `author`, `subscriber`
|
||||
- Default: `subscriber`
|
||||
- `status` (TEXT): Estado del usuario
|
||||
- Valores: `active`, `inactive`, `suspended`
|
||||
- Default: `active`
|
||||
|
||||
### Jerarquía de Roles
|
||||
|
||||
```
|
||||
administrator (nivel 4) - Acceso total
|
||||
↓
|
||||
editor (nivel 3) - Puede editar contenido
|
||||
↓
|
||||
author (nivel 2) - Puede crear contenido
|
||||
↓
|
||||
subscriber (nivel 1) - Solo lectura
|
||||
```
|
||||
|
||||
### Funciones Helper
|
||||
|
||||
#### `user_has_role(user_id, required_role)`
|
||||
Verifica si un usuario tiene un rol específico o superior.
|
||||
|
||||
**Uso:**
|
||||
```python
|
||||
if user_has_role(session['user_id'], 'administrator'):
|
||||
# Usuario es admin o superior
|
||||
```
|
||||
|
||||
#### `user_can(user_id, capability)`
|
||||
Verifica si un usuario tiene una capacidad específica.
|
||||
|
||||
**Uso:**
|
||||
```python
|
||||
if user_can(session['user_id'], 'manage_users'):
|
||||
# Usuario puede gestionar usuarios
|
||||
```
|
||||
|
||||
### Rutas Protegidas
|
||||
|
||||
Todas las rutas administrativas verifican el rol desde la base de datos:
|
||||
|
||||
```python
|
||||
@app.route('/admin')
|
||||
def admin():
|
||||
if not user_has_role(session['user_id'], 'administrator'):
|
||||
return "Solo administradores", 403
|
||||
# ...
|
||||
```
|
||||
|
||||
### Creación de Usuario Administrador
|
||||
|
||||
El primer usuario (ID=1) se crea automáticamente como `administrator`:
|
||||
- Email: `admin@gkachele.com`
|
||||
- Password: `admin123` (cambiar después)
|
||||
- Role: `administrator`
|
||||
|
||||
### Migración Automática
|
||||
|
||||
Si la tabla `users` no tiene las columnas `role` y `status`, se añaden automáticamente al iniciar la aplicación.
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-roles-db-20250114`
|
||||
250
memoria/SISTEMA_TEMPLATES.md
Normal file
250
memoria/SISTEMA_TEMPLATES.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# 🎨 Sistema de Templates - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 📋 Descripción
|
||||
|
||||
Sistema de templates similar a WordPress que permite:
|
||||
- ✅ Escanear automáticamente todos los templates disponibles
|
||||
- ✅ Seleccionar/cambiar template desde el customizer
|
||||
- ✅ Cargar configuración automáticamente desde `config.json`
|
||||
- ✅ Aplicar colores y tipografía por defecto del template
|
||||
|
||||
---
|
||||
|
||||
## 📁 Estructura de un Template
|
||||
|
||||
Para añadir un nuevo template, simplemente crea una carpeta en `demo/themes/` con esta estructura:
|
||||
|
||||
```
|
||||
demo/themes/
|
||||
└── mi-template/
|
||||
├── config.json (OBLIGATORIO)
|
||||
└── template.html (OBLIGATORIO)
|
||||
├── style.css (OPCIONAL)
|
||||
└── preview.jpg (OPCIONAL - para mostrar preview)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Formato de `config.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Nombre del Template",
|
||||
"rubro": "restaurante",
|
||||
"description": "Descripción del template",
|
||||
"sections": [
|
||||
"hero",
|
||||
"menu",
|
||||
"horarios",
|
||||
"reservas",
|
||||
"contacto"
|
||||
],
|
||||
"colors": {
|
||||
"primary": "#c94d4d",
|
||||
"secondary": "#d97757",
|
||||
"accent": "#f4a261",
|
||||
"text": "#2c2c2c"
|
||||
},
|
||||
"typography": {
|
||||
"font_family": "Roboto",
|
||||
"headings": "Playfair Display"
|
||||
},
|
||||
"features": {
|
||||
"menu_url": true,
|
||||
"horarios": true,
|
||||
"reservas": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Campos del `config.json`:
|
||||
|
||||
- **`name`**: Nombre visible del template
|
||||
- **`rubro`**: Categoría (restaurante, gimnasio, general, etc.)
|
||||
- **`description`**: Descripción breve
|
||||
- **`sections`**: Array de secciones disponibles
|
||||
- **`colors`**: Colores por defecto (primary, secondary, accent, text)
|
||||
- **`typography`**: Tipografía por defecto
|
||||
- **`features`**: Características del template
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Cómo Añadir un Nuevo Template
|
||||
|
||||
### Paso 1: Crear la carpeta
|
||||
```bash
|
||||
mkdir demo/themes/mi-nuevo-template
|
||||
```
|
||||
|
||||
### Paso 2: Crear `config.json`
|
||||
Copia el formato de arriba y ajusta los valores.
|
||||
|
||||
### Paso 3: Crear `template.html`
|
||||
Usa Jinja2 para variables dinámicas:
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
:root {
|
||||
--primary: {{ colors.primary if colors else '#c94d4d' }};
|
||||
--secondary: {{ colors.secondary if colors else '#d97757' }};
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>{{ hero_title or 'Bienvenido' }}</h1>
|
||||
<p>{{ hero_description or '' }}</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
### Paso 4: ¡Listo!
|
||||
El sistema lo detectará automáticamente al recargar.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Funciones del Sistema
|
||||
|
||||
### `scan_available_themes()`
|
||||
Escanear todos los templates disponibles y cargar sus configuraciones.
|
||||
|
||||
### `get_theme_config(theme_id)`
|
||||
Obtener configuración de un template específico.
|
||||
|
||||
### `get_themes_by_rubro(rubro)`
|
||||
Obtener templates filtrados por rubro.
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Endpoints API
|
||||
|
||||
### `GET /api/themes`
|
||||
Listar todos los templates disponibles.
|
||||
|
||||
**Query params:**
|
||||
- `rubro`: Filtrar por rubro (opcional)
|
||||
|
||||
**Respuesta:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"themes": {
|
||||
"restaurante-moderno": {
|
||||
"id": "restaurante-moderno",
|
||||
"name": "Restaurante Moderno",
|
||||
"description": "Tema elegante para restaurantes",
|
||||
"rubro": "restaurante",
|
||||
"colors": {...},
|
||||
"typography": {...}
|
||||
}
|
||||
},
|
||||
"total": 3
|
||||
}
|
||||
```
|
||||
|
||||
### `GET /api/themes/<theme_id>`
|
||||
Obtener información detallada de un template.
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Uso en el Customizer
|
||||
|
||||
El customizer ahora incluye un selector de templates en la parte superior:
|
||||
|
||||
1. **Selector de Template**: Dropdown con todos los templates disponibles
|
||||
2. **Cambio de Template**: Al cambiar, se aplican automáticamente los colores y configuración por defecto
|
||||
3. **Confirmación**: Pide confirmación antes de cambiar para evitar pérdida de datos
|
||||
|
||||
---
|
||||
|
||||
## 📌 Notas Importantes
|
||||
|
||||
1. **Carpetas que empiezan con `_`**: Se ignoran (ej: `_gkachele/`)
|
||||
2. **Archivos requeridos**: `config.json` y `template.html` son obligatorios
|
||||
3. **Detección automática**: No necesitas registrar templates manualmente
|
||||
4. **Colores dinámicos**: Los templates usan variables CSS que se actualizan desde el customizer
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Ejemplo Completo
|
||||
|
||||
### Template: `restaurante-asiatico`
|
||||
|
||||
**`config.json`:**
|
||||
```json
|
||||
{
|
||||
"name": "Restaurante Asiático",
|
||||
"rubro": "restaurante",
|
||||
"description": "Tema moderno para restaurantes asiáticos",
|
||||
"sections": ["hero", "menu", "reservas", "contacto"],
|
||||
"colors": {
|
||||
"primary": "#e63946",
|
||||
"secondary": "#f77f00",
|
||||
"accent": "#fcbf49",
|
||||
"text": "#1d3557"
|
||||
},
|
||||
"typography": {
|
||||
"font_family": "Roboto",
|
||||
"headings": "Oswald"
|
||||
},
|
||||
"features": {
|
||||
"menu_url": true,
|
||||
"reservas": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**`template.html`:**
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{{ site_name or 'Restaurante' }}</title>
|
||||
<style>
|
||||
:root {
|
||||
--primary: {{ colors.primary if colors else '#e63946' }};
|
||||
--secondary: {{ colors.secondary if colors else '#f77f00' }};
|
||||
}
|
||||
body {
|
||||
font-family: '{{ typography.font_family if typography else 'Roboto' }}', sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>{{ site_name or 'Restaurante' }}</h1>
|
||||
</header>
|
||||
<main>
|
||||
<section class="hero">
|
||||
<h1>{{ hero_title or 'Bienvenido' }}</h1>
|
||||
<p>{{ hero_description or '' }}</p>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist para Nuevo Template
|
||||
|
||||
- [ ] Crear carpeta en `demo/themes/`
|
||||
- [ ] Crear `config.json` con todos los campos
|
||||
- [ ] Crear `template.html` con variables Jinja2
|
||||
- [ ] Probar que se detecta en `/api/themes`
|
||||
- [ ] Probar cambio desde customizer
|
||||
- [ ] Verificar que colores se aplican correctamente
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-sistema-templates-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
89
memoria/SUBDOMINIOS_PAGOS.md
Normal file
89
memoria/SUBDOMINIOS_PAGOS.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# 🌐 Subdominios y Pagos - GKACHELE™
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
|
||||
## 🌐 SUBDOMINIOS
|
||||
|
||||
### Opciones:
|
||||
|
||||
#### Opción A: Subdominio con Tu Dominio
|
||||
- Cliente obtiene: `cliente1.tudominio.com`
|
||||
- Configuración DNS automática
|
||||
- SSL automático (Let's Encrypt)
|
||||
- **Gratis** o incluido en plan
|
||||
|
||||
#### Opción B: Cliente Compra Dominio
|
||||
- Cliente compra su dominio
|
||||
- Tú gestionas la configuración
|
||||
- **Cobrar por gestión** (ej: $10-20 USD)
|
||||
- Configurar DNS y SSL
|
||||
|
||||
### Implementación:
|
||||
- Tabla `domains` en base de datos
|
||||
- Campo `subdomain` en tabla `sites`
|
||||
- Scripts para configurar DNS
|
||||
- Integración con API de dominio
|
||||
- SSL automático con certbot
|
||||
|
||||
---
|
||||
|
||||
## 💳 PAGOS - NOMINALIA
|
||||
|
||||
### Integración:
|
||||
- API Nominalia para pagos
|
||||
- Comodines para pagos recurrentes
|
||||
- Gestión de suscripciones
|
||||
- Facturación automática
|
||||
|
||||
### Funcionalidades:
|
||||
- Pago inicial (registro)
|
||||
- Pagos mensuales/anuales
|
||||
- Renovación automática
|
||||
- Suspender si no paga
|
||||
- Notificaciones de pago
|
||||
|
||||
### Para Pagarte a Mí:
|
||||
- Comodines con Nominalia
|
||||
- Pagos recurrentes
|
||||
- Gestión desde dashboard admin
|
||||
|
||||
---
|
||||
|
||||
## 📋 TABLA: domains
|
||||
|
||||
```sql
|
||||
CREATE TABLE domains (
|
||||
id INTEGER PRIMARY KEY,
|
||||
user_id INTEGER,
|
||||
site_id INTEGER,
|
||||
domain_type TEXT, -- 'subdomain' o 'custom'
|
||||
domain_name TEXT, -- 'cliente1.tudominio.com' o 'cliente.com'
|
||||
dns_configured BOOLEAN DEFAULT 0,
|
||||
ssl_configured BOOLEAN DEFAULT 0,
|
||||
created_at TIMESTAMP,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
FOREIGN KEY (site_id) REFERENCES sites(id)
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLUJO CON SUBDOMINIOS
|
||||
|
||||
```
|
||||
1. Cliente se registra
|
||||
2. Cliente elige: subdominio gratis o comprar dominio
|
||||
3. Si compra dominio → Cobrar gestión
|
||||
4. Configurar DNS automáticamente
|
||||
5. SSL automático
|
||||
6. Sitio accesible en dominio
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Última actualización:** 14 Enero 2025
|
||||
**Hash:** `gkachele-subdominios-pagos-20250114`
|
||||
|
||||
---
|
||||
|
||||
**© 2025 GKACHELE™. Todos los derechos reservados.**
|
||||
Reference in New Issue
Block a user