1. 项目背景与需求分析
汽车票网上预订系统是传统客运行业数字化转型的典型应用场景。在传统购票模式下,乘客需要亲自前往车站排队购票,不仅耗时耗力,还经常面临票源紧张、信息不透明等问题。而运营方也缺乏有效的票务管理手段,难以实时掌握票务销售情况和乘客需求变化。
这个系统主要解决以下几个核心痛点:
- 乘客购票体验差:排队时间长、无法实时查询余票、无法提前规划行程
- 运营管理效率低:人工售票容易出错、票务统计滞后、无法动态调整运力
- 数据价值未挖掘:缺乏用户行为分析、无法基于数据进行精准营销
系统采用前后端分离架构,后端基于SpringBoot框架实现RESTful API,前端使用Vue.js构建响应式用户界面。这种架构选择主要基于以下考虑:
- 前后端分离有利于团队协作和独立部署
- SpringBoot的自动配置特性可以快速搭建稳定的后端服务
- Vue.js的组件化开发模式适合构建复杂的用户交互界面
- RESTful API风格保证了系统的可扩展性和前后端解耦
2. 技术架构设计
2.1 后端技术栈
后端采用SpringBoot 2.7.x作为基础框架,主要依赖包括:
- spring-boot-starter-web:提供Web MVC支持
- spring-boot-starter-data-jpa:简化数据库操作
- mybatis-spring-boot-starter:集成MyBatis
- spring-boot-starter-security:基础安全支持
- spring-boot-starter-validation:参数校验
数据库选用MySQL 8.0,主要考虑因素:
- 成熟稳定,社区支持完善
- 事务支持完善,适合票务系统的高一致性要求
- 性能满足中小型票务系统的需求
- 与Spring生态集成良好
2.2 前端技术栈
前端基于Vue 3.x构建,主要技术组件:
- Vue Router:实现前端路由管理
- Pinia:状态管理库
- Element Plus:UI组件库
- Axios:HTTP客户端
- Vite:构建工具
选择Vue.js而非React或Angular的主要原因是:
- 学习曲线平缓,团队上手快
- 文档完善,中文社区活跃
- 性能足够满足票务系统的需求
- 与Element UI等组件库集成良好
2.3 系统架构图
code复制[前端层] Vue.js SPA
↑↓ HTTP/HTTPS
[API网关层] SpringBoot RESTful API
↑↓
[业务逻辑层] 服务组件
↑↓
[数据访问层] MyBatis
↑↓
[数据存储层] MySQL
3. 核心功能实现
3.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证,关键流程:
- 用户登录成功后,服务端生成包含用户ID和角色的JWT
- 客户端存储JWT(通常放在localStorage)
- 后续请求在Authorization头中携带JWT
- 服务端验证JWT有效性并解析用户信息
JWT的优点是:
- 无状态,服务端不需要维护会话
- 可包含自定义声明
- 适合分布式系统
安全注意事项:
- 必须使用HTTPS传输
- Token设置合理的过期时间
- 敏感操作需要二次验证
3.2 车次查询功能
车次查询是系统的核心功能,需要考虑以下因素:
- 查询性能:建立合适的数据库索引
- 缓存策略:热门线路可以缓存查询结果
- 分页处理:大数据量时需要分页返回
关键SQL示例:
sql复制SELECT * FROM schedule
WHERE departure_city = ?
AND arrival_city = ?
AND departure_time BETWEEN ? AND ?
AND available_seats > 0
ORDER BY departure_time
LIMIT ?, ?
3.3 订单处理流程
订单状态机设计:
code复制待支付 → 已支付 → 已完成
↘ 已取消
关键业务逻辑:
- 创建订单时需要检查座位是否可用(使用乐观锁)
- 支付成功后需要更新座位余量
- 订单超时未支付自动取消
事务处理要点:
- 订单创建和座位锁定必须在同一事务中
- 支付回调处理需要保证幂等性
- 重要操作需要记录操作日志
4. 数据库设计优化
4.1 核心表结构
用户表(user)优化建议:
- 密码存储使用bcrypt等强哈希算法
- 添加索引:username, phone_number
- 考虑添加last_login_ip字段用于安全审计
车次表(schedule)优化建议:
- 添加复合索引:(departure_city, arrival_city, departure_time)
- 考虑将price拆分为基础票价和附加费
- 添加运营状态字段(正常/停运/临时调整)
订单表(order)优化建议:
- 添加支付渠道字段
- 添加退款相关字段
- 考虑分表策略:按用户ID或时间范围分表
4.2 查询性能优化
- 使用EXPLAIN分析慢查询
- 合理使用覆盖索引
- 大数据量表考虑分区
- 适当使用读写分离
4.3 数据安全
- 敏感字段加密存储
- 数据库连接使用SSL
- 定期备份验证
- 操作审计日志
5. 部署与运维
5.1 后端部署
推荐使用Docker容器化部署,Dockerfile示例:
dockerfile复制FROM openjdk:11-jre
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
启动参数建议:
- 设置合适的JVM内存参数
- 添加Spring Profile区分环境
- 配置健康检查端点
5.2 前端部署
使用Nginx作为静态资源服务器,配置示例:
nginx复制server {
listen 80;
server_name ticket.example.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
5.3 监控与告警
建议监控指标:
- 应用层面:请求量、响应时间、错误率
- 系统层面:CPU、内存、磁盘IO
- 业务层面:订单量、支付成功率
6. 扩展与优化方向
6.1 性能优化
- 引入Redis缓存热门车次数据
- 使用消息队列削峰填谷
- 静态资源CDN加速
- 数据库读写分离
6.2 功能扩展
- 微信小程序端开发
- 会员积分系统
- 智能推荐线路
- 多平台比价功能
6.3 安全加固
- 增加风控系统
- 完善操作审计
- 定期安全扫描
- 敏感操作二次验证
7. 开发经验分享
7.1 踩坑记录
- 日期时间处理:
- 前端后端统一使用UTC时间
- 数据库存储带时区的时间戳
- 显示时根据用户所在地转换
- 并发订票问题:
- 使用SELECT FOR UPDATE悲观锁
- 配合版本号乐观锁
- 考虑使用分布式锁
- 支付回调处理:
- 保证幂等性
- 记录原始回调信息
- 设置合理的超时时间
7.2 调试技巧
- 使用Postman测试API
- 善用Spring Boot Actuator
- 前端使用Vue Devtools
- 数据库慢查询日志分析
7.3 团队协作建议
- 定义清晰的API文档规范
- 使用Swagger或OpenAPI
- 前后端并行开发
- 定期代码评审