Initial commit: Proyecto Portal ePromos completo con documentación unificada y seguridad base
This commit is contained in:
@@ -0,0 +1,241 @@
|
||||
-- Tabla principal de landings
|
||||
CREATE TABLE IF NOT EXISTS landing_pages (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
titulo VARCHAR(200) NOT NULL,
|
||||
slug VARCHAR(160) NOT NULL UNIQUE,
|
||||
estado ENUM('borrador','publicado') NOT NULL DEFAULT 'borrador',
|
||||
hero_image VARCHAR(255) NULL,
|
||||
contenido_html MEDIUMTEXT NULL, -- HTML renderizable
|
||||
css_inline MEDIUMTEXT NULL, -- CSS opcional por landing
|
||||
js_inline MEDIUMTEXT NULL, -- JS opcional por landing
|
||||
meta_title VARCHAR(200) NULL,
|
||||
meta_desc VARCHAR(255) NULL,
|
||||
canonical_url VARCHAR(255) NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Captura de leads del formulario de la landing
|
||||
CREATE TABLE IF NOT EXISTS landing_forms (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT UNSIGNED NOT NULL,
|
||||
nombre VARCHAR(150) NULL,
|
||||
email VARCHAR(180) NULL,
|
||||
telefono VARCHAR(60) NULL,
|
||||
mensaje TEXT NULL,
|
||||
ip_address VARCHAR(64) NULL,
|
||||
user_agent TEXT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX (landing_id),
|
||||
CONSTRAINT fk_lf_lp FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-- 1. Bloques reutilizables (biblioteca)
|
||||
CREATE TABLE IF NOT EXISTS landing_blocks (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
nombre VARCHAR(160) NOT NULL,
|
||||
tipo ENUM('html','css','js') NOT NULL DEFAULT 'html',
|
||||
contenido MEDIUMTEXT NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
KEY idx_nombre (nombre)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- 2. Asignación de bloques a una landing (con orden)
|
||||
CREATE TABLE IF NOT EXISTS landing_page_blocks (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT UNSIGNED NOT NULL,
|
||||
block_id INT UNSIGNED NOT NULL,
|
||||
posicion INT NOT NULL DEFAULT 1, -- orden
|
||||
zona VARCHAR(40) NOT NULL DEFAULT 'main', -- main/header/footer/etc
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY uq_lp_block (landing_id, block_id, zona),
|
||||
KEY idx_landing_pos (landing_id, posicion),
|
||||
CONSTRAINT fk_lpb_lp FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
CONSTRAINT fk_lpb_blk FOREIGN KEY (block_id) REFERENCES landing_blocks(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- 3. Variantes A/B de una landing
|
||||
CREATE TABLE IF NOT EXISTS landing_variants (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT UNSIGNED NOT NULL,
|
||||
nombre VARCHAR(120) NOT NULL,
|
||||
peso DECIMAL(6,3) NOT NULL DEFAULT 1.000, -- tráfico relativo
|
||||
estado ENUM('borrador','activo','pausado') NOT NULL DEFAULT 'activo',
|
||||
-- contenido específico de la variante (opcional); si NULL, toma el de landing_pages
|
||||
hero_image VARCHAR(255) NULL,
|
||||
contenido_html MEDIUMTEXT NULL,
|
||||
css_inline MEDIUMTEXT NULL,
|
||||
js_inline MEDIUMTEXT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
KEY idx_lv_landing (landing_id, estado),
|
||||
CONSTRAINT fk_lv_lp FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- 4. Programación por fecha (ventanas de publicación)
|
||||
CREATE TABLE IF NOT EXISTS landing_schedule (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT UNSIGNED NOT NULL,
|
||||
start_at DATETIME NULL,
|
||||
end_at DATETIME NULL,
|
||||
estado ENUM('programada','activa','finalizada') NOT NULL DEFAULT 'programada',
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
KEY idx_sched (landing_id, start_at, end_at),
|
||||
CONSTRAINT fk_ls_lp FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- 5. Tracking: impresiones y conversiones por variante
|
||||
CREATE TABLE IF NOT EXISTS landing_variant_stats (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT UNSIGNED NOT NULL,
|
||||
variant_id INT UNSIGNED NULL, -- NULL = página base (sin variante)
|
||||
event_type ENUM('impression','conversion') NOT NULL,
|
||||
session_id VARCHAR(64) NULL,
|
||||
ip_address VARCHAR(64) NULL,
|
||||
user_agent TEXT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
KEY idx_lv_evt (landing_id, variant_id, event_type, created_at),
|
||||
CONSTRAINT fk_lvs_lp FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
CONSTRAINT fk_lvs_lv FOREIGN KEY (variant_id) REFERENCES landing_variants(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
---
|
||||
|
||||
## Estructura de Base de Datos
|
||||
|
||||
```sql
|
||||
-- Landings principales
|
||||
CREATE TABLE landing_pages (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
titulo VARCHAR(255) NOT NULL,
|
||||
slug VARCHAR(255) NOT NULL UNIQUE,
|
||||
descripcion TEXT,
|
||||
activo TINYINT(1) DEFAULT 1,
|
||||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Bloques reutilizables
|
||||
CREATE TABLE landing_blocks (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL,
|
||||
tipo ENUM('texto','html','imagen','video') DEFAULT 'texto',
|
||||
contenido TEXT,
|
||||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Relación landing <-> bloques
|
||||
CREATE TABLE landing_page_blocks (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
block_id INT NOT NULL,
|
||||
zona VARCHAR(40) DEFAULT 'main',
|
||||
posicion INT DEFAULT 1,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (block_id) REFERENCES landing_blocks(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Variantes para A/B testing
|
||||
CREATE TABLE landing_variants (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
nombre VARCHAR(255),
|
||||
porcentaje_traffic DECIMAL(5,2) DEFAULT 50.00,
|
||||
activo TINYINT(1) DEFAULT 1,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Programación de publicaciones
|
||||
CREATE TABLE landing_schedule (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
variant_id INT DEFAULT NULL,
|
||||
fecha_inicio DATETIME,
|
||||
fecha_fin DATETIME,
|
||||
activo TINYINT(1) DEFAULT 1,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (variant_id) REFERENCES landing_variants(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_pages (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
titulo VARCHAR(255) NOT NULL,
|
||||
slug VARCHAR(255) NOT NULL UNIQUE,
|
||||
descripcion TEXT,
|
||||
activo TINYINT(1) DEFAULT 1,
|
||||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_variants (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
nombre VARCHAR(255),
|
||||
porcentaje_traffic DECIMAL(5,2) DEFAULT 50.00,
|
||||
activo TINYINT(1) DEFAULT 1,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_blocks (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL,
|
||||
tipo ENUM('texto','html','imagen','video') DEFAULT 'texto',
|
||||
contenido TEXT,
|
||||
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_page_blocks (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
block_id INT NOT NULL,
|
||||
zona VARCHAR(40) DEFAULT 'main',
|
||||
posicion INT DEFAULT 1,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (block_id) REFERENCES landing_blocks(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_forms (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
nombre VARCHAR(200),
|
||||
email VARCHAR(200),
|
||||
telefono VARCHAR(50),
|
||||
mensaje TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
ip_address VARCHAR(100),
|
||||
user_agent TEXT,
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landing_variant_stats (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
landing_id INT NOT NULL,
|
||||
variant_id INT NULL,
|
||||
event_type ENUM('impression','conversion') NOT NULL,
|
||||
session_id VARCHAR(100) NULL,
|
||||
ip_address VARCHAR(100) NULL,
|
||||
user_agent TEXT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX (landing_id),
|
||||
INDEX (variant_id),
|
||||
INDEX (event_type),
|
||||
INDEX (created_at),
|
||||
FOREIGN KEY (landing_id) REFERENCES landing_pages(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (variant_id) REFERENCES landing_variants(id) ON DELETE SET NULL
|
||||
);
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
Reference in New Issue
Block a user