毕业设计实战:基于SSM的一站式家装服务管理系统全流程指南
在开发“一站式家装服务管理系统”时,曾因“合同与工程安排的关联设计不清晰”踩过大坑——初期合同状态变更未同步更新工程进度,导致合同已终止但工程仍在进行。耗费2天重构状态同步逻辑才解决问题📝。本文将分享家装系统从需求到部署的全流程经验。
一、需求分析:聚焦家装全流程管理
核心用户与功能
用户端(业主)
- 风格选择:浏览装修风格库,收藏喜欢风格
- 预算规划:在线制定装修预算,选择主材
- 合同管理:查看合同状态,下载合同文件
- 工程跟进:查看工程安排,了解进度
- 售后服务:提交服务申请,查看服务记录
管理员端(装修公司)
- 风格管理:维护装修风格库(现代、中式、欧式等)
- 主材管理:管理主材库(品牌、价格、库存)
- 合同管理:审核合同,变更合同状态
- 工程安排:分配工程任务,跟踪进度
- 预算管理:审核用户预算方案
- 售后服务:处理用户售后申请
二、技术选型:稳定高效的SSM框架
推荐技术栈
- 后端:Spring + SpringMVC + MyBatis(SSM)
- 前端:Vue 2.x + ElementUI
- 数据库:MySQL 8.0
- 工具:IDEA + Maven + Git
- 部署:Tomcat 8.5
选型理由
- SSM框架:企业级应用成熟方案
- MyBatis:灵活SQL,便于复杂查询
- Vue+ElementUI:组件丰富,开发高效
- MySQL 8.0:性能稳定,支持JSON
三、数据库设计:关键业务表结构
核心表设计(优化版)
合同表(contract)
CREATE TABLE `contract` (
`id` int NOT NULL AUTO_INCREMENT,
`contract_no` varchar(50) NOT NULL COMMENT '合同编号',
`user_id` int NOT NULL COMMENT '业主ID',
`style_id` int COMMENT '装修风格ID',
`total_amount` decimal(10,2) NOT NULL COMMENT '合同总金额',
`deposit` decimal(10,2) COMMENT '定金',
`sign_date` date NOT NULL COMMENT '签订日期',
`start_date` date COMMENT '开工日期',
`end_date` date COMMENT '完工日期',
`status` tinyint DEFAULT 1 COMMENT '1待审核 2已生效 3进行中 4已完成 5已终止',
`attachment` varchar(500) COMMENT '合同附件路径',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_no` (`contract_no`),
INDEX `idx_user_status` (`user_id`, `status`)
);
工程安排表(project_schedule)
CREATE TABLE `project_schedule` (
`id` int NOT NULL AUTO_INCREMENT,
`contract_id` int NOT NULL COMMENT '合同ID',
`phase` tinyint NOT NULL COMMENT '阶段:1设计 2拆改 3水电 4泥木 5油漆 6安装',
`phase_name` varchar(50) NOT NULL COMMENT '阶段名称',
`plan_start` date COMMENT '计划开始',
`plan_end` date COMMENT '计划结束',
`actual_start` date COMMENT '实际开始',
`actual_end` date COMMENT '实际结束',
`status` tinyint DEFAULT 1 COMMENT '1未开始 2进行中 3已完成',
`responsible` varchar(50) COMMENT '负责人',
`contact` varchar(20) COMMENT '联系方式',
`remark` text COMMENT '备注',
PRIMARY KEY (`id`),
INDEX `idx_contract_phase` (`contract_id`, `phase`)
);
预算表(budget)
CREATE TABLE `budget` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`budget_no` varchar(50) COMMENT '预算编号',
`style_id` int NOT NULL COMMENT '风格ID',
`total_budget` decimal(10,2) NOT NULL COMMENT '总预算',
`design_fee` decimal(10,2) COMMENT '设计费',
`material_fee` decimal(10,2) COMMENT '材料费',
`labor_fee` decimal(10,2) COMMENT '人工费',
`other_fee` decimal(10,2) COMMENT '其他费用',
`status` tinyint DEFAULT 1 COMMENT '1草稿 2已提交 3已审核',
PRIMARY KEY (`id`)
);
设计要点
- 合同状态机:明确定义合同状态流转规则
- 工程阶段:标准化家装工程流程
- 金额字段:统一使用decimal(10,2)存储金额
- 关联关系:合同-工程-预算的完整关联链
四、核心业务逻辑实现
1. 合同状态同步工程进度
@Service
public class ContractService {
@Transactional
public Result updateContractStatus(Integer contractId, Integer status) {
Contract contract = contractMapper.selectById(contractId);
if (contract == null) {
return Result.error("合同不存在");
}
// 状态流转校验
if (!canTransition(contract.getStatus(), status)) {
return Result.error("状态流转不合法");
}
// 更新合同状态
contract.setStatus(status);
contractMapper.updateById(contract);
// 根据状态同步工程安排
syncProjectSchedule(contractId, status);
return Result.success("状态更新成功");
}
private void syncProjectSchedule(Integer contractId, Integer status) {
if (status == 3) { // 合同进行中
// 自动创建第一个工程阶段
ProjectSchedule firstPhase = new ProjectSchedule();
firstPhase.setContractId(contractId);
firstPhase.setPhase(1);
firstPhase.setPhaseName("设计阶段");
firstPhase.setStatus(2); // 进行中
projectScheduleMapper.insert(firstPhase);
} else if (status == 4) { // 合同已完成
// 标记所有工程阶段为已完成
projectScheduleMapper.updateStatusByContract(
contractId, 3); // 3=已完成
}
}
}
2. 预算生成与主材关联
@Service
public class BudgetService {
public Budget generateBudget(Integer userId, Integer styleId) {
// 1. 获取风格信息
DecorationStyle style = styleMapper.selectById(styleId);
// 2. 根据风格推荐主材
List<MainMaterial> materials = mainMaterialMapper
.selectByStyle(styleId);
// 3. 计算各项费用
Budget budget = new Budget();
budget.setUserId(userId);
budget.setStyleId(styleId);
budget.setBudgetNo(generateBudgetNo());
// 计算材料费
BigDecimal materialFee = materials.stream()
.map(MainMaterial::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
budget.setMaterialFee(materialFee);
// 估算人工费(材料费的30%)
budget.setLaborFee(materialFee.multiply(
new BigDecimal("0.3")));
// 总预算
budget.setTotalBudget(budget.getMaterialFee()
.add(budget.getLaborFee())
.add(budget.getDesignFee()));
return budget;
}
}
五、测试要点
核心测试场景
- 合同状态流转:测试状态机所有合法流转路径
- 工程阶段同步:合同状态变更时工程阶段的同步更新
- 预算计算:不同风格预算的自动计算准确性
- 主材库存:主材选择与库存校验
测试数据准备
-- 测试风格
INSERT INTO decoration_style VALUES
(1, '现代简约', '现代简约风格', 1, '120平');
-- 测试主材
INSERT INTO main_material VALUES
(1, '大理石瓷砖', 1, '片', 150.00, 1000);
-- 测试合同
INSERT INTO contract VALUES
(1, 'HT20240601001', 1, 1, 150000.00,
30000.00, '2024-06-01', NULL, NULL, 1, '');
六、部署与优化
快速部署
- SSM项目部署
<!-- pom.xml关键依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
- 数据库配置
# jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/home_decoration?useSSL=false
jdbc.username=root
jdbc.password=123456
性能优化建议
-
数据库优化
- 合同、工程表按年份分表
- 主材图片使用CDN存储
- 频繁查询字段添加复合索引
-
缓存策略
- 装修风格列表缓存(1小时)
- 主材分类缓存(永不过期)
- 合同状态缓存(实时更新)
-
业务优化
- 预算计算使用缓存结果
- 工程进度批量更新
- 异步处理图片上传
答辩准备要点
1. 演示流程(3分钟)
- 用户端:选择风格 → 生成预算 → 签订合同 → 查看工程
- 管理员端:审核合同 → 安排工程 → 管理主材 → 处理售后
2. 技术亮点
- 状态同步机制:合同与工程进度自动同步
- 预算智能计算:基于风格自动生成预算方案
- 全流程跟踪:设计-施工-售后的完整闭环
3. 常见问题准备
- Q:如何处理合同变更? A:版本控制+变更记录+重新计算工期
- Q:主材价格变动怎么办? A:价格历史记录+预算预警机制
- Q:工程延期如何处理? A:进度预警+责任划分+违约金计算
结语
一站式家装系统的核心在于业务流程的完整性与数据关联的准确性。重点关注以下三点:
- 合同管理:状态流转与工程进度的强关联
- 预算控制:动态计算与实时预警
- 进度跟踪:可视化展示与异常预警
采用SSM+Vue技术栈可稳定实现,数据库设计时注意业务约束的完整性。测试阶段重点验证状态同步和金额计算。
资源获取:需要完整源码和数据库脚本,评论区留言"家装系统"。
关键提醒:务必设计完善的合同状态机,这是系统业务流程的核心。
收藏本文,开发过程随时参考。祝各位毕设顺利!🎉