LibrarySystem es un sistema de gestión de bibliotecas para entornos académicos. Desarrollado con Jakarta EE 10 y diseñado para Eclipse GlassFish 7, permite la administración de usuarios, autores, libros y préstamos.
Esta sección detalla los componentes técnicos y la arquitectura principal del sistema.
| Componente | Tecnología |
|---|---|
| Lenguaje principal | Java 17 |
| Plataforma Enterprise | Jakarta EE 10 (Servlets y plantillas JSP) |
| Servidor de Apps | Eclipse GlassFish 7.0.25 |
| Base de Datos | MySQL 8.0 |
| Manejo de JSON | Jackson Databind 2.18.2 |
| Logging | SLF4J + Log4j2 |
| Frontend | HTML5, CSS3 Nativo (Variables), JavaScript Vanilla |
| Recursos Visuales | Lucide Icons (vía CDN), Tipografías de Google Fonts |
El proyecto mantiene una estricta separación de responsabilidades:
webapp/pages/(Vistas): Documentos JSP reusables para la interfaz gráfica.controller/(Controladores): Servlets que orquestan el tráfico HTTP. UsanJacksonpara retornar respuestas JSON estandarizadas.service/(Capa de Negocio): Centraliza la lógica de validación, reglas de negocio y orquestación entre modelos.dao/(Acceso a Datos): Interfaces e implementaciones JDBC. Uso intensivo dePreparedStatementy logging profesional con SLF4J.model/(Entidades): POJOs que representan las entidades del dominio.
- JDK 17.
- Apache Maven 3.8 o superior.
- MySQL 8.0 o superior.
- Eclipse GlassFish 7.0.25.
CREATE DATABASE DBlibrary;
CREATE TABLE `users` (
id_user int NOT NULL AUTO_INCREMENT,
name varchar(100) DEFAULT NULL,
email varchar(100) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
activo bit(1) DEFAULT b'1',
PRIMARY KEY (id_user)
);
CREATE TABLE authors (
id_author INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
nationality VARCHAR(50)
);
CREATE TABLE books (
id_book INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(150),
isbn VARCHAR(20),
year INT,
id_author INT,
FOREIGN KEY (id_author) REFERENCES authors(id_author)
);
CREATE TABLE `loans` (
id_loan int NOT NULL AUTO_INCREMENT,
loan_date date DEFAULT NULL,
return_date date DEFAULT NULL,
id_user int DEFAULT NULL,
id_book int DEFAULT NULL,
returned bit(1) DEFAULT b'0',
PRIMARY KEY (id_loan),
KEY id_user (id_user),
KEY id_book (id_book),
CONSTRAINT loans_ibfk_1 FOREIGN KEY (`id_user`) REFERENCES users (id_user),
CONSTRAINT loans_ibfk_2 FOREIGN KEY (`id_book`) REFERENCES books (id_book)
);Atención: Asegúrate de configurar correctamente tus credenciales (usuario y contraseña locales) editando el archivo de conexión correspondiente en database/ConnectionDB.java o el respectivo bundle properties resources\database.properties.example.
Si deseas evitar un entorno vacío y probar la eficiencia con miles de datos, ejecuta nuestra simulación:
python generate_seed.py(Carga un histórico base de 978 usuarios, 1256 autores, 4751 libros y 2791 préstamos).
Es la página inicial del aplicativo. Expone métricas en tiempo real leyendo agregados globales para dar rápida visión operativa a administradores de recintos.
Para evitar bloqueos al cargar grandes volúmenes de datos en una sola petición web:
- Se limitó la consulta inicial (ej. 20 resultados).
- Se incorporó un bloque deslizante dinámico para su paginación (limita visualmente a 5 botones).
- Las búsquedas operan del lado del servidor SQL (
LIKE %query%) en lugar de sobrecargar memoria RAM filtrando listas inmensas desde el backend Java. - Nota en Usuarios: Tienen eliminación "lógica". El usuario es desmarcado a falso mediante el atributo
activosin destruir compromisos de préstamos existentes.
El ingreso de nuevos libros usa autocompletado en el front-end con peticiones AJAX, brindando hasta 10 respuestas cortas, evitando que el usuario envíe peticiones masivas enteras.
Implementa prevención predictiva contra "ISBN clonados", validado usando SELECT 1 FROM books WHERE isbn=? LIMIT 1.
Los componentes de préstamos en /loans tienen doble pestaña de visualización (Históricos vs Activos).
Permite filtros combinados que ajustan iterativamente un StringBuilder en SQL, haciendo posible buscar de forma ágil desde el identificador de usuario hasta por margen de fechas.
Se eliminaron los alert() nativos del navegador. Ahora el sistema utiliza un sistema de Toasts customizado en app.js que proporciona feedback visual no bloqueante y estéticamente superior.
La eliminación de usuarios ahora se realiza mediante un modal de confirmación y una petición asíncrona, evitando recargas de página innecesarias y mejorando la UX.
Todos los controladores han sido refactores para devolver objetos JSON consistentes ({status, message, data}) utilizando la librería Jackson, eliminando la concatenación manual de strings.
Los listados (DAO) ahora devuelven los registros en orden descendente por defecto (ORDER BY id DESC), asegurando que las acciones más recientes sean visibles de inmediato.
GET /users?action=apiSearch&query=...GET /authors?action=apiSearch&query=...GET /books?action=apiSearch&query=...
POST /usersaction=register | update | delete
POST /loans?action=registerAjax(Nuevo préstamo)POST /loans?action=return(Devolución)
Este proyecto es desarrollado exclusivamente para propósitos formativos y académicos.




