Proyecto - gestionar-datos

Estructura del proyecto:

Antes de empezar, aquí está el árbol de la estructura del proyecto que organizaremos:

gestionar-datos/
├── htdocs/                    # Carpeta creada automáticamente para almacenar datos
├── backend/                   # Código backend
│   ├── server.js              # Servidor principal
│   ├── roles.json             # Gestión de roles y permisos
├── frontend/                  # Código frontend
│   ├── index.html             # Ventana inicial (Desarrollador)
│   ├── admin.html             # Ventana del Administrador
│   ├── user.html              # Ventana del Usuario
│   ├── guest.html             # Ventana de Invitado
│   ├── style.css              # Estilos compartidos
│   ├── scripts.js             # Funciones del frontend
├── package.json               # Configuración de Node.js
├── node_modules/              # Dependencias instaladas con npm

Generando Raiz del proyecto (gestionar-datos), directorio (carpetas) y archivos (files)

cd proyectos
mkdir gestionar-datos && { cd gestionar-datos && mkdir htdocs backend frontend; }
cd backend && touch server.js roles.json
cd ..
cd frontend && touch index.html admin.html user.html guest.html style.css scripts.js
cd .. 

 

Paso 1: Configurar el Backend

 Crea la carpeta backend y dentro de ella el archivo server.js. Aquí tienes el código para manejar las funcionalidades del backend:

const express = require("express");
const fs = require("fs");
const path = require("path");
const cors = require("cors");

const app = express();
app.use(cors()); // Permitir solicitudes desde el frontend
app.use(express.json()); // Permitir JSON en las solicitudes

// Ruta para almacenar archivos
const htdocsPath = path.join(__dirname, "../htdocs");

// Crear carpeta `htdocs` si no existe
if (!fs.existsSync(htdocsPath)) {
  fs.mkdirSync(htdocsPath);
}

// Endpoint para agregar datos
app.post("/add-data", (req, res) => {
  const { fileName, content } = req.body;

  if (!fileName) {
    return res.status(400).send("El nombre del archivo es obligatorio.");
  }

  const filePath = path.join(htdocsPath, fileName);

  fs.writeFile(filePath, JSON.stringify(content, null, 2), (err) => {
    if (err) {
      return res.status(500).send("Error al crear el archivo.");
    }
    res.send("Archivo creado exitosamente.");
  });
});

// Endpoint para listar datos
app.get("/list-data", (req, res) => {
  fs.readdir(htdocsPath, (err, files) => {
    if (err) {
      return res.status(500).send("Error al listar archivos.");
    }
    const dataList = files.map((file) => ({
      fileName: file,
      content: JSON.parse(fs.readFileSync(path.join(htdocsPath, file))),
    }));
    res.json(dataList);
  });
});

// Configuración del servidor
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Servidor corriendo en http://localhost:${PORT}`);
});

 

Paso 2: Configurar el Frontend

Crea la carpeta frontend y organiza los archivos como se indica en el árbol.

Archivo index.html (Ventana de Desarrollador):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Gestión de Datos</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <nav>
      <ul class="menu">
        <li><a href="index.html">Desarrollador</a></li>
        <li><a href="admin.html">Administrador</a></li>
        <li><a href="user.html">Usuario</a></li>
        <li><a href="guest.html">Invitado</a></li>
      </ul>
    </nav>
  </header>
  <main>
    <h1>Gestión de Datos - Desarrollador</h1>
    <div>
      <label>Nombre del archivo:</label>
      <input type="text" id="fileName" placeholder="archivo.json">
      <textarea id="fileContent" placeholder="Escribe contenido en formato JSON"></textarea>
      <button onclick="addData()">Agregar Datos</button>
    </div>
    <div>
      <button onclick="listData()">Listar Datos</button>
      <pre id="output"></pre>
    </div>
  </main>
  <script src="scripts.js"></script>
</body>
</html>

Archivo admin.html, user.html, guest.html:

  • Admin puede gestionar usuarios y datos.
  • User puede introducir y editar datos permitidos.
  • Guest solo puede visualizar.

La estructura básica es similar a index.html. Con menú de navegación persistente y pestañas

 

 Archivo scripts.js (Frontend):

const API_URL = "http://localhost:3000";

function addData() {
  const fileName = document.getElementById("fileName").value;
  const fileContent = document.getElementById("fileContent").value;

  try {
    const content = JSON.parse(fileContent); // Validar JSON
    fetch(`${API_URL}/add-data`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ fileName, content }),
    })
      .then((response) => response.text())
      .then((data) => alert(data))
      .catch((error) => console.error("Error:", error));
  } catch (e) {
    alert("Contenido no es válido JSON.");
  }
}

function listData() {
  fetch(`${API_URL}/list-data`)
    .then((response) => response.json())
    .then((data) => {
      const output = document.getElementById("output");
      output.textContent = JSON.stringify(data, null, 2);
    })
    .catch((error) => console.error("Error:", error));
}

Archivo style.css (Estilos):

body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
}

header {
  background-color: #4CAF50;
  color: white;
  padding: 10px 0;
}

nav {
  display: flex;
  justify-content: center;
}

.menu {
  list-style-type: none;
  padding: 0;
  margin: 0;
  display: flex;
}

.menu li {
  margin: 0 15px;
}

.menu a {
  color: white;
  text-decoration: none;
  font-weight: bold;
}

.menu a:hover {
  text-decoration: underline;
}

main {
  padding: 20px;
}

 

Solución para la comunicación entre el backend y el frontend

La falta de comunicación suele deberse a: 

  • Rutas incorrectas en el frontend (scripts.js). 
  • El servidor no está ejecutándose correctamente. 
  • El navegador bloquea solicitudes por razones de CORS (Cross-Origin Resource Sharing). 

 

Por qué es importante cors

El módulo cors es esencial para manejar solicitudes entre distintas ubicaciones (cross-origin requests). Por ejemplo, si tu frontend y backend están en servidores separados o en diferentes puertos (como http://localhost:3000 para el backend y http://localhost:5000 para el frontend), el navegador bloquearía las solicitudes sin este módulo habilitado.

 

Paso 3: Ejecutar el Proyecto

Inicializa un proyecto Node.js:

  • Ejecuta el siguiente comando para inicializar un archivo package.json:
npm init -y 

Instalar dependencias

En la carpeta raíz del proyecto (gestionar-datos), ejecuta:

npm install express 

Instalar el módulo cors

 Abre tu terminal y asegúrate de estar ubicado en la carpeta raíz de tu proyecto (gestionar-datos).

Ejecuta este comando para instalar el módulo:

npm install cors

Verifica que cors se haya añadido a las dependencias en tu archivo package.json:

"dependencies": {
  "express": "^4.21.2",
  "cors": "^2.8.5"
}
 

Iniciar el backend: 

Ve a la carpeta backend y ejecuta el servidor:

 node backend/server.js 

Esto debería eliminar el error relacionado con cors.

Abrir el frontend:

  • Para la vista del desarrollador, abre el archivo frontend/index.html en el navegador.
  • Para administrador, usuario e invitado, abre sus respectivos archivos. 

 Navega entre las páginas usando el menú y verifica:

  •  Desarrollador puede agregar y listar datos.
  • Administrador puede gestionar usuarios y datos.
  • Usuario tiene permisos limitados según lo configurado en el backend.
  • Invitado solo puede visualizar datos.
 

  

Paso 4: Extender Funcionalidades

 

 

 

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...