Sistema de Gestión de Presupuestos para Decoración del Hogar con SpringBoot

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>

Etiquetas: SpringBoot vue.js MySQL Redis MyBatis-Plus

Publicado el 7-29 12:56