zoukankan      html  css  js  c++  java
  • Python 购物车

    购物车需求:

    可购买的商品信息显示
    显示购物车内的商品信息、数量
    购物车内的商品数量进行增加、减少
    用户余额的充值
    用户购买完成进行结账,将最终余额回写到用户文件中  

    流程图:

    代码:

     1、主文件 

    def login():
        # 验证用户帐号和密码函数
        global name
        lock = "lock.txt"
        loginfile = "password.txt"
        login_info = 0
        i = 0
    
        while i < 3 and login_info == 0:
            name = input("Please input your name: ")
            with open(lock, "r") as f:
                for line in f:
                    # if name in line:
                    if name == line.strip():
                        sys.exit('33[32:1m用户 %s 已经被锁定33[0m' % name)
            password = input("Please input password: ")
            with open(loginfile, "r") as f:
                for line in f:
                    user_file, pass_file = line.split()
                    if user_file == name and pass_file == password:
                        print("Bingo!")
                        login_info = 1
                        return name
                else:
                    print("You name or password is error!")
                    i += 1
        else:
            if i == 3 and login_info == 0:
                f = open(lock, "a")
                f.write(name + "
    ")
                f.close()
                print('33[32:1m用户 %s 已经被锁定33[0m' % name)  
    def show_goods():
        # 显示当前商店所有商品函数
        commodity = "commodity.txt"
        x = PrettyTable(["商品名称", "价格", "数量"])
        x.align["商品名称"] = "l"  # 以name字段左对齐
        x.align["价格"] = "r"  # 以name字段右对齐
        x.align["数量"] = "r"  # 以name字段右对齐
        x.padding_width = 1  # 填充宽度
        with open(commodity, "r", encoding='utf-8') as f:
            for line in f:
                name, money, number = line.split()
                x.add_row([name, money, number])
            print(x)  
    def show_shopping_cart():
        # 显示购物车商品函数
        open_shop_cart()  
    def show_bought_goods():
        # 显示已购买商品函数
        open_bought()  
    def show_yue(username):
        # 显示帐号的金额
        money = "money.txt"
        x = PrettyTable(["用户", "余额"])
        x.align["用户"] = "l"  # 以name字段左对齐
        x.align["余额"] = "r"  # 以name字段右对齐
        x.padding_width = 1  # 填充宽度
        with open(money, "r", encoding='utf-8') as f:
            for line in f:
                name, money = line.split()
                if name == username:
                    x.add_row([name, money])
            print(x)  
    def show_info():
        # 显示信息函数
        print("*****************************")
        print("修改密码,请输入E:")
        print("查看购物车,请输入S:")
        print("查看已购买商品函数,请输入V:")
        print("充值,请输入M:")
        print("查询余额,请输入Y:")
        print("购买商品,请输入B:")
        print("查看商品数量和价格,请输入G:")
        print("添加商品到购物车,请输入商品名称:")
        print("*****************************")
        return input("请输入你的选择:")  
    def recharge(username):
        # 充值函数
        key = username
        n = input("请输入充值金额:")
        filename = "money.txt"
        edit_file_data(filename, username, n, '+')  
    def add_goods_shopping_cart(key):
        # 添加商品到购物车函数
        n = input("请输入购买数量:")
        file1 = "commodity.txt"
        file2 = "shop-cart.txt"
        ret = edit_file_data(file1, key, n, '-')
        if int(ret) == 1:
            print("*****************************")
            print("商品数量不足,请重新选择")
            return
        else:
            edit_file_data(file2, key, n, '+')  
    def goods_bought(username):
        # 从商品购买函数
        while True:
            show_shopping_cart()
            q = input("输入q返回上级菜单,输入其他键继续:")
            if q.lower() == 'q':
                return
            # else:
            key = input("请输入购买商品名称:")
            n = input("请输入购买数量:")
            file1 = "money.txt"
            file2 = "shop-cart.txt"
            file3 = "bought.txt"
            with open("commodity.txt", "r", encoding='utf-8') as f1:
                for line in f1:
                    shop = line.split()
                    if str(shop[0]) == str(key):
                        value = shop[2]
            sum_value = int(n) * int(value)
            with open(file1, "r", encoding='utf-8') as f1:
                for line in f1:
                    shop = line.split()
                    if str(shop[0]) == str(username):
                        value = shop[1]
            if int(sum_value) > int(value):
                print("*****************************")
                print("余额不足请充值:")
                print("*****************************")
                return recharge(username)
    
            ret = edit_file_data(file2, key, n, '-')
            if int(ret) == 1:
                print("*****************************")
                print("购物车中没有这么多商品,请重新选择")
                print("*****************************")
                continue
            else:
                edit_file_data(file1, username, sum_value, '-')
                edit_file_data(file3, key, n, '+')  
    def edit_password(username):
        # 修改帐号密码函数
        passwd1 = input("请输入你的新密码:")
        passwd2 = input("请再次确认你的密码:")
        if passwd1 != passwd2:
            print("*****************************")
            print("你2次输入的密码不一致,请重新输入")
            print("*****************************")
            return edit_password(username)
        else:
            file1 = "password.txt"
            file2 = "tmp.txt"
            with open(file1, "r", encoding='utf-8') as f1:
                with open(file2, "w", encoding='utf-8') as f2:
                    for line in f1:
                        shop = line.split()
                        if str(shop[0]) == str(username):
                            shop[1] = str(passwd1)
                            dat_out = " ".join(shop)
                            f2.write(dat_out + "
    ")
                        else:
                            dat_out = " ".join(shop)
                            f2.write(dat_out + "
    ")
            move_filename(file1)
            print("*****************************")
            print("密码修改成功!")  
    def open_shop_cart():
        x = PrettyTable(["商品名称", "数量"])
        x.align["商品名称"] = "l"  # 以name字段左对齐
        # x.align["价格"] = "r"  # 以name字段右对齐
        x.align["数量"] = "r"  # 以name字段右对齐
        x.padding_width = 1  # 填充宽度
        with open("shop-cart.txt", "r", encoding='utf-8') as f:
            for line in f:
                name, number = line.split()
                x.add_row([name, number])
            print("*****************************")
            print(x)  
    def open_commodity():
        x = PrettyTable(["商品名称", "价格", "数量"])
        x.align["商品名称"] = "l"  # 以name字段左对齐
        x.align["价格"] = "r"  # 以name字段右对齐
        x.align["数量"] = "r"  # 以name字段右对齐
        x.padding_width = 1  # 填充宽度
        with open("commodity.txt", "r", encoding='utf-8') as f:
            for line in f:
                name, money, number = line.split()
                x.add_row([name, money, number])
            print(x)  
    def open_bought():
        x = PrettyTable(["商品名称", "数量"])
        x.align["商品名称"] = "l"  # 以name字段左对齐
        x.align["数量"] = "r"  # 以name字段右对齐
        x.padding_width = 1  # 填充宽度
        with open("bought.txt", "r", encoding='utf-8') as f:
            for line in f:
                name, number = line.split()
                x.add_row([name, number])
            print(x)  
    def move_filename(filename):
        # 重命名文件名函数
        for file in os.listdir('.'):  # os.listdir('.')遍历文件夹内的每个文件名,并返回一个包含文件名的list
            if file == filename:
                os.remove(file)
        for file in os.listdir('.'):
            if file == "tmp.txt":
                new_name = filename
                os.rename(file, new_name)
                return  
    def edit_file_data(filename, key, n, operator):
        # 修改文件数据函数
        file2 = "tmp.txt"
        sign = 0
        if operator == '+':
            with open(filename, "r", encoding='utf-8') as f1:
                with open(file2, "w", encoding='utf-8') as f2:
                    for line in f1:
                        shop = line.split()
                        if str(shop[0]) == str(key):
                            sign = 1
                            shop[1] = str(int(shop[1]) + int(n))
                            dat_out = " ".join(shop)
                            f2.write(dat_out + "
    ")
                        else:
                            dat_out = " ".join(shop)
                            f2.write(dat_out + "
    ")
                    if sign == 0:
                        shop = [key, str(n)]
                        dat_out = " ".join(shop)
                        f2.write(dat_out + "
    ")
        elif operator == '-':
            with open(filename, "r", encoding='utf-8') as f1:
                with open(file2, "w", encoding='utf-8') as f2:
                    for line in f1:
                        shop = line.split()
                        if str(shop[0]) == str(key):
                            if int(shop[1]) < int(n):
                                return 1
                            else:
                                shop[1] = str(int(shop[1]) - int(n))
                                dat_out = " ".join(shop)
                                f2.write(dat_out + "
    ")
                        else:
                            dat_out = " ".join(shop)
                            f2.write(dat_out + "
    ")
    
        move_filename(filename)
        return 0    
    #!/usr/bin/env python
    # -*- conding:utf-8 -*-
    # create a shopping cart system
    
    # 20170921
    # evescn
    
    import sys
    import os
    import yaml
    from prettytable import PrettyTable
    
    
    def main():
        # 验证用户帐号和密码
        username = login()
    
        # 显示当前商店内的所有商品
        show_goods()
    
        while True:
            # 输出显示信息
            key = show_info()
            print("*****************************")
            if key.lower() == 's':
                show_shopping_cart()
            elif key.lower() == 'e':
                edit_password(username)
            elif key.lower() == 'v':
                show_bought_goods()
            elif key.lower() == 'm':
                recharge(username)
            elif key.lower() == 'y':
                show_yue(username)
            elif key.lower() == 'b':
                goods_bought(username)
            elif key.lower() == 'g':
                show_goods()
            else:
                add_goods_shopping_cart(key)
    
    
    if __name__ == "__main__":
        main() 

      

     2、用户帐号密码文件 

    # password.txt
    evescn 123456
    gmkk 12321   

     3、用户金额文件 

    # money.txt
    evescn 30
    gmkk 200  

     4、商品文件  

    # commodity.txt
    《Python入门》 5 100
    《Python放弃》 12 100
    瓜子 89 10
    苹果 55 5
    西瓜 15 2
    葡萄 12 3
    西红柿 8 4
    

      

     5、购物车文件  

    # shop-cart.txt
    瓜子 6
    苹果 2
    西瓜 3
    西红柿 2
    

      

     6、已购商品文件  

    # bought.txt
    瓜子 1
    

      

    运行结果:

      1、修改用户密码测试 

    Please input your name: evescn
    Please input password: 123456
    Bingo!
    +----------------+------+------+
    | 商品名称       | 价格 | 数量 |
    +----------------+------+------+
    | 《Python入门》 |    5 |  100 |
    | 《Python放弃》 |   12 |  100 |
    | 瓜子           |   89 |   10 |
    | 苹果           |   55 |    5 |
    | 西瓜           |   15 |    2 |
    | 葡萄           |   12 |    3 |
    | 西红柿         |    8 |    4 |
    +----------------+------+------+
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:e
    *****************************
    请输入你的新密码:Gmkk
    请再次确认你的密码:gmkk
    *****************************
    你2次输入的密码不一致,请重新输入
    *****************************
    请输入你的新密码:gmkk
    请再次确认你的密码:gmkk
    *****************************
    密码修改成功!
    *****************************  
    # password.txt 文件内容
    evescn gmkk
    gmkk 12321  

     2、添加商品到购物车测试 

    # 原商品文件信息
    
    《Python入门》 5 100
    《Python放弃》 12 100
    瓜子 89 10
    苹果 55 5
    西瓜 15 2
    葡萄 12 3
    西红柿 8 4
    
    # 原购物车文件信息
    
    瓜子 6
    苹果 2
    西瓜 3
    西红柿 2  
    Please input your name: evescn
    Please input password: 123456
    Bingo!
    +----------------+------+------+
    | 商品名称       | 价格 | 数量 |
    +----------------+------+------+
    | 《Python入门》 |    5 |  100 |
    | 《Python放弃》 |   12 |  100 |
    | 瓜子           |   89 |   10 |
    | 苹果           |   55 |    5 |
    | 西瓜           |   15 |    2 |
    | 葡萄           |   12 |    3 |
    | 西红柿         |    8 |    4 |
    +----------------+------+------+
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:瓜子
    *****************************
    请输入购买数量:20
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:  
    # 商品文件信息
    
    《Python入门》 5 100
    《Python放弃》 12 100
    瓜子 69 10
    苹果 55 5
    西瓜 15 2
    葡萄 12 3
    西红柿 8 4
    
    # 购物车文件信息
    
    瓜子 26
    苹果 2
    西瓜 3
    西红柿 2  

     3、充值测试和显示余额测试 

    # 充值前 money.txt 文件
    evescn 30
    gmkk 200  
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:m
    *****************************
    请输入充值金额:200
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:y
    *****************************
    +--------+------+
    | 用户   | 余额 |
    +--------+------+
    | evescn |  230 |
    +--------+------+
    *****************************  

     4、显示购物车 

    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:s
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |   26 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    *****************************  

     5、显示已购商品 

    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:v
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    1 |
    +----------+------+
    *****************************  

     6、购买商品 

    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:b
    *****************************
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |   26 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    输入q返回上级菜单,输入其他键继续:
    请输入购买商品名称:瓜子
    请输入购买数量:20
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    6 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    输入q返回上级菜单,输入其他键继续:
    请输入购买商品名称:瓜子
    请输入购买数量:5
    *****************************
    余额不足请充值:
    *****************************
    请输入充值金额:200
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:b
    *****************************
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    6 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    输入q返回上级菜单,输入其他键继续:
    请输入购买商品名称:瓜子
    请输入购买数量:7
    *****************************
    购物车中没有这么多商品,请重新选择
    *****************************
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    6 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    输入q返回上级菜单,输入其他键继续:
    请输入购买商品名称:瓜子
    请输入购买数量:6
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    0 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    输入q返回上级菜单,输入其他键继续:q
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:  
    # 运行后文件数据
    
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:y
    *****************************
    +--------+------+
    | 用户   | 余额 |
    +--------+------+
    | evescn |  170 |
    +--------+------+
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:s
    *****************************
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |    0 |
    | 苹果     |    2 |
    | 西瓜     |    3 |
    | 西红柿   |    2 |
    +----------+------+
    *****************************
    修改密码,请输入E:
    查看购物车,请输入S:
    查看已购买商品函数,请输入V:
    充值,请输入M:
    查询余额,请输入Y:
    购买商品,请输入B:
    查看商品数量和价格,请输入G:
    添加商品到购物车,请输入商品名称:
    *****************************
    请输入你的选择:v
    *****************************
    +----------+------+
    | 商品名称 | 数量 |
    +----------+------+
    | 瓜子     |   27 |
    +----------+------+
    *****************************  

     已知的bug问题:

    没有对用户输入的商品进行判断,一旦用户输入的商品不存在,将会报错(添加商品到购物车和购买商品时需要输入商品名称)
    

      

  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/evescn/p/7562020.html
Copyright © 2011-2022 走看看