一、软件结构特点
1.1设计模式
在工程实践中,我们选用MVC架构座位本次设计的架构。MVC中M、V和C所代表的含义如下:
- Model(模型)代表一个存取数据的对象及其数据模型。在MVC架构下,模型用来封装核心数据和功能,它独立于特定的输出表示和输入行为,是执行某些任务的代码,至于这些任务以什么形式显示给用户,并不是模型所关注的问题。模型只有纯粹的功能性接口,也就是一系列的公开方法,这些方法有的是取值方法,让系统其它部分可以得到模型的内部状态,有的则是写入更新数据的方法,允许系统的其它部分修改模型的内部状态。
- View(视图)代表模型包含的数据的表达方式,一般表达为可视化的界面接口。在MVC架构下,视图用来向用户显示信息,它获得来自模型的数据,决定模型以什么样的方式展示给用户。同一个模型可以对应于多个视图,这样对于视图而言,模型就是可重用的代码。一般来说,模型内部必须保留所有对应视图的相关信息,以便在模型的状态发生改变时,可以通知所有的视图进行更新。
- Controller(控制器)作用于模型和视图上,控制数据流向模型对象,并在数据变化时更新视图。控制器可以使视图与模型分离开解耦合。在MVC架构下,控制器是和视图联合使用的,它捕捉鼠标移动、鼠标点击和键盘输入等事件,将其转化成服务请求,然后再传给模型或者视图。软件的用户是通过控制器来与系统交互的,他通过控制器来操纵模型,从而向模型传递数据,改变模型的状态,并最后导致视图的更新。
在售票系统中,Model层中存储着用户的个人信息,订票信息,列车调度信息和出售信息等等;View层中是售票系统的前端部分;Controller层中控制着车票的售票管理等信息。在这种架构下,前后端可以很好地分离出来,通过控制器链接模型和视图,让模型层能专注于处理数据的存储,视图层能专注于处理前端方面的业务,让控制器专注于处理数据,并通过制定的方式传输到视图。
1.2软件架构风格与策略
在工程实践中,我们选用B/S风格,即浏览器/服务器模式。
B/S的优点如下:
1)客户端无需安装,有Web浏览器即可。
2)BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
3)BS架构无需升级多个客户端,升级服务器即可。
二、接口设计
1、注册接口:
{ "username":"", "password":"" }
{ "code":"", // 消息代码 "msg": "", // 消息 说明是否注册成功 "data":{} // 这里是无 }
2、登录接口:
{ "username":"", "password":"" }
返回:
{ "code":"", // 消息代码 "msg": "", // 消息 "data":{ "token":"" } }
3、查询余票请求:
{ "startCity":"", // 城市名或站名 "endCity":"", "date":"", "type":"" // 0 全类, 1高铁动车票 }
返回:
{ "code":"", "msg":"", "data":{ "list": [ { "train_number":"", // 列次 字符串 "start_station":"", "end_station":"", "start_time":"", // 出发时间 "arrival_time":"", // 达到时间 "start_station_type":"", //起始站类型, 是否始发站还是过站, 0, 1 "end_station_type":"", //到达站类型, 是否是过站还是终点站, 1,2 "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": , // 高软 } ] } }
4、购票请求:
{ "username":"",//用户名 "token":"",//验证信息 "date":"",//发车日期 "train_number":"",//车次 "start_station":"",//上车站 "end_station":"",//下车站 "passengers":{//乘客数据 "passenger_seq":"",//乘客序号 "seat_class":"",//座位等级 "seat_type":""//座位类型 } }
返回:
{ "code":"",//返回代码 "msg":"",//返回的消息 "data":{//返回的数据 "order_outer_id":"",//订单外部 "train_number":"",//车次号 "start_station":"",//上车站 "start_time":"",//列车在上车站发出时间 "end_station":"",//下车站 "arrival_time":"",//列车到达下车站时间 "duration":"",//中间用时 "start_time":"",//发车日期 "total_money":"",//总金额 "tickets":{//乘客的票据信息 "passenger_name":"",//乘车人姓名 "passenger_id":"",//乘车人身份证号 "carriage_number":"",//车厢号 "seat":"",//座位号 "money":"",//票价 } } }
三、软件系统概念原型的各类视图
1、分解视图
2、执行视图
3、用例视图
用户用例视图:
管理员用例视图:
4、UML图
5、实现视图
我们的项目根据模块进行分包,最终的实现视图如下:
四、数据库设计
1、用户表:
变量名称 | 变量类型 | 备注 |
id | varchar | 账户名 |
password | varchar | 密码 |
name | varchar | 姓名 |
nickname | varchar | 昵称 |
credential_type | varchar | 证件类型 |
credential_number | varchar | 证件号 |
telephone | varchar | 手机号 |
member | varchar | 会员信息 |
2、车次表:
变量名称 | 变量类型 | 备注 |
train_id | int | 车次编号 |
train_number | varchar | 车次号 |
train_identification | varchar | 列车编号 |
begin_place | varchar | 起点 |
end_place | varchar | 终点 |
begin_time | datetime | 开车时间 |
end_time | datetime | 到达时间 |
3、列车表:
变量名称 | 变量类型 | 备注 |
train_identification | varchar | 列车编号 |
train_type | varchar | 列车类型 |
carriage_sum | varchar | 车厢数量 |
carriage_type | varchar | 列车状态 |
4、车厢表:
变量名称 | 变量类型 | 备注 |
carriage_id | varchar | 车厢编号 |
train_identification | varchar | 列车编号 |
carriage_number | int | 车厢号 |
carriage_type | varchar | 车厢类型 |
seat_number | int | 车厢座位数 |
seat_price | double | 车厢座位价格系数 |
5、座位表:
变量名称 | 变量类型 | 备注 |
seat_id | varchar | 座位编号 |
carriage_id | varchar | 车厢编号 |
train_identification | varchar | 列车编号 |
seat_number | varchar | 座位号 |
seat_use | varchar | 座位使用情况 |
6、站点表:
变量名称 | 变量类型 | 备注 |
station_id | varchar | 站点编号 |
station_name | varchar | 站点名称 |
train_id | varchar | 车次编号 |
begin_time | datetime | 列车到站时间 |
end_time | datetime | 列车出发时间 |
7、订单表:
变量名称 | 变量类型 | 备注 |
order_id | varchar | 订单编号 |
order_time | varchar | 订单时间 |
order_person | varchar | 订单联系人 |
seat_id | varchar | 订单座位号 |
order_status | varchar | 订单状态 |
五、运行环境和技术选型
开发语言:Golang
后端框架:Gin
数据库:Mysql
缓存技术:Redis
部署缓解:Linux+Docker
六、系统概念原型核心工作机制
用户可以通过系统注册自己的账户,然后登录自己的账户,完善个人信息。在系统首页选择出发城市、到达城市和日期,然后在筛选出的车次中选择一个具体的车次,选择座位,然后系统生成订单,用户支付订单。用户可以通过订单页面选择改签或退票。
管理员可以登录系统,增加或删除某天的车次、某种车型,还可以增加和删除某个具体的站点及站点信息。