Una plataforma moderna tipo Udemy para la creación y gestión de cursos online
- Descripción
- Características Principales
- Tecnologías Utilizadas
- Estructura del Proyecto
- Instalación
- Configuración
- Uso
- Seguridad
- Despliegue
- Solución de Problemas
- Contribuir
- Licencia
EduFlow es una plataforma de aprendizaje en línea profesional diseñada para educadores que desean crear, gestionar y publicar cursos online. Inspirada en plataformas como Udemy, EduFlow ofrece una experiencia intuitiva y completa para la creación de contenido educativo estructurado en módulos y lecciones.
La plataforma permite a los docentes:
- Crear cursos con estructura modular (módulos → lecciones)
- Subir contenido multimedia (videos MP4 y documentos PDF)
- Organizar contenido mediante drag & drop
- Previsualizar cursos antes de publicarlos
- Gestionar múltiples cursos desde un dashboard centralizado
- Autenticación completa con Supabase Auth
- Sistema de roles: Docente, Estudiante, Coordinador
- Control de acceso: Solo docentes pueden crear y editar cursos
- Protección de contraseñas comprometidas (opcional)
- Creación de cursos con información completa (título, descripción, categoría, imagen)
- Estructura modular: Organiza contenido en módulos y lecciones
- Drag & Drop: Reordena módulos y lecciones de forma intuitiva
- Estados de publicación: Borrador o Publicado
- Vista previa: Visualiza el curso desde la perspectiva del estudiante
- Subida de imágenes para portadas de cursos (Supabase Storage)
- Soporte multimedia: Videos MP4 y documentos PDF
- Barra de progreso en tiempo real durante la subida
- Vista previa de contenido integrada en el editor
- Gestión de archivos: Eliminación y reemplazo de contenido
- Diseño moderno con Tailwind CSS
- Modo oscuro integrado
- Responsive design para todos los dispositivos
- Animaciones fluidas con Framer Motion
- Notificaciones toast para feedback inmediato
- UX optimizada con estados de carga y errores
- Row Level Security (RLS) en todas las tablas
- Políticas de acceso basadas en roles y propiedad
- Funciones de base de datos con
SECURITY DEFINERysearch_pathfijo - Validación de tipos con TypeScript
- Protección contra vulnerabilidades SQL injection
- React 18.2 - Biblioteca de UI
- TypeScript 5.4 - Tipado estático
- Vite 5.3 - Build tool y dev server
- Tailwind CSS 3.4 - Framework CSS utility-first
- Framer Motion 11.2 - Animaciones
- React Beautiful DnD 13.1 - Drag & Drop
- React Hot Toast 2.4 - Notificaciones
- Supabase - Backend as a Service
- PostgreSQL - Base de datos relacional
- Supabase Auth - Autenticación y autorización
- Supabase Storage - Almacenamiento de archivos
- Row Level Security (RLS) - Seguridad a nivel de fila
- PostCSS 8.4 - Procesamiento CSS
- Autoprefixer 10.4 - Compatibilidad CSS
- UUID 9.0 - Generación de IDs únicos
- Netlify - Hosting y CI/CD
- Node.js 18+ - Runtime de JavaScript
EduFlow/
├── components/ # Componentes React
│ ├── Auth.tsx # Componente de autenticación (login/registro)
│ ├── CourseEditor.tsx # Editor completo de cursos
│ ├── CoursePreview.tsx # Vista previa del curso
│ └── icons.tsx # Iconos SVG personalizados
│
├── lib/ # Utilidades y configuraciones
│ └── supabaseClient.ts # Cliente configurado de Supabase
│
├── supabase/
│ └── migrations/ # Migraciones SQL de la base de datos
│ ├── 20250101000000_initial_schema.sql
│ ├── 20250101000001_fix_search_path.sql
│ ├── 20250101000002_harden_functions_and_auth.sql
│ ├── 20250101000003_finalize_schema_and_dnd.sql
│ ├── 20250101000005_atomic_course_save.sql
│ ├── 20250101000011_final_fixes_and_architecture.sql
│ └── 20250101000012_fix_null_content_handling.sql
│
├── App.tsx # Componente principal de la aplicación
├── index.tsx # Punto de entrada de la aplicación
├── types.ts # Definiciones de tipos TypeScript
├── index.html # Template HTML
├── index.css # Estilos globales
│
├── vite.config.ts # Configuración de Vite
├── tailwind.config.js # Configuración de Tailwind CSS
├── postcss.config.js # Configuración de PostCSS
├── tsconfig.json # Configuración de TypeScript
├── netlify.toml # Configuración de despliegue en Netlify
├── package.json # Dependencias y scripts del proyecto
└── README.md # Este archivo
App.tsx: Componente raíz que gestiona el estado global, autenticación, y navegación entre vistas (Dashboard, Editor, Preview)Auth.tsx: Maneja el registro e inicio de sesión de usuarios con validación de rolesCourseEditor.tsx: Editor completo con funcionalidades de drag & drop, subida de archivos, y gestión de módulos/leccionesCoursePreview.tsx: Vista previa del curso desde la perspectiva del estudiantesupabaseClient.ts: Cliente singleton de Supabase configurado con variables de entorno
- Node.js 18 o superior
- npm o yarn
- Una cuenta de Supabase (gratuita en supabase.com)
- Un proyecto de Supabase configurado
git clone https://github.com/tu-usuario/EduFlow.git
cd EduFlownpm install
# o
yarn installCrea un archivo .env en la raíz del proyecto:
VITE_SUPABASE_URL=tu_url_de_supabase
VITE_SUPABASE_ANON_KEY=tu_clave_anon_de_supabaseCómo obtener las credenciales:
- Ve a tu proyecto en Supabase Dashboard
- Navega a Settings → API
- Copia la Project URL y la anon/public key
- Abre el SQL Editor en tu proyecto de Supabase
- Ejecuta las migraciones en orden cronológico:
-- Ejecuta cada migración una por una, en este orden:
1. supabase/migrations/20250101000000_initial_schema.sql
2. supabase/migrations/20250101000001_fix_search_path.sql
3. supabase/migrations/20250101000002_harden_functions_and_auth.sql
4. supabase/migrations/20250101000003_finalize_schema_and_dnd.sql
5. supabase/migrations/20250101000005_atomic_course_save.sql
6. supabase/migrations/20250101000011_final_fixes_and_architecture.sql
7. supabase/migrations/20250101000012_fix_null_content_handling.sqlLos buckets se crean automáticamente con la primera migración. Verifica que existan:
- Ve a Storage en tu dashboard de Supabase
- Verifica que existan estos buckets públicos:
course-images- Para imágenes de portada de cursoslesson-files- Para videos MP4 y PDFs de lecciones
- Ve a Authentication → Settings en Supabase
- Habilita Leaked Password Protection para mayor seguridad
- Al abrir la aplicación, verás la pantalla de autenticación
- Para registrarse:
- Haz clic en "Regístrate"
- Ingresa tu email y contraseña
- Selecciona tu rol (Docente, Estudiante o Coordinador)
⚠️ Solo usuarios con rol "Docente" pueden crear y editar cursos
- Verifica tu email si la verificación está habilitada en Supabase
- Accede al Dashboard: Una vez autenticado como Docente, verás tu dashboard
- Crear nuevo curso: Haz clic en "Crear Nuevo Curso"
- Completa la información básica:
- Título del curso
- Descripción
- Categoría
- Imagen de portada (opcional, arrastra y suelta o haz clic para seleccionar)
- Agregar módulos: Haz clic en "Agregar Módulo" y dale un título
- Agregar lecciones: Dentro de cada módulo, haz clic en "Agregar Lección"
- Subir contenido:
- Para cada lección, puedes subir un archivo (MP4 para videos o PDF)
- Observa la barra de progreso durante la subida
- Puedes eliminar o reemplazar archivos si es necesario
- Reorganizar contenido: Usa drag & drop para reordenar módulos y lecciones
- Guardar cambios: Haz clic en "Guardar Cambios" para persistir todo en Supabase
- Haz clic en "Vista Previa" en el editor para ver cómo se verá el curso para los estudiantes
- Navega entre módulos y lecciones desde la barra lateral
- Visualiza videos y documentos directamente en el navegador
- En el editor, activa el toggle "Publicado" para hacer el curso visible
- Los cursos publicados pueden ser vistos por estudiantes (si implementas esa funcionalidad)
- Los cursos en borrador solo son visibles para el docente propietario
- Editar: Haz clic en el icono de editar en la tarjeta del curso
- Eliminar: Haz clic en el icono de eliminar (se requiere confirmación)
- Ver estado: El estado (Publicado/Borrador) se muestra en cada tarjeta
EduFlow implementa múltiples capas de seguridad:
- Habilitado en todas las tablas:
profiles,courses,modules,lessons - Políticas de acceso:
- Los docentes solo pueden ver y editar sus propios cursos
- Los estudiantes solo pueden ver cursos publicados
- Los usuarios solo pueden modificar su propio perfil
SECURITY DEFINER: Funciones ejecutadas con permisos elevados pero controladossearch_pathfijo: Previene vulnerabilidades de inyección SQL- Validación de entrada: Todas las entradas son validadas antes de procesarse
- Supabase Auth: Sistema robusto de autenticación
- Tokens JWT: Manejo seguro de sesiones
- Protección de contraseñas: Opción de protección contra contraseñas comprometidas
- TypeScript: Validación de tipos en tiempo de compilación
- Validación de formularios: Validación tanto en cliente como servidor
- Sanitización: Contenido sanitizado antes de mostrar
EduFlow está configurado para desplegarse fácilmente en Netlify:
- Conecta tu repositorio a Netlify
- Configura las variables de entorno en Netlify:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Netlify detectará automáticamente la configuración desde
netlify.toml - El despliegue se realizará automáticamente en cada push a la rama principal
El archivo netlify.toml ya está configurado con:
- Comando de build:
npm install && npm run build - Directorio de publicación:
dist - Node.js versión: 18
Solución:
- Verifica que el archivo
.envexiste en la raíz del proyecto - Asegúrate de que las variables no tengan comillas ni espacios alrededor del
= - Reinicia el servidor de desarrollo después de crear/modificar
.env
Solución:
- Verifica que los buckets de Storage estén creados y sean públicos
- Revisa los límites de tamaño en Supabase:
- Imágenes: 5MB por defecto
- Archivos de lecciones: 512MB por defecto
- Verifica los permisos de Storage en Supabase
Solución:
- Verifica que todas las migraciones se hayan ejecutado correctamente
- Revisa la consola del navegador para errores específicos
- Asegúrate de estar autenticado como Docente
- Verifica que la función RPC
save_course_with_childrenexiste en Supabase
Solución:
- Ejecuta la migración
20250101000012_fix_null_content_handling.sql - Verifica en el SQL Editor de Supabase que la función existe
- Revisa los logs de Supabase para errores específicos
Solución:
- Asegúrate de que
react-beautiful-dndesté correctamente instalado - Verifica que los IDs de módulos y lecciones sean únicos
- Revisa la consola del navegador para errores de JavaScript
Las contribuciones son bienvenidas. Para contribuir:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
- Sigue las convenciones de código existentes
- Añade tests para nuevas funcionalidades
- Actualiza la documentación según sea necesario
- Asegúrate de que el código pase los linters
Este proyecto es de código abierto y está disponible bajo la Licencia MIT.
Desarrollado con ❤️ para la comunidad educativa.
- 🌐 Demo en Vivo
- 📚 Documentación de Supabase
- ⚛️ Documentación de React
- 🎨 Documentación de Tailwind CSS
- ⚡ Documentación de Vite
⭐ Si este proyecto te resulta útil, considera darle una estrella en GitHub ⭐
Hecho con ❤️ usando React, TypeScript y Supabase