Portal Ciencias de la Salud | Automata
secciones (8)
$ cd .. // volver a proyectos
automata@latam: ~/proyectos/education_portal
CASO DE USO · slug: education_portal ·2026 · 2 min read · 489 words

> Portal Ciencias de la Salud

// Portal de colaboracion para estudiantes de ciencias de la salud: biblioteca de recursos, grupos de estudio, foros, calendario, mensajeria y busqueda global en una app Laravel + Livewire.

Laravel 12Livewire 3Flux UIMySQL 8FortifyTailwind 4
forks last commit
Portal Ciencias de la Salud
▸ rol
Full-stack · Laravel · Livewire
▸ equipo
Solo
▸ status
ready
// section 01 · descubrimiento

$ cat ./descubrimiento.md

▸ descripcion

Un portal unico para estudiantes universitarios de ciencias de la salud (Medicina, Enfermeria, Odontologia, Fisioterapia) que reemplaza la fragmentacion entre WhatsApp + Drive + email + Google Calendar por un solo lugar para encontrar recursos, armar grupos de estudio, discutir en foros, seguir noticias y el calendario academico, y mensajear con compañeros. Los recursos subidos pasan por aprobacion para que la biblioteca no se vuelva un volcadero. El componente GlobalSearch cross-content es el punto de entrada diario.

▸ problema

Materiales, grupos de estudio y anuncios se dispersan en al menos cuatro herramientas distintas por cohorte. Los estudiantes pierden el link al PDF de la semana pasada, se les pasa la fecha del examen y reformulan las mismas preguntas. La solucion no son mejores carpetas de Drive — es una sola herramienta que entiende cursos, miembros y fechas.

▸ audiencia

Estudiantes de ciencias de la salud (primario). Coordinadores academicos y la institucion (secundario).

// section 03 · arquitectura

$ cat ./arquitectura.md

// section 04 · infraestructura

$ cat ./infraestructura.md

▸ servicios
provider: Laravel + MySQL + Vite
  • App Laravel 12 (Livewire + Flux UI)
  • MySQL 8 (resources, forums, study_groups, events, news, ratings)
  • Storage de archivos para materiales subidos (con gate de aprobacion)
  • Laravel Fortify (auth + 2FA)
  • Vite dev server
  • Scheduler de Laravel (recordatorios de eventos, jobs de digest)
// section 05 · implementacion

$ cat ./implementacion.md

▸ frontend
  • · Livewire 3 + Volt 1.7
  • · Flux UI
  • · Tailwind CSS 4
  • · Alpine.js
  • · Vite
▸ backend
  • · Laravel 12
  • · PHP 8.2
  • · Laravel Fortify 1.30
▸ datos
  • · MySQL
  • · Eloquent
  • · Columnas JSON para payloads de ratings/votos
  • · Storage en disco por recurso
▸ devops
  • · Solo dev local (sin CI/CD aun)
// section 06 · desafios tecnicos

$ cat ./challenges/*.md

// 1 problemas tecnicos resueltos

01 / 01
challenge-01.md · uploads · moderacion · busqueda
▸ problema

Permitir que los estudiantes suban materiales sin que la biblioteca se vuelva un cajon de sastre ni se expongan paths del server.

restriccion: Todos los listados, busquedas y endpoints de descarga deben respetar el gate is_approved. Path del archivo y nombre original se guardan por separado para que la URL publica nunca filtre la estructura de disco.

▸ enfoque

Resource tiene is_approved (default false), file_path (lado server, opaco) y file_name (solo display). Cada scope de lista/busqueda en Livewire agrega where('is_approved', true). El flujo de upload notifica a coordinadores, que aprueban con un click. La busqueda sobre titulo/descripcion/materia es un solo query con debounce de Livewire.

app/Livewire/Resources/ResourceList.php php
public function render()
{
    $resources = Resource::with('user')
        ->where('is_approved', true)
        ->when($this->search, function ($query) {
            $query->where(function ($q) {
                $q->where('title',       'like', '%' . $this->search . '%')
                  ->orWhere('description','like', '%' . $this->search . '%')
                  ->orWhere('subject',    'like', '%' . $this->search . '%');
            });
        })
        ->latest()
        ->paginate(20);

    return view('livewire.resources.resource-list', compact('resources'));
}
// section 07 · testing & ci

$ cat ./testing.md

▸ estrategia

Pest 4 sobre SQLite in-memory. El foco esta en auth + flujo de aprobacion + busqueda global.

▸ herramientas
Pest 4.3PHPUnitPest Laravel plugin
// section 09 · resultados

$ cat ./resultados.md

01 /
10
modelos Eloquent (Resource, Forum, ForumTopic, ForumReply, Event, News, StudyGroup, StudentProfile, ResourceRating, User)
02 /
17
componentes Livewire (listas + detalle + GlobalSearch + LiveNotifications)
03 /
11
migrations
04 /
2
seeders (PortalEducativoSeeder con data de ejemplo completa)
▸ outcomes

MVP entregado: auth, perfiles, biblioteca de recursos con aprobacion, foros con temas/respuestas, grupos de estudio, calendario, feed de noticias, mensajeria y GlobalSearch funcionan. Listo para piloto institucional. Roadmap: mensajeria en tiempo real, push notifications, wrapper mobile, integracion LMS, recomendaciones.

// relacionados

$ grep -l "tech" ./projects/*

// proyectos que comparten parte del stack

// siguiente paso

$ automata deploy --tu-operacion

// Conversemos sobre como adaptamos esto a tu caso.

./contactar.sh