仿12306系统设计方案
1.项目介绍
参考 12306 站点进行售票系统建模设计,尽可能接近覆盖真实线上系统
o 实现的功能有但不限于:
-
用户基本信息注册
-
查询余票: 根据时间,车次,站点区间,座次(一等座,二等座,硬卧,硬座...)查询余票
-
售票:支持一次购买同一车次的多张车票(多人),支持订单30分钟内锁定,超时释放。支付接口可以 mock
-
退票: 支持一个用户账户下的批量退票
-
改签: 同一用户一张车票只能改签一次
o 所有读写接口延迟要求 <= 500ms
o 单机支持到 500qps 的并发
2.软件架构方案
本系统的特点需要支持高并发、低时延。
2.1架构设计
本次系统整体采用微服务的架构风格,而对于后端系统而言,采用Spring Cloud框架搭建基本微服务,本系统前端采用Vue.js搭建。
对于微服务的每个组件而言,其后端系统架构类似于MVC架构,
- Model模型层用来表示数据模型以及其对应的持久化操作。在MVC架构下,模型封装了数据。
- View视图层用来展示UI界面,和用户做交互。它将从模型层获取的数据展示给用户看。
- Controller控制器层作用在模型层和视图层上,使得视图层和模型层可以分解耦合,视图层只关心页面表示,而模型层只关注数据表示。
在本系统中,MVC架构的View被基于RESTful风格的api代替,而其真正的视图层为通过Vue.js搭建的前端系统。
前端系统采用Vue.js开发,而Vue.js采用了MVVM架构,
- M模型层,和MVC层的模型层类似,表示数据模型。
- View视图层,也和MVC架构类似,只关注于页面展示。
- VM层,和MVC层的controller有所区。比如在Vue.js中采用双向数据绑定,将VM与M和V联系起来。
微服务是一组能够独立部署、独立运行、可水平扩展,(可能拥有独立数据存储)的服务单元。它摆脱了传统单体应用过于庞大、不易维护的缺点。
在本系统中,我们将系统划分成了三个微服务系统。
- 身份认证微服务,主要负责用户的登录和注册,以及其身份信息的核验。
- 车次微服务,提供有关列车车次、余票查询以及时刻表查询等功能。
- 订单微服务,提供和订单有关的功能,包括下单、订单查询、改签等。
2.2部分API接口示例
1.注册接口
需要发送的数据格式如下:
{ "name": "", "password":"" }
返回注册成功与否的结果
{ "code": 10000, "msg": "success", "data": null }
2.登录接口
登录可以通过绑定用户名+密码,手机号码+密码的形式
而后端系统会根据name字段的正则表达式匹配是否为手机号码,自动识别用户名或者密码登录
{
"name":"",
"password":""
}
返回的结果如下所示
{
"code":10000,
"msg":"success",
"data":{
"username":"",
"token":"",
"phone":"",
"idnum":"",
"isvalid":""
}
}
3.余票查询接口
余票查询需要输入日期、出发地和目的地三个条件,可选的有G、D等类型的火车,请求数据如下所示:(注:其中type为一个数组,标识动车类型)
{
"date":"",
"departure":"",
"destination":"",
"type":[]
}
返回结果如下所示:
{
"code":10000,
"msg":"success",
"data":[{
"train_no":"",
"departure":"",
"destination":"",
"start_time":"",
"arrive_time":"",
"first_class_seats":"",
"second_class_seats":"",
"soft_berth_seats":"",
"hard_berth_seats":"",
"hard_seats":"",
"business_seats":""
}
]
}
可能有不同类型的车次,为一个列表,示例只给出了一趟车的数据
4.时刻表接口
请求数据只需要车次号和时间
{
"train_no":"",
"date":""
}
返回数据为时刻表:
{
"code":10000,
"msg":"success",
"data":{
"train_no":"",
"date":"",
"timetable":
[{
"station_name":"",//车站名
"start_time":"",//发时
"arrive_time":"",//到时
"stay_time":"",//停留时间
"on_time":""//是否正晚点
}
]
}
5.下单接口
{
"token":"",
"train_no":"",
"date":"",
"departure":"",
"destination":"",
"start_time":"",
"arrive_time":"",
"seat_type":""
}
返回数据如下所示:
{ "code":10000, "msg":"success", "data":[{
"order_id":"",//订单号 "train_no":"",//车次号
"date":"",//发车日期 "departure":"",//出发地 "destination":"",//目的地 "start_time":"",//发车时间 "arrive_time":"",//到达时间
"payed":"",//是否已支付
"create_time":"",//下单时间
"ticket":{
"seat_type":"",//座位类型
"seat_no":"",//座位号
"price":"",//车票价格
"passenger_name":"",//乘客姓名
"passenger_idnum":"",//乘客身份证号
"ticket_type":""//车票类型,学生票、成人票等
}
]
}
3.视图模型
3.1分解视图

3.2依赖视图
依赖视图如下所示,其中前端页面依赖所有服务,订单系统依赖于身份认证系统以及车次系统。

3.3实现视图
实现的项目目录如下所示:

3.4部署视图

3.5工作分配视图
| 组员 | 分工 |
| A | 前端页面 |
| B | 身份认证服务、基础设施以及公共类建设 |
| C | 车次服务 |
| D | 订单服务 |
4.数据库设计
表1 用户表
| 字段名 | 类型 | 含义说明 |
| user_id | varchar | 用户对应的id |
| name | varchar | 用户名 |
| password | varchar | 用户登录密码 |
| phone | varchar | 绑定手机号 |
| idnum | varchar | 身份证号码 |
| isvalid | int | 是否通过核验 |
| type | int | 身份类型,成人、学生等 |
表2管理员表
| 字段 | 类型 | 含义说明 |
| name | varchar | 用户名 |
| password | varchar | 登录密码 |
表3列车表
| 字段 | 类型 | 含义说明 |
| train_no | varchar | 列车编号 |
| name | varchar | 列车名 |
| type | int | 列车类型(高铁、特快、动车等) |
| seat | int | 座位数量 |
表4站点表
| 字段 | 类型 | 含义说明 |
| station_no | varchar | 站点号 |
| name | varchar | 站点名 |
表5时刻表
| 字段 | 类型 | 含义说明 |
| id | int | 主键id |
| train_no | varchar | 对应列车表的车次号 |
| station_no | varchar | 对应站点表编号 |
| starttime | time | 出发时间 |
| arrivetime | time | 到站时间 |
| date | date | 发车日期 |
表6车票表
| 字段 | 类型 | 含义说明 |
| id | int | 主键id |
| train_no | varchar | 对应列车编号 |
| departure | varchar | 对应站点表编号,出发地 |
| destination | varchar | 对应站点表编号,目的地 |
| price | double | 车票价格 |
表7订单表
| 字段 | 类型 | 含义说明 |
| order_id | varchar | 订单号 |
| user_id | varchar | 对应用户表id |
| departure | varchar | 出发地 |
| destination | varchar | 目的地 |
| starttime | time | 出发时间 |
| arrivetime | time | 到达时间 |
| date | date | 发车日期 |
| price | double | 车票价格 |
| seat | varchar | 车位号 |
| train_no | varchar | 列车编号 |
5.软件运行环境和系统选型说明
开发语言:Java
开发工具:Intellj IDEA
使用的框架:Spring Cloud Spring Boot Vue.js
运行环境:Linux+Docker容器
6.总结
本文对仿12306系统做了简要的系统设计,初步选定了系统架构,目前系统正在研发当中,以本文涉及的理论作为指导。在软件工程方法论的指导下,我们对系统的研发有了更加明确的定位以及目标。

浙公网安备 33010602011771号