Aplicación full‑stack para registrar ingresos y gastos, consultar tu histórico, ver resúmenes y estadísticas (gráficas), y exportar informes a Excel/PDF. Incluye autenticación con JWT, modo claro/oscuro y gestión de perfil (editar datos, reset de transacciones y eliminación de cuenta).
- Registro / login (JWT).
- Mis transacciones
- Crear, editar y eliminar transacciones.
- Filtro y ordenación.
- Exportar listado a Excel y PDF.
- Dashboard
- Resumen financiero (ingresos, gastos, balance).
- Gráficas (categorías / evolución temporal).
- Exportar informe a Excel y PDF.
- Perfil
- Cambiar tema claro/oscuro.
- Editar nombre, email y contraseña.
- Borrar todas las transacciones del usuario.
- Eliminar cuenta (borra usuario + transacciones).
- Frontend: Angular (standalone components), Angular Material, Bootstrap, Chart.js
- Backend: Spring Boot 3 (Java 17), Spring Security, Spring Data JPA
- BBDD: PostgreSQL
- Auth: JWT (header
Authorization: Bearer <token>)
frontend/: aplicación Angularbackend/: API REST con Spring Boot
- Node.js (recomendado LTS)
- Angular CLI (opcional, se puede usar
npx) - Java 17
- Maven
- PostgreSQL
El backend lee credenciales y el secreto JWT desde variables de entorno (ver backend/src/main/resources/application.properties y backend/docker-compose.yml).
- Copia el ejemplo y créalo como
.envsolo en tu máquina:
cd backend
cp .env.example .env- Edita
backend/.envy sustituye los valoresREPLACE_*por datos reales. - Genera un
JWT_SECRET_KEYnuevo (Base64, suficiente longitud), por ejemplo:
openssl rand -base64 48Importante: si alguna vez subiste un
.envreal al repositorio, rota todas esas credenciales y el secreto JWT antes de hacer el repo público. Si ya se hizogit push, considera también limpiar el historial (p. ej.git filter-repo) o asumir que esos secretos están comprometidos.
Desde la raíz del monorepo:
git check-ignore -v backend/.envDebe mostrar una regla del .gitignore. Si no aparece nada, no hagas push hasta corregir la configuración.
En application.properties se usan placeholders ${SPRING_DATASOURCE_*}; los valores reales van en .env o en el entorno del sistema.
No existe application.yml con secretos en el código versionado; evita crear application-local.properties con contraseñas y subirlo (está ignorado en .gitignore).
Las URLs del backend están definidas como http://localhost:8080/... en los servicios de Angular (auth, expense, user). No hay src/environments/environment*.ts en este proyecto: es una configuración típica de demo local. Para despliegues reales conviene externalizar la URL base (build-time o proxy) sin hardcodear el host de producción en el código.
Desde backend/ (con backend/.env ya creado a partir de .env.example):
docker compose up --build- API:
http://localhost:8080 - Adminer (solo desarrollo):
http://localhost:8081
Ajusta SPRING_DATASOURCE_URL en .env a jdbc:postgresql://postgres:5432/... cuando el backend corre dentro de Docker, o a localhost si ejecutas Spring solo en el host.
Este proyecto está pensado para poder empezar como repositorio privado y pasar a público cuando el historial esté limpio (sin .env ni artefactos) y las credenciales sean solo locales o de CI secretas. Revisa SECURITY.md.
Desde backend/:
mvn spring-boot:runLa API queda (por defecto) en http://localhost:8080.
Desde frontend/:
npm install
npm startLa app queda en http://localhost:4200.
- Auth
POST /api/auth/register(name, email, password)POST /api/auth/login(email, password) → devuelve{ token }
- Transacciones
GET /api/expenses/mePOST /api/expensesPUT /api/expenses/{id}DELETE /api/expenses/{id}POST /api/expenses/reset(borra todas las transacciones del usuario autenticado)
- Usuario
GET /api/users/mePUT /api/users/meDELETE /api/users/me(elimina cuenta + transacciones)
El tema se guarda en localStorage (clave app-theme) y se aplica vía data-bs-theme en el <html>.
Las contraseñas se guardan en la base de datos como MD5 (hex) al:
- registrar un usuario
- cambiar la contraseña desde el perfil
Importante: MD5 no es recomendable para contraseñas en producción. Para un entorno real se recomienda
bcrypt/argon2con salt y coste configurable.
Frontend:
npm start # ng serve
npm run build # buildBackend:
mvn test
mvn -DskipTests packageProyecto educativo / personal.