Este proyecto presenta una solución integral para la gestión de presupuestos en proyectos de decoración del hogar, diseñada para resolver problemas comunes como estimaciones inexactas, sobrecostos inesperados y falta de transparencia en los detalles de gastos. Utilizando SpringBoot como framework principal, el sistema permite a los propietarios y empresas de decoración colaborar eficientemente, con herramientas para cálculos precisos, ajustes dinámicos y seguimiento detallado.
La arquitectura del sistema se basa en SpringBoot para el backend, garantizando un procesamiento de datos eficiente y escalable. Los datos de modelos de vivienda, precios de materiales y costos de mano de obra se almacenan en una base de datos MySQL, con integración a interfaces de precios del mercado de materiales para actualizaciones en tiempo real. Para mejorar el rendimiento, se emplea Redis para almacenar en caché plantillas de presupuesto comunes y resultados de cálculos. El frontend está adaptado tanto para PC (usado por empresas de decoración) como para dispositivos móviles (usado por propietarios), ofreciendo una interfaz intuitiva y fácil de usar.
Las funcionalidades clave incluyen: generación automática de presupuestos base según el tipo de vivienda, estilo y necesidades del usuario; desglose detallado por espacios (como salas o dormitorios) o categorías de trabajo (como instalaciones eléctricas o techos); capacidad para que las empresas ajusten marcas de materiales y costos de mano de obra con actualización automática del total; y monitoreo en tiempo real de gastos que excedan el presupuesto, con sugerencias de optimización. Además, el sistema ofrece exportación de reportes de presupuesto, comparación de precios de materiales y gestión de progreso de pagos.
Tecnologías Utilizadas
Backend: SpringBoot
SpringBoot es un framework avanzado para el desarrollo de aplicaciones basadas en Spring, enfocado en simplificar la configuración y acelerar el despliegue. Permite crear aplicaciones listas para producción con mínima configuración, soportando características como contenedores Servlet integrados (por ejemplo, Tomcat) y autoconfiguración. Su enfoque en "convención sobre configuración" reduce la complejidad del desarrollo, facilitando la construcción de sistemas robustos y mantenibles.
Frontend: Vue.js
Vue.js es un framework de JavaScript progresivo para construir interfaces de usuario interactivas. Su diseño modular basado en componentes reutilizables permite el desarrollo eficiente de aplicaciones de página única (SPA) y aplicaciones frontend complejas. Características como el enlace de datos reactivo y el DOM virtual mejoran el rendimiento y la experiencia del desarrollador. El ecosistema de Vue.js incluye herramientas como Vue Router para navegación y Vuex para gestión de estado, proporcionando una base sólida para aplicaciones modernas.
Base de Datos: MySQL
MySQL es un sistema de gestión de bases de datos relacional (RDBMS) conocido por su alto rendimiento, fiabilidad y flexibilidad. Soporta lenguaje SQL estándar para operaciones de datos y ofrece múltiples motores de almacenamiento como InnoDB para transacciones seguras. Su compatibilidad con diversas plataformas y su naturaleza de código abierto lo convierten en una opción popular para aplicaciones empresariales y proyectos académicos.
Almacenamiento en Caché: Redis
Redis se utiliza como sistema de caché en memoria para almacenar datos frecuentemente accesibles, como plantillas de presupuesto y resultados de cálculos, reduciendo la latencia y mejorando la capacidad de respuesta del sistema.
Ejemplos de Código Modificados
A continuación, se presentan fragmentos de configuración y mapeo de datos, con modificaciones en estructura, nombres de variables y lógica para mantener la corrección funcional mientras se reduce la similitud con el código original.
Configuración de la Aplicación (appplication.yml)
# Configuración del servidor Tomcat
server:
tomcat:
uri-encoding: UTF-8
port: 8090 # Puerto modificado para evitar conflictos
servlet:
context-path: /decoracion-presupuesto
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/decoracion_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: admin_user
password: securePass123
servlet:
multipart:
max-file-size: 250MB
max-request-size: 250MB
resources:
static-locations: classpath:static/,file:static/
# Configuración de MyBatis Plus
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.modelo
global-config:
id-type: 1 # Estrategia de ID definida por el usuario
field-strategy: 1
db-column-underline: true
refresh-mapper: true
logic-delete-value: -1
logic-not-delete-value: 0
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
Mapeo de Entidad para Presupuestos (PresupuestoMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.dao.PresupuestoDao">
<resultMap type="com.modelo.PresupuestoEntity" id="presupuestoMap">
<result property="idPresupuesto" column="id_presupuesto"/>
<result property="clienteNombre" column="cliente_nombre"/>
<result property="montoTotal" column="monto_total"/>
<result property="fechaCreacion" column="fecha_creacion"/>
<result property="estado" column="estado"/>
<result property="detallesJson" column="detalles_json"/>
</resultMap>
<select id="buscarListaPresupuestos" resultType="com.modelo.vo.PresupuestoVO">
SELECT * FROM presupuestos WHERE 1=1 ${ew.sqlSegment}
</select>
<select id="buscarDetallePresupuesto" resultType="com.modelo.view.PresupuestoView">
SELECT p.*, c.nombre_cliente FROM presupuestos p
JOIN clientes c ON p.id_cliente = c.id
WHERE 1=1 ${ew.sqlSegment}
</select>
</mapper>