Plataforma de apoyo completa para la gestión de propuestas de tesis, proyectos de título y seguimiento académico
- Capturas de Pantalla
- Descripción
- Stack Tecnológico Avanzado
- Arquitectura del Sistema
- Roles y Funcionalidades Detalladas
- Instalación y Despliegue
- Configuración Avanzada
- Documentación de API Completa
- Recursos Adicionales y Documentación
A continuación se muestran todas las vistas y flujos principales de la plataforma:
Acceso y Páginas Principales (Haz clic para expandir)
Gestión de Propuestas y Proyectos (Haz clic para expandir)
Asignaciones y Comisiones (Haz clic para expandir)
Administración y Calendario (Haz clic para expandir)
AcTitUBB es una aplicación web avanzada diseñada para el apoyo de la gestión académica en la Universidad del Bío-Bío. El sistema abarca desde la creación de propuestas de tesis hasta el seguimiento de hitos, calendario académico, y gestión de archivos, proporcionando una experiencia integral para estudiantes, profesores y administradores.
- Creación, edición y seguimiento completo de propuestas
- Estados de propuesta: Borrador, En Revisión, Aprobada, Rechazada
- Gestión avanzada de archivos con validaciones estrictas
- Sistema de comentarios bidireccional profesor-estudiante
- Definición y seguimiento de hitos por proyecto
- Entrega de archivos con validaciones automáticas
- Control de fechas límite y estados dinámicos
- Visualización de progreso en tiempo real
- Revisión y calificación por parte de profesores
- Gestión centralizada del calendario académico
- Fechas específicas por proyecto y globales
- Marcado de fechas como completadas
- Notificaciones automáticas de vencimientos
- Vista responsive para móviles y escritorio
- Autenticación JWT segura con blacklist
- Estudiantes: Dashboard personalizado, entrega de hitos, seguimiento
- Profesores: Revisión de entregas, gestión de cronogramas
- Administradores: Control total del sistema y asignaciones
- Estadísticas en tiempo real por rol
- Resumen de actividades pendientes
- Métricas de progreso visual
- Interfaz completamente responsive
| Tecnología | Versión | Propósito |
|---|---|---|
| Angular | 18.2+ | Framework principal SPA |
| TypeScript | 5.0+ | Tipado estático y desarrollo robusto |
| Angular Material | 18+ | Componentes UI consistentes |
| SCSS | Latest | Estilos avanzados con variables |
| Vite | Latest | Build tool ultra-rápido |
| Nginx | 1.21+ | Servidor web optimizado |
| Tecnología | Versión | Propósito |
|---|---|---|
| Node.js | 20+ | Runtime JavaScript del servidor |
| Express.js | 4.18+ | Framework web minimalista |
| MySQL2 | 3.6+ | Driver MySQL optimizado |
| JWT | 9.0+ | Autenticación segura |
| Multer | 1.4+ | Manejo de archivos |
| Nodemailer | 6.9+ | Sistema de emails |
| Tecnología | Versión | Propósito |
|---|---|---|
| MySQL | 8.0+ | Base de datos relacional |
| Docker | 24+ | Contenedorización |
| Docker Compose | 2.0+ | Orquestación de servicios |
graph TD
A[Estudiante / Profesor] -->|HTTPS| B(Nginx / Angular Frontend)
B -->|API REST| C{Node.js + Express Backend}
C -->|Validaciones| D[JWT / Middlewares]
D -->|Lectura/Escritura| E[(MySQL Database)]
C -->|Subida de Archivos| F[Uploads Storage]
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#dd0031,stroke:#333,stroke-width:2px,color:#fff
style C fill:#026e00,stroke:#333,stroke-width:2px,color:#fff
style E fill:#00758f,stroke:#333,stroke-width:2px,color:#fff
AcTitUBB/
├── backend/ # API REST con Node.js
│ ├── src/
│ │ ├── controllers/ # Controladores MVC
│ │ │ ├── admin.controller.js # Gestión administrativa
│ │ │ ├── calendario.controller.js # Fechas importantes
│ │ │ ├── login.controller.js # Autenticación
│ │ │ ├── project.controller.js # Proyectos y hitos
│ │ │ ├── propuesta.controller.js # Propuestas de tesis
│ │ │ └── role.controller.js # Gestión de roles
│ │ ├── services/ # Lógica de negocio
│ │ │ ├── email.service.js # Notificaciones por email
│ │ │ ├── project.service.js # Lógica de proyectos
│ │ │ ├── propuesta.service.js # Lógica de propuestas
│ │ │ └── RutVal.service.js # Validación RUT chileno
│ │ ├── models/ # Modelos de datos
│ │ │ ├── avance.model.js # Modelo de avances
│ │ │ ├── calendario.model.js # Modelo de fechas
│ │ │ ├── fecha-importante.model.js # Fechas importantes
│ │ │ ├── project.model.js # Modelo de proyectos
│ │ │ ├── propuesta.model.js # Modelo de propuestas
│ │ │ ├── role.model.js # Modelo de roles
│ │ │ └── user.model.js # Modelo de usuarios
│ │ ├── routes/ # Definición de endpoints
│ │ │ ├── admin.route.js # Rutas administrativas
│ │ │ ├── calendario.route.js # Rutas de calendario
│ │ │ ├── download.route.js # Descarga de archivos
│ │ │ ├── login.route.js # Rutas de autenticación
│ │ │ ├── project.route.js # Rutas de proyectos
│ │ │ ├── propuesta.routes.js # Rutas de propuestas
│ │ │ └── role.route.js # Rutas de roles
│ │ ├── middlewares/ # Middlewares personalizados
│ │ │ ├── blacklist.js # JWT blacklist
│ │ │ ├── uploader.js # Subida de archivos
│ │ │ └── verifySession.js # Verificación de sesión
│ │ ├── db/ # Base de datos
│ │ │ ├── connectionDB.js # Pool de conexiones
│ │ │ └── database.sql # Schema completo
│ │ └── index.js # Servidor principal
│ ├── uploads/ # Archivos del sistema
│ │ └── propuestas/ # Documentos de propuestas
│ ├── dockerfile # Imagen Docker backend
│ └── package.json # Dependencias Node.js
│
├── frontend/ # Aplicación Angular
│ ├── src/app/
│ │ ├── pages/ # Páginas principales
│ │ │ ├── estudiante/ # Módulo estudiante
│ │ │ │ └── home/ # Dashboard estudiante
│ │ │ ├── profesor/ # Módulo profesor
│ │ │ │ └── cronograma/ # Gestión de cronogramas
│ │ │ ├── admin/ # Panel administrativo
│ │ │ │ ├── asignaciones/ # Asignación profesor-estudiante
│ │ │ │ ├── gestion-calendario/ # Calendario global
│ │ │ │ └── gestion-profesores/ # Gestión de profesores
│ │ │ ├── propuestas/ # CRUD de propuestas
│ │ │ ├── login/ # Autenticación
│ │ │ └── register/ # Registro de usuarios
│ │ ├── services/ # Servicios Angular
│ │ │ └── api.ts # Cliente HTTP centralizado
│ │ ├── guards/ # Guards de seguridad
│ │ │ └── auth.guard.ts # Protección de rutas
│ │ ├── interceptors/ # Interceptors HTTP
│ │ │ └── auth.interceptor.ts # Inyección automática de JWT
│ │ └── components/ # Componentes reutilizables
│ │ └── calendar-modal/ # Modal de calendario
│ ├── public/ # Recursos estáticos
│ │ ├── Escudo_Universidad_del_Bío-Bío.png
│ │ └── favicon.ico
│ ├── dockerfile # Imagen Docker frontend
│ ├── nginx.conf # Configuración Nginx
│ ├── angular.json # Configuración Angular
│ ├── vite.config.ts # Configuración Vite
│ └── package.json # Dependencias Angular
│
├── mysql/ # Configuración MySQL
│ └── init.sql/ # Scripts de inicialización
├── docker-compose.yml # Orquestación completa
└── README.md # Documentación (este archivo)
- Vista general: Resumen de propuestas, hitos y fechas importantes
- Progreso visual: Indicadores de avance por proyecto
- Notificaciones: Alertas de vencimientos y actualizaciones
- Crear propuestas: Formulario completo con validaciones
- Adjuntar archivos: PDF, Word con validaciones de tamaño
- Seguimiento: Estados en tiempo real y comentarios
- Entrega de hitos: Subida de archivos con validaciones estrictas
- Control de fechas: Visualización de deadlines y tiempo restante
- Estados dinámicos: Pendiente, Entregado, En Revisión, Aprobado, Vencido
- Comentarios: Comunicación bidireccional con profesores
- Fechas importantes: Vista personalizada por proyecto
- Completar fechas: Marcado de hitos cumplidos
- Filtros avanzados: Por proyecto, estado, fecha
- Propuestas asignadas: Lista completa con filtros
- Estudiantes: Vista de todos los estudiantes asignados
- Estadísticas: Métricas de desempeño y progreso
- Evaluar entregas: Sistema de calificación integrado
- Feedback detallado: Comentarios estructurados
- Aprobación/Rechazo: Flujo de trabajo simplificado
- Seguimiento de progreso: Vista cronológica de avances
- Crear fechas específicas: Por estudiante o proyecto
- Definir hitos: Configuración de deliverables
- Notificaciones automáticas: Alertas de vencimientos
- Dashboard de seguimiento: Vista general de todos los proyectos
- CRUD completo: Crear, editar, eliminar usuarios
- Gestión de roles: Asignación y modificación de permisos
- Estadísticas de uso: Métricas del sistema
- Profesor-Estudiante: Sistema de asignación inteligente
- Gestión de proyectos: Vista global de todos los proyectos
- Reportes: Estadísticas de rendimiento académico
- Fechas institucionales: Gestión del calendario académico
- Eventos globales: Fechas que afectan a todos los usuarios
- Notificaciones masivas: Comunicados importantes
- Docker (versión 24.0+)
- Docker Compose (versión 2.20+)
- Git
- 4GB RAM mínimo recomendado
-
Clonar el repositorio
git clone https://github.com/Dantrotel/AcTitUBB.git cd AcTitUBB -
Configurar variables de entorno (opcional)
# Crear archivo .env en /backend/ si necesitas configuraciones específicas cp backend/.env.example backend/.env -
Levantar todos los servicios
docker-compose up --build
-
Acceder a la aplicación
- Frontend: http://localhost
- API Backend: http://localhost:3000
- Base de datos: localhost:3306 (usuario:
actitubb_user)
Click para expandir instrucciones de desarrollo local
Prerrequisitos de desarrollo:
- Node.js 20+
- MySQL 8.0+
- Angular CLI 18+
Backend:
cd backend
npm install
npm run devFrontend:
cd frontend
npm install
ng serve
# O con Vite (más rápido)
npm run devBase de Datos:
# Instalar MySQL 8.0+
mysql -u root -p < backend/src/db/database.sql
# Configurar variables en backend/.env
DB_HOST=localhost
DB_PORT=3306
DB_NAME=actitubb
DB_USER=root
DB_PASSWORD=tu_passwordNote
La configuración detallada de Docker, NGINX y variables de entorno ha sido movida a su propio documento para mayor comodidad. 📄 Ver Guía de Configuración Avanzada
| Endpoint | Método | Descripción | Body | Respuesta |
|---|---|---|---|---|
/api/v1/login |
POST | Iniciar sesión | {email, password} |
JWT Token |
/api/v1/register |
POST | Registro de usuario | {usuario, email, password, rut} |
Usuario creado |
/api/v1/logout |
POST | Cerrar sesión | - | Token invalidado |
Ejemplo de Login:
POST /api/v1/login
{
"email": "estudiante@alumnos.ubiobio.cl",
"password": "contraseña123"
}
// Respuesta exitosa
{
"success": true,
"message": "Login exitoso",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"usuario": "estudiante",
"email": "estudiante@alumnos.ubiobio.cl",
"rol": "estudiante"
}
}
}| Endpoint | Método | Descripción | Rol Requerido | Parámetros |
|---|---|---|---|---|
/api/v1/propuestas |
GET | Listar propuestas | Todos | ?estado=, ?page=, ?limit= |
/api/v1/propuestas |
POST | Crear propuesta | Estudiante | FormData con archivo |
/api/v1/propuestas/:id |
GET | Obtener propuesta | Todos | - |
/api/v1/propuestas/:id |
PUT | Editar propuesta | Estudiante/Admin | FormData |
/api/v1/propuestas/:id/comentarios |
POST | Agregar comentario | Profesor/Admin | {comentario} |
/api/v1/propuestas/:id/estado |
PUT | Cambiar estado | Profesor/Admin | {estado} |
| Endpoint | Método | Descripción | Rol Requerido | Body/Params |
|---|---|---|---|---|
/api/v1/projects/:projectId/hitos |
GET | Listar hitos | Todos | - |
/api/v1/projects/:projectId/hitos |
POST | Crear hito | Profesor/Admin | {nombre, descripcion, fecha_limite} |
/api/v1/hitos/:hitoId/entregar |
POST | Entregar hito | Estudiante | FormData con archivo |
/api/v1/hitos/:hitoId/revisar |
POST | Revisar hito | Profesor | {aprobado, calificacion, comentarios} |
/api/v1/hitos/:hitoId/detalle |
GET | Detalle del hito | Todos | - |
| Endpoint | Método | Descripción | Rol Requerido | Body/Params |
|---|---|---|---|---|
/api/v1/fechas-importantes/proyecto/:projectId |
GET | Fechas del proyecto | Todos | - |
/api/v1/fechas-importantes |
POST | Crear fecha | Profesor/Admin | {titulo, descripcion, fecha, proyecto_id} |
/api/v1/fechas-importantes/:fechaId |
PUT | Editar fecha | Profesor/Admin | {titulo, descripcion, fecha} |
/api/v1/fechas-importantes/:fechaId |
DELETE | Eliminar fecha | Admin | - |
/api/v1/fechas-importantes/:fechaId/completar |
POST | Marcar completada | Estudiante | - |
| Endpoint | Método | Descripción | Rol Requerido | Body/Params |
|---|---|---|---|---|
/api/v1/admin/usuarios |
GET | Listar usuarios | Admin | ?rol=, ?page= |
/api/v1/admin/usuarios/:userId/asignar |
POST | Asignar profesor | Admin | {profesor_id, proyecto_id} |
/api/v1/admin/estadisticas |
GET | Estadísticas globales | Admin | - |
/api/v1/admin/calendario/global |
POST | Crear fecha global | Admin | {titulo, descripcion, fecha} |
# Tests del Backend
cd backend
npm test # Unit tests
npm run test:coverage # Coverage report
npm run test:integration # Integration tests
# Tests del Frontend
cd frontend
ng test # Unit tests con Jest
ng test --coverage # Coverage report
ng e2e # End-to-end tests con Cypress
npm run test:lint # Linting con ESLint# Backend
npm run lint # ESLint
npm run lint:fix # Auto-fix linting issues
npm run format # Prettier formatting
# Frontend
ng lint # Angular ESLint
ng lint --fix # Auto-fix
npm run format # Prettier formatting- Coverage: >80% en componentes críticos
- Linting: Configuración ESLint estricta
- TypeScript: Strict mode habilitado
- Security: Dependencias auditadas regularmente
Note
La guía de solución de problemas comunes, errores de base de datos y comandos útiles ha sido movida a su propio documento. 📄 Ver Guía de Troubleshooting
El sistema incluye endpoints para métricas:
# Estadísticas generales
GET /api/v1/admin/estadisticas
{
"usuarios_totales": 150,
"propuestas_activas": 45,
"hitos_pendientes": 23,
"fechas_proximas": 8
}
# Métricas por rol
GET /api/v1/admin/estadisticas/rol/:roleId# Backend performance
npm run test:performance
# Frontend bundle analysis
ng build --stats-json
npx webpack-bundle-analyzer dist/stats.json
# Database performance
SHOW PROCESSLIST; # En MySQL
EXPLAIN SELECT * FROM propuestas; # Query analysis- JWT con blacklist: Tokens seguros con invalidación
- Bcrypt: Hash de contraseñas con salt rounds configurable
- CORS configurado: Origen específico para producción
- Sanitización: Input sanitization en backend
- Validación de RUT: Algoritmo específico para RUT chileno
- Validación de archivos: Tipo y tamaño
- SQL Injection: Prepared statements en todas las queries
# Configuración de seguridad en backend/.env
JWT_SECRET=clave_super_segura_de_al_menos_64_caracteres
BCRYPT_ROUNDS=12
MAX_LOGIN_ATTEMPTS=5
RATE_LIMIT_WINDOW=15 # minutos
RATE_LIMIT_REQUESTS=100- Configurar variables de entorno de producción
- Configurar SSL/TLS con Let's Encrypt
- Configurar backup automático de base de datos
- Configurar monitoring y logging
version: '3.8'
services:
backend:
build: ./backend
environment:
- NODE_ENV=production
- DB_HOST=mysql
- JWT_SECRET=${JWT_SECRET}
restart: unless-stopped
networks:
- app-network
volumes:
- ./backend/uploads:/app/uploads
- ./logs:/app/logs
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./ssl:/etc/nginx/ssl
depends_on:
- backend
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: actitubb
MYSQL_USER: actitubb_user
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
restart: unless-stopped
volumes:
- mysql_data:/var/lib/mysql
- ./backup:/backup
networks:
- app-network
backup:
image: alpine:latest
restart: unless-stopped
volumes:
- mysql_data:/var/lib/mysql
- ./backup:/backup
command: |
sh -c 'while true; do
mysqldump -h mysql -u actitubb_user -p$$MYSQL_PASSWORD actitubb > /backup/backup_$$(date +%Y%m%d_%H%M%S).sql
find /backup -name "backup_*.sql" -mtime +7 -delete
sleep 86400
done'
volumes:
mysql_data:
networks:
app-network:
driver: bridge# Agregar al docker-compose.yml
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}Para no saturar este archivo principal, hemos dividido algunas documentaciones específicas en la carpeta documentacion/:
- Manual de Usuarios Externos
- Guía de Revisión de Hitos para Profesores
- Historial de Cambios de la Base de Datos
- Angular Documentation
- Vite Build Tool
- Docker Best Practices
- MySQL 8.0 Reference Manual
- Node.js Security Checklist
- VS Code Extensions recomendadas:
- Angular Language Service
- Docker
- ESLint
- Prettier
- MySQL
Important
Hemos movido las directrices de contribución, ramas, y estándares de código a su propio archivo para facilitar la lectura. ¡Cualquier PR es bienvenido! 🤝 Ver Guía de Contribución (CONTRIBUTING.md)
Este proyecto está desarrollado para uso académico en la Universidad del Bío-Bío bajo los siguientes términos:
- Uso académico: Libre para investigación y educación
- Modificación: Permitida para propósitos educativos
- Distribución: Con atribución apropiada
- Uso comercial: Requiere autorización expresa
Daniel Aguayo
Full Stack Developer & Student
Universidad del Bío-Bío
2026
Ingeniería de ejecución en computación e Informática
- Universidad del Bío-Bío - Por el soporte académico
- Facultad de Ciencias empresariales - Por los recursos y guidance
- Profesores guía - Por la mentoría técnica
- Comunidad Open Source - Por las herramientas utilizadas
¿Encontraste un bug o tienes una pregunta técnica?
- ** Revisa Issues existentes**: GitHub Issues
- ** Contacto directo**: daniel.aguayo2001@alumnos.ubiobio.cl
















