Aplicación web de gestión de clientes y facturación desarrollada con Spring Boot 4, Thymeleaf y Spring Security. Permite realizar operaciones CRUD sobre clientes, gestionar facturas con líneas de detalle (productos) y controlar el acceso mediante autenticación con roles.
| Capa |
Tecnologías |
| Backend |
Java 21, Spring Boot 4.0.2, Spring Data JPA, Spring Security, Bean Validation |
| Frontend |
Thymeleaf, Bootstrap 5, jQuery UI Autocomplete |
| Base de datos |
MySQL 8, Flyway (migraciones) |
| Mapping / Utilidades |
MapStruct 1.6, Lombok 1.18 |
| Testing |
JUnit 5, Mockito, AssertJ, H2 (in-memory) |
- CRUD de clientes con subida y gestión de imágenes de perfil (UUID como nombre único, límite 10 MB).
- Sistema de facturación con búsqueda de productos por autocompletado (AJAX + jQuery UI Autocomplete) y cálculo automático de importes con
BigDecimal.
- Autenticación y autorización basada en roles (
ROLE_USER, ROLE_ADMIN) con Spring Security y encriptación BCrypt.
- Paginación de resultados con componente reutilizable (
PageRender).
- Migraciones de base de datos con Flyway (
V1 crea tablas, V2 inserta datos de prueba).
- Separación de capas: Entidades JPA ↔ DTOs especializados (formulario, listado, detalle) mapeados con MapStruct.
- Manejo global de errores con
@ControllerAdvice (404, 500, 403).
- Tests unitarios e integración: servicios con Mockito, repositorios con
@DataJpaTest sobre H2, y mappers.
- Java 21 (o superior)
- Docker y Docker Compose (para la base de datos MySQL)
- No es necesario instalar Maven — el proyecto incluye el wrapper (
mvnw).
- Clonar el repositorio:
git clone https://github.com/nicovilab/springboot-datajpa.git
cd springboot-datajpa
- Levantar MySQL con Docker:
- Ejecutar la aplicación:
.\mvnw spring-boot:run "-Dspring-boot.run.arguments=--DB_USERNAME=user --DB_PASSWORD=password"
Flyway ejecutará las migraciones automáticamente en el primer arranque, creando las tablas e insertando datos de prueba.
- Acceder a http://localhost:8080
| Usuario |
Contraseña |
Roles |
| nico |
abc123. |
ROLE_USER |
| admin |
abc123. |
ROLE_ADMIN, ROLE_USER |
ROLE_USER puede ver el listado de clientes, ver detalles de un cliente y visualizar sus fotos.
ROLE_ADMIN además puede crear, editar y eliminar clientes, y gestionar facturas.
| Método |
Ruta |
Acceso |
Descripción |
| GET |
/, /listar |
Público |
Listado paginado de clientes |
| GET |
/ver/{id} |
USER |
Detalle de un cliente con sus facturas |
| GET |
/form |
ADMIN |
Formulario de creación de cliente |
| POST |
/form |
ADMIN |
Guardar/actualizar cliente |
| POST |
/eliminar/{id} |
ADMIN |
Eliminar cliente |
| GET |
/factura/form/{clienteId} |
ADMIN |
Formulario nueva factura |
| POST |
/factura/form |
ADMIN |
Guardar factura |
| GET |
/factura/ver/{id} |
ADMIN |
Detalle de factura |
| POST |
/factura/eliminar/{id} |
ADMIN |
Eliminar factura |
| GET |
/factura/cargar-productos/{term} |
ADMIN |
Búsqueda AJAX de productos (JSON) |
| GET |
/login |
Público |
Página de login |
| Variable |
Descripción |
Ejemplo |
DB_USERNAME |
Usuario de la base de datos MySQL |
user |
DB_PASSWORD |
Contraseña de la base de datos MySQL |
password |
