火车票订票系统的设计目的包括实现系统用户管理、车票搜索、火车车次搜索、订票管理、车票改签及退票管理等主要功能模块。系统采用面向对象的开发模式进行软件开发和硬件架设,以满足实际使用需求。经过完善的软件架构和程序编码,系统实现功能,并采用MySQL作为后台数据的主要存储单元。对火车票订票系统的各项需求和技术问题进行分析,证明必要性和技术可行性,并对设计系统所需的技术软件和设计思想进行介绍。最终,实现火车票订票系统的开发和部署运行。通过该系统,用户可以快速查询车次信息、选择合适的座位并完成支付。该系统提供多种支付方式,如信用卡、支付宝和微信支付等。系统与铁路或交通管理部门的数据库实时对接,提供最新的车次信息,包括班次、座位余量和票价等。用户还可通过系统能够及时获取车次动态信息,合理安排出行计划,并接收实时的车次变化信息,如延误和取消等,帮助用户及时调整行程。
设计火车票预定系统,应具备友好且直观的用户界面,使用户能够轻松地进行车次查询、选座、购票和支付等操作。界面设计注重用户体验,确保操作简便、信息清晰。其次,提供实时的车次信息,包括出发时间、到达时间、剩余座位、票价等详细数据,通过多种查询条件如日期、出发地、目的地等来获取所需信息。还需要具备高效的订单处理能力,支持用户在线完成购票,并生成电子票据。在支付功能方面,系统应集成多种支付方式,如信用卡、支付宝、微信支付等,保证支付过程安全、快捷。为满足不同用户的需求,系统提供订单管理功能,可查看和管理自己的购票订单,包括未支付订单、已支付订单和取消订单等。通过后台管理功能,运营方可以实时监控票务销售情况,管理用户数据,以优化运营策略。
MySQL代码如下;
-- 创建 用户 表
CREATE TABLE 用户 (
用户ID INT PRIMARY KEY,
用户名 VARCHAR(50) NOT NULL,
密码 VARCHAR(50) NOT NULL,
电子邮件 VARCHAR(100) NOT NULL,
电话 VARCHAR(15)
);
-- 插入十组用户数据
INSERT INTO 用户 (用户ID, 用户名, 密码, 电子邮件, 电话) VALUES
(1, '用户3', 'password3', 'user3@example.com', '1357924680'),
(2, '用户4', 'password4', 'user4@example.com', '2468013579'),
(3, '用户5', 'password5', 'user5@example.com', '9876543210'),
(4, '用户6', 'password6', 'user6@example.com', '0123456789'),
(5, '用户7', 'password7', 'user7@example.com', '5678901234'),
(6, '用户8', 'password8', 'user8@example.com', '3210987654'),
(7, '用户9', 'password9', 'user9@example.com', '8765432109'),
(8, '用户10', 'password10', 'user10@example.com', '2345678901'),
(9, '用户11', 'password11', 'user11@example.com', '7890123456'),
(10, '用户12', 'password12', 'user12@example.com', '5432109876');
DROP TABLE IF EXISTS 用户;
INSERT INTO 用户 (用户ID, 用户名, 密码, 电子邮件, 电话) VALUES
(11, '用户13', 'password13', 'user13@example.com', '1234567890');
ALTER TABLE 用户 DROP COLUMN 电话;
-- 查询所有用户
SELECT * FROM 用户;
-- 创建 火车 表
CREATE TABLE 火车 (
火车ID INT PRIMARY KEY,
火车名称 VARCHAR(50) NOT NULL,
起点站 VARCHAR(50) NOT NULL,
终点站 VARCHAR(50) NOT NULL,
发车时间 DATETIME NOT NULL,
到达时间 DATETIME NOT NULL
);
-- 插入十组火车数据
INSERT INTO 火车 (火车ID, 火车名称, 起点站, 终点站, 发车时间, 到达时间) VALUES
(1, '火车C', '站点E', '站点F', '2024-06-22 10:00:00', '2024-06-22 14:00:00'),
(2, '火车D', '站点G', '站点H', '2024-06-23 12:00:00', '2024-06-23 16:00:00'),
(3, '火车E', '站点I', '站点J', '2024-06-24 14:00:00', '2024-06-24 18:00:00'),
(4, '火车F', '站点K', '站点L', '2024-06-25 16:00:00', '2024-06-25 20:00:00'),
(5, '火车G', '站点M', '站点N', '2024-06-26 18:00:00', '2024-06-26 22:00:00'),
(6, '火车H', '站点O', '站点P', '2024-06-27 20:00:00', '2024-06-27 00:00:00'),
(7, '火车I', '站点Q', '站点R', '2024-06-28 22:00:00', '2024-06-29 02:00:00'),
(8, '火车J', '站点S', '站点T', '2024-06-30 09:00:00', '2024-06-30 13:00:00'),
(9, '火车K', '站点U', '站点V', '2024-07-01 11:00:00', '2024-07-01 15:00:00'),
(10, '火车L', '站点W', '站点X', '2024-07-02 13:00:00', '2024-07-02 17:00:00');
--DROP TABLE IF EXISTS 火车;
SELECT * FROM 火车
WHERE 起点站 = '站点E';
SELECT * FROM 火车
WHERE 发车时间 > '2024-06-25 00:00:00';
-- 查询所有火车
SELECT * FROM 火车;
-- 创建 车厢 表
CREATE TABLE 车厢 (
车厢ID INT PRIMARY KEY,
火车ID INT NOT NULL,
车厢号 INT NOT NULL,
车厢类型 VARCHAR(50) NOT NULL,
FOREIGN KEY (火车ID) REFERENCES 火车(火车ID)
);
-- 插入十组车厢数据
INSERT INTO 车厢 (车厢ID, 火车ID, 车厢号, 车厢类型) VALUES
(11, 3, 3, '二等座'),
(12, 3, 4, '二等座'),
(13, 4, 2, '一等座'),
(14, 4, 3, '一等座'),
(15, 5, 1, '一等座'),
(16, 5, 2, '一等座'),
(17, 6, 1, '一等座'),
(18, 6, 2, '二等座'),
(19, 7, 1, '一等座'),
(20, 7, 2, '二等座');
--DROP TABLE IF EXISTS 车厢;
-- 查询某个车厢的座位
SELECT * FROM 车厢 ;
-- 创建 座位 表
CREATE TABLE 座位 (
座位ID INT PRIMARY KEY,
车厢ID INT NOT NULL,
座位号 VARCHAR(10) NOT NULL,
FOREIGN KEY (车厢ID) REFERENCES 车厢(车厢ID)
);
INSERT INTO 座位 (座位ID, 车厢ID, 座位号) VALUES
(1, 4, '1A'), (2, 4, '1B'),
(3, 5, '2A'), (4, 5, '2B'),
(5, 6, '1A'), (6, 6, '1B'),
(7, 7, '2A'), (8, 7, '2B'),
(9, 8, '1A'), (10, 8, '1B'),
(11, 9, '2A'), (12, 9, '2B'),
(13, 10, '1A'), (14, 10, '1B'),
(15, 11, '2A'), (16, 11, '2B'),
(17, 12, '1A'), (18, 12, '1B');
-- DROP TABLE IF EXISTS 座位;
SELECT * FROM 座位;
-- 创建 火车时刻表 表
CREATE TABLE 火车时刻表 (
记录ID INT PRIMARY KEY IDENTITY,
火车ID INT NOT NULL,
站点名称 VARCHAR(50) NOT NULL,
到达时间 DATETIME NOT NULL,
离开时间 DATETIME NOT NULL,
FOREIGN KEY (火车ID) REFERENCES 火车(火车ID)
);
-- 插入十组火车时刻表数据
INSERT INTO 火车时刻表 (火车ID, 站点名称, 到达时间, 离开时间) VALUES
(3, '站点E', '2024-06-22 09:50:00', '2024-06-22 10:00:00'),
(3, '站点F', '2024-06-22 13:50:00', '2024-06-22 14:00:00'),
(4, '站点G', '2024-06-23 11:50:00', '2024-06-23 12:00:00'),
(4, '站点H', '2024-06-23 15:50:00', '2024-06-23 16:00:00'),
(5, '站点I', '2024-06-24 13:50:00', '2024-06-24 14:00:00'),
(5, '站点J', '2024-06-24 17:50:00', '2024-06-24 18:00:00'),
(6, '站点K', '2024-06-25 15:50:00', '2024-06-25 16:00:00'),
(6, '站点L', '2024-06-25 19:50:00', '2024-06-25 20:00:00'),
(7, '站点M', '2024-06-26 17:50:00', '2024-06-26 18:00:00'),
(7, '站点N', '2024-06-26 21:50:00', '2024-06-26 22:00:00');
INSERT INTO 火车时刻表 (火车ID, 站点名称, 到达时间, 离开时间) VALUES
(8, '站点O', '2024-06-27 19:50:00', '2024-06-27 20:00:00'),
(8, '站点P', '2024-06-27 23:50:00', '2024-06-28 00:00:00'),
(9, '站点Q', '2024-06-28 21:50:00', '2024-06-28 22:00:00'),
(9, '站点R', '2024-06-29 01:50:00', '2024-06-29 02:00:00'),
(10, '站点S', '2024-06-30 08:50:00', '2024-06-30 09:00:00'),
(10, '站点T', '2024-06-30 12:50:00', '2024-06-30 13:00:00'),
(1, '站点W', '2024-07-01 10:50:00', '2024-07-01 11:00:00'),
(1, '站点X', '2024-07-01 14:50:00', '2024-07-01 15:00:00'),
(2, '站点Y', '2024-07-02 12:50:00', '2024-07-02 13:00:00'),
(2, '站点Z', '2024-07-02 16:50:00', '2024-07-02 17:00:00');
--DROP TABLE IF EXISTS 火车时刻表;
-- 查询某个火车的时刻表
SELECT * FROM 火车时刻表 ;
-- 创建 车厢类型票价 表
CREATE TABLE 车厢类型票价 (
记录ID INT PRIMARY KEY,
车厢类型 VARCHAR(50) NOT NULL,
价格 DECIMAL(10, 2) NOT NULL
);
-- 插入十组车厢类型票价数据
INSERT INTO 车厢类型票价 (记录ID, 车厢类型, 价格) VALUES
(1, '二等座', 150.00),
(2, '二等座', 150.00),
(3, '一等座', 250.00),
(4, '一等座', 250.00),
(5, '一等座', 250.00),
(6, '一等座', 250.00),
(7, '一等座', 250.00),
(8, '二等座', 150.00),
(9, '一等座', 250.00),
(10, '二等座', 150.00);
--DROP TABLE IF EXISTS 车厢类型票价;
-- 查询某个车厢类型的票价
SELECT * FROM 车厢类型票价 WHERE 车厢类型 = '一等座';
SELECT * FROM 车厢类型票价;
-- 创建 预订 表
CREATE TABLE 预订 (
记录ID INT PRIMARY KEY,
用户ID INT NOT NULL,
座位ID INT NOT NULL,
预订日期 DATETIME NOT NULL
);
-- 创建 支付信息 表
CREATE TABLE 支付信息 (
记录ID INT PRIMARY KEY,
预订ID INT NOT NULL,
支付金额 DECIMAL(10, 2) NOT NULL,
支付时间 DATETIME NOT NULL,
支付方式 VARCHAR(50) NOT NULL,
FOREIGN KEY (预订ID) REFERENCES 预订(记录ID)
);
-- 插入预订数据
INSERT INTO 预订 (记录ID, 用户ID, 座位ID, 预订日期) VALUES
(1, 3, 4, '2024-06-18 09:00:00'),
(2, 4, 6, '2024-06-18 10:00:00'),
(3, 5, 8, '2024-06-19 11:00:00'),
(4, 6, 10, '2024-06-19 12:00:00'),
(5, 7, 12, '2024-06-20 13:00:00'),
(6, 8, 14, '2024-06-20 14:00:00'),
(7, 9, 16, '2024-06-21 15:00:00'),
(8, 10, 18, '2024-06-21 16:00:00'),
(9, 11, 20, '2024-06-22 17:00:00'),
(10, 12, 22, '2024-06-22 18:00:00');
-- 插入支付信息数据,确保预订ID存在于预订表中的记录ID中
INSERT INTO 支付信息 (记录ID, 预订ID, 支付金额, 支付时间, 支付方式) VALUES
(1, 1, 250.00, '2024-06-21 15:30:00', '支付宝'),
(2, 2, 150.00, '2024-06-21 16:30:00', '微信支付'),
(3, 3, 250.00, '2024-06-22 17:30:00', '信用卡'),
(4, 4, 150.00, '2024-06-22 18:30:00', '支付宝'),
(5, 5, 250.00, '2024-06-23 19:30:00', '微信支付'),
(6, 6, 150.00, '2024-06-23 20:30:00', '信用卡'),
(7, 7, 250.00, '2024-06-24 21:30:00', '支付宝'),
(8, 8, 150.00, '2024-06-24 22:30:00', '微信支付'),
(9, 9, 250.00, '2024-06-25 23:30:00', '信用卡'),
(10, 10, 150.00, '2024-06-26 00:30:00', '支付宝');
-- 删除支付信息表
DROP TABLE IF EXISTS 支付信息;
-- 删除预订表
DROP TABLE IF EXISTS 预订;
-- 查询支付信息表
SELECT * FROM 支付信息;
-- 查询预订表
SELECT * FROM 预订;
INSERT INTO 用户 (用户名, 密码, 电子邮件, 电话)
VALUES ('新用户', 'newpassword', 'newuser@example.com', '1234567890');
登录页面:
1.<!DOCTYPE html>
2.<html lang="zh-CN">
3. <head>
4. <meta charset="UTF-8" />
5. <link rel="icon" href="图标.ico" type="image/x-icon" />
6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7. <title>登录页面</title>
8. <style>
9. body {
10. background-image: url("{{ url_for('static', filename='image/背景2.jpg') }}");
11. background-size: cover;
12. display: flex;
13. align-items: center;
14. justify-content: center;
15. height: 100vh;
16. margin: 0;
17. }
18. .container {
19. position: relative;
20. margin: auto;
21. width: 600px;
22. height: 600px;
23. }
24. .login-form {
25. width: 100%;
26. height: 100%;
27. opacity: 1;
28. border-radius: 10px;
29. background: linear-gradient(180deg, rgba(19, 37, 128, 0.1) 100%, rgba(204, 204, 204, 0.6) 101%);
30. backdrop-filter: blur(10px); /* 背景模糊效果 */
31. z-index: 1;
32. }
33. .logo {
34. position: absolute;
35. top: 43px;
36. left: 18%;
37. transform: translateX(-50%);
38. width: 96px;
39. height: 93px;
40. }
41. .title {
42. position: absolute;
43. left: 150px;
44. top: 59px;
45. width: 398px;
46. height: 67px;
47. opacity: 1;
48. font-size: 48px;
49. font-weight: 500;
50. letter-spacing: 0px;
51. line-height: 69.5px;
52. color: rgba(83, 92, 115, 1);
53. text-align: left;
54. vertical-align: top;
55. }
56. input[type="text"], input[type="password"] {
57. position: absolute;
58. left: 107px;
59. width: 400px;
60. height: 50px;
61. opacity: 1;
62. border-radius: 4px;
63. background: transparent;
64. border: 2px solid rgba(4, 46, 105, 1);
65. font-size: 25px;
66. font-weight: 400;
67. letter-spacing: 0px;
68. line-height: 40.54px;
69. color: rgba(83, 92, 115, 1);
70. transition: border-color 0.3s ease-in-out;
71. }
72. input[type="text"] {
73. top: 208px;
74. }
75. input[type="password"] {
76. top: 309px;
77. }
78. .login-button {
79. position: absolute;
80. padding: 10px;
81. left: 217px;
82. top: 461px;
83. width: 195px;
84. height: 59px;
85. opacity: 1;
86. border-radius: 15px;
87. background: linear-gradient(90deg, rgba(113, 113, 184, 1) 0%, rgba(113, 113, 184, 0.34) 100%);
88. font-size: 36px;
89. font-weight: 500;
90. letter-spacing: 1px;
91. line-height: 40.13px;
92. color: rgba(17, 45, 115, 1);
93. text-align: center;
94. vertical-align: middle;
95. border: none;
96. cursor: pointer;
97. }
98. .register-link, .register-link1 {
99. position: absolute;
100. top: 548px;
101. font-size: 25px;
102. color: rgba(83, 92, 115, 1);
103. text-decoration: none;
104. cursor: pointer;
105. }
106. .register-link {
107. left: 320px;
108. }
109. .register-link1 {
110. left: 160px;
111. }
112. .password-container {
113. display: flex;
114. align-items: center;
115. position: absolute;
116. left: 127px;
117. top: 395px;
118. }
119. .remember-password {
120. display: flex;
121. align-items: center;
122. cursor: pointer;
123. user-select: none;
124. font-size: 20px;
125. font-weight: 400;
126. letter-spacing: 2px;
127. color: rgba(83, 92, 115, 1);
128. }
129. .check-mark {
130. margin-right: 5px;
131. display: none;
132. }
133. .register-link2 {
134. margin-left: 156px;
135. font-size: 20px;
136. font-weight: 400;
137. letter-spacing: 2px;
138. color: rgba(83, 92, 115, 1);
139. text-decoration: none;
140. cursor: pointer;
141. }
142. </style>
143. </head>
144. <body>
145. <div class="container">
146. <div class="login-form">
147. <img src="{{ url_for('static', filename='images/logo copy.png') }}" alt="Logo" class="logo" />
148. <div class="title">
149. 火车票预定系统
150. </div>
151. <form action="{{ url_for('login') }}" method="POST">
152. <input type="text" id="username" name="username" placeholder="账号" required="" />
153. <input type="password" id="password" name="password" placeholder="密码" required="" />
154. <div class="password-container">
155. <label class="remember-password"> <input type="checkbox" id="remember-checkbox" /> <span class="check-mark" id="check-mark">✔</span> <span>记住密码</span> </label>
156. <a class="register-link2">忘记密码?</a>
157. </div>
158. <button type="submit" class="login-button">登录</button> {% if error %}
159. <p style="color: red;">{{ error }}</p> {% endif %}
160. </form>
161. <span class="register-link1">没有账号?去</span>
162. <a href="{{ url_for('register') }}" class="register-link">点击这里注册</a>
163. </div>
164. </div>
165. </body>
166.</html>
注册页面:
1.<!DOCTYPE html>
2.<html lang="zh-CN">
3.<head>
4. <meta charset="UTF-8">
5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
6. <title>注册页面</title>
7. <style>
8. body {
9. background-image: url("{{ url_for('static', filename='image/背景.jpg') }}");
10. background-size: cover;
11. display: flex;
12. justify-content: center;
13. align-items: center;
14. height: 100vh;
15. margin: 0;
16. font-family: Arial, sans-serif;
17. color: #333;
18. }
19. .container {
20. background: rgba(255, 255, 255, 0.8);
21. padding: 30px;
22. border-radius: 10px;
23. box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
24. width: 400px;
25. }
26. .container h2 {
27. text-align: center;
28. margin-bottom: 20px;
29. font-size: 24px;
30. }
31. .container label {
32. display: block;
33. margin-bottom: 5px;
34. font-weight: bold;
35. }
36. .container input[type="text"],
37. .container input[type="password"],
38. .container input[type="email"],
39. .container input[type="tel"],
40. .container input[type="date"],
41. .container select {
42. width: calc(100% - 20px);
43. padding: 10px;
44. margin-bottom: 20px;
45. border: 1px solid #ccc;
46. border-radius: 5px;
47. font-size: 16px;
48. }
49. .container button {
50. width: 100%;
51. padding: 10px;
52. background-color: #4CAF50;
53. color: white;
54. border: none;
55. border-radius: 5px;
56. font-size: 18px;
57. cursor: pointer;
58. }
59. .container button:hover {
60. background-color: #45a049;
61. }
62. </style>
63.</head>
64.<body>
65. <div class="container">
66. <h2>用户注册</h2>
67. <form action="{{ url_for('register') }}" method="POST">
68. <label for="username">用户名:</label>
69. <input type="text" id="username" name="username" required>
70.
71. <label for="password">密码:</label>
72. <input type="password" id="password" name="password" required>
73.
74. <label for="email">邮箱:</label>
75. <input type="email" id="email" name="email" required>
76.
77. <label for="phone">电话号码:</label>
78. <input type="tel" id="phone" name="phone" required>
79.
80. <label for="gender">性别:</label>
81. <select id="gender" name="gender" required>
82. <option value="male">男</option>
83. <option value="female">女</option>
84. <option value="other">其他</option>
85. </select>
86.
87. <label for="dob">出生年月日:</label>
88. <input type="date" id="dob" name="dob" required>
89.
90. <button type="submit">注册</button>
91. </form>
92. </div>
93.</body>
94.</html>
数据库查询照片:
运行图片太多了,自行运行上述代码均可见。此处省咯了哈
前端页面:
参考文献
[1]数据库系统概论(第五版),王珊、萨师煊 ,高等教育出版社,2014
[2]刘子宽,姜利,王德援,张强.铁路自动售票机研究与设计[J].铁路技术创新,2012(4):63-66
[3]朱建生,单杏花,周亮瑾,刘春煌,刘强.中国铁路客票发售和预订系统5.0版的研究与实现[J].中国铁道科学,2006,27(6):95-103
[4]田玉倩,张文华.SQL Server 2008数据库完整性的应用探索[J].中外企业家,2020(14):135.
[5]杨晶晶.网站管理系统中数据库设计的应用[J].福建茶叶,2020,42(04):39.
[6]于翔.数据库的安全重要性以及带来的风险[J].计算机产品与流通,2020(04):165.
[7]秦不凡.大数据时代下软件工程技术的应用[J].农家参谋,2020(10):214.