97 lines
3.6 KiB
Python

from flask import render_template, request, redirect, url_for, g, flash, session
from .config import db
import pymysql
from datetime import datetime
def book():
flight_id = request.args.get('flight_id')
if request.method == 'GET':
if not g.user:
return redirect(url_for("login"))
conn = pymysql.connect(**db)
cursor = conn.cursor(pymysql.cursors.DictCursor)
flight_sql = """
SELECT f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
FROM Flights f
JOIN Airports d ON f.Departure_airport = d.ID
JOIN Airports a ON f.Arrival_airport = a.ID
WHERE f.ID = %s;
"""
cursor.execute(flight_sql, (flight_id,))
flight = cursor.fetchone()
cursor.close()
conn.close()
return render_template('book.html', flight=flight, username=g.name)
if request.method == 'POST':
passengers = []
passenger_keys = ['card_code', 'name', 'phone_number', 'seat_class']
for i in range(len(request.form) // len(passenger_keys)):
passenger = {}
for key in passenger_keys:
passenger[key] = request.form.get(f'passengers[{i}][{key}]')
passengers.append(passenger)
if not passengers:
flash("请至少添加一位乘客", "error")
return redirect(url_for('index'))
conn = pymysql.connect(**db)
cursor = conn.cursor()
try:
# 插入订单记录
insert_order_sql = """
INSERT INTO Orders (Order_time, Paid, User_phone_number)
VALUES (%s, 0, %s)
"""
cursor.execute(insert_order_sql, (datetime.now(), g.user))
order_id = cursor.lastrowid
for passenger in passengers:
passenger_id = passenger['card_code']
name = passenger['name']
phone_number = passenger['phone_number']
seat_class = passenger['seat_class']
price_field = f"{seat_class.replace(' ', '_').lower()}_price"
price_sql = f"SELECT {price_field} FROM Flights WHERE ID = %s"
cursor.execute(price_sql, (flight_id,))
price = cursor.fetchone()[0]
insert_passenger_sql = """
INSERT INTO Passengers (ID, Name, Phone_number)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE Name=VALUES(Name), Phone_number=VALUES(Phone_number);
"""
cursor.execute(insert_passenger_sql, (passenger_id, name, phone_number))
update_seat_sql = f"""
UPDATE Flights
SET {seat_class.replace(' ', '_').lower()}_seats_remaining = {seat_class.replace(' ', '_').lower()}_seats_remaining - 1
WHERE ID = %s
"""
cursor.execute(update_seat_sql, (flight_id,))
insert_ticket_sql = """
INSERT INTO Tickets (Price, FlightID, Seat_class, PassengerID, OrderID)
VALUES (%s, %s, %s, %s, %s)
"""
cursor.execute(insert_ticket_sql, (price, flight_id, seat_class, passenger_id, order_id))
conn.commit()
return redirect(url_for('order', order_id=order_id))
except Exception as e:
conn.rollback()
print(e)
flash("订票失败", "error")
return redirect(url_for('index'))
finally:
cursor.close()
conn.close()