1. 项目概述
作为一名有10年Java开发经验的程序员,我想分享一个基于SpringBoot的航空公司售票系统毕业设计项目。这个系统采用了当前主流的技术栈,包括SpringBoot、Vue.js和MySQL,实现了完整的机票预订业务流程。
这个系统特别适合计算机相关专业的同学作为毕业设计选题,因为它涵盖了企业级应用开发的完整流程,从前端页面到后端业务逻辑,再到数据库设计,能够全面展示你的技术能力。我在实际开发过程中积累了不少经验,下面会详细分享这个项目的技术实现细节和注意事项。
2. 技术架构设计
2.1 整体架构设计
系统采用典型的三层架构设计:
- 表现层:使用Vue.js框架构建用户界面,实现前后端分离
- 业务逻辑层:基于SpringBoot框架开发,处理核心业务逻辑
- 数据访问层:采用MyBatis Plus作为ORM框架,与MySQL数据库交互
这种分层架构使系统具有良好的可维护性和扩展性。我在项目中特别注重各层之间的解耦,通过定义清晰的接口规范来降低模块间的依赖。
2.2 技术选型考量
选择SpringBoot作为后端框架主要基于以下考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大简化了项目搭建过程
- 微服务友好:便于后续扩展为微服务架构
- 丰富的生态系统:可以方便地集成各种Spring生态组件
前端选择Vue.js是因为:
- 渐进式框架:可以根据项目需求灵活选用功能
- 组件化开发:提高代码复用率
- 学习曲线平缓:适合学生快速上手
数据库选用MySQL主要考虑:
- 开源免费:适合学生项目
- 性能稳定:能满足系统数据存储需求
- 社区支持好:遇到问题容易找到解决方案
3. 核心功能实现
3.1 用户认证模块
用户认证是系统的第一个门槛,我采用了JWT(JSON Web Token)实现无状态认证。具体实现步骤如下:
- 用户登录时,后端验证用户名密码
- 验证通过后生成JWT令牌返回给前端
- 前端后续请求都在Header中携带该令牌
- 后端通过拦截器验证令牌有效性
关键代码示例:
java复制// JWT工具类
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 864_000_000; // 10天
public static String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public static String extractUsername(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
注意事项:在实际项目中,SECRET_KEY应该从配置文件中读取,而不是硬编码在代码中。同时要考虑定期更换密钥以提高安全性。
3.2 航班管理模块
航班管理是系统的核心功能,主要包括:
- 航班信息维护:添加、修改、删除航班信息
- 航班查询:支持多条件组合查询
- 座位管理:管理每个航班的座位信息
数据库表设计:
sql复制CREATE TABLE flight (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
flight_number VARCHAR(20) NOT NULL,
departure_airport VARCHAR(50) NOT NULL,
arrival_airport VARCHAR(50) NOT NULL,
departure_time DATETIME NOT NULL,
arrival_time DATETIME NOT NULL,
price DECIMAL(10,2) NOT NULL,
total_seats INT NOT NULL,
available_seats INT NOT NULL,
status TINYINT DEFAULT 1 COMMENT '1-正常 0-取消'
);
CREATE TABLE seat (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
flight_id BIGINT NOT NULL,
seat_number VARCHAR(10) NOT NULL,
class_type VARCHAR(20) NOT NULL COMMENT '经济舱/商务舱/头等舱',
status TINYINT DEFAULT 1 COMMENT '1-可用 0-已售',
FOREIGN KEY (flight_id) REFERENCES flight(id)
);
3.3 订单处理模块
订单处理流程包括:
- 用户选择航班和座位
- 系统生成订单并锁定座位
- 用户支付订单
- 系统确认订单并出票
这里我使用了Spring的事务管理来保证数据一致性:
java复制@Service
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private FlightMapper flightMapper;
@Autowired
private SeatMapper seatMapper;
@Autowired
private OrderMapper orderMapper;
@Override
public Order createOrder(OrderDTO orderDTO) {
// 1. 检查航班和座位可用性
Flight flight = flightMapper.selectById(orderDTO.getFlightId());
if(flight == null || flight.getAvailableSeats() <= 0) {
throw new BusinessException("航班不可用");
}
Seat seat = seatMapper.selectById(orderDTO.getSeatId());
if(seat == null || seat.getStatus() != 1) {
throw new BusinessException("座位不可用");
}
// 2. 锁定座位
seat.setStatus(0);
seatMapper.updateById(seat);
// 3. 减少可用座位数
flight.setAvailableSeats(flight.getAvailableSeats() - 1);
flightMapper.updateById(flight);
// 4. 创建订单
Order order = new Order();
// 设置订单属性...
orderMapper.insert(order);
return order;
}
}
经验分享:在实际开发中,高并发场景下直接这样操作可能会导致超卖问题。更完善的方案是使用分布式锁或者乐观锁机制。
4. 系统安全设计
4.1 权限控制
系统采用RBAC(基于角色的访问控制)模型,主要角色包括:
- 普通用户:可以查询航班、下单、管理自己的订单
- 管理员:可以管理航班信息、用户信息、查看所有订单
- 超级管理员:拥有系统所有权限
权限控制通过Spring Security实现,核心配置如下:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/user/**").hasAnyRole("USER", "ADMIN")
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
4.2 数据安全
- 密码加密:使用BCrypt算法加密存储用户密码
- 敏感数据保护:对用户身份证号等敏感信息进行加密存储
- SQL注入防护:使用MyBatis的参数绑定方式,避免拼接SQL
- XSS防护:前端对用户输入进行转义处理
5. 系统测试与部署
5.1 测试策略
我采用了分层测试策略:
- 单元测试:使用JUnit测试各个Service方法
- 集成测试:测试Controller接口
- 端到端测试:使用Postman测试完整业务流程
测试覆盖率达到了85%以上,关键业务方法达到100%。
5.2 部署方案
系统支持多种部署方式:
- 传统部署:将SpringBoot应用打包为jar,直接运行
- Docker部署:使用Docker容器化部署
- 云原生部署:支持Kubernetes部署
推荐使用Docker部署,部署脚本示例:
dockerfile复制# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/airline-system-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
6. 项目总结与扩展建议
这个机票预订系统涵盖了企业级应用开发的多个重要方面,包括用户认证、业务逻辑处理、数据库设计、安全控制等。通过完成这个项目,你可以掌握:
- SpringBoot应用开发全流程
- Vue.js前端开发技巧
- 数据库设计与优化
- 系统安全设计
- 项目测试与部署
对于想要进一步扩展的同学,我建议可以考虑:
- 引入Redis缓存提升系统性能
- 实现分布式架构提高系统可用性
- 增加数据分析模块,如热门航线分析
- 开发移动端应用
在实际开发过程中,我遇到并解决了不少问题,比如并发订票时的座位冲突、JWT令牌的刷新机制等。这些经验对于理解分布式系统设计非常有帮助。如果你在实现过程中遇到任何问题,可以参考我的完整源码,或者直接联系我讨论具体的技术细节。