以下是使用 Python 实现的一个简单 命令行点菜系统 完整示例,包含核心功能和详细注释:
功能概述
查看菜单及价格
添加菜品到购物车
从购物车移除菜品
实时计算总价
确认订单并生成账单
支持修改数量/删除菜品
保存订单记录(可选)
设计思路
采用 面向对象编程 思想,将系统分解为以下核心类:
| 类名 | 职责 |
|------------|--------------------------|
| `Dish` | 表示单个菜品(名称+价格)|
| `Menu` | 管理所有菜品集合 |
| `CartItem` | 购物车中的商品项(含数量)|
| `ShoppingCart` | 管理购物车逻辑 |
| `OrderSystem` | 主系统入口 |
完整代码实现
```python
import json
from typing import List, Dict
class Dish:
"""菜品类"""
def __init__(self, name: str, price: float):
self.name = name
self.price = price
def __str__(self):
return f"{self.name} (¥{self.price})"
class CartItem(Dish):
"""购物车中的商品项(继承自Dish,增加数量属性)"""
def __init__(self, dish: Dish, quantity: int = 1):
super().__init__(dish.name, dish.price)
self.quantity = quantity
@property
def total_price(self) -> float:
"""单项总价 = 单价 × 数量"""
return self.price * self.quantity
def increase(self):
"""增加数量"""
self.quantity += 1
def decrease(self):
"""减少数量(至少保留1个)"""
if self.quantity > 1:
self.quantity -= 1
class ShoppingCart:
"""购物车类"""
def __init__(self):
self.items: List[CartItem] = []
def add_item(self, dish: Dish, quantity: int = 1):
"""添加商品到购物车"""
# 如果已存在相同菜品,则合并数量
for item in self.items:
if item.name == dish.name:
item.increase()
if quantity > 1:
item.increase(quantity - 1)
return
# 否则新增条目
self.items.append(CartItem(dish, quantity))
def remove_item(self, index: int):
"""通过索引删除商品"""
if 0 <= index < len(self.items):
del self.items[index]
def update_quantity(self, index: int, new_quantity: int):
"""更新指定位置的商品数量"""
if 0 <= index < len(self.items):
self.items[index].quantity = max(1, new_quantity)
def calculate_total(self) -> float:
"""计算购物车总价"""
return sum(item.total_price for item in self.items)
def display_cart(self):
"""打印购物车内容"""
if not self.items:
print("⚠️ 购物车为空!")
return
print("\n🛒 当前购物车内容:")
for i, item in enumerate(self.items):
print(f"{i+1}. {item.name} x{item.quantity} = ¥{item.total_price:.2f}")
print(f"总计:¥{self.calculate_total():.2f}\n")
class OrderSystem:
"""点餐系统主类"""
def __init__(self):
# 初始化菜单(实际应用可改为从文件/数据库加载)
self.menu = [
Dish("鱼香肉丝", 28),
Dish("宫保鸡丁", 32),
Dish("麻婆豆腐", 22),
Dish("水煮牛肉", 45),
Dish("番茄炒蛋", 18),
Dish("酸辣土豆丝", 16),
Dish("米饭", 3)
]
self.cart = ShoppingCart()
def show_menu(self):
"""显示菜单"""
print("\n🍽 菜单推荐:")
for i, dish in enumerate(self.menu):
print(f"{i+1}. {dish}")
print()
def select_dish(self):
"""选择菜品"""
self.show_menu()
try:
choice = int(input("请输入菜品编号:")) - 1
if 0 <= choice < len(self.menu):
return self.menu[choice]
print("❌ 无效编号!")
except ValueError:
print("❌ 请输入数字!")
return None
def run(self):
"""主运行循环"""
while True:
print("\n===== 欢迎使用智能点餐系统 =====")
print("1. 查看菜单")
print("2. 添加菜品到购物车")
print("3. 查看购物车")
print("4. 修改购物车")
print("5. 结算")
print("6. 退出系统")
choice = input("请选择操作(1-6):")
if choice == "1":
self.show_menu()
elif choice == "2":
dish = self.select_dish()
if dish:
quantity = int(input(f"请输入{dish.name}的数量:"))
self.cart.add_item(dish, quantity)
print(f"✅ 已添加 {dish.name} x{quantity}")
elif choice == "3":
self.cart.display_cart()
elif choice == "4":
self.cart.display_cart()
if self.cart.items:
action = input("请选择操作 [A:修改数量 | R:删除]:").upper()
if action == "A":
index = int(input("请输入要修改的菜品编号:")) - 1
new_qty = int(input("请输入新数量:"))
self.cart.update_quantity(index, new_qty)
elif action == "R":
index = int(input("请输入要删除的菜品编号:")) - 1
self.cart.remove_item(index)
elif choice == "5":
if not self.cart.items:
print("⚠️ 购物车为空,无法结算!")
else:
total = self.cart.calculate_total()
print("\n🎉 您的订单如下:")
self.cart.display_cart()
print(f"应付总额:¥{total:.2f}")
confirm = input("确认结算?(Y/N):").upper()
if confirm == "Y":
print("🎊 感谢您的光临!祝您用餐愉快!")
# TODO: 这里可以添加保存订单逻辑
self.cart.items = [] # 清空购物车
elif choice == "6":
print("👋 感谢使用,再见!")
break
else:
print("❌ 无效选择,请重新输入!")
if __name__ == "__main__":
system = OrderSystem()
system.run()
```
关键功能解析
1. 数据结构设计
`Dish` 类封装菜品基本信息
`CartItem` 类扩展了数量控制能力
`ShoppingCart` 类实现购物车的核心逻辑(增删改查)
2. 交互流程优化
智能合并相同菜品(如多次添加同一道菜会自动累加数量)
支持动态修改数量和删除单品
实时计算并显示总价
结算后自动清空购物车
3. 异常处理
防止无效编号导致的崩溃
限制最小购买数量为1
输入校验(数字类型转换)
运行效果示例
```plaintext
===== 欢迎使用智能点餐系统 =====
1. 查看菜单
2. 添加菜品到购物车
3. 查看购物车
4. 修改购物车
5. 结算
6. 退出系统
请选择操作(1-6):2
菜单推荐:
1. 鱼香肉丝 (¥28)
2. 宫保鸡丁 (¥32)
3. 麻婆豆腐 (¥22)
4. 水煮牛肉 (¥45)
5. 番茄炒蛋 (¥18)
6. 酸辣土豆丝 (¥16)
7. 米饭 (¥3)
请输入菜品编号:3
请输入麻婆豆腐的数量:2
已添加 麻婆豆腐 x2
===== 欢迎使用智能点餐系统 =====
1. 查看菜单
2. 添加菜品到购物车
3. 查看购物车
4. 修改购物车
5. 结算
6. 退出系统
请选择操作(1-6):3
当前购物车内容:
1. 麻婆豆腐 x2 = ¥44.00
总计:¥44.00
===== 欢迎使用智能点餐系统 =====
1. 查看菜单
2. 添加菜品到购物车
3. 查看购物车
4. 修改购物车
5. 结算
6. 退出系统
请选择操作(1-6):5
您的订单如下:
当前购物车内容:
1. 麻婆豆腐 x2 = ¥44.00
总计:¥44.00
应付总额:¥44.00
确认结算?(Y/N):Y
感谢您的光临!祝您用餐愉快!
```
扩展建议
| 功能 | 实现方案 |
|---------------------|-----------------------------------|
| 订单持久化 | 使用 JSON 文件或 SQLite 数据库 |
| 会员积分系统 | 添加 User 类 + 积分累计逻辑 |
| 移动端适配 | 开发 Web 版(Flask/Django) |
| 优惠券折扣 | 在结算时应用折扣码 |
| 库存管理 | 添加库存字段 + 超卖预警 |
| 销售统计 | 按日/周统计畅销菜品 |
这个实现提供了完整的点餐系统基础框架,可根据实际需求灵活扩展。如需升级为 Web 应用,可结合 Flask/Django 快速实现前端界面。
以下是 在 Android 的 Termux 中运行点餐程序 的详细步骤指南,基于你之前开发的 Python 命令行版点餐系统:
前置条件
1. 已安装 Termux
如果未安装,从 [F-Droid](https://f-droid.org/packages/com.termux/) 或官网下载。
2. 基础配置完成
首次打开 Termux 时会引导完成初始化(选择 `storage` 权限以允许读写文件)。
核心步骤
安装 Python 解释器
```bash
pkg update && pkg upgrade -y # 更新软件源
pkg install python # 安装 Python(自动安装最新版)
```
验证安装:`python --version` 应显示 Python 版本号。
创建项目目录 & 写入代码**
有两种主流方式将你的 Python 脚本导入 Termux:
方案一:直接在 Termux 中编写代码
```bash
mkdir ~/order_system # 创建项目目录
cd ~/order_system # 进入目录
nano main.py # 使用 nano 编辑器创建文件
```
将你之前的 Python 代码完整复制粘贴进 `main.py`,保存退出(按 `Ctrl+X → Y → Enter`)。
方案二:从电脑传输脚本
1. 电脑上创建 `main.py` 文件并写入代码。
2. 通过 USB 调试/无线局域网将文件发送到手机。
3. 在 Termux 中移动文件到项目目录:
```bash
mv /sdcard/Download/main.py ~/order_system/ # 根据实际路径调整
```
运行程序
```bash
cd ~/order_system # 切换到项目目录
python main.py # 运行程序!
```
现在你可以像在电脑上一样操作点餐系统了!
常见问题排查
| 现象 | 原因及解决方案 |
|------------------------------|-------------------------------------------------|
| `python: can't open file...` | ❌ 文件路径错误 → 确认当前目录包含 `main.py` |
| `ImportError: No module named ...` | ❗️ 缺少第三方库 → 使用 `pip install <module>` |
| 中文显示乱码 | ➜ 修改脚本头部添加编码声明:`# -*- coding: utf-8 -*-` |
| 无法持久化订单数据 | 📱 Termux 的数据存储位置特殊,建议改用 SQLite 数据库 |
增强建议(可选)
持久化存储订单
修改 `ShoppingCart` 类,添加保存/加载功能:
```python
import pickle
class ShoppingCart:
def save_to_file(self, filename="cart.dat"):
with open(filename, "wb") as f:
pickle.dump(self.items, f)
@classmethod
def load_from_file(cls, filename="cart.dat"):
try:
with open(filename, "rb") as f:
items = pickle.load(f)
cart = cls()
cart.items = items
return cart
except FileNotFoundError:
return cls() # 返回空购物车
```
然后在结算成功后调用 `self.cart.save_to_file()`。
美化输出格式
替换普通 `print` 为彩色输出库:
```bash
pip install colorama # 安装颜色库
```
Python 代码中添加:
```python
from colorama import init, Fore, Style
init(autoreset=True) # 自动重置颜色
print(Fore.GREEN + "✅ 操作成功!" + Style.RESET_ALL)
```
打包为独立可执行文件
使用 PyInstaller 生成单文件(需交叉编译):
```bash
pkg install wget unzip # 安装依赖工具
wget https://github.com/andrep/debian-ports-cross/releases/download/v0.9.1/pyinstaller-armv7l.tar.gz
tar -xzf pyinstaller-armv7l.tar.gz
cd pyinstaller-armv7l
python setup.py install # 安装 arm 架构的 PyInstaller
pyinstaller --onefile main.py # 生成 standalone 文件
```
生成的 `main` 文件可直接分享给他人运行!
最终效果示例
```bash
~/order_system $ python main.py
===== 欢迎使用智能点餐系统 =====
1. 查看菜单
2. 添加菜品到购物车
3. 查看购物车
4. 修改购物车
5. 结算
6. 退出系统
请选择操作(1-6):2
菜单推荐:
1. 鱼香肉丝 (¥28)
2. 宫保鸡丁 (¥32)
...
请输入菜品编号:3
请输入麻婆豆腐的数量:2
已添加 麻婆豆腐 x2
```
注意事项
1. 性能限制:手机 CPU 较弱,避免复杂计算(如大数据排序)。
2. 输入法切换:长按输入框可切换软键盘布局。
3. 后台运行:按 `Ctrl+Z` 挂起进程,`fg` 恢复前台。
4. 数据安全:重要数据建议加密存储(如 AES 加密)。
如需进一步优化为专业级应用,建议后续迁移至 Kivy(跨平台 GUI)或 Flutter 开发原生 App。
|
|