1. 项目概述:企业级装饰工程管理系统的技术架构解析
这套基于Spring Boot+Vue+MyBatis+MySQL的装饰工程管理系统,是典型的现代化企业级应用解决方案。作为在工程管理领域深耕多年的开发者,我见证了大量装饰公司从纸质台账到Excel管理,再到专业系统的演进过程。当前市面上的工程管理软件要么功能冗余,要么价格高昂,而这套开源方案正好填补了中小型装饰企业的数字化空白。
系统采用前后端分离架构,后端使用Spring Boot 2.7提供RESTful API,前端通过Vue 3组合式API构建交互界面,MyBatis-Plus 3.5作为ORM层,MySQL 8.0负责数据持久化。这种技术组合既保证了系统性能,又具备良好的可维护性,特别适合需要快速迭代的工程管理场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计
2.1 项目全生命周期管理
系统以装饰工程项目为主线,实现从投标立项到竣工验收的全流程数字化:
- 立项管理:自动生成项目编号规则为"年份+类型+序号"(如2023-DEC-001),包含预算编制模板
- 进度看板:甘特图与日历视图双模式,支持拖拽调整任务依赖关系
- 材料管理:内置2000+装饰材料库,支持扫码入库和批次追踪
- 质量验收:移动端拍照上传+水印定位,自动生成验收报告PDF
2.2 智能预警系统
通过Spring Schedule实现定时任务扫描:
java复制@Scheduled(cron = "0 0 9 * * ?")
public void checkProjectDelay() {
// 查询逾期3天未更新的项目
List<Project> delayed = projectMapper.selectDelayedProjects();
delayed.forEach(proj -> {
smsService.sendDelayAlert(proj.getManager());
});
}
2.3 多维度数据分析
利用MyBatis动态SQL构建灵活报表:
xml复制<select id="selectCostAnalysis" resultType="CostVO">
SELECT
project_type,
SUM(material_cost) AS material,
SUM(labor_cost) AS labor
FROM project_cost
<where>
<if test="year != null">
YEAR(create_time) = #{year}
</if>
<if test="deptId != null">
AND dept_id = #{deptId}
</if>
</where>
GROUP BY project_type
</select>
3. 关键技术实现细节
3.1 Spring Boot多环境配置
采用profile区分开发/测试/生产环境:
code复制application-dev.yml # 开发环境H2内存数据库
application-test.yml # 测试环境MySQL容器
application-prod.yml # 生产环境MySQL集群
通过maven资源过滤自动打包对应配置:
xml复制<profiles>
<profile>
<id>prod</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>
3.2 Vue前端工程化实践
使用Vite构建工具实现:
- 按需加载:路由级代码分割
- 主题切换:CSS变量动态注入
- 权限控制:基于路由meta的全局守卫
javascript复制router.beforeEach((to, from, next) => {
const roles = store.getters.roles
if (to.meta.roles && !to.meta.roles.includes(roles)) {
next('/403')
} else {
next()
}
})
3.3 MyBatis-Plus高级特性应用
- 逻辑删除:全局配置@TableLogic
- 自动填充:@TableField(fill = FieldFill.INSERT)
- 多租户:TenantLineInnerInterceptor
- 性能分析:P6Spy格式SQL日志
4. 数据库设计与优化
4.1 MySQL核心表结构
| 表名 | 字段数 | 索引数 | 说明 |
|---|---|---|---|
| project | 28 | 5 | 项目主表 |
| material | 19 | 4 | 材料库存 |
| progress | 12 | 3 | 进度节点 |
| quality_check | 15 | 2 | 质检记录 |
4.2 分库分表策略
按项目区域水平分片:
yaml复制spring:
shardingsphere:
datasource:
names: ds0,ds1
sharding:
tables:
project:
actual-data-nodes: ds$->{0..1}.project_$->{0..1}
table-strategy:
inline:
sharding-column: region_code
algorithm-expression: project_$->{region_code % 2}
4.3 查询优化方案
- 为常用查询添加覆盖索引
- 大文本字段单独存储
- 使用CTE递归查询树形结构
- 定时归档历史数据
5. 系统部署与运维
5.1 容器化部署方案
Docker Compose编排文件示例:
yaml复制version: '3'
services:
app:
image: openjdk:17-jdk
ports:
- "8080:8080"
volumes:
- ./logs:/app/logs
depends_on:
- redis
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
5.2 性能监控配置
- Spring Boot Actuator暴露/metrics端点
- Prometheus采集JVM指标
- Grafana展示工程管理专属看板
- ELK收集业务日志
5.3 安全防护措施
- JWT令牌自动续期
- 接口幂等性设计
- 敏感数据AES加密
- 操作日志审计追踪
6. 典型问题排查实录
6.1 MyBatis缓存导致数据不一致
现象:材料库存更新后界面显示旧数据
解决:在Mapper上添加@CacheNamespace(flushInterval=60000)
6.2 Vue长列表卡顿
优化方案:
- 使用vue-virtual-scroller组件
- 分页加载+滚动监听
- 冻结非可视区域DOM
6.3 MySQL死锁问题
日志分析:
code复制LATEST DETECTED DEADLOCK
2023-08-20 14:23:45
*** (1) TRANSACTION:
UPDATE material SET stock=100 WHERE id=1
*** (2) TRANSACTION:
UPDATE project SET status=2 WHERE id=10
解决方案:调整事务隔离级别为READ_COMMITTED
7. 二次开发建议
7.1 扩展移动端功能
- 集成uni-app跨端框架
- 添加扫码领料功能
- 开发微信小程序版本
7.2 对接智能硬件
- 通过MQTT连接物联网传感器
- 工地摄像头AI识别安全违规
- 智能电表数据自动采集
7.3 增强BI能力
- 接入Apache ECharts
- 实现材料价格趋势预测
- 构建项目风险评估模型
在实际部署过程中,建议先在小规模项目组试运行,重点验证材料管理和进度追踪功能的实用性。我们团队在实施时发现,添加自定义审批流能显著提升装饰公司的流程规范性,这可以通过集成Activiti工作流引擎来实现。对于初期使用者,务必做好数据迁移方案的设计,特别是历史项目数据的结构化转换。
