SSM+Vue客车票务系统开发与高并发优化实践

SSM+Vue客车票务系统开发与高并发优化实践
1. 项目概述基于SSMVue的客车车票预订系统开发实录去年指导过一位2026届学生的毕业设计恰好就是客车票务系统的开发。这个选题看似传统但结合当下客运行业数字化转型需求其实很有现实意义。系统采用经典的SSMSpringSpringMVCMyBatis后端架构搭配Vue.js前端框架是JavaWeb领域非常典型的全栈开发组合。从技术实现角度看这类系统核心要解决三个问题票务库存的实时性避免超卖、高并发场景下的系统稳定性春运等高峰期、以及跨平台访问的兼容性需适配PC端和移动端。我们最终实现的系统在本地测试环境下能够支持500QPS的并发查询和200QPS的订单创建响应时间控制在300ms以内。2. 技术选型与架构设计2.1 为什么选择SSMVue技术栈SSM框架组合在JavaEE领域已经发展多年其稳定性经过大量企业级项目验证。Spring的IoC容器管理着整个应用的Bean生命周期我们通过注解方式声明了15个核心业务组件SpringMVC处理HTTP请求时采用RESTful风格设计了26个API端点MyBatis的XML映射文件共编写了38张表的CRUD操作其中复杂的联表查询都使用了二级缓存。前端选择Vue 2.x版本考虑到学生掌握程度通过vue-router实现前端路由跳转vuex管理着包括用户登录态、车次查询条件等12个状态变量。Element UI组件库极大提升了开发效率仅用3天就完成了所有基础页面的搭建。2.2 系统分层架构详解整体采用前后端分离架构通过JWT进行身份认证。后端代码按功能划分为控制层Controller处理HTTP请求参数校验服务层Service业务逻辑实现事务管理持久层Mapper数据库交互SQL优化实体层EntityPOJO对象定义前端采用典型的Vue CLI工程结构src/ ├── api/ # 封装所有axios请求 ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── router/ # 路由配置 ├── store/ # Vuex状态管理 ├── utils/ # 工具函数 └── views/ # 页面组件3. 核心功能实现细节3.1 车票库存管理方案票务系统最关键的库存控制采用Redis分布式锁乐观锁双重保障// 伪代码示例 public boolean bookTicket(Long ticketId) { String lockKey ticket_lock_ ticketId; try { // 获取分布式锁设置3秒超时 boolean locked redisTemplate.opsForValue() .setIfAbsent(lockKey, 1, 3, TimeUnit.SECONDS); if (!locked) return false; // 乐观锁更新 int rows ticketMapper.updateStock( ticketId, ticket.getVersion() ); return rows 0; } finally { redisTemplate.delete(lockKey); } }数据库表设计特别注意了version字段CREATE TABLE ticket ( id bigint NOT NULL AUTO_INCREMENT, bus_no varchar(20) NOT NULL COMMENT 车次编号, stock int NOT NULL DEFAULT 0 COMMENT 余票, version int NOT NULL DEFAULT 0 COMMENT 版本号, PRIMARY KEY (id), UNIQUE KEY idx_bus_no (bus_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 高并发查询优化车次查询接口做了三级缓存设计浏览器本地缓存静态数据缓存1小时Redis缓存热点车次信息缓存5分钟数据库查询添加了covering indexSpring Cache配置示例Cacheable(value schedule, key #departure_#arrival) public ListSchedule querySchedules(String departure, String arrival) { // 数据库查询逻辑 }3.3 微信小程序兼容方案为支持小程序访问后端接口做了特殊处理响应头添加Access-Control-Allow-Origin参数接收改用RequestBody处理JSON文件上传接口单独优化前端通过判断环境变量切换请求基址const isWeapp typeof wx ! undefined const baseURL isWeapp ? https://api.example.com/weapp : /api4. 开发过程中的典型问题4.1 日期时间处理坑点最初直接使用java.util.Date导致时区问题// 错误示例 Date now new Date(); // 依赖服务器时区 // 正确做法 LocalDateTime ldt LocalDateTime.now(ZoneId.of(Asia/Shanghai));前端day.js也需要统一时区import dayjs from dayjs import timezone from dayjs/plugin/timezone dayjs.extend(timezone) dayjs.tz.setDefault(Asia/Shanghai)4.2 MyBatis动态SQL优化复杂查询条件推荐使用script标签select idqueryTickets resultTypeTicket SELECT * FROM ticket script WHERE 11 if testdeparture ! null AND departure #{departure} /if if testminPrice ! null AND price #{minPrice} /if ORDER BY choose when testsortBy priceprice/when otherwisedepart_time/otherwise /choose /script /select4.3 Vue组件通信经验非父子组件通信推荐Vuex// store/modules/ticket.js const actions { async query({ commit }, params) { const res await api.queryTickets(params) commit(SET_LIST, res.data) } } // 组件中使用 this.$store.dispatch(ticket/query, { departure: 北京, arrival: 上海 })5. 论文写作要点建议技术类毕业论文建议结构引言行业背景选题意义关键技术分析SSM/Vue原理系统设计架构图功能模块核心实现含关键代码片段系统测试压力测试结果总结与展望特别提醒架构图建议使用PlantUML绘制数据库ER图推荐PowerDesigner接口文档用Swagger UI自动生成性能测试数据用JMeter采集在系统演示部分建议录制gif动画插入文档比静态截图更直观。测试数据最好包含单接口响应时间并发用户数 vs 错误率不同数据量下的查询性能6. 部署上线注意事项6.1 生产环境配置application-prod.yml关键配置spring: datasource: url: jdbc:mysql://db-prod:3306/ticket?useSSLfalse username: prod_user password: ${DB_PASSWORD} redis: host: redis-prod port: 6379 password: ${REDIS_PASS} server: tomcat: max-threads: 200 min-spare-threads: 206.2 前端打包优化vue.config.js关键配置module.exports { productionSourceMap: false, configureWebpack: { optimization: { splitChunks: { chunks: all, maxSize: 244 * 1024 // 控制chunk大小 } } }, chainWebpack: config { config.plugin(preload).tap(() [{ rel: preload, fileBlacklist: [/\.map$/, /hot-update/] }]) } }6.3 安全防护措施接口防刷Guava RateLimiter限流RateLimiter(value 10, key #userId) public ResponseEntity? query(..., RequestHeader String userId)XSS防护Jackson全局转义Bean public Jackson2ObjectMapperBuilder objectMapperBuilder() { return new Jackson2ObjectMapperBuilder() .serializers(new StringUnicodeSerializer()); }SQL注入坚持使用#{}参数绑定这个项目从技术实现到论文写作最深的体会是业务逻辑的严谨性比技术炫技更重要。特别是在处理票务库存时必须考虑各种边界情况比如网络超时时的库存回滚、分布式环境下的锁竞争等。建议在开发初期就建立完整的测试用例集这对毕业答辩时的系统演示环节会有很大帮助。