python-面向对象-简易购物系统

#一个简单的购物系统!

"""
@author: xiaoyang
@file: 2023-04-13-面向对象-三乐购物系统.py
@time: 2023/4/13 15:56
"""
import json
import pickle
#购物系统类
#实例属性
#   商品信息
#   系统说明信息
#   当前用户 -- 多个用户
#方法
#   登陆
#   注册
#   查看商品
#   添加购物车
#   结算

#用户类
#实例属性
#   名字
#   密码
#   钱
#   购物车
#方法
#
#user class
class User:
    def __init__(self, name, passwd, initial_amount):
        self.name = name
        self.passwd = passwd
        self.init_amount = initial_amount
        self.shopping_cart = {}

#shopping_system
class ShoppingSystem:
    #实例属性
    def __init__(self, goods_info, sys_info):
        self.goods_info = goods_info
        self.sys_info = sys_info
        self.userdict = {}


    #读取保存的用户
    def load_user(self):
        file_name = self.sys_info + "_user.pickle"
        #读取文件   如果文件不存在则不做任何处理,存在则直接读取
        try:
            with open(file_name, "rb") as fp:
                self.userdict = pickle.load(fp)
        except:
            pass
    #注册
    def register(self, name, passwd, initial_amount):
        if name not in self.userdict:
            # 创建一个新用户,实例化User类
            user = User(name, passwd, int(initial_amount))    #将initial_amount转换为int类型,在结算购物车时就不需要转换了
            #把名字作为key user对象作为value 存在self.userdict里面
            #{"sc":user对象}
            self.userdict[name] = user
            #写入文件    pickle包直接写入,自带的包不需要安装
            file_name = self.sys_info + "_user.pickle"
            with open(file_name, "wb") as fp:
                pickle.dump(self.userdict, fp)
            #使用json格式写入文件
            # with open(file_name, "w") as fp:
            #     fp.write( pickle.dumps(self.userdict).decode("utf-8") )
            # tmp_dict = {}
            # for k,v in self.userdict.items():
            #     tmp_dict[k] = {"passwd":v.passwd, "init_amount":v.init_amount}
            # with open(file_name, "w") as fp:
            #     fp.write( json.dumps(tmp_dict) )

        else:
            print("用户已经存在,请直接登录")

    #登录
    def login(self, name, passwd):
        if name in self.userdict and self.userdict[name].passwd == passwd:
            return True
            #下面这种也是可以实现登录功能的,只是代码长一点
        # if name == self.userdict[name].name:
        #     if passwd == self.userdict[name].passwd:
        #         print(f"恭喜您登陆成功!您的余额为{self.userdict[name].init_amount}")
        #     else:
        #         print("您输入的密码错误,请重试!")
        # else:
        #     print("您输入的用户名不存在,请先注册!")

        #查看商品
    def check_goods(self):
            #无格式的查看商品,不美观可以像后面的代码一样添加一些输出格式
        # for key,value in goods.items():
           # print(f"编号:{key} --> {value['name']} --> {value['price']}")
        print("商品编号".ljust(10," "),"商品名字".ljust(10," "),"商品价格".ljust(10," "))
        for key in self.goods_info:
            product_name = self.goods_info[key]["name"]
            product_price = self.goods_info[key]["price"]
            print(f"{key}".ljust(10, " "), f"{product_name}".ljust(20, " "), f"{product_price}".ljust(25, " "))

        #添加购物车
    def add_cart(self, id, num, name):
        # car = {"F0001":3, "F0002":2}
        if name in self.userdict:
            sc = self.userdict[name].shopping_cart
            sc[id] = sc.get(id, 0) + int(num)
            print("购物车商品有:")
            print(sc)

        #结算购物车
    def pay(self, name):
        sc = self.userdict[name].shopping_cart
        total = 0
        for id,num in sc.items():
            price = self.goods_info[id]["price"]
            total += price * num
        if total > self.userdict[name].init_amount:
            print("余额不足!请充值!")
        else:
            self.userdict[name].init_amount -= total
            print(f"账户余额为{self.userdict[name].init_amount}")



#主程序
fruit_goods = {
    'F0001':{ "name":"apple", "price":8},
    'F0002':{ "name":"banana","price":4}
}

medicine_goods = {
    'M0001':{ "name":"奥司他韦", "price":60},
    'M0002':{ "name":"抗病毒口服液", "price":30}
}
system1 = ShoppingSystem(fruit_goods, "水果购物系统")
system2 = ShoppingSystem(medicine_goods, "药品购物系统")

system = [system1, system2]

while 1:
    print("当前平台,已有购物系统如下:")
    for k,v in enumerate(system):
        print(f"{k}.{v.sys_info}")
    c1 = input("please input your choice(按q退出):")
    if c1 == "q":
        break
    if c1.isdigit() and int(c1)<len(system):
        c1 = int(c1)
        current_system = system[c1]
        #加载用户
        current_system.load_user()
        print(f"欢迎进入{system[c1].sys_info}" .center(40, "*"))
        while 1:
            c2 = input("1.登录\n2.注册\n请输入你的选择(按q退出):")
            if c2 == "q":
                break
            if c2 == "1":
                name, passwd = input("请输入你的名字、密码(用空白分隔):").split()
                if current_system.login(name, passwd):
                    print("登陆成功!")
                    while 1:
                        c3 = input("1.查看商品\n2.添加购物车\n3.结算购物车\n4.退出\n请输入你的选择:")
                        if c3 == "1":
                            current_system.check_goods()
                        elif c3 == "2":
                            id = input("请输入你要添加的商品的编号:")
                            num = input("请输入要买的数量:")
                            current_system.add_cart(id, num, name)
                        if c3 == "3":
                            current_system.pay(name)
                        if c3 == "4":
                            break
                else:
                    print("登陆失败!请重新登录!")

            elif c2 == "2":
                name, passwd, amount = input("请输入你的名字、密码、初始金额(用空白分隔):").split()
                current_system.register(name, passwd, amount)
                print(f"当前系统用户有:{current_system.userdict}")
            else:
                print("输入有误!")
    else:
        print("输入有误,请重新输入!")

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值