尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Trabajo final colaborativo — Programación distribuida.
Aplicación web para gestionar tareas personales: registro e inicio de sesión de usuarios, creación, edición, marcado como completadas y eliminación de tareas, organización por categorías y fecha de vencimiento opcional.
App publicada: https://gestor-tareas-omega-bice.vercel.app · Base de datos: MongoDB Atlas
| Documento | Contenido |
|---|---|
| 1. Planificación y diseño | Requisitos, arquitectura, diagramas de flujo y de secuencia, diseño de la base de datos, estructura de carpetas, decisiones de diseño y rendimiento |
| 2. Pruebas | 34 pruebas automatizadas, pruebas manuales de la interfaz, pruebas de despliegue, integración continua y problemas resueltos |
| 3. División de tareas | Responsables por área (3 integrantes), plan por etapas, flujo de trabajo con Git y comunicación |
| 4. Sustentación, ética y privacidad | Guion de la presentación, demostración en vivo, preguntas probables y medidas de privacidad |
El código está documentado con comentarios JSDoc (@param, @returns, @example) en el backend (src/) y en el frontend (public/js/).
| Capa | Tecnología |
|---|---|
| Entorno de ejecución | Node.js (≥ 18) |
| Framework web | Express.js |
| Base de datos | MongoDB |
| Modelado (ODM) | Mongoose |
| Seguridad | bcryptjs (hash de contraseñas), JSON Web Tokens (sesiones) |
| Interfaz | HTML, CSS y JavaScript (sin frameworks) |
gestor-tareas/
├── src/
│ ├── app.js # Aplicación Express: rutas, conexión a la BD, manejo de errores
│ ├── server.js # Arranque local (npm start)
│ ├── config/db.js # Conexión a MongoDB
│ ├── models/
│ │ ├── User.js # Usuario (hash de contraseña con bcrypt)
│ │ └── Task.js # Tarea (pertenece a un usuario)
│ ├── middleware/auth.js # Verificación del token JWT
│ └── routes/
│ ├── auth.js # Registro, login, usuario actual
│ └── tasks.js # CRUD de tareas y categorías
├── public/ # Frontend servido por Express
│ ├── index.html
│ ├── css/styles.css
│ └── js/
│ ├── api.js # Cliente de la API (fetch)
│ └── app.js # Lógica de la interfaz
├── scripts/
│ └── probar-conexion.js # npm run probar-db: verifica la conexión a MongoDB
├── test/ # Pruebas automatizadas (npm test)
├── docs/ # Documentación del proyecto
├── .github/workflows/ # Integración continua (GitHub Actions)
├── api/index.js # Entrada para Vercel (función serverless)
├── vercel.json # Configuración de rutas en Vercel
├── .env.example
└── package.json
npm install
.env.example como .env y cambiar JWT_SECRET por una cadena larga y aleatoria. Si usas Atlas, reemplaza MONGODB_URI por tu cadena de conexión.npm start
o, en desarrollo (se reinicia al guardar cambios):
npm run dev
gestor_tareas_test):
npm test
0.0.0.0/0 (cualquier IP), pero no lo dejes así en producción.mongodb+srv://.....env, reemplaza MONGODB_URI por esa cadena y pon tu contraseña donde dice <db_password>. Si la contraseña tiene caracteres como @ : / # %, codifícalos (por ejemplo @ → %40).npm run probar-db
Si algo falla, el script muestra una sugerencia (IP no autorizada, contraseña incorrecta, URI mal copiada…).
En algunos Windows, Node no logra resolver las direcciones mongodb+srv:// con el DNS del sistema (querySrv ECONNREFUSED); la app lo detecta y reintenta automáticamente con DNS públicos (8.8.8.8 y 1.1.1.1).npm start. Las colecciones users y tasks se crean solas en la base gestor_tareas (configurable con DB_NAME) al registrar el primer usuario.La app ya está preparada para Vercel:
api/index.js expone la aplicación Express como función serverless; vercel.json envía todas las rutas /api/* a esa función.public/ (HTML, CSS, JS) se sirven como sitio estático.src/config/db.js)..vercelignore evita subir el .env y node_modules.Pasos:
0.0.0.0/0). Vercel no tiene una IP fija, así que Atlas debe aceptar conexiones desde cualquier IP (la contraseña de la base sigue protegiéndola).gestor-tareas, inicia sesión en Vercel (se abre el navegador):
npx vercel login
npx vercel
MONGODB_URI, JWT_SECRET, DB_NAME y JWT_EXPIRES_IN. Puedes copiar el contenido de tu .env y pegarlo en el campo Key: Vercel separa las variables automáticamente.npx vercel --prod
Vercel muestra la URL pública (algo como https://gestor-tareas-xxxx.vercel.app).
El proyecto de Vercel está conectado al repositorio https://github.com/Luis1052948713/gestor-tareas:
git push a la rama main publica automáticamente una nueva versión en producción.npm test); si fallan, el commit aparece con ❌ en GitHub.N nueva tarea, / buscar, Esc cerrar o salir del campo.Todas las rutas de /api/tareas requieren el encabezado Authorization: Bearer <token>, que se obtiene al registrarse o iniciar sesión.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/registro | Crea un usuario. Cuerpo: { nombre, email, password } |
| POST | /api/auth/login | Inicia sesión. Cuerpo: { email, password } |
| GET | /api/auth/yo | Devuelve el usuario de la sesión actual |
Ambas respuestas de registro/login devuelven { token, usuario }.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/tareas | Lista las tareas del usuario. Filtros opcionales: ?categoria=X&estado=pendientes|completadas |
| GET | /api/tareas/categorias | Categorías del usuario con total y pendientes |
| POST | /api/tareas | Crea una tarea. Cuerpo: { titulo, descripcion?, categoria?, fechaVencimiento? } |
| PUT | /api/tareas/:id | Edita título, descripción, categoría, fecha o estado |
| PATCH | /api/tareas/:id/completar | Marca como completada/pendiente. Cuerpo: { completada: true|false } |
| DELETE | /api/tareas/:id | Elimina la tarea |
User: nombre, email (único), password (hash bcrypt, nunca se devuelve en consultas), createdAt, updatedAt.
Task: titulo, descripcion, categoria (por defecto "General"), fechaVencimiento (opcional), completada, usuario (referencia a User), createdAt, updatedAt.
textContent/createElement, de modo que el texto ingresado por usuarios no se ejecuta como código (protección contra XSS).express-rate-limit).httpOnly en lugar de localStorage.