Plataforma web educativa diseñada para ayudar a estudiantes de 2º de Bachillerato en su preparación para la Prueba de Acceso a la Universidad (PAU) en España.
¿Eres estudiante o quieres visitar la página? Accede directamente aquí:
PAUtopia es una aplicación web completa que centraliza recursos educativos, lecturas obligatorias, apuntes, herramientas de estudio y sistemas de evaluación. Incluye funcionalidades como gestión de lecturas con preguntas de comprensión, materiales de apoyo organizados por asignaturas, sistema de ranking de estudiantes, y un sistema de sugerencias integrado con Discord.
Creado por Rexy en colaboración con La Tiza de Rosa.
- Gestión de Lecturas: Sistema completo para administrar obras literarias con preguntas de comprensión y materiales adicionales
- Apuntes por Asignatura: Recursos organizados para Biología, Tecnología, Matemáticas, Filosofía, Lengua, Inglés, Historia, Física, Química y Cultura Audiovisual
- Sistema de Exámenes: Herramienta interactiva para evaluar conocimientos disponible para Historia de España y Cultura Audiovisual, con modo quiz tipo test y modo repaso con buscador y filtros
- Apps Educativas: Calculadoras y herramientas auxiliares (VigaCalc, WaveCalc, RLCCalc, Conceptuando la Historia)
- Ranking de Estudiantes: Sistema de clasificación basado en puntos
- Biblioteca de Frases: Colección de citas memorables de profesores
- Sistema de Sugerencias: Integrado con webhook de Discord para recibir feedback de usuarios
- Contador de Visitas: Registro de estudiantes que han utilizado la plataforma
Este proyecto nació para ayudar a estudiantes de 2º de Bachillerato, y la idea es que siga vivo y creciendo más allá de su creador original.
Si estás preparando tu PAU y quieres contribuir, ya sea añadiendo apuntes de tu comunidad, nuevas lecturas, preguntas, recursos, o mejoras técnicas — eres más que bienvenido/a a hacerlo. Este repositorio es tuyo también.
El objetivo es simple: que cada generación deje el proyecto un poco mejor de como lo encontró, para que los que vengan detrás lo tengan más fácil.
Este proyecto es de uso libre bajo las siguientes condiciones:
- Puedes ver, clonar y modificar el código libremente para uso personal o educativo.
- Puedes usar partes del proyecto como referencia o aprendizaje sin restricciones.
- Si quieres publicar una versión modificada o derivada de este proyecto, te pedimos que en lugar de hacerlo por separado, abras un Pull Request en este repositorio. Así el proyecto original se beneficia de tus mejoras, y tú recibes crédito oficial por tu contribución.
- No está permitido redistribuir este proyecto como propio sin reconocer su origen.
En resumen: úsalo, apréndelo, mejóralo, pero si lo publicas, hazlo aquí y te damos los créditos que mereces.
¿Quieres mejorar PAUtopia? Ya seas desarrollador, estudiante con apuntes útiles o simplemente alguien con buenas ideas, hay sitio para ti.
- Haz fork del repositorio
- Crea una rama para tu aportación (
git checkout -b feature/MiAportacion) - Haz commit de tus cambios (
git commit -m 'Añadir [descripción de tu aportación]') - Haz push a tu rama (
git push origin feature/MiAportacion) - Abre un Pull Request describiendo qué has añadido o mejorado
- Nuevos apuntes o recursos por asignatura
- Lecturas obligatorias de otras comunidades autónomas
- Preguntas de comprensión para las lecturas existentes
- Corrección de errores o bugs
- Mejoras de funcionalidad o diseño
- Adaptaciones para otras comunidades autónomas
Todos los contribuidores serán reconocidos en la sección de créditos del proyecto.
| Rol | Persona |
|---|---|
| Creador y desarrollador principal | Rexy |
| Colaboración en contenidos | La Tiza de Rosa |
| Primera contribuidora externa — Cultura Audiovisual | Haiko |
| Contribuidor de Filosofía | Aritz |
¿Has contribuido al proyecto? Tu nombre estará aquí.
- Node.js (versión 14 o superior)
- npm (incluido con Node.js)
- Navegador web moderno
git clone https://github.com/Rexyto/pautopia.git
cd pautopianpm installCrear un archivo .env en la raíz del proyecto con el siguiente contenido:
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/TU_WEBHOOK_ID/TU_WEBHOOK_TOKENPara obtener la URL del webhook de Discord:
- Ve a tu servidor de Discord
- Configuración del Canal > Integraciones > Webhooks
- Crear webhook y copiar la URL
Crear la carpeta data en la raíz del proyecto:
mkdir dataDentro de data, crear los siguientes archivos JSON (consultar la sección "Estructura de Datos" para ver el contenido de cada archivo):
Archivos obligatorios:
lecturas.jsonpreguntas_1.json,preguntas_2.json,preguntas_3.json,preguntas_4.jsonmateriales_1.json,materiales_2.json,materiales_3.json,materiales_4.jsonranking.jsonvisitas.jsonconceptos.jsonconceptos_cultura_audiovisual.jsonapps-versions.json
Archivo generado automáticamente:
sugerencias.json(se crea al recibir la primera sugerencia)
Asegurarse de que la carpeta public contenga:
logo.png- Logo de la aplicaciónrexy.png- Imagen del creadorVigaCalc.pngyVigaCalc.apk- App VigaCalcConceptuando_la_historia.pngyConceptuando_la_historia.apk- App Conceptuando- Archivos PDF de las lecturas mencionados en
materiales_{id}.json - PDFs de Cultura Audiovisual (ver tabla de nombres en la sección correspondiente)
Base de datos de conceptos históricos para el sistema de exámenes tipo test de Historia de España.
{
"conceptos": [
{
"categoria": "Político",
"nombre": "Absolutismo",
"definicion": "Sistema de gobierno en el que el monarca concentra todos los poderes del Estado sin limitación legal."
}
]
}Base de datos de conceptos de Cultura Audiovisual. Contiene 70 conceptos repartidos en 5 categorías: Historia de la Fotografía, Imagen Fija y Lenguajes, Teoría del Color, Leyes de la Gestalt y Publicidad.
{
"conceptos": [
{
"categoria": "Historia de la Fotografía",
"nombre": "Daguerrotipo",
"definicion": "Proceso fotográfico presentado por Louis Daguerre en 1839..."
}
]
}Almacena información sobre las obras literarias obligatorias de PAU.
Campos:
id: Identificador único de la lectura (string)titulo: Título de la obra (string)autor: Nombre del autor (string)evaluacion: Evaluación correspondiente (string, opcional)temas: Array de temas principales de la obra (array, opcional)descripcion: Descripción breve de la obra (string, opcional)
Ejemplo:
[
{
"id": "1",
"titulo": "Campos de Castilla",
"autor": "Antonio Machado",
"evaluacion": "Primera evaluación",
"temas": [
"El simbolismo en la obra Campos de Castilla",
"Análisis de los temas principales",
"Castilla como visión crítica de España"
],
"descripcion": "Obra esencial de Antonio Machado que combina paisaje, simbolismo y reflexión social."
}
]Lecturas actuales en el sistema:
- Campos de Castilla - Antonio Machado
- Bodas de sangre - Federico García Lorca
- Entre visillos - Carmen Martín Gaite
- La Fundación - Antonio Buero Vallejo
Preguntas de comprensión para cada lectura. Crear un archivo por cada lectura usando su ID.
[
{
"id": "1",
"texto": "¿Qué simbolismo encontramos en Campos de Castilla?",
"respuesta": "El paisaje castellano funciona como símbolo del alma española...",
"lecturaId": "1"
}
]Materiales adicionales (videos, documentos, enlaces) para cada lectura.
[
{
"id": "1",
"titulo": "Biografía de Antonio Machado",
"grupo": "Contexto",
"enlace": "https://www.biografiasyvidas.com/biografia/m/machado_antonio.htm",
"descripcion": "Vida y obra del poeta",
"lecturaId": "1"
}
][
{ "nombre": "Julia", "puntos": 31 },
{ "nombre": "Antonio", "puntos": 31 }
]{ "total": 0 }{
"VigaCalc": { "app": "VigaCalc", "version": "1.0" },
"Conceptuando_la_historia": { "app": "Conceptuando_la_historia", "version": "1.0" }
}Los archivos deben colocarse en public/ con los siguientes nombres exactos:
| Contenido | Nombre del archivo |
|---|---|
| Historia de la Fotografía | cultura-audiovisual-historia-fotografia.pdf |
| La Imagen Fija y sus Lenguajes | cultura-audiovisual-imagen-fija-lenguajes.pdf |
| Leyes de la Gestalt | cultura-audiovisual-leyes-gestalt.pdf |
| Teoría del Color | cultura-audiovisual-teoria-color.pdf |
| La Publicidad | cultura-audiovisual-publicidad.pdf |
npm run devLa aplicación estará disponible en: http://localhost:5173
npm run build
npm startEl servidor Express se ejecutará en el puerto 5555. Acceder a: http://localhost:5555
pautopia/
├── src/
│ ├── api.ts
│ ├── types.ts
│ ├── main.tsx
│ ├── App.tsx
│ ├── App.css
│ ├── index.css
│ ├── components/
│ │ ├── Accordion.tsx
│ │ ├── Layout.tsx
│ │ ├── Navbar.tsx
│ │ ├── SugerenciasModal.tsx
│ │ └── UnavailableModal.tsx
│ ├── hooks/
│ │ └── useDownloadFile.ts
│ ├── pages/
│ │ ├── Home.tsx
│ │ ├── Lecturas.tsx
│ │ ├── Frases.tsx
│ │ ├── Ranking.tsx
│ │ ├── Creditos.tsx
│ │ ├── Apps.tsx
│ │ ├── VigaCalc.tsx
│ │ ├── WaveCalc.tsx
│ │ ├── ConceptuandoHistoria.tsx
│ │ ├── rlccalc.tsx
│ │ ├── apuntes/
│ │ │ ├── ApuntesIndex.tsx
│ │ │ ├── Biologia.tsx
│ │ │ ├── Tecnologia.tsx
│ │ │ ├── Mates.tsx
│ │ │ ├── Filosofia.tsx
│ │ │ ├── Lengua.tsx
│ │ │ ├── Ingles.tsx
│ │ │ ├── Historia.tsx
│ │ │ ├── Fisica.tsx
│ │ │ ├── Quimica.tsx
│ │ │ └── CulturaAudiovisual.tsx
│ │ └── examinate/
│ │ ├── ExaminateIndex.tsx
│ │ ├── Historia.tsx
│ │ ├── Conceptos.tsx
│ │ ├── CulturaAudiovisual.tsx
│ │ ├── ConceptosCulturaAudiovisual.tsx
│ │ ├── RepasarConceptosHistoria.tsx
│ │ └── RepasarConceptosCulturaAudiovisual.tsx
│ └── styles/
│ ├── apuntes.css
│ ├── repasar.css
│ └── sugerencias.css
├── public/
│ ├── logo.png
│ ├── rexy.png
│ ├── VigaCalc.png / VigaCalc.apk
│ ├── Conceptuando_la_historia.png / .apk
│ ├── cultura-audiovisual-historia-fotografia.pdf
│ ├── cultura-audiovisual-imagen-fija-lenguajes.pdf
│ ├── cultura-audiovisual-leyes-gestalt.pdf
│ ├── cultura-audiovisual-teoria-color.pdf
│ ├── cultura-audiovisual-publicidad.pdf
│ └── *.pdf (lecturas)
├── data/
│ ├── lecturas.json
│ ├── conceptos.json
│ ├── conceptos_cultura_audiovisual.json
│ ├── ranking.json
│ ├── visitas.json
│ ├── apps-versions.json
│ ├── preguntas_1.json ... preguntas_4.json
│ ├── materiales_1.json ... materiales_4.json
│ └── sugerencias.json # Se crea automáticamente
├── server.js
├── package.json
├── tsconfig.json
├── vite.config.ts
├── index.html
├── .env # No incluido en el repositorio
└── README.md
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/lecturas |
Obtiene todas las lecturas |
POST |
/api/lecturas |
Crea una nueva lectura |
PUT |
/api/lecturas/:id |
Actualiza una lectura |
DELETE |
/api/lecturas/:id |
Elimina una lectura |
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/preguntas/:lecturaId |
Obtiene las preguntas de una lectura |
POST |
/api/preguntas/:lecturaId |
Crea una nueva pregunta |
DELETE |
/api/preguntas/:lecturaId/:id |
Elimina una pregunta |
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/materiales/:lecturaId |
Obtiene los materiales de una lectura |
POST |
/api/materiales/:lecturaId |
Crea un nuevo material |
DELETE |
/api/materiales/:lecturaId/:id |
Elimina un material |
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/ranking |
Clasificación de estudiantes |
GET |
/api/visitas |
Contador de visitas |
POST |
/api/visitas |
Registra una nueva visita |
POST |
/api/sugerencias |
Envía una sugerencia |
GET |
/apps/version.json |
Versiones de las apps |
GET |
/health |
Estado del servidor |
- Formulario modal accesible desde un botón flotante en la página principal
- Rate limiting: máximo 3 sugerencias cada 5 minutos por IP
- Sanitización de entrada para prevenir ataques
- Integración con Discord mediante webhook para notificaciones en tiempo real
- Almacenamiento local de respaldo en
sugerencias.json
DISCORD_WEBHOOK_URL=url_del_webhook_de_discord
NODE_ENV=development- Cookies de sesión HTTP-only con SameSite=lax
- Sanitización de entrada en el sistema de sugerencias
- Rate limiting para prevenir spam
- Validación de datos en servidor
- Variables sensibles en
.env(no incluido en el repositorio)
- Almacenamiento basado en archivos JSON (no escalable para grandes volúmenes)
- Sin sistema de autenticación de usuarios
- Sin base de datos relacional
- Rate limiting en memoria (se reinicia al reiniciar el servidor)