完成大作业服务端代码,新建管理端,管理端不可用
This commit is contained in:
92
Project/Service/func/book.py
Normal file
92
Project/Service/func/book.py
Normal file
@@ -0,0 +1,92 @@
|
||||
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)
|
||||
|
||||
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('search'))
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user