1. 项目背景与需求分析
小型船舶进出港管理一直是港口运营中的重要环节。传统的手工登记方式存在效率低下、数据易丢失、查询困难等问题。我在参与某港口信息化改造项目时,发现他们仍在使用纸质登记簿记录船舶进出港信息,经常出现登记信息不全、统计报表滞后等情况。
基于SpringBoot开发这套系统主要解决三个核心痛点:
- 实时性差:传统方式无法实时掌握船舶动态
- 数据孤岛:各部门信息不互通,重复登记
- 统计困难:手工汇总耗时且易出错
2. 系统架构设计
2.1 技术选型考量
选择SpringBoot作为基础框架主要基于以下考虑:
- 快速开发:内嵌Tomcat,简化配置
- 生态丰富:整合MyBatis、Spring Security等组件方便
- 微服务友好:便于后续扩展为分布式系统
数据库选用MySQL 8.0,因其:
- 事务支持完善
- 对JSON数据类型支持良好(存储船舶动态数据)
- 社区活跃,文档丰富
2.2 系统模块划分
系统采用经典三层架构:
code复制└── 船舶管理系统
├── 表现层(Thymeleaf+HTML5)
├── 业务层(Spring MVC)
└── 数据层(MyBatis+MySQL)
核心功能模块:
- 权限管理模块(基于RBAC模型)
- 船舶登记模块(进出港记录)
- 服务请求模块(后勤保障)
- 数据统计模块(可视化报表)
3. 核心功能实现
3.1 权限控制系统
采用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("/register/**").hasRole("REGISTER")
.antMatchers("/logistics/**").hasRole("LOGISTICS")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
}
权限划分策略:
- 管理员:系统配置、用户管理
- 登记员:船舶进出登记、信息查询
- 后勤人员:服务请求处理、天气预报查看
3.2 船舶进出港登记流程
核心数据库表设计:
sql复制CREATE TABLE `ship_registration` (
`id` bigint NOT NULL AUTO_INCREMENT,
`ship_id` varchar(20) NOT NULL COMMENT '船舶识别号',
`ship_name` varchar(50) NOT NULL,
`in_time` datetime DEFAULT NULL COMMENT '进港时间',
`out_time` datetime DEFAULT NULL,
`status` tinyint DEFAULT '0' COMMENT '0-在港 1-已出港',
`cargo_info` json DEFAULT NULL COMMENT '货物信息',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_ship_id` (`ship_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
进出港登记关键代码:
java复制@RestController
@RequestMapping("/api/registration")
public class RegistrationController {
@Autowired
private RegistrationService registrationService;
@PostMapping("/check-in")
public Result checkIn(@Valid @RequestBody CheckInDTO dto) {
return registrationService.processCheckIn(dto);
}
@PostMapping("/check-out")
public Result checkOut(@RequestParam String shipId) {
return registrationService.processCheckOut(shipId);
}
}
4. 系统特色功能
4.1 实时数据看板
采用ECharts实现动态可视化:
javascript复制function loadPortStatistics() {
$.get('/api/statistics/port', function(data) {
var chart = echarts.init(document.getElementById('port-chart'));
chart.setOption({
tooltip: {},
xAxis: {data: data.timeRange},
yAxis: {},
series: [{
name: '在港船舶',
type: 'line',
data: data.shipCounts
}]
});
});
}
4.2 智能预警机制
实现规则:
- 超时预警:船舶停留超过72小时自动提醒
- 冲突预警:同一泊位分配多艘船舶时告警
- 证件预警:证书临期(<30天)提示更新
5. 开发经验与优化建议
5.1 踩坑实录
- 并发登记问题:
- 现象:多人同时登记导致数据错乱
- 解决方案:采用乐观锁机制
java复制@Update("UPDATE ship_registration SET status=#{status}, version=version+1
WHERE id=#{id} AND version=#{version}")
int updateWithVersion(ShipRegistration registration);
- 时间格式问题:
- 现象:前端传参时区不一致
- 解决:统一使用UTC时间传输
5.2 性能优化技巧
- 登记查询优化:
sql复制-- 建立复合索引
ALTER TABLE ship_registration ADD INDEX idx_status_time (status, in_time);
- 缓存策略:
- 使用Redis缓存常用船舶信息
- 天气预报数据每小时更新缓存
6. 部署方案
推荐部署环境:
- 服务器:2核4G(最低配置)
- JDK:Amazon Corretto 11
- 数据库:MySQL 8.0+(建议配置主从复制)
启动参数建议:
bash复制java -jar ship-portal.jar \
--spring.profiles.active=prod \
--server.tomcat.max-threads=200 \
--spring.datasource.hikari.maximum-pool-size=20
这套系统在实际部署后,将船舶登记平均耗时从原来的15分钟缩短至2分钟以内,数据统计报表生成时间从半天缩短到实时可查。对于计算机专业毕业设计来说,既体现了完整的技术栈运用,又解决了实际业务问题。