1. 项目背景与核心需求
客车车票预订系统是交通出行领域的重要信息化解决方案。2026届计算机相关专业的学生选择这个课题作为毕业设计,既符合行业数字化转型趋势,又能全面检验SSM+Vue全栈开发能力。这个系统需要解决的核心问题包括:
- 多终端适配:乘客通过Web端/移动端随时查询余票、完成预订
- 实时数据同步:车次、座位状态需要秒级更新
- 高并发处理:节假日高峰期需应对突增的访问量
- 交易完整性:支付过程需要保证ACID特性
我在实际开发中发现,相比传统的Servlet+JSP方案,采用Spring+SpringMVC+MyBatis(SSM)后端配合Vue.js前端的架构,能更好地满足这些需求。SSM框架提供了完善的IoC容器、声明式事务管理和ORM支持,而Vue的组件化开发模式让前端交互更加流畅。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 后端技术栈解析
SSM框架组合各司其职:
- Spring 5.x:通过依赖注入管理Bean生命周期,使用@Transactional注解简化事务管理。实测中,采用CGLIB动态代理比JDK代理性能提升约15%
- Spring MVC:RESTful风格API设计,配合@RestController注解。关键配置项包括:
xml复制<!-- 启用注解驱动 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven> - MyBatis 3.5:XML与注解混合模式,动态SQL处理复杂查询。特别注意二级缓存配置:
xml复制<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> </settings>
2.2 前端技术方案
Vue 3.x带来显著优势:
- Composition API:比Options API减少30%的代码量
- Vue Router:实现前端路由跳转,关键配置示例:
javascript复制const routes = [ { path: '/ticket', component: TicketList, meta: { requiresAuth: true } } ] - Axios:封装HTTP请求,添加拦截器处理Token验证:
javascript复制axios.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem('token') return config })
2.3 数据库设计要点
MySQL 8.0表结构设计遵循第三范式,核心表包括:
- 车次表(schedule):包含departure_time, arrival_time, price等字段
- 座位表(seat):使用status字段标记已售/未售(0/1)
- 订单表(order):设置transaction_id关联支付流水
特别注意:在余票查询场景添加联合索引:
sql复制ALTER TABLE seat ADD INDEX idx_schedule_status (schedule_id, status);
3. 核心功能实现细节
3.1 余票实时查询优化
传统方案每次查询都执行COUNT导致性能瓶颈。我们采用两种优化策略:
-
Redis缓存余票数:通过定时任务每5秒更新
java复制@Scheduled(fixedRate = 5000) public void updateTicketCache() { List<Schedule> schedules = scheduleMapper.selectAll(); schedules.forEach(s -> { int count = seatMapper.countAvailable(s.getId()); redisTemplate.opsForValue().set("ticket:"+s.getId(), count); }); } -
数据库读写分离:查询走从库,通过Spring配置:
yaml复制spring: datasource: slave: url: jdbc:mysql://slave:3306/ticket username: root password: 123456
3.2 座位锁定机制
解决并发抢票问题的完整方案:
- 前端使用WebSocket接收座位状态变更
- 后端采用乐观锁控制:
java复制@Transactional public boolean lockSeat(Long seatId, Long userId) { Seat seat = seatMapper.selectForUpdate(seatId); if (seat.getStatus() == 0) { seat.setStatus(1); seat.setUserId(userId); return seatMapper.update(seat) > 0; } return false; } - 设置15分钟自动释放未支付的锁定座位(Quartz定时任务)
3.3 支付流程设计
保证交易完整性的关键步骤:
- 生成预支付订单(状态为"待支付")
- 调用第三方支付接口(模拟沙箱环境)
- 支付结果异步通知处理:
java复制@PostMapping("/notify") public String payNotify(@RequestBody PayNotifyDTO dto) { if (verifySign(dto)) { orderService.updateStatus(dto.getOrderNo(), "已支付"); return "success"; } return "fail"; } - 支付超时处理(延迟队列实现)
4. 典型问题与解决方案
4.1 跨域问题处理
开发阶段常见问题及解决方案:
- 方案一:Spring Boot配置全局CORS
java复制@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*"); } } - 方案二:Nginx反向代理(生产环境推荐)
nginx复制location /api { proxy_pass http://backend; add_header 'Access-Control-Allow-Origin' '$http_origin'; }
4.2 性能优化实践
通过JMeter压测发现的瓶颈及优化:
- 问题:100并发下订单接口响应时间>2s
- 优化措施:
- 启用MyBatis二级缓存
- 添加数据库连接池配置:
yaml复制spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000 - 结果:优化后平均响应时间降至400ms
4.3 移动端适配技巧
Vue项目适配不同设备的实践:
- 视口配置:public/index.html添加meta标签
html复制<meta name="viewport" content="width=device-width,initial-scale=1.0"> - 响应式布局:使用flex+rem方案
css复制@media screen and (max-width: 768px) { .container { flex-direction: column; } } - 手势优化:添加@touch事件处理滑动操作
5. 论文写作要点
5.1 技术章节组织建议
毕业设计论文的技术章节可参考结构:
- 系统架构设计(含部署图)
- 数据库ER图与表结构说明
- 核心算法流程图(如余票查询、支付流程)
- 性能测试数据与对比分析
5.2 创新点提炼方向
可从以下角度挖掘创新:
- 基于Redis的分布式锁优化方案
- 前后端分离架构的通信安全设计
- 大数据分析模块(历史购票数据可视化)
5.3 答辩演示技巧
三个关键演示环节:
- 高并发场景:使用JMeter展示系统稳定性
- 故障恢复:模拟服务器宕机后的数据一致性
- 移动体验:手机扫码演示响应式布局
6. 开发环境搭建指南
6.1 后端环境配置
- JDK 11安装验证:
bash复制
java -version - Maven仓库配置(settings.xml):
xml复制<mirror> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>central</mirrorOf> </mirror> - Spring Boot启动参数优化:
properties复制server.tomcat.max-threads=200 spring.servlet.multipart.max-file-size=10MB
6.2 前端开发准备
- Node.js环境检查:
bash复制
node -v npm -v - Vue CLI项目创建:
bash复制
npm install -g @vue/cli vue create ticket-frontend - 常用插件安装:
bash复制
npm install axios vue-router vuex --save
6.3 数据库初始化
- 执行SQL脚本创建表结构
- 初始化基础数据(车站、车次等)
- 配置Flyway数据库迁移(可选):
java复制spring: flyway: locations: classpath:db/migration enabled: true
7. 项目部署方案
7.1 传统部署模式
- 后端打包:
bash复制
mvn clean package -DskipTests - 前端构建:
bash复制
npm run build - Nginx配置示例:
nginx复制server { listen 80; location / { root /opt/ticket/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8080; } }
7.2 Docker容器化部署
- 编写Dockerfile:
dockerfile复制FROM openjdk:11-jre COPY target/ticket.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"] - 使用docker-compose编排:
yaml复制version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 app: build: . ports: - "8080:8080"
7.3 持续集成方案
GitHub Actions配置示例:
yaml复制name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build backend
run: mvn package -DskipTests
- name: Build frontend
run: |
cd frontend
npm install
npm run build
8. 扩展功能建议
8.1 微信小程序接入
- 使用uni-app跨平台方案:
javascript复制uni.request({ url: 'https://api.example.com/ticket', success: (res) => { this.tickets = res.data } }) - 获取用户openid实现快速登录
8.2 智能推荐模块
基于用户历史的推荐算法:
java复制public List<Schedule> recommend(Long userId) {
List<Order> history = orderMapper.selectByUser(userId);
// 简单实现:推荐相同出发地的车次
return scheduleMapper.selectByDeparture(
history.get(0).getDepartureStation());
}
8.3 管理端增强功能
- 数据看板(ECharts集成)
- 售票情况实时热力图
- 基于角色的权限控制(Spring Security)
在项目开发过程中,我特别建议做好Git版本控制,采用合理的分支策略(如Git Flow)。对于团队协作项目,每天进行代码Review能有效减少后期调试时间。数据库变更一定要通过Migration工具管理,避免直接修改生产环境表结构。
