列车售票系统设计方案
一、项目简介
该系统是一个类似12306的在线列车售票系统,主要实现用户注册、登录、查询、购票、退票、改签等功能。
二、系统架构
项目整体采用微服务架构,根据功能进行拆分,大致分为以下几个服务模块:
用户服务:用户注册、登录、个人信息维护等功能
查询服务:用于接收并处理用户查询站点、余票等请求
购票服务:用于接收并处理购票请求,考虑到购票请求并发度较高,所以单独作为一个模块
退改服务:用于接收并处理退票、改签相关请求
订单服务:用于接收并处理订单创建、订单查询等相关请求
支付服务:用于处理用户支付、退款等相关请求
票池:为了提高系统性能,设计专门的数据结构管理车票,购票、退票等请求与票池进行交互。
对于每个微服务而言,其内部架构使用了MVC架构。
- Model是指数据模型,是对客观事物的抽象。
- View是指视图,也就是呈现给用户的一个界面,是model的具体表现形式,也是收集用户输入的地方。
- Contorller指控制器,主要负责与model和view打交道。
三、分解视图
分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为明晰的分解结构(breakdown structure)特点。分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。
四、接口API
登录:
{ "username":"", "password":"" }
返回
{ "code":"", // 消息代码 "msg": "", // 消息 "data":{ "token":"" } }
查询余票:
{ "startCity":"", "endCity":"", "date":"", "type":"" }
返回
{ "code":"", "msg":"", "data":{ "list": [ { "train_number":"", "start_station":"", "end_station":"", "start_time":"", "arrival_time":"", "start_station_type":"", "end_station_type":"", "train_type":"", "business_seats_number":"", "first_seats_number":"", "second_seats_number":"", "no_seats_number":"", "hard_seats_number":"", "hard_berth_number":"", "soft_berth_number":"", "senior_soft_berth_number":"", } ] } }
购票:
{ "trainId":"", "startCity":"", "endCity":"", "date":"", "list":[ { "passengerName":"", "idcard":"", "seatType":"", } ] }
五、依赖视图
依赖视图展现了软件模块之间的依赖关系。
六、执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件(Component),都是不同于其他组件的执行实体。执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。
项目中我负责的模块为购票和改签,以这两个模块为例。
购票
改签
七、实现视图
实现视图是描述软件架构与源文件之间的映射关系。实现视图有助于码农在海量源代码文件中找到具体的某个软件单元的实现。实现视图与软件架构的静态结构之间映射关系越是对应的一致性高,越有利于软件的维护。
由于本项目我们小组只负责后端,前端有另外的小组完成,所以此处只包含了后端的源代码目录文件结构。
项目使用微服务架构,每个服务的RPC目录结构和Server目录结构类似。
八、部署视图
部署视图是将执行实体和计算机资源建立映射关系。这里的执行实体的粒度要与所部署的计算机资源相匹配,比如以进程作为执行实体那么对应的计算机资源就是主机,这时应该描述进程对应主机所组成的网络拓扑结构,这样可以清晰地呈现进程间的网络通信和部署环境的网络结构特点。
九、数据库和核心数据结构设计
用户表
字段名 | 字段类型 | 字段描述 |
id | int | 用户id |
username | varchar | 用户名 |
password | varchar | 密码 |
name | varchar | 姓名 |
sex | varchar | 性别 |
birthday | datetime | 出生日期 |
telephone | varchar | 手机号 |
varchar | 邮箱 | |
address | varchar | 地址 |
identification_type | varchar | 证件类型 |
identification_number | varchar | 证件号 |
乘车人表
字段名 | 字段类型 | 字段描述 |
id | int | 乘车人id |
name | varchar | 乘车人姓名 |
identification_type | varchar | 证件类型 |
identification_number | varchar | 证件号码 |
passenger_type | varchar | 乘客类型(成人、学生等) |
用户_乘车人表
字段名 | 字段类型 | 字段描述 |
id | int | 用户_乘车人表id |
passengerid | int | 乘车人id |
userid | int | 用户id |
列车表
字段名 | 字段类型 | 字段描述 |
id | int | 列车id |
traintypeid | int | 列车类型id |
trainNumber | int | 列车编号 |
start_stationid | int | 始发站id |
dest_stationid | int | 终点站id |
starttime | datetime | 发车时间 |
arrivetime | datetime | 到达时间 |
列车类型表
字段名 | 字段类型 | 字段描述 |
id | int | 列车类型表id |
trainType | string | 列车类型(动车、火车等) |
车厢表
字段名 | 字段类型 | 字段描述 |
id | int | 车厢id |
carriageType | varchar | 车厢类型 |
seatnumber | int | 座位数量 |
列车_车厢表
字段名 | 字段类型 | 字段描述 |
id | int | 列车_车厢表id |
trainid | int | 列车id |
carriageid | int | 车厢id |
carriagenumber | int | 车厢编号,用于表示该车厢是列车的几号车厢 |
车站表
字段名 | 字段类型 | 字段描述 |
id | int | 车站id |
stationname | varchar | 车站名称 |
列车_车站表
字段名 | 字段类型 | 字段描述 |
id | int | 列车_车站表id |
stationid | int | 车站id |
trainid | int | 列车id |
arrivetime | datetime | 列车到达时间 |
starttime | datetime | 列车发车时间 |
车票表
字段名 | 字段类型 | 字段描述 |
id | int | 车票id |
trainid | int | 该车票对应的列车id |
start_stationid | int | 车票出发站id |
dest_stationid | int | 车票目的站id |
starttime | datetime | 开车时间 |
carriageid | int | 车厢id |
seat | int | 座位号 |
passengerid | int | 乘车人id |
ticketstatus | varchar | 车票状态 |
订单表
字段名 | 字段类型 | 字段描述 |
id | int | 订单id |
userid | int | 创建该订单的用户id |
ticketid | int | 订单购买的车票id |
amountmoney | float | 订单金额 |
createtime | datetime | 创建时间 |
paytime | datetime | 支付时间 |
orderstatus | varchar | 订单状态(未支付、已支付..) |
十、运行环境及技术选型
主要技术:
Gin:Go语言轻量级Web框架
gRPC:基于Protobuf的跨语言RPC框架,用于不同微服务之间的交互
Redis:用于存储热点数据,提高系统响应速度
开发、运行环境:
开发语言:Golang
开发系统:Windows、Mac
开发工具:GoLand、VScode
数据库:Redis、Mysql
部署环境:Ubuntu+Docker