1. 项目背景与核心价值
船舶维修保养管理一直是航运企业运营中的关键环节。传统纸质记录和Excel表格管理方式存在数据孤岛、信息滞后、流程不透明等问题。我们团队开发的这套船舶维保管理系统,正是为了解决这些行业痛点而生。
系统采用前后端分离架构,前端使用Vue.js构建响应式界面,后端基于SpringBoot提供RESTful API服务。这种架构选择使系统具备以下优势:
- 维护人员可随时通过移动设备查看任务
- 管理人员能实时监控全船队维保状态
- 所有维修记录形成结构化数据库
- 自动生成符合海事要求的保养报告
实际部署案例:某中型航运公司使用本系统后,设备故障响应时间缩短40%,计划保养完成率提升至98%
2. 技术架构详解
2.1 后端技术栈
SpringBoot 2.7作为核心框架,主要考虑因素包括:
- 内嵌Tomcat简化部署
- 自动配置减少样板代码
- 丰富的Starter依赖库
数据库选型对比:
| 选项 | 优点 | 缺点 | 最终选择原因 |
|---|---|---|---|
| MySQL | 成熟稳定 | 分片扩展复杂 | 海事行业普遍使用 |
| PostgreSQL | 功能丰富 | 运维成本高 | - |
| MongoDB | 灵活扩展 | 事务支持弱 | 不适合维保场景 |
MyBatis配置关键点:
xml复制<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 下划线转驼峰 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
2.2 前端技术方案
Vue 3组合式API带来的改进:
- 维修工单表单代码量减少30%
- 自定义hooks复用图表逻辑
- Composition API更好支持TypeScript
典型页面加载优化措施:
- 路由懒加载
- 接口请求合并
- 关键资源预加载
- 表格虚拟滚动
3. 核心功能实现
3.1 维保计划引擎
采用Quartz调度框架实现:
java复制// 每月1号生成保养任务
@Scheduled(cron = "0 0 0 1 * ?")
public void generateMonthlyTasks() {
// 获取所有船舶
// 遍历设备类型
// 创建保养工单
}
保养规则配置表设计:
| 字段 | 类型 | 说明 |
|---|---|---|
| equipment_type | varchar | 设备分类 |
| maintain_cycle | int | 保养周期(天) |
| maintain_items | text | 保养项目JSON |
3.2 故障诊断模块
实现方案对比:
- 决策树:可解释性强但维护成本高
- 神经网络:需要大量历史数据
- 规则引擎:最终选择Drools
典型规则示例:
drl复制rule "主机润滑油异常"
when
$log : EquipmentLog(equipmentType == "MAIN_ENGINE",
oilPressure < 0.2MPa)
then
insert(new FaultAlert("ENGINE_OIL_WARNING"));
end
4. 系统部署实践
4.1 高可用方案
推荐部署架构:
code复制 [Nginx]
/ \
[SpringBoot App1] [SpringBoot App2]
\ /
[MySQL Cluster]
关键配置参数:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 20
spring:
datasource:
hikari:
maximum-pool-size: 50
connection-timeout: 30000
4.2 性能优化记录
压力测试结果对比:
| 优化措施 | TPS提升 | 平均响应时间降低 |
|---|---|---|
| 添加Redis缓存 | 45% | 60ms |
| SQL索引优化 | 30% | 40ms |
| 前端打包优化 | - | 200ms(首屏) |
5. 典型问题解决方案
5.1 数据同步冲突
船舶离线作业场景处理流程:
- 本地SQLite存储维修记录
- 网络恢复后比对时间戳
- 冲突记录人工确认
- 最终同步到中心数据库
5.2 报表生成优化
解决万级数据导出方案:
- 分页查询避免OOM
- 使用POI的SXSSFWorkbook
- 异步生成下载链接
- 临时文件自动清理
关键代码片段:
java复制try (SXSSFWorkbook workbook = new SXSSFWorkbook(100)) {
Sheet sheet = workbook.createSheet();
// 分批写入数据
for (int i = 0; i < totalPages; i++) {
List<Record> page = queryByPage(i);
// 写入行数据...
}
}
6. 安全防护措施
6.1 认证授权体系
JWT实现要点:
- 访问令牌30分钟过期
- 刷新令牌7天有效期
- RSA256非对称加密
- 黑名单机制处理注销
6.2 数据安全策略
敏感字段加密方案:
java复制@ColumnTransformer(
read = "AES_DECRYPT(UNHEX(equipment_no), '${encryption.key}')",
write = "HEX(AES_ENCRYPT(?, '${encryption.key}'))"
)
private String equipmentNo;
审计日志记录要求:
- 修改人
- 修改时间
- 修改前值
- 修改后值
- 客户端IP
7. 项目演进方向
当前正在开发的增强功能:
- 基于维修记录的预测性维护
- AR远程协助维修支持
- 备件库存智能预警
- 与船载IoT设备直连
技术债处理计划:
- 逐步迁移到SpringBoot 3.x
- Vue 2到Vue 3的渐进式升级
- 尝试GraalVM原生镜像
- 评估PostGIS对航线分析的支持