1. 项目概述:SpringBoot空调报修系统设计与实现
空调报修系统作为现代物业管理和设备维护的重要工具,在校园、写字楼、商场等场景中有着广泛的应用需求。这个基于SpringBoot的毕业设计项目,不仅符合计算机专业学生的实践要求,更是一个具有实际应用价值的典型案例。
系统采用B/S架构,前端使用Thymeleaf模板引擎,后端基于SpringBoot 2.7.x构建,数据库选用MySQL 8.0。整个系统实现了从用户报修、工单分配到维修完成的完整闭环流程,特别适合作为毕业设计选题,因为它在技术复杂度与实际应用价值之间取得了良好平衡。
提示:选择空调报修系统作为毕设题目有几个明显优势 - 业务逻辑清晰但不过于简单;可以展示完整CRUD操作;能体现工作流设计思想;便于扩展物联网等前沿技术。
2. 系统核心功能模块解析
2.1 用户角色与权限设计
系统采用RBAC(基于角色的访问控制)模型,定义了三种核心角色:
- 普通用户:提交报修单、查看处理进度、评价服务
- 维修人员:接收工单、更新维修状态、填写维修记录
- 管理员:用户管理、工单分配、数据统计、系统配置
权限控制通过Spring Security实现,关键配置如下:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/repair/**").hasAnyRole("STAFF", "ADMIN")
.antMatchers("/user/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/dashboard");
}
}
2.2 报修工单流转机制
工单状态机是系统的核心业务逻辑,包含以下状态转换:
code复制待受理 → 已分配 → 维修中 → 已完成 → 已评价
↘ ↘
已驳回 维修取消
使用枚举类定义状态:
java复制public enum RepairStatus {
PENDING("待受理"),
ASSIGNED("已分配"),
PROCESSING("维修中"),
COMPLETED("已完成"),
REJECTED("已驳回"),
CANCELLED("维修取消"),
EVALUATED("已评价");
private final String description;
// constructor & getter
}
2.3 数据库设计关键表结构
repair_order表(核心业务表):
sql复制CREATE TABLE `repair_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '报修用户ID',
`staff_id` bigint DEFAULT NULL COMMENT '分配员工ID',
`device_id` varchar(32) NOT NULL COMMENT '设备编号',
`fault_type` varchar(50) NOT NULL COMMENT '故障类型',
`description` text COMMENT '详细描述',
`images` varchar(512) DEFAULT NULL COMMENT '图片URL,多个用逗号分隔',
`status` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '工单状态',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 技术实现细节与避坑指南
3.1 SpringBoot多环境配置
实际开发中需要区分dev/test/prod环境,推荐采用以下配置结构:
code复制resources/
├── application.yml
├── application-dev.yml
├── application-test.yml
└── application-prod.yml
在application.yml中通过spring.profiles.active指定默认环境:
yaml复制spring:
profiles:
active: @activatedProperties@
注意:在pom.xml中需要配置profile过滤,否则@activatedProperties@不会被替换:
xml复制<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
</profile>
</profiles>
3.2 文件上传与存储方案
空调报修通常需要上传故障图片,推荐两种存储方案:
方案一:本地存储(适合毕设演示)
java复制@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
throw new RuntimeException("请选择上传文件");
}
String filename = UUID.randomUUID() +
FilenameUtils.getExtension(file.getOriginalFilename());
Path path = Paths.get("upload-dir", filename);
try {
Files.copy(file.getInputStream(), path,
StandardCopyOption.REPLACE_EXISTING);
return "/uploads/" + filename;
} catch (IOException e) {
throw new RuntimeException("文件上传失败", e);
}
}
方案二:云存储(推荐生产环境使用)
- 阿里云OSS
- 七牛云
- 腾讯云COS
3.3 定时任务与工单超时处理
使用Spring Scheduled实现工单超时自动提醒:
java复制@Service
@RequiredArgsConstructor
public class RepairTimeoutService {
private final RepairOrderMapper orderMapper;
private final NotificationService notificationService;
@Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
public void checkTimeoutOrders() {
List<RepairOrder> timeoutOrders = orderMapper.selectTimeoutOrders(
LocalDateTime.now().minusDays(2));
timeoutOrders.forEach(order -> {
notificationService.sendTimeoutAlert(order);
order.setStatus(RepairStatus.PROCESSING);
orderMapper.updateById(order);
});
}
}
4. 典型问题排查与优化建议
4.1 跨域问题解决方案
前后端分离开发时常见的跨域问题,可通过以下配置解决:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
4.2 事务管理最佳实践
报修系统涉及多个表的原子性操作,务必正确使用事务:
java复制@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class RepairOrderService {
private final RepairOrderMapper orderMapper;
private final DeviceMapper deviceMapper;
public void createOrder(CreateOrderDTO dto) {
// 检查设备状态
Device device = deviceMapper.selectById(dto.getDeviceId());
if (device == null) {
throw new RuntimeException("设备不存在");
}
// 创建工单
RepairOrder order = new RepairOrder();
BeanUtils.copyProperties(dto, order);
orderMapper.insert(order);
// 更新设备状态
device.setStatus(DeviceStatus.REPAIRING);
deviceMapper.updateById(device);
}
}
4.3 性能优化关键点
-
数据库索引优化:
- 为status, user_id, create_time等查询字段添加索引
- 避免在where条件中对字段进行函数操作
-
缓存策略:
java复制@Cacheable(value = "repairOrders", key = "#orderId") public RepairOrder getOrderDetail(Long orderId) { return orderMapper.selectById(orderId); } -
分页查询优化:
xml复制<select id="selectPage" resultType="RepairOrder"> SELECT * FROM repair_order WHERE status = #{status} ORDER BY create_time DESC LIMIT #{offset}, #{pageSize} </select>
5. 项目扩展方向与毕业设计加分项
5.1 微信小程序集成
为提升用户体验,可以扩展微信小程序端:
- 使用uni-app跨平台框架
- 通过JWT实现安全认证
- 集成微信支付完成维修费用结算
5.2 物联网设备对接
进阶功能可对接真实空调设备:
- 通过MQTT协议接收设备异常报警
- 自动创建维修工单
- 维修完成后远程重启设备
5.3 数据分析模块
使用ECharts实现数据可视化:
java复制@GetMapping("/stats")
public RepairStatsVO getStats() {
return new RepairStatsVO(
orderMapper.countByStatus("COMPLETED"),
orderMapper.avgProcessTime(),
orderMapper.countByFaultType()
);
}
6. 源码结构与关键代码说明
项目采用标准Maven结构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── entity/ # 实体类
│ │ ├── mapper/ # MyBatis接口
│ │ ├── service/ # 业务逻辑
│ │ └── Application.java
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── application.yml
└── test/ # 测试代码
关键依赖(pom.xml节选):
xml复制<dependencies>
<!-- SpringBoot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 持久层 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 工具类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在实现过程中,我特别推荐使用MyBatis-Plus的Active Record模式来简化开发:
java复制@Data
@TableName("repair_order")
public class RepairOrder {
@TableId(type = IdType.AUTO)
private Long id;
private Long userId;
private String deviceId;
private String faultType;
private String description;
private String status;
private LocalDateTime createTime;
public void saveOrder() {
this.insert();
}
public static List<RepairOrder> findByUser(Long userId) {
return new LambdaQueryChainWrapper<>(getSqlSession())
.eq(RepairOrder::getUserId, userId)
.list();
}
}
7. 毕业设计答辩准备建议
-
技术亮点提炼:
- SpringBoot自动配置原理
- 工单状态机设计
- 权限控制实现方案
-
演示重点:
- 完整走通一个报修流程
- 展示不同角色的界面差异
- 演示异常情况处理(如重复提交)
-
常见问题准备:
- 为什么选择SpringBoot而不是SSM?
- 系统如何处理高并发场景?
- 如果增加短信通知功能会如何设计?
-
文档规范:
- UML图要使用标准工具绘制(推荐PlantUML)
- 数据库设计文档要包含ER图
- 接口文档使用Swagger或YAPI生成
在项目部署时,如果遇到"Port 8080 already in use"错误,可以通过以下命令查找并终止占用进程:
bash复制# Linux/Mac
lsof -i :8080
kill -9 <PID>
# Windows
netstat -ano | findstr 8080
taskkill /PID <PID> /F
对于需要打包部署的项目,推荐使用SpringBoot Maven插件:
bash复制mvn clean package -DskipTests
java -jar target/air-condition-repair-0.0.1-SNAPSHOT.jar
