这个项目最初是为了解决个人出行抢票难的问题,顺带练手全栈技术。虽然市场上已有12306等平台,但做一个简化版能深入理解高并发下订单系统的设计要点。最后选定的组合是 SpringBoot 2.7 + Vue 3,数据库用 MySQL,缓存 Redis,消息队列预留 RabbitMQ。
技术栈与架构选择
后端基于 SpringBoot 搭建 RESTful API,持久层没有用 JPA,因为复杂查询下 JPA 动态查询不好控制,直接上 MyBatis-Plus,结合 QueryDSL 做类型安全的查询。安全框架 Spring Security 配合 JWT 做无状态认证。前端选 Vue 3 + Element Plus,后台管理界面组件化开发效率很高,图表展示用了 ECharts。
核心数据表
数据库设计了用户、车次和订单三张主表,订单表在结构上预留了分库分表的 sharding key。
用户表
CREATE TABLE t_user (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT,
account_name VARCHAR(32) NOT NULL UNIQUE,
password_hash CHAR(64) NOT NULL,
mobile VARCHAR(11),
real_name VARCHAR(20),
id_card_no CHAR(18),
account_status TINYINT DEFAULT 0,
register_time DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login_ip VARCHAR(15)
);
车次表
车次表存储基本信息,运行日用一个 varchar 表示一周哪几天开行,比如 '1111100' 代表周一到周五,方便计算。
| 字段 | 类型 | 说明 |
|---|---|---|
| train_code | VARCHAR(8) | 主键,车次编号 |
| train_type | TINYINT | 1-高铁,2-动车等 |
| departure_station | VARCHAR(20) | 始发站 |
| terminal_station | VARCHAR(20) | 终点站 |
| depart_time | TIME | 发车时刻 |
| total_seats | INT | 总座位数 |
| carriage_count |


