La Plataforma Educativa Personalizada adopta un diseño local-first: todos los datos se almacenan en un archivoDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/carlosgomezc7/plataforma_aprendizaje/llms.txt
Use this file to discover all available pages before exploring further.
db_local.json en el directorio del proyecto, sin necesidad de una conexión a internet, un servidor externo ni bibliotecas de terceros. MotorBaseDatos es la capa de persistencia que abstrae completamente las operaciones de lectura y escritura sobre ese archivo, exponiendo una API sencilla al resto de la aplicación. Al encapsular el acceso al disco en una sola clase, cualquier cambio futuro en el backend de almacenamiento (por ejemplo, migrar a SQLite o a una API REST) requiere modificar únicamente esta clase, sin tocar la lógica de estructuras de datos ni la interfaz gráfica.
Clase MotorBaseDatos
La clase se inicializa con la ruta del archivo de base de datos (por defecto "db_local.json") y define la estructura de datos predeterminada que se usará si el archivo no existe aún:
cargar_datos() al final, de modo que self.data siempre está disponible y poblado cuando la instancia queda lista para usar.
Inicialización automática
Sidb_local.json no existe en el momento en que se instancia MotorBaseDatos, el motor copia el catálogo predeterminado de cinco cursos a self.data y llama inmediatamente a guardar_datos(), creando el archivo en disco. Esto significa que la primera ejecución de la aplicación siempre genera un archivo funcional, sin pasos de configuración manual.
Si el archivo existe pero está malformado (JSON inválido, por ejemplo por una escritura interrumpida), cargar_datos() captura la excepción, imprime un mensaje informativo en la consola y carga los valores predeterminados en memoria para que la aplicación pueda continuar funcionando.
Operaciones
cargar_datos()
Lee el archivo indicado en self.archivo_db y deserializa su contenido JSON en self.data. Si el archivo no existe, usa self.default_db como fuente y lo persiste en disco. Si ocurre cualquier error de parseo, cae al mismo respaldo de datos predeterminados:
guardar_datos()
Serializa self.data completo de vuelta al archivo JSON, con sangría de 4 espacios para legibilidad humana y ensure_ascii=False para preservar caracteres acentuados y especiales del español:
obtener_cursos()
Retorna la lista completa de cursos almacenada en self.data["cursos"]. Si la clave no existe por algún motivo (archivo editado manualmente de forma incorrecta), retorna una lista vacía como valor seguro:
guardar_progreso(estudiante, modulo)
Agrega un registro de progreso al arreglo self.data["progresos"] y persiste inmediatamente los cambios en disco. Crea la clave "progresos" si no existía previamente:
Esquema JSON
El archivodb_local.json sigue siempre esta estructura de dos claves raíz:
| Campo | Tipo | Descripción |
|---|---|---|
cursos[].id | integer | Identificador numérico único del curso. Usado por la Búsqueda Binaria. |
cursos[].nombre | string | Nombre legible del curso mostrado en la interfaz. |
cursos[].relevancia | integer | Índice de relevancia (0–100). Quick Sort ordena por este campo de forma descendente. |
cursos[].dificultad | integer | Nivel de dificultad del curso (escala 1–10). |
progresos[].estudiante | string | Identificador del estudiante que completó el módulo. |
progresos[].modulo | string | Nombre del módulo completado, tal como se registró en la cola. |
Agregar cursos
Para extender el catálogo con nuevos cursos, instancia el motor, modificaself.data["cursos"] directamente y llama a guardar_datos():
db_local.json y estará disponible inmediatamente para Quick Sort y Búsqueda Binaria en la próxima ejecución de la aplicación. Asegúrate de que el campo id sea único para que la Búsqueda Binaria produzca resultados deterministas.
Para la referencia completa de la API de
MotorBaseDatos y la especificación formal del esquema, consulta: