Incluye admin web Spring Boot, API JWT para escáner y app Flutter qrscanner con login y escaneo de pases.
Base Admin Web
Proyecto base de Spring Boot con Metronic, autenticacion local y estructura modular lista para reutilizar en nuevos paneles administrativos.
Stack
- Spring Boot 4.0.6
- Java 25
- Spring Security
- Thymeleaf
- JPA / Hibernate
- H2 en archivo para desarrollo rapido
- PostgreSQL listo por perfil
- JWT para autenticacion API de escaneo
- Assets Metronic reutilizados desde
base-web
Estructura
base-admin-web-domain: entidades y repositoriosbase-admin-web-application: servicios y carga inicialbase-admin-web-configuration: seguridad, JWT y perfilesbase-admin-web-web: controladores y vistas Thymeleafbase-admin-web-jar: punto de entrada ejecutable
Usuarios iniciales
Administrador (panel web)
- Usuario:
admin - Password:
Admin123* - Rol:
ROLE_ADMIN - Acceso: login web en
/login, dashboard y modulo de codigos pase
Variables de entorno:
APP_ADMIN_USERNAMEAPP_ADMIN_PASSWORDAPP_ADMIN_DISPLAY_NAME
Escaneador (API)
- Usuario:
scanner - Password:
Scanner123* - Rol:
ROLE_SCANNER - Acceso: solo login por API y escaneo de codigos pase
Variables de entorno:
APP_SCANNER_USERNAMEAPP_SCANNER_PASSWORDAPP_SCANNER_DISPLAY_NAME
Modulo de codigos pase
Panel administrativo para dar de alta y consultar codigos pase.
- URL:
http://localhost:8080/admin/pass-codes - Tambien accesible desde el boton Codigos pase en el dashboard
- Alta por nombre; el sistema genera un codigo aleatorio de 10 caracteres
- Vista con tabla de estatus, escaneo y fecha de creacion
- Modal Metronic para ver el QR de cada codigo
- Al cerrar el modal, la lista se actualiza automaticamente por si el codigo fue utilizado
Campos del codigo pase:
- Nombre
- Codigo aleatorio
- Fecha de creacion
- Estatus (
ACTIVO/UTILIZADO) - Indicador de escaneado
- Fecha de escaneo
API
Login escaner
POST /api/auth/login
Content-Type: application/json
{
"username": "scanner",
"password": "Scanner123*"
}
Respuesta exitosa:
{
"success": true,
"accessToken": "eyJhbG...",
"tokenType": "Bearer",
"expiresIn": 28800,
"username": "scanner",
"roles": ["ROLE_SCANNER"]
}
Solo usuarios con rol SCANNER pueden iniciar sesion por API. El usuario admin no puede autenticarse por este endpoint.
Escanear codigo pase
POST /api/pass-codes/scan
Authorization: Bearer eyJhbG...
Content-Type: application/json
{
"code": "K7P2M9XQ4R"
}
Marca el codigo como escaneado y cambia su estatus a UTILIZADO.
Listado para el panel (requiere sesion admin)
GET /admin/pass-codes/list
Devuelve JSON con los codigos registrados. Se usa internamente para refrescar la tabla del panel.
Arranque local
Desde la raiz del proyecto:
./run-local.sh
El script:
- Detecta automaticamente Temurin/Java 25
- Compila todos los modulos del proyecto
- Arranca el modulo ejecutable
base-admin-web-jar - Muestra el perfil activo y la base de datos en uso
Si SPRING_PROFILES_ACTIVE incluye postgres, el script intenta levantar automaticamente el contenedor definido en docker-compose-postgres.local.yml antes de iniciar la aplicacion.
Tambien puedes ejecutar:
mvn test
mvn -pl base-admin-web-jar -am -DskipTests install
mvn -pl base-admin-web-jar spring-boot:run
Aplicacion:
- Login:
http://localhost:8080/login - Dashboard:
http://localhost:8080/dashboard - Codigos pase:
http://localhost:8080/admin/pass-codes - H2 Console:
http://localhost:8080/h2-console
Perfiles
dev: H2 en archivo (./data/h2/), consola H2 habilitada, datos persistentes entre reiniciosprod: cache Thymeleaf y H2 console deshabilitadapostgres: datasource PostgreSQL, datos persistentes en el servidor o volumen Dockertest: H2 en memoria concreate-drop, usado solo pormvn test
Con postgres, run-local.sh intenta arrancar Docker Compose automaticamente.
Ejemplo con PostgreSQL local:
SPRING_PROFILES_ACTIVE=postgres ./run-local.sh
Ejemplo con PostgreSQL remoto:
SPRING_PROFILES_ACTIVE=postgres \
SPRING_DATASOURCE_URL=jdbc:postgresql://TU_SERVIDOR:5432/base_admin_web \
SPRING_DATASOURCE_USERNAME=tu_usuario \
SPRING_DATASOURCE_PASSWORD=tu_password \
./run-local.sh
Variables utiles
Aplicacion
SERVER_PORTSPRING_PROFILES_ACTIVEAPP_TITLE
Base de datos
SPRING_DATASOURCE_URLSPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORDSPRING_JPA_HIBERNATE_DDL_AUTO
JWT API
APP_JWT_SECRET(minimo 32 caracteres)APP_JWT_EXPIRATION_HOURS
Seguridad
- Panel web: autenticacion por formulario con usuarios en base de datos
- API de escaneo: autenticacion stateless con JWT
/admin/**y/dashboard: requieren rolADMIN/api/pass-codes/scan: requiere rolSCANNERy token Bearer/api/auth/login: publico, pero solo emite token a usuariosSCANNER
Objetivo de esta base
Esta base deja resuelto lo minimo para arrancar nuevos proyectos internos:
- autenticacion local funcional para administradores
- autenticacion API para escaneo movil o externo
- layout inicial con Metronic
- dashboard simple
- modulo de codigos pase con QR y API de escaneo
- estructura modular limpia
- soporte rapido para H2 y PostgreSQL
El dashboard actual se mantiene deliberadamente sencillo para servir como punto de partida para futuras integraciones.