FitForge es un proyecto personal en Ionic + Angular pensado para gestionar entrenamientos de gimnasio con una arquitectura más cercana a un producto real que a una demo suelta.
- Dashboard con resumen del día, racha y accesos rápidos
- Gestión de rutinas y ejercicios
- Registro de sesiones reales de entrenamiento
- Seguimiento de progreso y estadísticas
- Base preparada para autenticación JWT, modo offline y sincronización
FitForge usa 4 tabs en la barra inferior:
Inicio: dashboard con racha, entrenamiento del día y récordsEntrena: rutinas activas y acceso al constructor de entrenamientosProgreso: evolución del volumen y del peso por ejercicioPerf: perfil del usuario y biblioteca de ejercicios
Pantallas adicionales previstas:
LoginRegistroBiblioteca de ejerciciosSesión activa
src/app/
├── core/
│ ├── guards/
│ ├── interceptors/
│ └── services/
├── shared/
│ ├── components/
│ └── models/
└── pages/
├── auth/
├── dashboard/
├── exercises/
├── profile/
├── progress/
├── routines/
├── tabs/
└── workout/
fitforge-backend/
├── middleware/
│ └── auth.js
├── repositories/
│ ├── exerciseRepository.js
│ ├── routineRepository.js
│ ├── userRepository.js
│ └── workoutRepository.js
├── routes/
│ ├── auth.js
│ ├── exercises.js
│ ├── routines.js
│ ├── sessions.js
│ └── stats.js
├── sql/
│ └── schema.sql
├── db.js
├── package.json
└── server.js
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
fitnessLevel ENUM('principiante','intermedio','avanzado') DEFAULT 'principiante',
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE exercises (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
muscleGroup VARCHAR(100) NOT NULL,
equipment VARCHAR(100),
difficulty ENUM('facil','intermedio','avanzado') DEFAULT 'intermedio',
description TEXT,
videoUrl VARCHAR(500)
);
CREATE TABLE routines (
id INT AUTO_INCREMENT PRIMARY KEY,
userId INT NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (userId) REFERENCES users(id)
);
CREATE TABLE routine_exercises (
id INT AUTO_INCREMENT PRIMARY KEY,
routineId INT NOT NULL,
exerciseId INT NOT NULL,
sets INT DEFAULT 3,
reps INT DEFAULT 10,
restSeconds INT DEFAULT 90,
`order` INT NOT NULL,
FOREIGN KEY (routineId) REFERENCES routines(id),
FOREIGN KEY (exerciseId) REFERENCES exercises(id)
);
CREATE TABLE workout_sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
userId INT NOT NULL,
routineId INT,
startedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
finishedAt TIMESTAMP,
durationMinutes INT,
notes TEXT,
FOREIGN KEY (userId) REFERENCES users(id)
);
CREATE TABLE workout_sets (
id INT AUTO_INCREMENT PRIMARY KEY,
sessionId INT NOT NULL,
exerciseId INT NOT NULL,
setNumber INT NOT NULL,
weight DECIMAL(5,2),
reps INT,
completedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sessionId) REFERENCES workout_sessions(id)
);| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/register |
Registro |
| POST | /api/auth/login |
Login con JWT |
| GET | /api/auth/me |
Usuario autenticado |
| GET | /api/exercises |
Listar ejercicios |
| GET | /api/exercises?muscleGroup=pecho |
Filtrar ejercicios |
| GET | /api/routines |
Obtener rutinas |
| POST | /api/routines |
Crear rutina |
| PUT | /api/routines/:id |
Actualizar rutina |
| DELETE | /api/routines/:id |
Eliminar rutina |
| GET | /api/sessions |
Historial de entrenos |
| POST | /api/sessions |
Iniciar sesión |
| PUT | /api/sessions/:id |
Finalizar sesión |
| POST | /api/sessions/:id/sets |
Añadir serie |
| GET | /api/stats/progress |
Progreso por ejercicio |
| GET | /api/stats/overview |
Volumen semanal y días activos |
- Una rutina es una plantilla reusable: ejercicios, orden, series, reps y descanso objetivo.
- Una sesión es una ejecución real de esa rutina en un día concreto, con pesos, repeticiones y tiempos reales.
Necesitamos ambas tablas porque representan dos niveles distintos del entrenamiento:
-
workout_sessionsguarda el contexto global de una sesión:- qué usuario entrenó
- qué rutina usó
- cuándo empezó y terminó
- cuánto duró
- notas generales
-
workout_setsguarda el detalle fino de lo que pasó dentro de la sesión:- ejercicio concreto
- número de serie
- peso usado
- repeticiones realizadas
- momento de registro
Sin workout_sessions no podríamos agrupar una sesión completa. Sin workout_sets no podríamos calcular volumen, progreso ni récords por ejercicio.
- Ionic 8 + Angular 20
- TypeScript standalone
- Node.js + Express
- MySQL
- Chart.js
- Ionic Storage
- Base Ionic creada
- Arquitectura frontend definida
- Guard, interceptor y servicios base creados
- Backend estructurado a nivel de carpetas
- README y modelo de datos documentados