温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与目标
随着咖啡消费市场的持续增长,门店在日常经营中积累了大量的销售数据。如何高效管理商品、订单和库存,并从这些数据中挖掘有价值的经营信息,成为咖啡门店数字化转型的关键问题。本文设计并实现一个基于 Python 的咖啡销售及数据分析系统,覆盖商品管理、订单管理、销售统计和可视化分析等核心功能,帮助门店经营者更直观地掌握销售状况。
系统的主要目标包括:
- 实现咖啡商品、订单和销售数据的统一管理。
- 提供按时间、品类、门店等多维度的销售统计。
- 通过可视化图表展示销售趋势和商品热度。
- 为经营决策提供数据支撑,提升管理效率。
2. 系统总体设计
系统采用分层架构设计,整体分为数据层、业务逻辑层和展示层三个部分。数据层负责销售数据、商品信息和订单记录的存储与读取;业务逻辑层封装商品管理、订单处理、统计分析和报表生成等核心功能;展示层通过命令行交互和可视化图表向用户呈现结果。
系统功能模块划分如下:
- 商品管理模块:负责咖啡商品的增删改查,包括名称、品类、价格和库存信息。
- 订单管理模块:支持创建订单、记录销售明细和计算订单金额。
- 销售统计模块:按日、周、月汇总销售额和销量,支持多维度对比。
- 数据分析模块:分析热销商品、销售趋势和品类占比。
- 可视化模块:使用图表库生成销售趋势图和商品销量排行图。
3. 开发环境与技术选型
系统基于 Python 3.9 开发,主要依赖以下第三方库:
- Pandas:用于销售数据的清洗、聚合和统计分析。
- Matplotlib:用于绘制销售趋势图、柱状图和饼图。
- SQLite3:作为轻量级数据库,存储商品、订单和销售明细数据。
- Tkinter:用于构建简单的图形化操作界面(可选)。
开发工具推荐使用 PyCharm 或 VS Code,操作系统支持 Windows、macOS 和 Linux。
4. 数据库设计
系统使用 SQLite 作为数据存储方案,主要设计三张数据表:商品表、订单表和订单明细表。
商品表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 商品编号,主键 |
| name | TEXT | 商品名称 |
| category | TEXT | 商品品类 |
| price | REAL | 销售单价 |
| stock | INTEGER | 当前库存 |
订单表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 订单编号,主键 |
| order_time | TEXT | 下单时间 |
| total_amount | REAL | 订单总金额 |
| customer_name | TEXT | 客户名称 |
订单明细表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 明细编号,主键 |
| order_id | INTEGER | 所属订单编号 |
| product_id | INTEGER | 商品编号 |
| quantity | INTEGER | 购买数量 |
| subtotal | REAL | 小计金额 |
5. 核心功能实现
本节给出系统核心模块的 Python 实现代码,包括数据库初始化、商品管理、订单创建和销售统计。
5.1 数据库初始化
首先创建数据库连接和表结构,代码如下:
import sqlite3 def init_db(): conn = sqlite3.connect("coffee_shop.db") cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, category TEXT, price REAL NOT NULL, stock INTEGER DEFAULT 0 ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_time TEXT NOT NULL, total_amount REAL NOT NULL, customer_name TEXT ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS order_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, product_id INTEGER NOT NULL, quantity INTEGER NOT NULL, subtotal REAL NOT NULL ) """) conn.commit() conn.close() print("数据库初始化完成")5.2 商品管理模块
商品管理模块实现商品的添加、查询和库存更新,代码如下:
def add_product(name, category, price, stock): conn = sqlite3.connect("coffee_shop.db") cursor = conn.cursor() cursor.execute( "INSERT INTO products (name, category, price, stock) VALUES (?, ?, ?, ?)", (name, category, price, stock) ) conn.commit() conn.close() print(f"商品 {name} 添加成功") def get_all_products(): conn = sqlite3.connect("coffee_shop.db") cursor = conn.cursor() cursor.execute("SELECT id, name, category, price, stock FROM products") rows = cursor.fetchall() conn.close() return rows def update_stock(product_id, new_stock): conn = sqlite3.connect("coffee_shop.db") cursor = conn.cursor() cursor.execute( "UPDATE products SET stock = ? WHERE id = ?", (new_stock, product_id) ) conn.commit() conn.close() print("库存更新成功")5.3 订单创建模块
创建订单时,需要同时写入订单表和订单明细表,并扣减商品库存,代码如下:
from datetime import datetime def create_order(customer_name, items): """ items 格式: [(product_id, quantity), ...] """ conn = sqlite3.connect("coffee_shop.db") cursor = conn.cursor() total_amount = 0.0 order_items = [] for product_id, quantity in items: cursor.execute("SELECT price, stock FROM products WHERE id = ?", (product_id,)) row = cursor.fetchone() if row is None: print(f"商品 {product_id} 不存在") conn.close() return price, stock = row if stock < quantity: print(f"商品 {product_id} 库存不足") conn.close() return subtotal = price * quantity total_amount += subtotal order_items.append((product_id, quantity, subtotal)) cursor.execute( "UPDATE products SET stock = stock - ? WHERE id = ?", (quantity, product_id) ) order_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") cursor.execute( "INSERT INTO orders (order_time, total_amount, customer_name) VALUES (?, ?, ?)", (order_time, total_amount, customer_name) ) order_id = cursor.lastrowid for product_id, quantity, subtotal in order_items: cursor.execute( "INSERT INTO order_items (order_id, product_id, quantity, subtotal) VALUES (?, ?, ?, ?)", (order_id, product_id, quantity, subtotal) ) conn.commit() conn.close() print(f"订单创建成功,订单号:{order_id},总金额:{total_amount:.2f} 元")5.4 销售统计模块
销售统计模块按日期汇总销售额和销量,代码如下:
import pandas as pd def load_sales_data(): conn = sqlite3.connect("coffee_shop.db") query = """ SELECT o.order_time, o.total_amount, oi.product_id, oi.quantity, oi.subtotal, p.name AS product_name, p.category FROM orders o JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id """ df = pd.read_sql_query(query, conn) conn.close() df["order_time"] = pd.to_datetime(df["order_time"]) return df def daily_sales_summary(df): df["date"] = df["order_time"].dt.date summary = df.groupby("date").agg( total_sales=("total_amount", "sum"), order_count=("order_id", "nunique") ).reset_index() return summary def category_sales_summary(df): summary = df.groupby("category").agg( total_sales=("subtotal", "sum"), total_quantity=("quantity", "sum") ).reset_index() return summary6. 数据可视化实现
系统使用 Matplotlib 生成销售趋势图和商品销量排行图,帮助经营者直观了解销售情况。
6.1 销售趋势图
绘制每日销售额折线图,代码如下:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False def plot_sales_trend(df): summary = daily_sales_summary(df) plt.figure(figsize=(10, 5)) plt.plot(summary["date"], summary["total_sales"], marker="o", color="#C0392B") plt.title("每日销售额趋势") plt.xlabel("日期") plt.ylabel("销售额(元)") plt.xticks(rotation=45) plt.grid(True, linestyle="--", alpha=0.6) plt.tight_layout() plt.savefig("sales_trend.png") plt.show()6.2 商品销量排行图
绘制销量前十商品的横向柱状图,代码如下:
def plot_top_products(df, top_n=10): product_sales = df.groupby("product_name").agg( total_quantity=("quantity", "sum"), total_sales=("subtotal", "sum") ).reset_index() top_products = product_sales.sort_values("total_quantity", ascending=False).head(top_n) plt.figure(figsize=(10, 6)) plt.barh(top_products["product_name"], top_products["total_quantity"], color="#27AE60") plt.title(f"销量前 {top_n} 商品") plt.xlabel("销量(杯)") plt.ylabel("商品名称") plt.gca().invert_yaxis() plt.tight_layout() plt.savefig("top_products.png") plt.show()6.3 品类占比饼图
绘制不同品类销售额占比饼图,代码如下:
def plot_category_pie(df): category_summary = category_sales_summary(df) plt.figure(figsize=(8, 8)) plt.pie( category_summary["total_sales"], labels=category_summary["category"], autopct="%1.1f%%", startangle=90 ) plt.title("品类销售额占比") plt.axis("equal") plt.tight_layout() plt.savefig("category_pie.png") plt.show()7. 系统测试与运行效果
为验证系统功能,编写测试脚本依次执行数据库初始化、商品添加、订单创建和销售统计,代码如下:
if __name__ == "__main__": init_db() add_product("美式咖啡", "咖啡", 18.0, 100) add_product("拿铁咖啡", "咖啡", 22.0, 80) add_product("卡布奇诺", "咖啡", 24.0, 60) add_product("抹茶拿铁", "茶饮", 20.0, 50) add_product("蓝莓芝士蛋糕", "甜点", 28.0, 30) create_order("张三", [(1, 2), (2, 1)]) create_order("李四", [(3, 1), (5, 2)]) create_order("王五", [(2, 3), (4, 1)]) df = load_sales_data() print("每日销售汇总:") print(daily_sales_summary(df)) print("品类销售汇总:") print(category_sales_summary(df)) plot_sales_trend(df) plot_top_products(df) plot_category_pie(df)运行测试脚本后,系统能够正确完成商品录入、订单创建、库存扣减和销售汇总,并输出对应的可视化图表,验证了系统各模块的功能完整性。
8. 总结与展望
本文设计并实现了一个基于 Python 的咖啡销售及数据分析系统,覆盖商品管理、订单管理、销售统计和可视化分析等核心功能。系统采用 SQLite 存储数据,结合 Pandas 进行数据聚合分析,并使用 Matplotlib 生成直观的销售图表,能够有效帮助门店经营者掌握销售动态。
后续可以从以下方向继续完善系统:
- 增加用户登录和权限管理功能,保障数据安全。
- 引入 Web 前端框架,提供更友好的操作界面。
- 接入真实业务数据,优化库存预警和采购建议。
- 结合机器学习算法,实现销售预测和智能定价。