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问题:

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

      

  • 相关阅读:
    Ural1387 Vasya's Dad
    SGU481 Hero of Our Time
    sjtu1590 强迫症
    sjtu1591 Count On Tree
    sjtu1585 oil
    sjtu1364 countcountcount
    sjtu1333 函数时代
    Fabric-ca client端初始化过程源码分析
    Fabric-ca server端与client端交互
    Fabric-ca server端初始化过程源码分析
  • 原文地址:https://www.cnblogs.com/evescn/p/7562020.html
Copyright © 2011-2022 走看看