客运站网上售票系统是传统交通行业数字化转型的典型代表。作为一名参与过多个交通信息化项目的开发者,我亲眼见证了从人工窗口排队到移动端自主购票的产业升级过程。这个毕设选题结合了企业级开发的主流技术栈(SSM+Vue),既符合当前行业实际需求,又涵盖了完整的前后端技术体系。
在实际客运站运营中,网上售票系统需要解决几个核心痛点:高峰期并发订票的稳定性、余票数据的实时准确性、支付流程的安全可靠性。我去年参与某省会城市客运站系统升级时,就遇到过售票峰值期数据库连接池耗尽导致服务瘫痪的情况。这个毕设项目虽然规模较小,但已经包含了这些关键业务场景的雏形。
SSM(Spring+SpringMVC+MyBatis)作为经典JavaEE开发框架,在中小型项目中具有显著优势。在客运售票场景中:
选择Vue.js而非React或Angular主要基于:
这是系统最关键的模块,我们采用二级缓存策略:
java复制// 伪代码示例
public class TicketService {
@Cacheable(value = "routeCache", key = "#routeId")
public Route getRouteInfo(String routeId) {
// 数据库查询
}
@Scheduled(fixedRate = 30000)
public void refreshCache() {
// 定时同步数据库与缓存
}
}
注意事项:
客运票务的订单状态流转比电商更复杂,需要包含:
code复制待支付 -> 已支付 -> 已出票
-> 已取消(超时未付)
-> 已改签
-> 已退票
我的实现方案:
java复制public enum OrderStatus {
PENDING_PAYMENT {
public boolean canChangeTo(OrderStatus newStatus) {
return newStatus == PAID || newStatus == CANCELLED;
}
},
// 其他状态定义...
}
踩坑记录:
sql复制CREATE TABLE `ticket` (
`id` BIGINT PRIMARY KEY,
`schedule_id` BIGINT NOT NULL COMMENT '班次ID',
`seat_no` VARCHAR(10) NOT NULL COMMENT '座位号',
`status` TINYINT NOT NULL COMMENT '0-待售 1-已售 2-锁定',
`version` INT DEFAULT 0 COMMENT '乐观锁版本号'
);
CREATE TABLE `order` (
`order_no` VARCHAR(32) PRIMARY KEY,
`user_id` BIGINT NOT NULL,
`total_amount` DECIMAL(10,2) NOT NULL,
`status` VARCHAR(20) NOT NULL,
`create_time` DATETIME NOT NULL
);
优化建议:
在毕业答辩中,这是评委最关注的技术点之一。我的解决方案对比:
| 方案 | 实现复杂度 | 性能影响 | 适用场景 |
|---|---|---|---|
| 悲观锁 | 低 | 高 | 低并发 |
| 乐观锁 | 中 | 低 | 推荐方案 |
| Redis原子操作 | 高 | 最低 | 超高并发 |
最终选择乐观锁实现:
java复制public boolean purchaseTicket(Long ticketId) {
Ticket ticket = ticketMapper.selectById(ticketId);
if (ticket.getStatus() != 0) {
return false;
}
ticket.setStatus(1);
ticket.setVersion(ticket.getVersion() + 1);
int affected = ticketMapper.updateByIdAndVersion(ticket);
return affected > 0;
}
采用延迟队列实现订单自动取消:
java复制@RabbitListener(queues = "order.delay.queue")
public void processExpiredOrder(String orderNo) {
Order order = orderMapper.selectByOrderNo(orderNo);
if (order.getStatus().equals("待支付")) {
order.setStatus("已取消");
orderMapper.update(order);
// 释放库存...
}
}
注意事项:
使用Vue+Element UI实现带筛选的班次表格:
vue复制<template>
<el-table :data="filteredSchedules">
<el-table-column prop="departTime" label="发车时间"/>
<el-table-column label="余票">
<template #default="{row}">
<el-tag :type="row.tickets > 10 ? 'success' : 'danger'">
{{ row.tickets }}
</el-tag>
</template>
</el-table-column>
</el-table>
</template>
<script>
export default {
computed: {
filteredSchedules() {
return this.schedules.filter(s =>
s.departTime >= this.selectedDate &&
s.from === this.selectedFrom
)
}
}
}
</script>
基于SVG的可视化选座组件开发要点:
根据指导过20+篇优秀毕设的经验,建议论文结构:
加分技巧:
去年作为答辩秘书记录的评委常见问题:
建议准备:
如果想提升项目竞争力,可以考虑:
我在实现电子客票时遇到的坑:二维码生成后需要加密签名,否则可能被伪造。最终采用JWT方案:
java复制public String generateTicketToken(Ticket ticket) {
return Jwts.builder()
.claim("ticketNo", ticket.getTicketNo())
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
这个毕设项目虽然基础,但涵盖了企业级开发的完整流程。建议在开发过程中多思考业务场景的异常情况处理,这往往是区分普通项目和优秀项目的关键。我在第一次实现售票系统时,就因为没有充分考虑网络抖动情况,导致出现了票已售出但用户未收到确认的严重bug。后来通过引入本地消息表+定时任务补偿机制才彻底解决。