船舶维保管理系统是航运企业数字化升级的关键基础设施。传统纸质工单和Excel表格的管理方式存在数据孤岛、响应滞后、维保记录追溯困难等痛点。我们团队基于SpringBoot+Vue技术栈开发的这套系统,实现了从故障申报、工单派发、维修执行到验收结算的全流程数字化管理。
系统上线后,某中型航运公司的平均故障响应时间从72小时缩短至12小时,备件库存周转率提升40%。这套代码之所以适合作为Java Web毕设选题,在于它完整覆盖了企业级应用的核心模块:
采用SpringBoot 2.7作为基础框架,主要基于以下考量:
数据库选用MySQL 8.0,关键配置参数:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/ship_maintenance?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 加密存储
hikari:
maximum-pool-size: 20
connection-timeout: 30000
Vue 3组合式API带来更好的逻辑复用性,主要技术组件:
典型接口调用示例:
javascript复制// 获取待处理工单列表
const fetchPendingOrders = async () => {
try {
const res = await api.get('/api/work-order', {
params: { status: 'PENDING' }
})
orderList.value = res.data
} catch (err) {
ElMessage.error('获取数据失败')
}
}
船舶维保涉及复杂的业务流程,我们采用状态模式实现工单流转:
java复制public enum OrderStatus {
CREATED(1, "已创建"),
ASSIGNED(2, "已派单"),
PROCESSING(3, "处理中"),
NEED_APPROVAL(4, "待验收"),
COMPLETED(5, "已完成"),
CANCELLED(6, "已取消");
// 状态流转规则
private static final Map<OrderStatus, Set<OrderStatus>> TRANSITION_RULES = Map.of(
CREATED, Set.of(ASSIGNED, CANCELLED),
ASSIGNED, Set.of(PROCESSING, CANCELLED),
PROCESSING, Set.of(NEED_APPROVAL, CANCELLED),
NEED_APPROVAL, Set.of(COMPLETED, PROCESSING)
);
public static boolean isValidTransition(OrderStatus from, OrderStatus to) {
return TRANSITION_RULES.getOrDefault(from, Set.of()).contains(to);
}
}
结合航运企业组织特点,设计四级权限体系:
通过注解实现接口权限控制:
java复制@PreAuthorize("hasRole('FLEET_MANAGER') || hasRole('SYSTEM_ADMIN')")
@PostMapping("/maintenance-plan")
public ResponseEntity<?> createPlan(@Valid @RequestBody PlanDTO dto) {
// 业务逻辑
}
原始方案频繁请求GPS设备导致性能瓶颈,改进方案:
核心代码片段:
java复制@GetMapping("/tracking/{shipId}")
public SseEmitter streamLocation(@PathVariable Long shipId) {
SseEmitter emitter = new SseEmitter(3600000L);
locationService.addEmitter(shipId, emitter);
emitter.onCompletion(() -> locationService.removeEmitter(shipId));
return emitter;
}
维修报告常包含高清图片和视频,采用分片上传方案:
前端关键代码:
javascript复制const uploadChunk = async (file, chunk, chunks) => {
const formData = new FormData()
formData.append('file', chunk)
formData.append('chunkNumber', chunkIndex)
formData.append('totalChunks', chunks)
formData.append('identifier', fileHash)
await axios.post('/api/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
Docker Compose编排文件示例:
yaml复制version: '3'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Spring Boot Actuator关键配置:
properties复制management.endpoints.web.exposure.include=health,metrics,prometheus
management.metrics.export.prometheus.enabled=true
management.endpoint.health.show-details=always
配合Grafana监控面板可实时观测:
技术章节建议结构:
避坑提示:MySQL 8.0默认使用caching_sha2_password认证,旧版本客户端连接需在my.cnf添加default_authentication_plugin=mysql_native_password
SQL脚本包含三个关键部分:
接口文档采用Swagger UI + OpenAPI 3.0规范,重点接口包括:
源码目录结构说明:
code复制├── backend
│ ├── config # 安全/JPA配置
│ ├── controller # 接口层
│ ├── service # 业务逻辑
│ └── entity # 数据库实体
└── frontend
├── api # 接口封装
├── views # 页面组件
└── store # Pinia状态管理
实际开发中我们发现,维修工单的状态变更通知采用WebSocket比轮询方案节省约75%的网络开销。移动端适配时,使用vw单位配合媒体查询可以更好地适应不同船载终端设备。