1. 项目概述
"基于SpringBoot的家装预算系统"是一个面向家庭装修场景的预算管理与成本控制解决方案。该系统采用SpringBoot框架作为技术底座,整合了材料清单管理、人工费用计算、项目进度跟踪等核心功能模块,帮助用户实现装修全周期的财务可视化。
作为开发者,我在实际装修过程中深刻体会到传统Excel表格管理的局限性——数据分散、版本混乱、多人协作困难。这正是我决定开发这套系统的初衷。系统采用B/S架构,前端使用Vue.js实现响应式界面,后端基于SpringBoot 2.7.x构建,数据持久层采用MyBatis-Plus,整体技术栈成熟稳定。
2. 系统核心功能解析
2.1 多维度预算编制
系统支持按空间维度(客厅/卧室/厨房等)和工种维度(水电/泥瓦/木工等)两种方式创建预算模板。每个预算项包含:
- 材料规格参数(品牌/型号/单位)
- 市场参考价区间
- 实际采购价记录
- 供应商联系方式
- 采购状态跟踪
java复制// 预算项实体类示例
@Data
public class BudgetItem {
private Long id;
private String category; // 分类:材料/人工
private String spaceType; // 空间类型
private String workType; // 工种类型
private String productName;
private String specification;
private BigDecimal marketPriceMin;
private BigDecimal marketPriceMax;
private BigDecimal actualPrice;
private Integer quantity;
private String supplierInfo;
private Integer status; // 0-未采购 1-已下单 2-已到货
}
2.2 实时成本预警
系统通过配置阈值规则实现自动预警:
- 单项超支预警(实际价 > 预算价×110%)
- 分类超支预警(分类实际总额 > 分类预算×105%)
- 总预算红线预警(实际总支出 > 总预算×90%时提醒)
实际开发中发现,单纯百分比预警可能不够精准,后期增加了基于历史采购数据的智能预测功能,通过线性回归算法预测最终可能超支的金额。
2.3 供应商比价系统
集成主流电商平台API实现:
- 自动抓取京东/天猫等平台同款商品价格
- 本地建材市场报价录入
- 生成比价雷达图
- 支持导出比价Excel报表
3. 技术架构详解
3.1 后端技术栈
采用分层架构设计:
code复制com.deco.budget
├── config # 配置类
├── controller # 表现层
├── service # 业务逻辑
│ ├── impl # 实现类
├── dao # 数据访问
├── entity # 实体类
├── util # 工具包
└── exception # 异常处理
3.1.1 SpringBoot关键配置
yaml复制# application-prod.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/deco_budget?useSSL=false
username: root
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: 20
connection-timeout: 30000
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.1.2 特色功能实现
材料价格波动监控:
java复制@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
public void monitorMaterialPrice() {
List<Material> materials = materialService.listNeedMonitor();
materials.forEach(material -> {
BigDecimal latestPrice = jdService.getLatestPrice(material.getSku());
if (latestPrice.compareTo(material.getReferencePrice()) < 0) {
alertService.sendDiscountAlert(material, latestPrice);
}
});
}
3.2 前端技术方案
采用Vue3 + Element Plus实现:
- 使用ECharts展示预算执行情况
- 微信扫码登录集成
- 移动端适配方案:
css复制/* 响应式布局 */
@media (max-width: 768px) {
.budget-form {
grid-template-columns: 1fr;
}
.chart-container {
height: 300px;
}
}
4. 部署实践指南
4.1 本地开发环境
- 基础环境准备:
bash复制# JDK安装
brew install openjdk@11
# Maven配置
export MAVEN_HOME=/usr/local/apache-maven-3.8.6
export PATH=$MAVEN_HOME/bin:$PATH
- 数据库初始化:
sql复制CREATE DATABASE deco_budget CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON deco_budget.* TO 'deco_user'@'%' IDENTIFIED BY 'yourpassword';
4.2 生产环境部署
推荐使用Docker Compose部署:
dockerfile复制version: '3'
services:
app:
image: openjdk:11-jre
volumes:
- ./target/deco-budget.jar:/app.jar
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
command: ["java", "-jar", "/app.jar"]
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: deco_budget
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
4.3 性能优化建议
- 缓存配置:
java复制@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
- 数据库索引优化:
sql复制ALTER TABLE budget_item ADD INDEX idx_category_space (category, space_type);
ALTER TABLE material_price ADD INDEX idx_sku_date (sku, price_date);
5. 常见问题解决方案
5.1 数据导入导出问题
Excel导入乱码:
- 解决方案:统一使用POI的XSSFWorkbook处理.xlsx文件
java复制public List<BudgetItem> importExcel(MultipartFile file) {
Workbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
// 数据处理逻辑...
}
PDF导出样式错乱:
- 推荐使用Flying Saucer + Thymeleaf方案:
xml复制<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
5.2 微信登录集成
获取用户信息失败:
- 检查公众号网页授权域名配置
- 确保redirect_uri使用urlencode编码
- 注意access_token的时效性(2小时)
java复制public String getWechatUserInfo(String code) {
String tokenUrl = String.format(
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
appId, appSecret, code);
// 发送HTTP请求...
}
5.3 性能瓶颈处理
材料比价响应慢:
- 采用多线程并行查询:
java复制CompletableFuture<BigDecimal> jdPrice = CompletableFuture.supplyAsync(
() -> jdService.getPrice(sku), executor);
CompletableFuture<BigDecimal> tmPrice = CompletableFuture.supplyAsync(
() -> tmService.getPrice(sku), executor);
CompletableFuture.allOf(jdPrice, tmPrice).join();
6. 项目扩展方向
- AR量房功能:集成ARKit/ARCore,通过手机摄像头测量房间尺寸
- 3D效果预览:使用Three.js实现装修效果可视化
- 供应链金融:对接银行API提供装修分期服务
- 智能推荐:基于用户画像推荐建材组合方案
实际开发中,我特别推荐使用Lombok简化实体类代码,但要注意在IDE中安装对应插件。另外,对于预算这种需要精确计算的场景,务必使用BigDecimal而非Double,我在初期版本中就曾因浮点数精度问题导致计算结果出现偏差。
