1. 项目背景与核心需求
大学宿舍作为学生日常生活的重要场所,设备设施的维护管理一直是后勤工作的难点。传统纸质报修单存在流转效率低、进度不透明、数据难统计等问题。这个基于SpringBoot的宿舍报修系统正是为解决这些痛点而设计。
我在实际开发中发现,一个合格的报修系统需要满足三个核心需求:
- 学生端:便捷提交报修单(含文字描述、图片上传)、实时查看处理进度、对服务进行评价
- 维修端:任务智能分配、移动端接单、维修过程记录(含耗材登记)
- 管理端:数据可视化分析(报修类型统计、响应时效统计)、维修人员KPI考核、耗材库存预警
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用经典的三层架构:
- 前端:Thymeleaf + Bootstrap(兼顾管理员PC端和学生移动端适配)
- 后端:SpringBoot 2.7 + MyBatis-Plus(选型理由:毕业设计场景需要快速开发,避免过度复杂)
- 数据库:MySQL 8.0(关系型数据) + Redis(缓存高频访问的报修状态数据)
- 文件存储:本地存储(毕业设计场景推荐)或七牛云OSS(生产环境建议)
注意:学生作业项目建议使用本地存储,避免云服务产生的额外费用。实际部署时可考虑minio自建对象存储。
2.2 核心功能模块设计
mermaid复制graph TD
A[学生模块] -->|提交| B(报修单管理)
C[维修工模块] -->|处理| B
D[管理员模块] -->|分配| B
B --> E[数据统计]
B --> F[消息通知]
3. 关键实现细节
3.1 报修单状态机设计
采用状态模式实现报修流程控制:
java复制public interface RepairState {
void handle(RepairOrder order);
}
// 具体状态实现示例
public class PendingState implements RepairState {
@Override
public void handle(RepairOrder order) {
// 发送短信通知逻辑
notificationService.sendSMS(order.getStudent().getPhone());
}
}
状态流转规则:
- 待受理(学生提交后)
- 已分配(管理员分配维修工)
- 处理中(维修工接单)
- 已完成(维修工确认)
- 已评价(学生评价后)
3.2 图片上传处理
java复制@PostMapping("/upload")
public Result uploadImage(@RequestParam MultipartFile file) {
// 文件校验(大小、类型)
if(file.isEmpty() || !file.getContentType().startsWith("image/")) {
return Result.error("仅支持图片文件");
}
// 生成存储路径(按日期分目录)
String path = "repair_images/" + LocalDate.now().toString();
String filename = UUID.randomUUID() + ".jpg";
// 实际存储逻辑(本地/云存储)
storageService.store(file, path, filename);
return Result.ok("/" + path + "/" + filename);
}
避坑提示:务必限制文件大小(application.yml配置):
yaml复制spring: servlet: multipart: max-file-size: 5MB max-request-size: 10MB
4. 特色功能实现
4.1 智能分配算法
根据维修工的专业标签和当前负载自动分配:
java复制public RepairWorker assignWorker(RepairType type) {
return workerMapper.selectList(new QueryWrapper<RepairWorker>()
.eq("skill_tags", type.getTag())
.orderByAsc("current_task_count"))
.stream()
.findFirst()
.orElseGet(() -> assignFallbackWorker());
}
4.2 数据可视化方案
使用ECharts实现管理后台统计看板:
javascript复制// 报修类型分布饼图
option = {
tooltip: { trigger: 'item' },
series: [{
type: 'pie',
data: [
{value: 1048, name: '水电维修'},
{value: 735, name: '家具维修'},
{value: 580, name: '网络故障'}
]
}]
};
5. 部署注意事项
5.1 多环境配置
建议配置三个环境:
properties复制# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/dorm_repair_dev
# application-test.properties
spring.datasource.url=jdbc:mysql://test-server:3306/dorm_repair_test
# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-server:3306/dorm_repair_prod
激活方式:
bash复制java -jar dorm-repair.jar --spring.profiles.active=prod
5.2 安全防护措施
- 接口权限控制:
java复制@PreAuthorize("hasRole('ADMIN') or #studentId == authentication.principal.id")
@GetMapping("/records/{studentId}")
public List<RepairRecord> getRecords(@PathVariable Long studentId) {
// ...
}
- XSS防护(SpringBoot自动配置+自定义):
java复制@Configuration
public class WebSecurityConfig {
@Bean
public FilterRegistrationBean<XssFilter> xssFilter() {
FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new XssFilter());
registration.addUrlPatterns("/*");
return registration;
}
}
6. 毕业设计扩展建议
- 增加微信小程序端(Uniapp+SpringBoot)
- 引入简单的物料管理系统(维修耗材进销存)
- 实现自动化的满意度分析(NLP处理评价文本)
- 添加维修知识库(常见问题解决方案)
我在实际开发中最大的收获是:数据库设计阶段就要充分考虑状态流转的完整性约束。比如在MySQL中可以使用ENUM类型配合触发器来保证状态变更的合法性:
sql复制CREATE TABLE repair_order (
status ENUM('pending','assigned','processing','completed','rated') NOT NULL,
CONSTRAINT chk_status_transition CHECK (
(status = 'pending' AND old_status IS NULL) OR
(status = 'assigned' AND old_status = 'pending') OR
-- 其他合法状态转换规则
)
);
这个项目虽然作为毕业设计,但采用了企业级开发的标准流程(Git版本控制、Swagger接口文档、Lombok简化代码),这些实践经验对后续求职非常有帮助。建议学弟学妹们在开发时注意保持代码规范,这对答辩时的印象分提升很明显。
