""" Demo SaaS - Versión SIMPLE que FUNCIONA Sistema profesional automatizado - GKACHELE™ """ from flask import Flask, render_template, render_template_string, request, jsonify, session, redirect import sqlite3 import os import json from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__, template_folder='templates', static_folder='static') app.secret_key = 'demo-2025' # DB simple DB_PATH = 'demo.db' def init_db(): conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, email TEXT UNIQUE, password TEXT, plan TEXT, rubro TEXT )''') c.execute('''CREATE TABLE IF NOT EXISTS sites ( id INTEGER PRIMARY KEY, user_id INTEGER, slug TEXT UNIQUE, content TEXT, status TEXT DEFAULT 'draft' )''') conn.commit() conn.close() init_db() # Landing profesional (inspirada en tu landing real) LANDING_HTML = ''' PageBuilder SaaS | Crea tu sitio web automatizado

🎨 PageBuilder SaaS

Crea tu sitio web automatizado

Sistema profesional y automatizado. Cada cliente con su admin, templates y base de datos.

Nuestros Planes

Base

$50
  • Sitio web de una página
  • Diseño profesional
  • Responsive móvil
  • Panel de administración
  • Base de datos propia

Pro

$100
  • Sitio multipágina
  • Animaciones y efectos
  • Galería de imágenes
  • Formularios avanzados
  • Customizer completo

Premium

$200
  • Sitio completo escalable
  • SEO optimizado
  • Panel admin avanzado
  • Integraciones
  • Soporte prioritario

Contacto

Email

contacto@pagebuilder.com

Teléfono

+54 9 11 2345 6789

WhatsApp

Chatea con nosotros

''' @app.route('/') def home(): # Usar tu landing real EXACTA return render_template('landing_real.html') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': data = request.get_json() conn = sqlite3.connect(DB_PATH) c = conn.cursor() try: c.execute('INSERT INTO users (email, password, plan, rubro) VALUES (?, ?, ?, ?)', (data['email'], generate_password_hash(data['password']), data.get('plan', 'base'), data.get('rubro', 'gimnasio'))) user_id = c.lastrowid conn.commit() session['user_id'] = user_id return jsonify({'success': True, 'user_id': user_id}) except: return jsonify({'error': 'Email existe'}), 400 finally: conn.close() return render_template_string(''' Registro

Registro

''') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': data = request.get_json() conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT id, password FROM users WHERE email = ?', (data['email'],)) user = c.fetchone() conn.close() if user and check_password_hash(user[1], data['password']): session['user_id'] = user[0] return jsonify({'success': True}) return jsonify({'error': 'Credenciales inválidas'}), 401 return render_template_string(''' Login

Login

''') @app.route('/dashboard') def dashboard(): if 'user_id' not in session: return redirect('/login') conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT id, slug, status FROM sites WHERE user_id = ?', (session['user_id'],)) sites = c.fetchall() conn.close() sites_html = ''.join([f'

{s[1]}

Status: {s[2]}

Editar
' for s in sites]) return render_template_string(f''' Dashboard

📊 Dashboard

➕ Crear Sitio
{sites_html if sites else '

No tienes sitios. Crear uno

'} ''') @app.route('/create', methods=['GET', 'POST']) def create(): if 'user_id' not in session: return redirect('/login') if request.method == 'POST': data = request.get_json() conn = sqlite3.connect(DB_PATH) c = conn.cursor() content = json.dumps({ 'site_name': data.get('site_name', 'Mi Sitio'), 'hero_title': data.get('hero_title', 'Bienvenido'), 'colors': {'primary': '#ff4d4d', 'secondary': '#1a1a1a'} }) c.execute('INSERT INTO sites (user_id, slug, content) VALUES (?, ?, ?)', (session['user_id'], data['slug'], content)) site_id = c.lastrowid conn.commit() conn.close() return jsonify({'success': True, 'site_id': site_id}) return render_template_string(''' Crear Sitio

➕ Crear Sitio

''') @app.route('/customizer/') def customizer(site_id): if 'user_id' not in session: return redirect('/login') conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT content FROM sites WHERE id = ? AND user_id = ?', (site_id, session['user_id'])) site = c.fetchone() conn.close() if not site: return "No encontrado", 404 content = json.loads(site[0]) return render_template_string(f''' Customizer

{content.get('hero_title', 'Título')}

''') @app.route('/api/save/', methods=['POST']) def save(site_id): if 'user_id' not in session: return jsonify({'error': 'No autorizado'}), 401 data = request.get_json() conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('UPDATE sites SET content = ? WHERE id = ? AND user_id = ?', (json.dumps(data['content']), site_id, session['user_id'])) conn.commit() conn.close() return jsonify({'success': True}) @app.route('/api/submit/', methods=['POST']) def submit(site_id): if 'user_id' not in session: return jsonify({'error': 'No autorizado'}), 401 conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('UPDATE sites SET status = ? WHERE id = ? AND user_id = ?', ('pending', site_id, session['user_id'])) conn.commit() conn.close() return jsonify({'success': True}) @app.route('/admin') def admin(): conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT id, slug, status FROM sites WHERE status = ?', ('pending',)) requests = c.fetchall() c.execute('SELECT id, slug, status FROM sites') sites = c.fetchall() conn.close() return render_template_string(f''' Admin

🔧 Admin

Solicitudes Pendientes

{''.join([f'' for r in requests])}
IDSlugAcción
{r[0]}{r[1]}

Todos los Sitios

{''.join([f'' for s in sites])}
IDSlugStatus
{s[0]}{s[1]}{s[2]}
''') @app.route('/api/approve/', methods=['POST']) def approve(site_id): conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('UPDATE sites SET status = ? WHERE id = ?', ('published', site_id)) conn.commit() conn.close() return jsonify({'success': True}) @app.route('/site/') def site(slug): conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT content FROM sites WHERE slug = ? AND status = ?', (slug, 'published')) site = c.fetchone() conn.close() if not site: return "Sitio no encontrado", 404 content = json.loads(site[0]) return render_template_string(f''' {content.get('site_name', 'Sitio')}

{content.get('hero_title', 'Título')}

{content.get('site_name', '')}

''') if __name__ == '__main__': print("🚀 Demo SaaS SIMPLE iniciado") print("📍 http://localhost:5001") app.run(debug=True, host='0.0.0.0', port=5001)