"""
@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("输入有误,请重新输入!")