数据库课程设计:火车售票系统0
主要任务:
1.
2.
3.
4.
任务分配情况
一、需求分析
姓名\任务 | 需求概述,角色,内容编写 | 功能建模 | 数据建模 | 行为建模 |
---|---|---|---|---|
王玉 | 数据2 | 数据3 | 数据4 | 数据5 |
王雨萌 | 数据7 | 数据8 | 数据9 | 数据10 |
陆睿希 | 数据12 | 数据13 | 数据14 | 数据15 |
胡雨娟 | 数据12 | 数据13 | 数据14 | 数据15 |
二、系统设计
需求分析
一、需求概述
本系统为乘客提供便捷的火车票购买与管理服务。乘客可通过输入出发站、到达站及日期查询车次信息,系统动态显示列车发车时间、席别、实时票价及余票情况,并支持提交订单与第三方支付。若支付超时或候补订单未匹配成功,系统将自动释放座位并更新订单状态,保障公平性。退票时系统根据发车时间自动计算手续费并恢复余票,改签需先退票后重新购票。运营管理员可维护列车、车站信息等。乘客信息(如身份证号)脱敏显示,候补订单按提交时间优先级处理,超时未支付或候补失败自动通知用户。系统全面覆盖购票、退改、候补、运营管理及风控场景,兼顾效率与合规性。
用户角色
角色 | 主要职责 |
---|---|
普通用户 | 购票、退票、改签、订单查询、信息反馈。 |
管理员 | 系统维护、用户管理、异常处理、日志监控。 |
铁路工作人员 | 车次/票价/站点管理、运营状态调整。 |
售票员 | 人工售票、退改服务、设备维护(线下场景)。 |
支付接口管理员 | 支付渠道配置、风控管理、交易异常处理(第三方服务)。 |
三、功能建模
业务流程描述
- 用户购票流程
当乘客进入购票页面时,可以通过系统查询车次(输入出发站、到达站、发车日期),然后系统会根据车次停靠表(Train_Schedule)动态计算区间余票(基于余票信息表 Ticket_Inventory),显示车次、席别、票价(匹配票价表 Ticket_Price)、发车时间等信息供乘客选择,乘客选择车次并提交订单后,系统通过乐观锁(version字段)扣减余票,生成订单表(Order)记录,并跳转至支付页面。支付成功后,订单状态更新为“已支付”,生成支付记录表(Payment)数据;若支付超时(如30分钟未支付),系统自动释放库存并标记订单为“已取消”。 - 退票与改签
乘客需要退票或改签时,可以在订单详情页发起退票,系统查询相应金额并退款(我们这里退款时退全款)后更新订单状态为“已取消”,并且同时恢复对应区间的余票(更新余票信息表 Ticket_Inventory)。记录退款信息至支付记录表(Payment)。改签则需先退票后重新购票,系统禁止直接修改原有订单。 - 候补购票
当余票不足时,乘客可提交候补订单表(Wait_Order),指定车次、席别、乘车日期。系统实时监控余票变化:当有余票释放时,按候补下单时间顺序锁定座位,通知用户支付(15分钟内未支付则释放)。若候补失败(发车前24小时仍无票),系统自动取消候补订单并通知用户。 - 列车与车站管理
运营管理员可维护列车表(Train)信息(如调整运营状态is_active)、车站表(Station)信息(如新增车站编码station_code)。修改车次停靠表(Train_Schedule)时(如增减停靠站),需校验是否存在未完成的关联订单(通过订单表 Order检查),若有则禁止修改。 - 票价动态调整
运营管理员可在票价表(Ticket_Price)中设置不同区间、席别的票价规则(含生效日期effective_date),系统自动匹配当前有效票价。 - 支付与风控
支付接口对接第三方(如支付宝、微信),通过transaction_id关联支付流水,确保交易可追溯。若支付失败(如余额不足),系统自动释放座位并标记订单为“支付失败”,防止占票不支付。 - 数据安全与高并发
用户密码(password字段)使用BCrypt加密存储,身份证号(id_card)脱敏显示。
余票扣减通过乐观锁(version字段)实现并发控制,避免超售。
业务流程图
四、行为建模
业务流程图
-
用户注册登录核心流程图
-
列车基础数据录入流程
-
车站基础信息管理
-
管理列车停靠站序列
-
管理余票库存
-
规范票价设置流程
-
描述订单生命周期(未支付→已支付→已取消)
-
管理支付流程
-
规范候补购票流程
-
管理用户常用乘车人信息
-
总流程
五、数据建模
数据字典
- 用户表:用户账号,用户名,加密后的密码,用户真实姓名,身份证号,手机号
- 列车表:列车编号,车次号,列车类型,起始站ID,终点站ID,发车时间,到达终点站时间,总座位数,运营状态
- 车站表:车站唯一标识,车站名称,所在城市,所在省份,车站编码,车站等级,是否为换乘站
- 车次停靠表:停靠记录编号,关联列车ID,关联车站ID,停靠顺序,到站时间,离站时间,停留分钟数
- 余票信息表:余票编号,关联列车ID,发车日期,出发站ID,到达站ID,席别,可用余票数量
- 票价表:票价记录唯一标识,关联列车ID,出发站ID,到达站ID,席别,票价,票价生效日期,票价失效日期
- 订单表:订单号,关联用户ID,关联列车ID,出发站ID,到达站ID,席别,下单时间,乘车日期,订单金额,订单状态,支付时间
- 支付记录表:支付记录,关联订单ID,关联用户ID,实际支付金额,支付方式,支付时间,第三方交易流水号,支付状态
- 候补订单表:候补订单唯一标识,关联用户ID,关联列车ID,出发站ID,到达站ID,席别,乘车日期,候补下单时间,候补状态,候补成功时间
- 乘客信息表:乘客唯一标识,关联用户ID,乘客真实姓名,身份证号,联系电话,是否为默认乘客,添加时间
二、系统设计
1. 用户表 (User)
字段名 | 类型/约束 | 说明 |
---|---|---|
user_id | BIGINT, PK | 用户唯一标识 |
username | VARCHAR(50), UNIQUE, NOT NULL | 用户名(登录用) |
password | VARCHAR(100), NOT NULL | 加密后的密码(使用BCrypt或SHA-256哈希加密) |
real_name | VARCHAR(50), NOT NULL | 用户真实姓名 |
id_card | VARCHAR(18), UNIQUE, NOT NULL | 身份证号 |
phone | VARCHAR(11), UNIQUE, NOT NULL | 手机号 |
VARCHAR(100) | 邮箱(可选) | |
user_level | INT DEFAULT 1 | 用户等级(默认1级) |
register_time | DATETIME, NOT NULL | 注册时间 |
last_login_time | DATETIME | 最后登录时间 |
2. 列车表 (Train)
字段名 | 类型/约束 | 说明 |
---|---|---|
train_id | VARCHAR(10), PK | 列车唯一标识 |
train_number | VARCHAR(20), NOT NULL | 车次号(如G1234) |
train_type | VARCHAR(10), NOT NULL | 列车类型(高铁/动车/普快等) |
start_station_id | INT, FK(Station.station_id) | 起始站ID(外键关联车站表) |
end_station_id | INT, FK(Station.station_id) | 终点站ID(外键关联车站表) |
departure_time | TIME, NOT NULL | 发车时间 |
arrival_time | TIME, NOT NULL | 到达终点站时间 |
total_seats | INT, NOT NULL | 总座位数(按车厢和席别动态计算,非冗余字段) |
is_active | BOOLEAN DEFAULT TRUE | 是否运营中 |
3. 车站表 (Station)
字段名 | 类型/约束 | 说明 |
---|---|---|
station_id | INT, PK | 车站唯一标识 |
station_name | VARCHAR(50), NOT NULL | 车站名称(如北京南站) |
city | VARCHAR(50), NOT NULL | 所在城市 |
province | VARCHAR(50), NOT NULL | 所在省份 |
station_code | VARCHAR(10), UNIQUE, NOT NULL | 车站编码(如BJN) |
station_level | VARCHAR(10) | 车站等级(特等/一等/二等) |
is_transfer | BOOLEAN DEFAULT FALSE | 是否为换乘站 |
4. 车次停靠表 (Train_Schedule)
字段名 | 类型/约束 | 说明 |
---|---|---|
schedule_id | BIGINT, PK | 停靠记录唯一标识 |
train_id | VARCHAR(10), FK(Train.train_id) | 关联列车ID |
station_id | INT, FK(Station.station_id) | 关联车站ID |
sequence_number | INT, NOT NULL | 停靠顺序(从1开始) |
arrival_time | TIME | 到站时间(若为始发站则无值) |
departure_time | TIME | 离站时间(若为终点站则无值) |
stop_duration | INT | 停留分钟数 |
mileage | INT | 累计里程(单位:公里) |
5. 余票信息表 (Ticket_Inventory)
字段名 | 类型/约束 | 说明 |
---|---|---|
inventory_id | BIGINT, PK | 余票记录唯一标识 |
train_id | VARCHAR(10), FK(Train.train_id) | 关联列车ID |
departure_date | DATE, NOT NULL | 发车日期 |
from_station_id | INT, FK(Station.station_id) | 出发站ID |
to_station_id | INT, FK(Station.station_id) | 到达站ID |
seat_type | VARCHAR(10), NOT NULL | 席别(商务座/一等座/二等座等) |
available_count | INT, NOT NULL | 可用余票数量 |
version | INT DEFAULT 0 | 乐观锁版本号(用于高并发控制) |
6. 票价表 (Ticket_Price)
字段名 | 类型/约束 | 说明 |
---|---|---|
price_id | BIGINT, PK | 票价记录唯一标识 |
train_id | VARCHAR(10), FK(Train.train_id) | 关联列车ID |
from_station_id | INT, FK(Station.station_id) | 出发站ID |
to_station_id | INT, FK(Station.station_id) | 到达站ID |
seat_type | VARCHAR(10), NOT NULL | 席别 |
price | DECIMAL(10,2), NOT NULL | 票价 |
effective_date | DATE, NOT NULL | 票价生效日期 |
expiry_date | DATE | 票价失效日期(可选,默认为长期有效) |
7. 订单表 (Order)
字段名 | 类型/约束 | 说明 |
---|---|---|
order_id | BIGINT, PK | 订单唯一标识 |
user_id | BIGINT, FK(User.user_id) | 关联用户ID |
train_id | VARCHAR(10), FK(Train.train_id) | 关联列车ID |
from_station_id | INT, FK(Station.station_id) | 出发站ID |
to_station_id | INT, FK(Station.station_id) | 到达站ID |
seat_type | VARCHAR(10), NOT NULL | 席别 |
order_time | DATETIME, NOT NULL | 下单时间 |
departure_date | DATE, NOT NULL | 乘车日期 |
price | DECIMAL(10,2), NOT NULL | 订单金额(从票价表同步) |
order_status | VARCHAR(20), NOT NULL | 订单状态(未支付/已支付/已取消/已完成) |
payment_time | DATETIME | 支付时间(仅状态为已支付时有效) |
8. 支付记录表 (Payment)
字段名 | 类型/约束 | 说明 |
---|---|---|
payment_id | BIGINT, PK | 支付记录唯一标识 |
order_id | BIGINT, FK(Order.order_id) | 关联订单ID |
user_id | BIGINT, FK(User.user_id) | 关联用户ID |
payment_amount | DECIMAL(10,2), NOT NULL | 实际支付金额 |
payment_method | VARCHAR(20), NOT NULL | 支付方式(支付宝/微信/银联等) |
payment_time | DATETIME, NOT NULL | 支付时间 |
transaction_id | VARCHAR(50), UNIQUE | 第三方交易流水号 |
payment_status | VARCHAR(20), NOT NULL | 支付状态(成功/失败) |
9. 候补订单表 (Wait_Order)
字段名 | 类型/约束 | 说明 |
---|---|---|
wait_order_id | BIGINT, PK | 候补订单唯一标识 |
user_id | BIGINT, FK(User.user_id) | 关联用户ID |
train_id | VARCHAR(10), FK(Train.train_id) | 关联列车ID |
from_station_id | INT, FK(Station.station_id) | 出发站ID |
to_station_id | INT, FK(Station.station_id) | 到达站ID |
seat_type | VARCHAR(10), NOT NULL | 席别 |
departure_date | DATE, NOT NULL | 乘车日期 |
create_time | DATETIME, NOT NULL | 候补下单时间 |
wait_status | VARCHAR(20), NOT NULL | 候补状态(等待中/成功/失败/取消) |
success_time | DATETIME | 候补成功时间(仅状态为成功时有效) |
10. 乘客信息表 (Passenger)
字段名 | 类型/约束 | 说明 |
---|---|---|
passenger_id | BIGINT, PK | 乘客唯一标识 |
user_id | BIGINT, FK(User.user_id) | 关联用户ID(添加该乘客的用户) |
real_name | VARCHAR(50), NOT NULL | 乘客真实姓名 |
id_card | VARCHAR(18), UNIQUE, NOT NULL | 身份证号 |
phone | VARCHAR(11) | 联系电话(可选) |
is_default | BOOLEAN DEFAULT FALSE | 是否为默认乘客(用户常用乘客标记) |
create_time | DATETIME, NOT NULL | 添加时间 |