Paso 1: Crear La Base De Datos En Mysql
Primero, asegúrate de tener MySQL instalado y ejecutándose. Luego, abre tu terminal y accede a
MySQL para crear la base de datos:
-- Crear la base de datos llamada brayan123
CREATE DATABASE brayan123;
-- Usar la base de datos brayan123
USE brayan123;
-- Crear la tabla users con las columnas id, username, password y role
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- Columna id, entero, autoincremental y clave
primaria
username VARCHAR(50) NOT NULL, -- Columna username, cadena de caracteres con un
máximo de 50 caracteres, no puede ser nula
password VARCHAR(100) NOT NULL, -- Columna password, cadena de caracteres con un
máximo de 100 caracteres, no puede ser nula
role ENUM('admin', 'user') NOT NULL -- Columna role, puede ser 'admin' o 'user', no puede ser
nula
);
Paso 2: Crear Archivos de la Aplicación "index.js", "panel,js", "login.js", "registro.js", "panel.js"
Index.Js:
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql2');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const app = express();
// Configuración de la conexión a la base de datos MySQL
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'brayan123'
});
// Conexión a la base de datos MySQL
db.connect((err) => {
if (err) throw err;
console.log('Conectado a MySQL');
});
app.use(bodyParser.json()); // Middleware para parsear JSON
// Rutas para las diferentes funcionalidades
app.use('/login', require('./login')); // Ruta para el login
app.use('/register', require('./registro')); // Ruta para el registro
app.use('/panel', require('./panel')); // Ruta para el panel de usuario
const PORT = process.env.PORT || 3000; // Definición del puerto
app.listen(PORT, () => {
console.log(`Servidor corriendo en el puerto ${PORT}`);
});
Panel,Js:
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const mysql = require('mysql2');
const PDFDocument = require('pdfkit');
const fs = require('fs');
// Configuración de la conexión a la base de datos MySQL
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'brayan123'
});
// Ruta para la descarga del archivo PDF
router.get('/download', (req, res) => {
// Obtener el token de la cabecera de autorización
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('No se proporciona ningún token'); // Enviar error si no hay token
// Verificar el token JWT
jwt.verify(token, 'secretkey', (err, decoded) => {
if (err) {
return res.status(500).send('No se pudo autenticar el token'); // Enviar error si el token no
se puede verificar
// Verificar si el usuario tiene el rol de 'admin'
if (decoded.role !== 'admin') {
return res.status(403).send('Acceso denegado'); // Enviar error si el usuario no es admin
// Consultar la base de datos para obtener los usuarios
db.query('SELECT username, role FROM users', (err, results) => {
if (err) throw err; // Lanzar error si ocurre un problema en la consulta
// Crear un nuevo documento PDF
const doc = new PDFDocument();
const filePath = './users.pdf'; // Ruta del archivo PDF
doc.pipe(fs.createWriteStream(filePath)); // Escribir el PDF en el sistema de archivos
// Agregar título al PDF
doc.text('Registered Users', { align: 'center' });
// Agregar información de cada usuario al PDF
results.forEach(user => {
doc.text(`Username: ${user.username}, Role: ${user.role}`);
});
// Finalizar el documento PDF
doc.end();
// Evento cuando el documento PDF ha terminado de generarse
doc.on('finish', () => {
// Enviar el archivo PDF como respuesta para descarga
res.download(filePath, 'users.pdf', (err) => {
if (err) throw err; // Lanzar error si ocurre un problema en la descarga
// Eliminar el archivo PDF después de la descarga
fs.unlink(filePath, (err) => {
if (err) throw err; // Lanzar error si ocurre un problema al eliminar el archivo
});
});
});
});
});
});
module.exports = router;
login.js:
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const mysql = require('mysql2');
// Configuración de la conexión a la base de datos
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'brayan123'
});
// Ruta para el inicio de sesión
router.post('/', (req, res) => {
const { username, password } = req.body;
// Verificar que los campos de nombre de usuario y contraseña no estén vacíos
if (!username || !password) {
return res.status(400).send('Por favor ingrese todos los campos');
// Consulta a la base de datos para buscar el usuario por nombre de usuario
db.query('SELECT * FROM users WHERE username = ?', [username], (err, results) => {
if (err) throw err;
// Verificar si el usuario no fue encontrado
if (results.length === 0) {
return res.status(400).send('Usuario no encontrado');
const user = results[0];
// Comparar la contraseña proporcionada con la contraseña almacenada en la base de datos
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
// Verificar si las contraseñas no coinciden
if (!isMatch) {
return res.status(400).send('Contraseña incorrecta');
// Generar un token JWT con el ID y rol del usuario
const token = jwt.sign({ id: user.id, role: user.role }, 'secretkey', { expiresIn: '1h' });
// Enviar el token como respuesta
res.json({ token });
});
});
});
module.exports = router;
registro.js:
// Importar las dependencias necesarias
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const mysql = require('mysql2');
// Configurar la conexión a la base de datos MySQL
const db = mysql.createConnection({
host: 'localhost',
user: 'root', // Usuario de la base de datos
password: '', // Contraseña de la base de datos
database: 'brayan123' // Nombre de la base de datos
});
// Ruta para manejar la solicitud POST para registrar un nuevo usuario
router.post('/', (req, res) => {
const { username, password, role } = req.body; // Extraer los datos del cuerpo de la solicitud
// Verificar que todos los campos necesarios estén presentes
if (!username || !password || !role) {
return res.status(400).send('Por favor ingrese todos los campos');
// Generar una sal para el hash de la contraseña
bcrypt.genSalt(10, (err, salt) => {
// Hashear la contraseña usando la sal generada
bcrypt.hash(password, salt, (err, hash) => {
if (err) throw err; // Manejar errores
// Insertar el nuevo usuario en la base de datos
db.query('INSERT INTO users (username, password, role) VALUES (?, ?, ?)', [username, hash,
role], (err, result) => {
if (err) throw err; // Manejar errores
res.send('Usuario(a) registrado(a)'); // Enviar respuesta de éxito
});
});
});
});
// Exportar el router para que pueda ser utilizado en otras partes de la aplicación
module.exports = router;
Paso 3: Crear el Archivo package.json:
El archivo package.json se generará automáticamente con "npm init", pero debería verse algo
así:
"name": "brayan123",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js" // Comando para iniciar la aplicación
},
"dependencies": {
"bcryptjs": "^2.4.3", // Librería para encriptar contraseñas
"body-parser": "^1.19.0", // Middleware para analizar cuerpos de solicitudes HTTP
"express": "^4.17.1", // Framework para aplicaciones web
"jsonwebtoken": "^8.5.1", // Librería para crear y verificar JSON Web Tokens
"mysql2": "^2.3.3", // Librería para interactuar con bases de datos MySQL
"pdfkit": "^0.11.0" // Generador de documentos PDF
},
"author": "",
"license": "ISC"
}
Paso 4: Configurar el Proyecto Node.js
Inicializar el proyecto y crear package.json:
mkdir brayan123
cd brayan123
npm init -y
npm install
install nodemom
install npm
Install expresss
Instalar las dependencias necesarias:
npm install express mysql2 bcryptjs jsonwebtoken body-parser pdfkit
Con estos archivos y configuraciones, tu aplicación debería estar lista para ejecutarse. Inicia el
servidor con:
npm start
npm run dev
Ahora puedes registrar usuarios, iniciar sesión y generar un PDF con los usuarios registrados desde
el panel.