EDITOR / Sin cambios
PERMISO DE INVITADOS
Espacio abierto: Cualquiera con el enlace puede leer y editar esta nota; no hace falta PIN ni cuenta.
H1 H2 H3
Actualizado
Comienza con un Prompt de IA

Esta nota todavía no tiene un módulo interactivo incorporado.

+ Añadir otro módulo

xt-brand-600 dark:text-brand-100">C
Calendario
Fechas y entregas integradas
ADMINISTRADOR

Consola de Control y Widgets

Módulos Activos
Módulos Interactivos
Encuestas, Exámenes y Tareas visibles
Cuadernos y Espacios
Navegación lateral de carpetas
Chat lateral contextual
Permitir conversación en tiempo real
Progreso de Alumnos
Monitor de avance en tiempo real
Apariencia y Estilo
Instrumental Académico
Serif editorial, papel crema, verde bosque
Minimalismo Arquitectónico
Playfair / Sans, tonos neutros claros

Arquitectura PHP + Fragmentación JSON (/data/notes/nota_[id].json)

Código optimizado para tu servidor PHP local con bloqueo exclusivo LOCK_EX.

// 1. Archivo PHP local Backend (api.php)
<?php
// api.php — CharlsNote+ Server Handler
header('Content-Type: application/json');

$action = $_GET['action'] ?? '';
$notesDir = __DIR__ . '/data/notes/';
$uploadsDir = __DIR__ . '/uploads/';

if (!is_dir($notesDir)) mkdir($notesDir, 0755, true);
if (!is_dir($uploadsDir)) mkdir($uploadsDir, 0755, true);

// OBTENER NOTA INDIVIDUAL (Carga instantánea por ID)
if ($action === 'get_note') {
    $noteId = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['id'] ?? '');
    $filePath = $notesDir . 'nota_' . $noteId . '.json';
    
    if (file_exists($filePath)) {
        echo file_get_contents($filePath);
    } else {
        echo json_encode(['error' => 'Nota no encontrada']);
    }
    exit;
}

// GUARDAR NOTA INDIVIDUAL CON BLOQUEO EXCLUSIVO (Evita colisiones)
if ($action === 'save_note') {
    $input = json_decode(file_get_contents('php://input'), true);
    if (!$input || !isset($input['id'])) {
        echo json_encode(['success' => false, 'error' => 'ID inválido']);
        exit;
    }

    $noteId = preg_replace('/[^a-zA-Z0-9_-]/', '', $input['id']);
    $filePath = $notesDir . 'nota_' . $noteId . '.json';
    
    $jsonData = json_encode($input, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    
    // Escritura atómica con LOCK_EX
    $fp = fopen($filePath, 'w');
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, $jsonData);
        fflush($fp);
        flock($fp, LOCK_UN);
        fclose($fp);
        echo json_encode(['success' => true, 'path' => '/data/notes/nota_' . $noteId . '.json']);
    } else {
        echo json_encode(['success' => false, 'error' => 'Error de bloqueo de archivo']);
    }
    exit;
}
?>
// 2. Ejemplo de fragmento JSON generado (/data/notes/nota_1.json)