仿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系统做了简要的系统设计,初步选定了系统架构,目前系统正在研发当中,以本文涉及的理论作为指导。在软件工程方法论的指导下,我们对系统的研发有了更加明确的定位以及目标。

 

 

posted @ 2020-12-30 14:57  xiaoze8  阅读(955)  评论(0)    收藏  举报