1. 项目概述
天盛装潢公司管理系统是一套基于SpringBoot框架开发的B/S架构企业信息化解决方案。这个系统我从零开始参与了完整的设计和开发过程,前后耗时近6个月,目前已在3家装潢公司实际部署运行。系统主要解决了装潢行业常见的项目管理混乱、材料库存不清、财务对账困难等痛点问题。
作为全栈开发者,我在这个项目中负责了技术选型、架构设计、核心模块开发以及最终的部署实施。系统采用前后端分离架构,后端基于SpringBoot 2.7 + MyBatis Plus,前端使用Vue3 + Element Plus,数据库选用MySQL 8.0,并整合了Redis作为缓存层。整套系统包含12个核心业务模块,代码总量超过5万行。
提示:本文会详细解析系统的技术实现方案,包含完整的部署指南和核心代码解读。所有配置参数和命令都经过生产环境验证,可直接用于实际项目。
2. 系统架构设计
2.1 技术栈选型考量
选择SpringBoot作为基础框架主要基于以下考虑:
- 快速开发:装潢行业需求变化频繁,需要快速迭代。SpringBoot的自动配置和起步依赖能显著提升开发效率
- 生态丰富:Spring生态有大量现成解决方案,如Spring Security用于权限控制,Spring Batch适合处理批量报表
- 易于维护:约定优于配置的原则使得项目结构清晰,新人上手快
数据库选型时对比了MySQL和PostgreSQL:
- MySQL 8.0在Window函数和JSON支持上已足够强大
- 装潢行业的材料清单通常包含非结构化数据,MySQL的JSON类型能满足需求
- 公司现有运维团队对MySQL更熟悉
2.2 系统模块划分
系统采用领域驱动设计(DDD)思想,将业务划分为以下核心领域:
mermaid复制graph TD
A[客户管理] --> B[项目跟踪]
B --> C[材料管理]
C --> D[施工管理]
D --> E[财务管理]
E --> F[报表中心]
实际代码结构中对应的包名为:
code复制com.tiansheng.decorate
├── customer # 客户管理
├── project # 项目管理
├── material # 材料管理
├── construct # 施工管理
├── finance # 财务管理
└── report # 报表中心
3. 核心功能实现
3.1 材料库存管理
装潢行业最头疼的就是材料管理,我们实现了智能预警机制:
- 材料入库时自动记录批次和供应商信息
- 出库采用先进先出(FIFO)原则
- 库存量低于阈值时自动触发预警
核心代码片段:
java复制// MaterialStockService.java
@Transactional
public void outbound(MaterialOutboundDTO dto) {
// 1. 查询可用库存(按入库时间排序)
List<MaterialStock> stocks = baseMapper.selectAvailableStocks(
dto.getMaterialId(),
dto.getQuantity()
);
// 2. 校验库存是否充足
if(stocks.stream().mapToInt(MaterialStock::getRemain).sum() < dto.getQuantity()){
throw new BusinessException("库存不足");
}
// 3. 扣减库存(按入库顺序)
int remaining = dto.getQuantity();
for(MaterialStock stock : stocks){
int deduct = Math.min(remaining, stock.getRemain());
stock.setRemain(stock.getRemain() - deduct);
updateById(stock);
remaining -= deduct;
// 记录出库明细
saveOutboundDetail(stock, deduct);
if(remaining == 0) break;
}
// 4. 检查库存预警
checkStockWarning(dto.getMaterialId());
}
3.2 项目进度跟踪
采用甘特图展示项目进度,关键技术点:
- 使用MP的自动填充功能记录各节点时间
- 通过Redis缓存进度数据,减轻数据库压力
- 前端使用ECharts实现可视化展示
进度状态机设计:
java复制// ProjectStateMachine.java
public enum ProjectState {
@Descriptor("待签约")
PENDING,
@Descriptor("设计中")
DESIGNING,
@Descriptor("施工中")
CONSTRUCTING,
@Descriptor("已完工")
COMPLETED,
@Descriptor("已结算")
SETTLED
}
// 状态转换规则
static {
TRANSITIONS.put(PENDING, Set.of(DESIGNING, CLOSED));
TRANSITIONS.put(DESIGNING, Set.of(CONSTRUCTING, CLOSED));
// ...其他状态转换规则
}
4. 系统部署指南
4.1 环境准备
生产环境推荐配置:
- 服务器:4核8G(最低2核4G)
- 操作系统:CentOS 7.6+
- 软件依赖:
- JDK 11(必须Oracle JDK)
- MySQL 8.0(配置innodb_buffer_pool_size=2G)
- Redis 6.x(配置maxmemory 1GB)
4.2 数据库初始化
- 创建数据库和用户:
sql复制CREATE DATABASE tiansheng_decorate CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'decorate'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON tiansheng_decorate.* TO 'decorate'@'%';
FLUSH PRIVILEGES;
- 执行初始化脚本:
bash复制mysql -u decorate -p tiansheng_decorate < /path/to/init.sql
4.3 应用部署
推荐使用Docker Compose部署:
yaml复制version: '3.8'
services:
app:
image: tiansheng/decorate:1.0.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/tiansheng_decorate
- SPRING_DATASOURCE_USERNAME=decorate
- SPRING_DATASOURCE_PASSWORD=StrongPassword123!
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=RootPass123!
- MYSQL_DATABASE=tiansheng_decorate
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6-alpine
command: redis-server --maxmemory 1gb --maxmemory-policy allkeys-lru
volumes:
mysql_data:
启动命令:
bash复制docker-compose up -d
5. 常见问题排查
5.1 性能优化建议
- 慢SQL问题:
- 开启MySQL慢查询日志
- 使用EXPLAIN分析执行计划
- 对project表的status字段添加索引
- 内存泄漏:
- 定期检查Redis内存使用情况
- 限制MyBatis一级缓存范围
- 配置JVM参数:-XX:+HeapDumpOnOutOfMemoryError
5.2 典型错误处理
- 文件上传失败:
- 检查nginx配置:client_max_body_size 20m;
- 确认存储目录权限:chmod -R 755 /data/upload
- 定时任务不执行:
- 检查@EnableScheduling注解是否启用
- 确认服务器时区配置:timedatectl set-timezone Asia/Shanghai
6. 二次开发建议
- 扩展接口:
java复制// 在现有API基础上添加版本控制
@RestController
@RequestMapping("/api/v1/materials")
public class MaterialControllerV1 extends MaterialController {
// 可重写父类方法实现版本差异
}
- 添加新模块:
- 使用代码生成器创建基础CRUD
- 在admin模块注册菜单路由
- 更新权限配置表
- 性能监控:
- 集成Prometheus + Grafana
- 关键指标:接口响应时间、SQL执行时间、JVM内存
这套系统在实际运行中经受住了日均300+并发请求的考验,特别是在2023年装修旺季期间,成功帮助客户管理了超过200个同时进行的装修项目。最大的收获是认识到清晰的领域划分和合理的状态机设计对业务系统的重要性。