1. 项目概述:船舶维保管理系统的技术选型与架构设计
在航运业快速发展的今天,船舶维修保养管理系统的数字化转型已成为行业刚需。传统单体架构的维保系统普遍面临扩展性差、迭代困难、用户体验不佳等痛点。我们团队基于SpringBoot+Vue的前后端分离架构,开发了一套高性能、易扩展的船舶维保管理系统,经过半年多的实际运行验证,系统稳定性与效率提升显著。
技术选型上,后端采用SpringBoot 2.7 + MyBatis-Plus 3.5的组合,前端使用Vue 3 + Element Plus,数据库选用MySQL 8.0。这套技术栈的搭配主要基于以下考量:
- SpringBoot的自动配置特性大幅减少了XML配置,内置Tomcat支持快速部署
- MyBatis-Plus在传统MyBatis基础上增强了CRUD操作,开发效率提升40%以上
- Vue 3的Composition API使前端组件逻辑更清晰,配合TypeScript类型检查大幅降低维护成本
- MySQL 8.0的窗口函数和CTE特性简化了复杂统计查询的实现
提示:实际部署时建议使用Nginx作为静态资源服务器和反向代理,我们测试发现这比直接使用SpringBoot内嵌Tomcat服务静态资源的性能高出3倍左右。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计与实现
2.1 维修任务管理模块
维修任务流转是本系统的核心功能,我们设计了状态机驱动的工作流引擎。任务状态包括:待分配(10)→已分配(20)→进行中(30)→待验收(40)→已完成(50)→已取消(90)。关键实现代码如下:
java复制// 任务状态变更服务
@Transactional
public void changeTaskStatus(Long taskId, String newStatus) {
TaskEntity task = taskMapper.selectById(taskId);
if (!StateMachine.validTransition(task.getStatus(), newStatus)) {
throw new BusinessException("非法状态变更");
}
task.setStatus(newStatus);
task.setUpdateTime(LocalDateTime.now());
taskMapper.updateById(task);
// 记录状态变更日志
TaskLog log = new TaskLog();
log.setTaskId(taskId);
log.setOldStatus(task.getStatus());
log.setNewStatus(newStatus);
taskLogMapper.insert(log);
}
数据库表设计上,除了基础的task表外,我们还添加了task_attachment(任务附件)、task_comment(任务评论)、task_log(操作日志)三个辅助表,形成完整的数据关系。
2.2 备件库存管理模块
备件管理采用"库存批次"的设计模式,每个入库批次记录独立保质期和供应商信息。核心难点在于实现实时库存预警,我们通过MySQL触发器+Redis缓存的方案解决:
sql复制CREATE TRIGGER `stock_update_trigger` AFTER UPDATE ON `part_stock`
FOR EACH ROW BEGIN
IF NEW.stock_quantity < NEW.low_level THEN
INSERT INTO stock_alert(part_id, current_qty, alert_time)
VALUES(NEW.part_id, NEW.stock_quantity, NOW());
END IF;
END
前端采用ECharts实现库存可视化看板,关键配置项包括:
- 库存水位图(当前库存/安全库存)
- 备件周转率热力图
- 近效期备件预警列表
3. 数据库设计与优化实践
3.1 核心表结构设计
船舶信息表(ship_info)采用星型模型设计,主表存储基本信息,扩展表存放技术参数:
sql复制CREATE TABLE `ship_info` (
`ship_id` int NOT NULL AUTO_INCREMENT,
`ship_code` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT 'IMO编号',
`ship_name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
`ship_type` enum('CONTAINER','BULK','TANKER','OTHER') COLLATE utf8mb4_bin DEFAULT NULL,
`build_date` date DEFAULT NULL,
`last_dock_date` date DEFAULT NULL,
`status` tinyint DEFAULT '1' COMMENT '1-运营中 2-维修中 3-停运',
PRIMARY KEY (`ship_id`),
UNIQUE KEY `udx_code` (`ship_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
3.2 查询性能优化方案
针对维修记录查询慢的问题(>2s),我们实施了以下优化措施:
- 添加复合索引:
sql复制ALTER TABLE repair_record
ADD INDEX `idx_ship_status` (`ship_code`, `repair_status`);
- 对大文本字段使用垂直分表:
sql复制CREA
