基于SpringBoot+Vue+MySQL的12306购票系统:大学生期末项目实践

一、项目背景与目标

中国铁路12306平台作为全球最大的在线票务系统之一,其业务逻辑复杂、并发需求高。本次大学生期末项目旨在通过SpringBoot+Vue+MySQL技术栈,模拟实现12306平台的核心功能,包括用户注册登录、车次信息查询、余票展示、订单生成与支付等。项目目标为:

  1. 掌握前后端分离架构的设计与实现;
  2. 理解高并发场景下的数据库优化策略;
  3. 实践完整的软件开发流程(需求分析→设计→编码→测试)。

二、技术选型与架构设计

1. 技术栈选择

  • 后端框架:SpringBoot
    • 基于Java的微服务框架,提供快速开发、自动配置和内置依赖管理。
    • 集成Spring Security实现用户认证与授权。
    • 使用MyBatis-Plus简化数据库操作。
  • 前端框架:Vue 3 + Element Plus
    • 组件化开发提升代码复用性。
    • Element Plus提供丰富的UI组件(如表单、表格、弹窗)。
  • 数据库:MySQL 8.0
    • 支持事务、索引优化和分布式部署。
    • 使用Redis缓存热点数据(如余票信息)。

2. 系统架构

采用前后端分离的B/S架构:

  • 前端:Vue负责页面渲染与用户交互,通过Axios调用后端API。
  • 后端:SpringBoot提供RESTful接口,处理业务逻辑与数据库交互。
  • 数据库:MySQL存储用户信息、车次数据、订单记录等。
  • 缓存层:Redis缓存余票数据,减少数据库压力。

三、核心功能实现

1. 用户管理模块

  • 功能:注册、登录、个人信息修改。
  • 实现细节
    • 使用Spring Security的JWT(JSON Web Token)实现无状态认证。
    • 密码加密存储(BCryptPasswordEncoder)。
    • 前端表单验证(如手机号格式、密码强度)。
      1. // Spring Security配置示例
      2. @Configuration
      3. @EnableWebSecurity
      4. public class SecurityConfig {
      5. @Bean
      6. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
      7. http.csrf().disable()
      8. .authorizeHttpRequests(auth -> auth
      9. .antMatchers("/api/auth/**").permitAll()
      10. .anyRequest().authenticated()
      11. )
      12. .sessionManagement(session -> session
      13. .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      14. );
      15. return http.build();
      16. }
      17. }

2. 车次查询模块

  • 功能:按出发地、目的地、日期查询车次。
  • 实现细节
    • 数据库设计:train_schedule表存储车次信息(车次号、出发站、到达站、出发时间、到达时间、票价等)。
    • 后端接口:支持多条件组合查询(如/api/trains?from=北京&to=上海&date=2023-12-01)。
    • 前端展示:使用Element Plus的表格组件动态渲染查询结果。
      1. -- 车次表SQL示例
      2. CREATE TABLE train_schedule (
      3. id BIGINT AUTO_INCREMENT PRIMARY KEY,
      4. train_no VARCHAR(20) NOT NULL,
      5. from_station VARCHAR(50) NOT NULL,
      6. to_station VARCHAR(50) NOT NULL,
      7. departure_time DATETIME NOT NULL,
      8. arrival_time DATETIME NOT NULL,
      9. price DECIMAL(10,2) NOT NULL
      10. );

3. 票务预订模块

  • 功能:选择座位、生成订单、支付。
  • 实现细节
    • 余票管理
      • 数据库设计:ticket_inventory表记录每车次的剩余票数。
      • 并发控制:使用Redis分布式锁防止超卖(如SETNX命令)。
    • 订单生成
      • 事务处理:确保扣减余票与生成订单的原子性。
        1. @Transactional
        2. public Order createOrder(Long userId, Long trainId, int seatCount) {
        3. // 1. 检查余票
        4. TicketInventory inventory = ticketInventoryMapper.selectById(trainId);
        5. if (inventory.getRemaining() < seatCount) {
        6. throw new RuntimeException("余票不足");
        7. }
        8. // 2. 扣减余票
        9. ticketInventoryMapper.updateRemaining(trainId, inventory.getRemaining() - seatCount);
        10. // 3. 生成订单
        11. Order order = new Order();
        12. order.setUserId(userId);
        13. order.setTrainId(trainId);
        14. order.setSeatCount(seatCount);
        15. orderMapper.insert(order);
        16. return order;
        17. }

四、性能优化与测试

1. 数据库优化

  • 索引:为高频查询字段(如train_nofrom_station)添加索引。
  • 分表策略:按日期分表存储历史订单(如order_202312)。

2. 缓存策略

  • Redis缓存:缓存热门车次的余票信息,设置过期时间(如5分钟)。
  • 本地缓存:使用Caffeine缓存用户基本信息。

3. 压力测试

  • 使用JMeter模拟1000并发用户查询余票,观察系统响应时间与错误率。
  • 优化结果:通过Redis缓存,查询接口的平均响应时间从500ms降至80ms。

五、项目总结与收获

  1. 技术能力提升
    • 掌握了SpringBoot与Vue的集成开发。
    • 理解了高并发场景下的数据库与缓存设计。
  2. 业务理解深化
    • 模拟了真实票务系统的核心流程(查询→预订→支付)。
  3. 团队协作经验
    • 通过Git进行版本控制,使用Jenkins实现自动化部署。

六、扩展建议

  1. 功能扩展
    • 增加退票、改签功能。
    • 引入消息队列(如RabbitMQ)处理异步通知。
  2. 技术升级
    • 使用Spring Cloud Alibaba实现微服务架构。
    • 引入Elasticsearch优化车次搜索性能。

结语:本次项目通过SpringBoot+Vue+MySQL技术栈,成功模拟了12306平台的核心业务,为大学生提供了实践全栈开发的宝贵机会。未来可进一步优化系统性能,探索更复杂的业务场景(如抢票算法、分布式事务)。