Sistema completo de autenticación y gestión para el Bienestar Estudiantil de la Universidad Tecnológica de Panamá.
- Requisitos del Sistema
- Instalación de WAMP Server
- Configuración de MySQL
- Instalación del Proyecto
- Configuración de la Base de Datos
- Ejecución del Servidor
- Uso del Sistema
- Estructura del Proyecto
- Troubleshooting
- Colaboración en Equipo
Este proyecto usa pnpm 11 en lugar de npm para reducir riesgos de supply chain.
Comandos recomendados:
corepack enable
corepack pnpm@11.1.2 install
corepack pnpm@11.1.2 run devNo uses npm install para el flujo normal del proyecto. El archivo .npmrc deja ignore-scripts=true para que, si alguien ejecuta npm por accidente, no se ejecuten scripts preinstall, install o postinstall de dependencias.
La política de pnpm está en pnpm-workspace.yaml:
minimumReleaseAge: 1440: espera 24 horas antes de instalar versiones recién publicadas.blockExoticSubdeps: true: bloquea subdependencias desde fuentes exóticas como tarballs o repos git no esperados.strictDepBuilds: true: falla si una dependencia intenta ejecutar scripts sin aprobación.allowBuilds.bcrypt: true: permite solo el build necesario debcrypt.
En Railway, el campo packageManager de package.json permite que el build use pnpm con Corepack.
- WAMP Server (Windows) / MAMP (Mac) / LAMP (Linux)
- Incluye Apache, MySQL/MariaDB y PHP
- Versión recomendada: WAMP 3.2.0 o superior
- Node.js versión 14.0 o superior
- Incluye npm (Node Package Manager)
- Descargar desde: https://nodejs.org/
- Git para control de versiones
- Descargar desde: https://git-scm.com/
- Navegador Web moderno (Chrome, Firefox, Edge)
- Sistema Operativo: Windows 10/11, macOS 10.15+, o Linux
- RAM: 4 GB mínimo (8 GB recomendado)
- Espacio en Disco: 500 MB para el proyecto + 2 GB para WAMP
- Procesador: Dual Core 2.0 GHz o superior
-
Descargar WAMP Server
- Visita: https://www.wampserver.com/en/
- Descarga la versión de 64 bits (recomendado)
- Ejecuta el instalador
.exe
-
Instalación
- Acepta los términos y condiciones
- Ruta de instalación recomendada:
C:\wamp64 - Selecciona tu navegador predeterminado
- Selecciona tu editor de texto predeterminado
- Completa la instalación
-
Verificar Instalación
- Abre WAMP desde el menú Inicio
- El icono de WAMP aparecerá en la bandeja del sistema
- Espera a que el icono se ponga verde (indica que todos los servicios están corriendo)
- Si está amarillo: Algunos servicios no están corriendo
- Si está rojo: Los servicios están detenidos
-
Configurar Puertos (si es necesario)
- Puerto MySQL por defecto:
3306 - Puerto Apache por defecto:
80 - Si hay conflictos de puerto, click derecho en icono WAMP → Tools → Port used
- Puerto MySQL por defecto:
-
Descargar MAMP
- Visita: https://www.mamp.info/en/downloads/
- Descarga la versión gratuita
- Arrastra MAMP a la carpeta Aplicaciones
-
Iniciar MAMP
- Abre MAMP desde Aplicaciones
- Click en "Start Servers"
- Verifica que Apache y MySQL estén en verde
# Actualizar repositorios
sudo apt update
# Instalar Apache
sudo apt install apache2
# Instalar MySQL
sudo apt install mysql-server
# Instalar PHP
sudo apt install php libapache2-mod-php php-mysql
# Iniciar servicios
sudo systemctl start apache2
sudo systemctl start mysql- Click izquierdo en el icono de WAMP en la bandeja
- Selecciona "phpMyAdmin"
- O abre tu navegador y visita:
http://localhost/phpmyadmin
- Abre tu navegador
- Visita:
http://localhost:8888/phpMyAdmin/
# Instalar phpMyAdmin
sudo apt install phpmyadmin
# Acceder desde navegador
http://localhost/phpmyadminWAMP/LAMP:
- Usuario:
root - Contraseña: `` (vacío - dejar en blanco)
MAMP:
- Usuario:
root - Contraseña:
root
- En phpMyAdmin, haz click en "Nueva" en el panel izquierdo
- Nombre de la base de datos:
paperease - Cotejamiento:
utf8mb4_general_ci - Click en "Crear"
# Navega a tu carpeta de proyectos
cd C:\Users\TuUsuario\Documents # Windows
# o
cd ~/Documents # Mac/Linux
# Clona el repositorio
git clone https://github.com/tuusuario/PaperEase-be.git
# Entra al directorio del proyecto
cd PaperEase-be# Asegúrate de estar en la raíz del proyecto
npm installEsto instalará las siguientes dependencias:
express(v5.1.0) - Framework webmysql2(v3.11.5) - Driver de MySQLcors(v2.8.5) - Middleware CORSbcrypt(v5.1.1) - Hash de contraseñasexpress-session(v1.18.1) - Gestión de sesiones
# Verificar que node_modules se creó
ls node_modules # Mac/Linux
dir node_modules # Windows
# Deberías ver carpetas como: express, mysql2, bcrypt, cors, etc.Si tienes un archivo .sql con toda la estructura:
- Abre phpMyAdmin
- Selecciona la base de datos
papereaseen el panel izquierdo - Ve a la pestaña "Importar"
- Click en "Seleccionar archivo"
- Selecciona tu archivo
.sql - Click en "Continuar"
- Abre phpMyAdmin
- Selecciona la base de datos
paperease - Ve a la pestaña "SQL"
- Ejecuta los siguientes scripts en orden:
CREATE TABLE roles (
IdRol INT PRIMARY KEY,
Rol VARCHAR(50) NOT NULL
);
INSERT INTO roles (IdRol, Rol) VALUES
(1, 'estudiante'),
(2, 'trabajadora');CREATE TABLE genero (
IdGenero INT PRIMARY KEY AUTO_INCREMENT,
Genero VARCHAR(50) NOT NULL
);
INSERT INTO genero (Genero) VALUES
('Masculino'),
('Femenino'),
('Otro'),
('Prefiero no decir');CREATE TABLE facultad (
IdFacultad INT PRIMARY KEY AUTO_INCREMENT,
Facultad VARCHAR(100) NOT NULL
);
INSERT INTO facultad (Facultad) VALUES
('Facultad de Ingeniería de Sistemas Computacionales'),
('Facultad de Ingeniería Civil'),
('Facultad de Ingeniería Eléctrica'),
('Facultad de Ingeniería Mecánica'),
('Facultad de Ingeniería Industrial');CREATE TABLE estudiante (
IdEstudiante INT PRIMARY KEY AUTO_INCREMENT,
Email VARCHAR(100) NOT NULL UNIQUE,
Password VARCHAR(255) NOT NULL,
Nombre VARCHAR(100) NOT NULL,
Apellido VARCHAR(100) NOT NULL,
Cedula VARCHAR(20) UNIQUE,
IdGenero INT,
IdFacultad INT,
FechaNacimiento DATE,
Telefono VARCHAR(20),
Direccion TEXT,
FechaRegistro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UltimoAcceso TIMESTAMP NULL,
FOREIGN KEY (IdGenero) REFERENCES genero(IdGenero),
FOREIGN KEY (IdFacultad) REFERENCES facultad(IdFacultad)
);CREATE TABLE trabajador_social (
IdTrabajador INT PRIMARY KEY AUTO_INCREMENT,
Email VARCHAR(100) NOT NULL UNIQUE,
Password VARCHAR(255) NOT NULL,
Nombre VARCHAR(100) NOT NULL,
Apellido VARCHAR(100) NOT NULL,
Cedula VARCHAR(20) UNIQUE,
IdGenero INT,
Departamento VARCHAR(100),
Oficina VARCHAR(50),
Telefono VARCHAR(20),
Extension VARCHAR(10),
FechaRegistro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UltimoAcceso TIMESTAMP NULL,
FOREIGN KEY (IdGenero) REFERENCES genero(IdGenero)
);CREATE TABLE sesiones (
IdSesion INT PRIMARY KEY AUTO_INCREMENT,
TokenSesion VARCHAR(255) NOT NULL UNIQUE,
TipoUsuario ENUM('estudiante', 'trabajadora') NOT NULL,
IdUsuario INT NOT NULL,
FechaCreacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FechaExpiracion TIMESTAMP NOT NULL,
DireccionIP VARCHAR(45),
UserAgent TEXT,
INDEX idx_token (TokenSesion),
INDEX idx_usuario (TipoUsuario, IdUsuario)
);CREATE TABLE auditoria_acceso (
IdAuditoria INT PRIMARY KEY AUTO_INCREMENT,
TipoUsuario ENUM('estudiante', 'trabajadora'),
IdUsuario INT,
Email VARCHAR(100),
Accion ENUM('login', 'logout', 'registro', 'intento_fallido') NOT NULL,
Exitoso BOOLEAN DEFAULT TRUE,
DireccionIP VARCHAR(45),
UserAgent TEXT,
FechaHora TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_fecha (FechaHora),
INDEX idx_usuario (TipoUsuario, IdUsuario)
);- En phpMyAdmin, selecciona la base de datos
paperease - Deberías ver las siguientes tablas:
- auditoria_acceso
- estudiante
- facultad
- genero
- roles
- sesiones
- trabajador_social
Abre el archivo backend/conexion.js y verifica que las credenciales coincidan con tu configuración:
const pool = mysql.createPool({
host: 'localhost',
user: 'root', // ← Tu usuario de MySQL
password: '', // ← Tu contraseña de MySQL (vacío por defecto en WAMP)
database: 'paperease', // ← Nombre de la base de datos
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});Valores comunes:
- WAMP (Windows):
user: 'root',password: ''(vacío) - MAMP (Mac):
user: 'root',password: 'root' - LAMP (Linux):
user: 'root',password: 'tu_contraseña'
Antes de iniciar el servidor, prueba la conexión a MySQL:
node test-conexion.jsSalida esperada:
🔍 Probando conexión a MySQL...
✅ Conexión exitosa!
✅ Query de prueba funcionó
📋 Tablas en la base de datos paperease:
✓ auditoria_acceso
✓ estudiante
✓ facultad
✓ genero
✓ roles
✓ sesiones
✓ trabajador_social
📊 Estructura de tabla estudiante:
- IdEstudiante (int)
- Email (varchar(100))
- Password (varchar(255))
- Nombre (varchar(100))
- Apellido (varchar(100))
...
✅ ¡Todo está bien! La base de datos está lista.
Si hay errores, consulta la sección Troubleshooting.
WAMP (Windows):
- El icono de WAMP debe estar verde
- Si no, click derecho → Start All Services
MAMP (Mac):
- Click en "Start Servers" en MAMP
Linux:
sudo systemctl status mysql
# Si no está corriendo:
sudo systemctl start mysqlDesde la raíz del proyecto:
node backend/index.jsSalida esperada:
✅ Conexión exitosa a MySQL
🚀 Servidor corriendo en http://localhost:3000
Abre tu navegador y visita:
http://localhost:3000
Deberías ver la página de registro de PaperEase.
- Accede a:
http://localhost:3000 - Serás redirigido automáticamente a
Registro.html - Completa el formulario:
- Nombre
- Apellido
- Correo electrónico (formato: usuario@utp.ac.pa)
- Contraseña (mínimo 6 caracteres)
- Confirmar contraseña
- Selecciona tu rol:
- Estudiante: Acceso a programas y servicios
- Trabajadora Social: Gestión de programas
- Click en "Crear Cuenta"
- Serás redirigido automáticamente:
- Estudiantes →
MenuPE.html - Trabajadoras Sociales →
gestion.html
- Estudiantes →
- Accede a:
http://localhost:3000/Login.html - Ingresa:
- Correo electrónico
- Contraseña
- Click en "Iniciar Sesión"
- Serás redirigido según tu rol
El sistema expone los siguientes endpoints:
POST http://localhost:3000/api/auth/register
Content-Type: application/json
{
"nombre": "Juan",
"apellido": "Pérez",
"email": "juan.perez@utp.ac.pa",
"password": "Pass123!",
"rol": 1
}POST http://localhost:3000/api/auth/login
Content-Type: application/json
{
"email": "juan.perez@utp.ac.pa",
"password": "Pass123!"
}GET http://localhost:3000/api/auth/verificar
Authorization: Bearer {token}POST http://localhost:3000/api/auth/logout
Authorization: Bearer {token}PaperEase-be/
├── backend/
│ ├── index.js # Servidor principal
│ ├── conexion.js # Conexión a MySQL
│ ├── auth.js # Rutas de autenticación
│ └── middleware/
│ └── authMiddleware.js # Middleware de autenticación
├── frontend/
│ └── src/
│ ├── Login.html # Página de login
│ ├── Registro.html # Página de registro
│ ├── MenuPE.html # Menú para estudiantes
│ ├── gestion.html # Panel para trabajadoras sociales
│ ├── css/
│ │ └── style.css # Estilos centralizados
│ └── js/
│ ├── login.js # Lógica de login
│ ├── registro.js # Lógica de registro
│ └── authHelper.js # Utilidades de autenticación
├── test-conexion.js # Script de prueba de conexión
├── package.json # Dependencias de Node.js
├── package-lock.json # Lockfile de dependencias
├── README.md # Este archivo
├── AUTENTICACION_README.md # Documentación de autenticación
└── SOLUCION_MYSQL.md # Guía de troubleshooting MySQL
Causa: MySQL no está corriendo.
Solución:
Windows (WAMP):
- Abre XAMPP/WAMP Control Panel
- Click en "Start" junto a MySQL
- Espera a que el icono se ponga verde
Mac (MAMP):
brew services start mysql
# o
mysql.server startLinux:
sudo systemctl start mysql
sudo systemctl status mysqlCausa: La base de datos no existe.
Solución:
- Abre phpMyAdmin:
http://localhost/phpmyadmin - Click en "Nueva" en el panel izquierdo
- Nombre:
paperease - Cotejamiento:
utf8mb4_general_ci - Click "Crear"
Causa: Usuario o contraseña incorrectos.
Solución:
- Verifica las credenciales en
backend/conexion.js - Para WAMP:
user: 'root',password: '' - Para MAMP:
user: 'root',password: 'root'
Causa: Las tablas no se han creado.
Solución:
- Ejecuta los scripts SQL en phpMyAdmin (ver sección Configuración de la Base de Datos)
- Verifica que todas las tablas existen
Causa: Dependencias no instaladas.
Solución:
npm installCausa: Otro proceso está usando el puerto 3000.
Solución:
Opción 1: Cambiar el puerto
Edita backend/index.js:
const PORT = 3001; // Cambiar a otro puertoOpción 2: Liberar el puerto
Windows:
netstat -ano | findstr :3000
taskkill /PID <PID> /FMac/Linux:
lsof -i :3000
kill -9 <PID>Solución:
- Verifica que MySQL esté corriendo (icono verde en WAMP)
- Ejecuta
node test-conexion.jspara diagnosticar - Revisa los logs del servidor en la consola
- Consulta
SOLUCION_MYSQL.mdpara más detalles
Causa: Campos faltantes en el formulario.
Solución:
- Verifica que
Registro.htmltenga campos separados paranombreyapellido - Verifica que
registro.jsesté capturando ambos valores - Revisa la consola del navegador (F12) para ver errores de JavaScript
Causa: Configuración incorrecta de cookies o sesiones.
Solución:
- Verifica que
express-sessionesté configurado enbackend/index.js - Asegúrate de que el token se guarde correctamente en localStorage
- Revisa la tabla
sesionesen phpMyAdmin para ver si se crean registros
# Actualiza tu rama local
git pull origin main
# Crea una nueva rama para tu feature
git checkout -b feature/nombre-de-tu-feature# Verifica cambios
git status
# Agrega archivos modificados
git add .
# Haz commit con mensaje descriptivo
git commit -m "Descripción clara de los cambios"# Actualiza tu rama con los últimos cambios de main
git checkout main
git pull origin main
git checkout feature/nombre-de-tu-feature
git merge main
# Resuelve conflictos si los hay# Sube tu rama
git push origin feature/nombre-de-tu-feature
# Crea un Pull Request en GitHub
# Espera la revisión del equipo antes de hacer merge- JavaScript: camelCase (
nombreCompleto,idEstudiante) - SQL: PascalCase para tablas (
Estudiante,TrabajadorSocial) - Constantes: UPPER_SNAKE_CASE (
MAX_INTENTOS)
- HTML: PascalCase (
Registro.html,MenuPE.html) - JavaScript: camelCase (
registro.js,authHelper.js) - CSS: kebab-case (
style.css,login-form.css)
// Comentarios en español
// Explicar el "por qué", no el "qué"
/**
* Función para validar email
* @param {string} email - Email a validar
* @returns {boolean} - True si es válido
*/
function validateEmail(email) {
// ...
}- Slack/Discord: Para discusiones diarias
- GitHub Issues: Para reportar bugs
- GitHub Pull Requests: Para revisión de código
- Reuniones semanales: Para sincronización del equipo
- Frontend:
frontend/- HTML, CSS, JavaScript del cliente - Backend:
backend/- API, rutas, lógica de negocio - Base de Datos: Scripts SQL, estructura de tablas
- Testing: Pruebas de endpoints, validaciones
- AUTENTICACION_README.md: Documentación completa del sistema de autenticación
- SOLUCION_MYSQL.md: Guía de troubleshooting para problemas de MySQL
- test-conexion.js: Script para probar la conexión a la base de datos
- Nunca subas credenciales a Git
- Usa
.gitignorepara excluir archivos sensibles - Las contraseñas se hashean con bcrypt (10 rounds)
- Los tokens de sesión expiran en 24 horas
- Todas las acciones se registran en
auditoria_acceso
- Cambiar secret de sesión en
backend/index.js - Habilitar HTTPS
- Configurar CORS para dominios específicos
- Usar variables de entorno para credenciales
- Aumentar rounds de bcrypt a 12
- Configurar límite de intentos de login
Si tienes problemas:
- Revisa la sección Troubleshooting
- Consulta
SOLUCION_MYSQL.mdpara problemas de base de datos - Revisa los logs del servidor en la consola
- Verifica la tabla
auditoria_accesoen phpMyAdmin - Contacta al equipo en Slack/Discord
Este proyecto es parte del curso de Desarrollo de Software de la UTP.
Desarrollado por el Equipo de PaperEase - Universidad Tecnológica de Panamá
Última actualización: Octubre 2025