Sistema MVP de gestión de tareas por proyectos, construido con FastAPI (backend) y Bootstrap 5 (frontend).
- ✅ Gestión de Proyectos: Crear y seleccionar proyectos
- ✅ Gestión de Tareas: Crear, editar, eliminar tareas por proyecto
- ✅ Dos Vistas: Tabla y Cards (responsive 1/2/3 columnas)
- ✅ Filtros Avanzados: Búsqueda, estado, prioridad, rango de fechas
- ✅ Persistencia: Proyecto seleccionado y vista guardados en localStorage
- ✅ Modal de Selección: Al iniciar, elige proyecto (no intrusivo)
- ✅ Avisos Huérfanos: Indica tareas sin proyecto asignado
- ✅ Notificaciones Toast: Confirmaciones y mensajes de error
- ✅ Estética Mejorada: Diseño limpio con Bootstrap + Font Awesome
git clone <url-repo>
cd StackDoCopiar .env.example a .env y rellenar con tus datos de PostgreSQL:
cp .env.example .envContenido de .env:
DB_USER=postgres
DB_PASSWORD=tu_contraseña
DB_HOST=localhost
DB_PORT=5432
DB_NAME=stackdo
DB_SCHEMA=public# Crear entorno virtual
python -m venv .venv
# Activar entorno
# Windows:
.venv\Scripts\Activate.ps1
# Linux/Mac:
source .venv/bin/activate
# Instalar dependencias
pip install fastapi uvicorn sqlmodel python-dotenv psycopg2-binary# Python script para crear BD y tablas
python -c "from api.db import init_db; init_db()"uvicorn api.main:app --reload --host 0.0.0.0 --port 8000Abre en tu navegador: http://localhost:8000
python/
├── api/
│ ├── __init__.py
│ ├── main.py # FastAPI app, rutas
│ ├── models.py # Esquemas Pydantic
│ ├── db.py # Conexión BD, modelos SQLModel
│ ├── crud.py # Operaciones BD (Create, Read, Update, Delete)
│ └── __pycache__/
├── ui/
│ ├── index.html # Interfaz principal
│ ├── main.js # Lógica frontend
│ ├── styles.css # Estilos personalizados
├── scripts/
│ └── init_db.py # Script inicial (opcional)
├── .env.example # Plantilla variables entorno
├── .env # Archivo real (NO subir a git)
├── README.md # Esta documentación
└── __pycache__/
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/tasks |
Listar todas las tareas |
GET |
/tasks?project_id=1 |
Tareas de un proyecto |
GET |
/tasks/{id} |
Obtener detalle de tarea |
POST |
/tasks |
Crear tarea |
PUT |
/tasks/{id} |
Actualizar tarea |
DELETE |
/tasks/{id} |
Eliminar (soft-delete, marca como inactiva) |
Payload POST/PUT:
{
"titulo": "Mi tarea",
"descripcion": "Descripción opcional",
"estado": "pendiente", // pendiente | en_progreso | completada
"prioridad": 3, // 1-5
"fecha_vencimiento": "2026-12-31",
"project_id": 1
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/projects |
Listar todos los proyectos |
GET |
/projects/{id} |
Obtener detalle proyecto |
POST |
/projects |
Crear proyecto |
Payload POST:
{
"name": "Mi Proyecto",
"description": "Descripción opcional"
}| Estado | Color | Badge |
|---|---|---|
| Pendiente | Amarillo | bg-warning |
| En Progreso | Azul | bg-info |
| Completada | Verde | bg-success |
| Sin Proyecto | Gris/Amarillo | bg-warning |
id INT PRIMARY KEY
name VARCHAR(200) UNIQUE
description TEXT NULLid INT PRIMARY KEY
titulo VARCHAR(200)
descripcion VARCHAR(255) NULL
estado VARCHAR(50) -- pendiente, en_progreso, completada
prioridad INT -- 1-5
fecha_vencimiento DATE NULL
active BOOLEAN DEFAULT TRUE -- soft-delete
project_id INT FK → projects.id -- NULL para tareas huérfanas- Iniciar app: Se muestra modal de selección de proyecto (modal no intrusivo)
- Seleccionar proyecto: Elige uno de la lista y se carga en localStorage
- Ver tareas: Se cargan todas las tareas del proyecto seleccionado
- Filtrar: Usa barra de filtros (búsqueda, estado, prioridad, fechas)
- Cambiar vista: Toggle tabla ↔ cards según preferencia
- Crear tarea: Botón "Nueva Tarea", rellena formulario modal, requiere proyecto
- Editar tarea: Click en fila/card → abre detalle → botón "Editar"
- Eliminar tarea: Soft-delete (se marca como inactiva, no aparece en lista)
- Cambiar proyecto: Selector en navbar → actualiza vista y localStorage
- Si una tarea NO tiene
project_id, aparece un icono⚠️ gris y texto "Huérfano" - Las tareas huérfanas se pueden ver pero no se pueden crear (formulario requiere proyecto)
- Se pueden editar si cargan una tarea existente y asignarle proyecto
- Eliminar una tarea pone
active = false - No aparece en lista pero se queda en BD (recuperable en futuro)
- Frontend filtra por
active = trueautomáticamente
currentProjectId: Guardado enlocalStorage→ permanece entre sesionesviewMode: Tabla o Cards guardado enlocalStorage- Filtros: Reset al cambiar proyecto
- Título: obligatorio, max 200 caracteres
- Descripción: opcional, max 255 caracteres
- Prioridad: 1-5 (default 1)
- Proyecto: obligatorio al crear/editar tarea
- Estado: solo valores válidos (
pendiente,en_progreso,completada)
Nota: Esta es una versión MVP sin autenticación. Para producción:
- Agregar JWT tokens
- Autorización por usuario/rol
- Rate limiting
- CORS configurado
- Validación de permisos
# El servidor muestra logs en consola si hay errores
uvicorn api.main:app --reload --log-level debug# Conectar a PostgreSQL
psql -U postgres -d stackdo
# Ver tablas
\dt
# Ver contenido
SELECT * FROM projects;
SELECT * FROM tareas;localStorage.removeItem('currentProjectId');
localStorage.removeItem('viewMode');- Backend: FastAPI + SQLModel + PostgreSQL
- Frontend: Vanilla JavaScript + Bootstrap 5 + Font Awesome
- Vistas: 2 (tabla + cards responsive)
- Filtros: 5 (búsqueda, estado, prioridad, fecha inicio, fecha fin)
- Modales: 4 (selección proyecto, crear tarea, crear proyecto, detalle tarea)
- Líneas de código: ~1500 (frontend + backend)
- Autenticación y autorización
- Exportar tareas a PDF/CSV
- Comentarios en tareas
- Asignación de tareas a usuarios
- Drag & drop para cambiar estado
- Estadísticas y gráficos
- Notificaciones por email
- Temas (dark mode)
- Ordenamiento personalizable
- Recurrencia de tareas
MIT
Para reportar bugs o sugerir mejoras, abre un issue en el repositorio.
Última actualización: Febrero 2026 Versión: 1.0.0 (MVP)