命令行点菜系统

[复制链接]
148|0
以下是使用 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("&#9888;️ 购物车为空!")
            return
        print("\n&#128722; 当前购物车内容:")
        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&#127869; 菜单推荐:")
        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("&#10060; 无效编号!")
        except ValueError:
            print("&#10060; 请输入数字!")
        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"&#9989; 已添加 {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("&#9888;️ 购物车为空,无法结算!")
                else:
                    total = self.cart.calculate_total()
                    print("\n&#127881; 您的订单如下:")
                    self.cart.display_cart()
                    print(f"应付总额:¥{total:.2f}")
                    confirm = input("确认结算?(Y/N):").upper()
                    if confirm == "Y":
                        print("&#127882; 感谢您的光临!祝您用餐愉快!")
                        # TODO: 这里可以添加保存订单逻辑
                        self.cart.items = []  # 清空购物车
            elif choice == "6":
                print("&#128075; 感谢使用,再见!")
                break
            else:
                print("&#10060; 无效选择,请重新输入!")

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...` | &#10060; 文件路径错误 → 确认当前目录包含 `main.py`      |
| `ImportError: No module named ...` | &#10071;️ 缺少第三方库 → 使用 `pip install <module>` |
| 中文显示乱码                 | ➜ 修改脚本头部添加编码声明:`# -*- coding: utf-8 -*-` |
| 无法持久化订单数据           | &#128241; 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 + "&#9989; 操作成功!" + 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。



您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

55

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部