📅  最后修改于: 2023-12-03 15:09:26.983000             🧑  作者: Mango
实施旅行社的菜单驱动程序是一个基于命令行界面的应用程序,旨在为旅行社提供一个便捷、易用的系统,实现旅游预订、客户管理、订单管理等功能。
该程序包括以下功能模块:
该程序使用Python语言实现,主要技术包括:
cmd
库,实现命令行界面菜单驱动;sqlite3
库,实现对旅游产品、客户和订单信息的数据库存取;matplotlib
库和numpy
库,实现数据可视化和统计。下面是程序的代码片段,其中使用了类、函数、文件读写、异常处理等操作。
import cmd
import sqlite3
import matplotlib.pyplot as plt
import numpy as np
class TravelAgencyProgram(cmd.Cmd):
intro = "Welcome to the Travel Agency Program. Type help or ? to list commands.\n"
prompt = "travel> "
def __init__(self):
super().__init__()
self.conn = None
self.cur = None
self.connect()
self.init_database()
def connect(self):
self.conn = sqlite3.connect("travel.db")
self.cur = self.conn.cursor()
def init_database(self):
sql = """
CREATE TABLE IF NOT EXISTS products(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price FLOAT NOT NULL,
itinerary TEXT,
hotel TEXT
);
CREATE TABLE IF NOT EXISTS customers(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
phone TEXT NOT NULL,
id_card TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS orders(
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id INTEGER NOT NULL,
customer_id INTEGER NOT NULL,
date TEXT NOT NULL,
FOREIGN KEY(product_id) REFERENCES products(id),
FOREIGN KEY(customer_id) REFERENCES customers(id)
)
"""
self.cur.executescript(sql)
self.conn.commit()
def do_list_products(self, arg):
"""
List all travel products.
"""
sql = "SELECT id, name, price FROM products"
self.cur.execute(sql)
rows = self.cur.fetchall()
for row in rows:
print(f"{row[0]} | {row[1]:<20} | {row[2]:.2f}")
def do_add_product(self, arg):
"""
Add a new travel product.
"""
try:
name, price, itinerary, hotel = arg.split(",")
price = float(price)
except ValueError:
print("Invalid arguments. Usage: add_product name,price,itinerary,hotel")
return
sql = "INSERT INTO products(name, price, itinerary, hotel) VALUES(?, ?, ?, ?)"
self.cur.execute(sql, (name, price, itinerary, hotel))
self.conn.commit()
print("Product added successfully.")
def do_delete_product(self, arg):
"""
Delete a travel product by ID.
"""
try:
product_id = int(arg)
except ValueError:
print("Invalid arguments. Usage: delete_product id")
return
sql = "DELETE FROM products WHERE id=?"
self.cur.execute(sql, (product_id,))
self.conn.commit()
print("Product deleted successfully.")
def do_list_customers(self, arg):
"""
List all customers.
"""
sql = "SELECT id, name, phone, id_card FROM customers"
self.cur.execute(sql)
rows = self.cur.fetchall()
for row in rows:
print(f"{row[0]} | {row[1]:<10} | {row[2]:<15} | {row[3]:<18}")
def do_add_customer(self, arg):
"""
Add a new customer.
"""
try:
name, phone, id_card = arg.split(",")
except ValueError:
print("Invalid arguments. Usage: add_customer name,phone,id_card")
return
sql = "INSERT INTO customers(name, phone, id_card) VALUES(?, ?, ?)"
self.cur.execute(sql, (name, phone, id_card))
self.conn.commit()
print("Customer added successfully.")
def do_delete_customer(self, arg):
"""
Delete a customer by ID.
"""
try:
customer_id = int(arg)
except ValueError:
print("Invalid arguments. Usage: delete_customer id")
return
sql = "DELETE FROM customers WHERE id=?"
self.cur.execute(sql, (customer_id,))
self.conn.commit()
print("Customer deleted successfully.")
def do_list_orders(self, arg):
"""
List all orders.
"""
sql = """
SELECT orders.id, products.name, customers.name, orders.date
FROM orders
JOIN products ON orders.product_id=products.id
JOIN customers ON orders.customer_id=customers.id
"""
self.cur.execute(sql)
rows = self.cur.fetchall()
for row in rows:
print(f"{row[0]} | {row[1]:<20} | {row[2]:<10} | {row[3]}")
def do_add_order(self, arg):
"""
Add a new order.
"""
try:
product_id, customer_id, date = arg.split(",")
product_id = int(product_id)
customer_id = int(customer_id)
except ValueError:
print("Invalid arguments. Usage: add_order product_id,customer_id,date")
return
sql = "INSERT INTO orders(product_id, customer_id, date) VALUES(?, ?, ?)"
self.cur.execute(sql, (product_id, customer_id, date))
self.conn.commit()
print("Order added successfully.")
def do_delete_order(self, arg):
"""
Delete an order by ID.
"""
try:
order_id = int(arg)
except ValueError:
print("Invalid arguments. Usage: delete_order id")
return
sql = "DELETE FROM orders WHERE id=?"
self.cur.execute(sql, (order_id,))
self.conn.commit()
print("Order deleted successfully.")
def do_statistics(self, arg):
"""
Display statistics data.
"""
sql1 = """
SELECT SUM(price) FROM products
"""
self.cur.execute(sql1)
total_sales = self.cur.fetchone()[0]
sql2 = """
SELECT COUNT(*) FROM customers
"""
self.cur.execute(sql2)
total_customers = self.cur.fetchone()[0]
sql3 = """
SELECT COUNT(*) FROM orders
"""
self.cur.execute(sql3)
total_orders = self.cur.fetchone()[0]
print(f"Total sales: {total_sales:.2f}")
print(f"Total customers: {total_customers}")
print(f"Total orders: {total_orders}")
# plot pie chart for sales by product
sql4 = """
SELECT products.name, SUM(products.price)
FROM orders
JOIN products ON orders.product_id=products.id
GROUP BY products.name
"""
self.cur.execute(sql4)
rows = self.cur.fetchall()
labels = [row[0] for row in rows]
values = [row[1] for row in rows]
fig1, ax1 = plt.subplots()
ax1.pie(values, labels=labels, autopct="%1.1f%%", startangle=90)
ax1.axis("equal")
plt.show()
def do_exit(self, arg):
"""
Exit the program.
"""
self.conn.close()
print("Bye!")
return True
def default(self, line):
print(f"Command not found: {line}")
return False
def preloop(self):
if not self.cur or not self.conn:
self.connect()
print("Loading data from database...")
def postloop(self):
self.cur.close()
self.conn.close()
if __name__ == "__main__":
TravelAgencyProgram().cmdloop()
以上代码实现了所有功能模块,并且处理了一些异常情况,例如输入参数不正确、查询结果为空等。在数据统计模块中,使用了matplotlib
库和numpy
库实现了数据可视化。程序在启动时会自动连接数据库,并且在退出时关闭连接。