#关于购物车的优化
#之前写了一个购物车还是存在着bug,打算做个优化
#有两个接口:1.用户接口(购买商品,账户充值) 2.管理员接口(增加或者删除商品,更改商品的价格)
#前提:商品的名称和价格以及金钱的存储都不在内存中,我将其通过txt的文件形式存放在本地目录下,通过文件的读写形式将其调用
#判断是否为新用户,保存余额,如果是老用户,直接根据所剩的余额进入商城
def Main():
user_balance = ‘balance.txt‘ #根据余额判断是否为新用户(存储用户的余额)
user_commodity = ‘shopping.txt‘
while True:
choice = Interface()
if choice == ‘1‘:
is_commodity = True
commodity_list = []
new_user(user_balance)
price = user_price(user_balance) #获取用户的 钱
tat = [price,commodity_list]
commodity(user_commodity,tat)
elif choice == ‘2‘:
user_admini = ‘shopping.txt‘
admini(user_admini)
#选择接口 1.用户接口 2.管理员接口 [更改商品价格]
def Interface():
is_choice = True
while is_choice:
print(‘1-用户\n2-管理员‘)
choice = input(‘请选择你的身份:‘)
if choice == ‘1‘:
print(‘您将以用户的身份登陆我们的商城!‘)
is_choice = False
elif choice == ‘2‘:
print(‘您将以管理员的身份进入商城!‘)
is_choice = False
else:
print(‘您输入了无效的选项,请重新输入.‘)
return choice
#判断是否为新用户
def new_user(user_balance):
try:
with open(user_balance,mode=‘r‘,encoding=‘utf-8‘) as ff:
print(‘你目前的账户余额有:‘+ ff.readlines()[0])
except FileNotFoundError:
with open(user_balance, mode=‘w‘, encoding=‘utf-8‘) as ff:
is_number = True
while is_number:
number = input(‘您是新用户,请输入您的余额:‘)
if number.isdigit() == False:
print(‘您只能输入数字,请重新输入‘)
else:
print(‘您当前的账户有:‘+ number + ‘余额,请进行购物!‘)
ff.write(number)
is_number = False
#获取到用户的余额
def user_price(user_balance):
with open(user_balance,‘r‘) as ff:
balance = ff.read()
return balance
#打印商城列表
def commodity(user_commodity,tat): #tat【钱,已购买商品列表】
print(‘以下是商城列表中的商品,请根据序号选择!(0:账户充值)‘)
list_of_commodity = [‘clothes.txt‘, ‘food.txt‘, ‘electronics.txt‘]
commodity_address = user_commodity
is_commodity = True
with open(user_commodity,‘r‘) as ff:
date_1 = ff.read().splitlines() #商品列表[衣服,食品,电子]---date_1
count = 1
for val in date_1:
print(str(count) + ‘-‘ + val)
count = count + 1
number = input(‘请根据序号选择商品列表(任意键退出):‘)
while is_commodity:
if number.isdigit() == False:
print(‘您已退出商城!‘)
if len(tat[1]) <= 0:
print(‘您未购买商品!‘)
print(‘你的余额还剩:‘+ str(tat[0])+‘\n------------------‘)
else:
print(‘您购买了:‘+ str(tat[1]))
print(‘你的余额还剩:‘+ str(tat[0])+‘\n------------------‘)
break
elif number == ‘0‘:
with open(‘balance.txt‘,‘r‘) as ff:
is_recharge = ff.read().splitlines() #列表[0]
is_number = is_recharge[0]
recharge = input(‘您想充值多少呢:‘)
if recharge.isdigit() == False:
print(‘不好意思,您充值的数据有误,请输入数字!‘)
commodity(user_commodity,tat)
elif recharge == ‘0‘:
print(‘不好意思,充值无效!‘)
commodity(user_commodity,tat)
else:
with open(‘balance.txt‘,‘w‘) as f:
is_pri = str(int(is_number)+int(recharge))
f.write(is_pri)
tat[0] = is_pri
print(‘恭喜您,充值成功!‘)
is_commodity = False
commodity(user_commodity,tat)
elif int(number) > len(date_1):
print(‘您所输入的选项不存在!‘)
is_commodity = False
commodity(user_commodity,tat)
else:
choose = list_of_commodity[int(number)-1] #存储用户选择列表的文件名
user_choice(choose,commodity_address,tat)
break
#用户选择的列表
def user_choice(choice,commodity_address,tat):
with open(choice,‘r‘) as ff:
date_2 = ff.read().splitlines()
is_goods = [] #存储商品
is_price = [] #存储价格
count = 1
is_choice = True
for val in date_2:
print(str(count) + ‘-‘ + val)
a=val.index(‘:‘)
aa = val[a+1:]
bb = val[:a]
is_price.append(int(aa))
is_goods.append(bb)
count = count + 1
print(‘您目前的余额有:‘+ str(tat[0]))
number = input(‘请输入您需要购买的商品(任意键退出):‘)
while is_choice:
if number.isdigit() == False:
print(‘您已退出当前界面!‘)
is_choice = False
commodity(commodity_address,tat)
elif number == ‘0‘:
print(‘您所输入的选项不存在!‘)
is_commodity = False
user_choice(choice,commodity_address,tat)
elif int(number) > len(date_2):
print(‘您所输入的选项不存在!‘)
is_commodity = False
user_choice(choice,commodity_address,tat)
else:
is_number =input(‘您确定要购买‘+ is_goods[int(number)-1] + ‘这件商品吗?(Y/任意键重新选择)‘)
if is_number == ‘y‘:
if int(tat[0]) < is_price[int(number)-1]:
print(‘不好意思,您的金钱不足,无法购买!‘)
user_choice(choice,commodity_address,tat)
else:
tat[0] = int(tat[0]) - is_price[int(number)-1]
with open(‘balance.txt‘,‘w‘) as ff:
ff.write(str(tat[0]))
tat[1].append(is_goods[int(number)-1])
print(‘恭喜您,购买成功!‘)
is_choice = False
user_choice(choice,commodity_address,tat)
else:
user_choice(choice,commodity_address,tat)
break
#----------管理员接口--------------------
def admini(user_admini):
list_admini = []
admini_list = [‘clothes.txt‘,‘food.txt‘,‘electronics.txt‘]
with open(user_admini,‘r‘) as ff:
data = ff.read().splitlines()
count = 1
for val in data:
print(str(count)+ ‘-‘ + val)
count = count + 1
number = input(‘请输入您要修改的列表(q返回上一级):‘)
if number == ‘q‘:
Interface()
elif number.isdigit() == False:
print(‘输入错误,请重新输入!‘)
admini(user_admini)
elif number == ‘0‘:
print(‘您输入的选项不存在,请重新输入!‘)
admini(user_admini)
elif int(number) > len(data):
print(‘您输入的选项不存在,请重新输入!‘)
admini(user_admini)
else:
number = int(number) - 1
operation(number,admini_list[number],user_admini) #admini_list[number] 地址的存储
#操作列表(增加,修改,删除)
def operation(number,admini_list,user_admini):
tat = [number,admini_list,user_admini]
with open(admini_list,‘r‘) as ff:
list_operation = ff.read().splitlines()
count = 1
for val in list_operation:
print(str(count) + ‘-‘ + val)
count = count +1
is_operation = input(‘请选择您的操作[增加-修改-删除](q返回上一级):‘)
if is_operation==‘q‘:
admini(user_admini)
elif is_operation == ‘增加‘:
increase(admini_list,tat)
elif is_operation==‘修改‘:
revise(admini_list,tat)
elif is_operation == ‘删除‘:
delete(admini_list,tat)
else:
print(‘不好意思,您的操作错误!‘)
operation(number,admini_list,)
#增加
def increase(admini_list,tat):
list_increase = []
is_goods = [] #存储商品
is_price = [] #存储价格
is_increase = True
with open(admini_list,‘r‘) as ff:
list_increase = ff.read().splitlines()
for val in list_increase:
a=val.index(‘:‘)
aa = val[a+1:]
bb = val[:a]
is_price.append(int(aa))
is_goods.append(bb)
values = input(‘您添加的商品名称(q返回上一级):‘)
if values == ‘q‘:
operation(tat[0],tat[1],tat[2])
elif values in is_goods:
print(‘不好意思,商品已经存在!‘)
increase(admini_list,tat)
else:
price = input(‘请输入该商品的价格:‘)
if price.isdigit() == False:
print(‘请输入正确的价格!‘)
else:
with open(admini_list,‘a‘) as ff:
ff.write(‘\n‘+values + ‘:‘ + price)
print(‘添加商品成功‘)
increase(admini_list,tat)
#修改价格
def revise(admini_list,tat):
revise_list = []
with open(admini_list,‘r‘) as ff:
revise_list = ff.read().splitlines()
is_goods = [] #存储商品
is_price = [] #存储价格
count = 1
for val in revise_list:
a=val.index(‘:‘)
aa = val[a+1:]
bb = val[:a]
is_price.append(int(aa))
is_goods.append(bb)
for i in range(len(is_goods)):
print(str(count)+ ‘-‘ + str(is_goods[i]) + ‘:‘ + str(is_price[i]))
count = count + 1
is_revise = input(‘请选择你要修改的商品序号(q返回上一级):‘)
if is_revise == ‘q‘:
operation(tat[0],tat[1],tat[2])
elif is_revise.isdigit() == False:
print(‘不好意思,您输入错误,请重新输入!‘)
revise(admini_list,tat)
elif is_revise == ‘0‘:
print(‘不好意思,该选项不存在,请重新输入!‘)
revise(admini_list,tat)
elif int(is_revise) > len(is_goods):
print(‘不好意思,该选项不存在,请重新输入!‘)
revise(admini_list,tat)
else:
price = input(‘您想修改‘+ str(is_goods[int(is_revise)-1])+‘的价格为:‘)
if price.isdigit() == False:
print(‘不好意思,请输入正确的数字!‘)
revise(admini_list,tat)
elif price == ‘0‘:
print(‘不是福利机构啊,白送么!‘)
revise(admini_list,tat)
else:
is_price[int(is_revise)-1] = price
with open(admini_list,‘w‘) as ff:
for k in range(len(revise_list)):
if k == len(revise_list)-1:
ff.write(str(is_goods[k]) + ‘:‘ + str(is_price[k]))
else:
ff.write(str(is_goods[k]) + ‘:‘ + str(is_price[k])+ ‘\n‘)
print(‘修改成功!‘)
revise(admini_list,tat)
#删除
def delete(admini_list,tat):
delete_list = []
with open(admini_list,‘r‘) as ff:
delete_list = ff.read().splitlines()
is_goods = [] #存储商品
is_price = [] #存储价格
count = 1
for val in delete_list:
a=val.index(‘:‘)
aa = val[a+1:]
bb = val[:a]
is_price.append(int(aa))
is_goods.append(bb)
for i in range(len(is_goods)):
print(str(count)+ ‘-‘ + str(is_goods[i]) + ‘:‘ + str(is_price[i]))
count = count + 1
is_delete = input(‘请选择你要删除的商品序号(q返回上一级):‘)
if is_delete == ‘q‘:
operation(tat[0],tat[1],tat[2])
elif is_delete.isdigit() == False:
print(‘不好意思,您输入错误,请重新输入!‘)
delete(admini_list,tat)
elif is_delete == ‘0‘:
print(‘不好意思,该选项不存在,请重新输入!‘)
delete(admini_list,tat)
elif int(is_delete) > len(is_goods):
print(‘不好意思,该选项不存在,请重新输入!‘)
delete(admini_list,tat)
else:
del delete_list[int(is_delete)-1]
with open(admini_list,‘w‘) as f:
for i in range(len(delete_list)):
if i == len(delete_list)-1:
f.write(delete_list[i])
else:
f.write(delete_list[i] + ‘\n‘)
print(‘删除成功!‘)
Main()
原文:https://www.cnblogs.com/ifdashui/p/10645168.html