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()