数据结构:
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
......
]
功能要求:
基础要求:
1、启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
扩展需求:
1、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
2、许查询之前的消费记录
代码实现:
import copy
# 从文件读取用户信息,数据结构为:
# id_info=dict(key:用户名,values['密码',余额,历史消费记录[{商品名:价格:数量:},{}],锁定标志位:0未锁定,1锁定])
f = open("id_info.txt", 'r', encoding="GBK")
id_info = eval(f.read())
f.close()
# -----------------------------------------------用户登陆模块-------------------------------------------
# 新用户登录,输入两遍密码确认;老用户登录则从用户信息表读取帐密校验;同一帐号连续输入三次则锁定,退出程序
count = 0
user_name = None
is_same_user = True
last_login_user = None
is_login = False
while count < 3:
user_name = input("请输入用户名:").strip()
user_pwd = input("请输入密码:").strip()
if last_login_user is None: # 首次登陆
last_login_user = user_name
if user_name != last_login_user: # 判断是否连续登陆
is_same_user = False
if user_name in id_info:
if id_info[user_name][3] == 0: # 判断帐号是否锁定
if user_pwd == id_info[user_name][0]:
print("尊敬的\033[1;31;40m%s\033[0m,欢迎登陆路飞商城!" % user_name)
is_login = True
break
else:
print("密码错误,请重输!")
else:
print("用户帐号已冻结,请联系管理员解锁。")
else:
print("该用户帐号不存在,请联系管理员分配帐号!")
count += 1
else:
print("密码输入错误超过3次!")
if is_same_user is True: # 锁定帐号,写入文件保存
id_info[user_name][3] = 1
f = open("id_info.txt", 'w', encoding="GBK")
f.write(str(id_info))
f.close()
# ---------------------------------------------用户选购商品模块-------------------------------------------
# 支持保存和查询全部历史消费记录,当天购物车清单,同时对展示的同类商品进行了数量合并
goods = [{"name": "电脑", "price": 1999}, {"name": "鼠标", "price": 10}, {"name": "游艇", "price": 20},
{"name": "美女", "price": 998}, ]
cart_history = id_info[user_name][2] # 读取文件传给id_info的历史购物记录
# 初始化本次购物车商品列表,用于按q打印时输出
cart = []
j = 0
while j < len(goods):
cart.append({})
j += 1
# 定义打印菜单所需的字符串
s = "商品列表"
s_c = "本次购物车清单"
s_h = "历史消费记录"
if is_login:
while True:
if id_info[user_name][1] is None: # 未输入工资的用户,首次运行程序输入,以后登陆不再输入工资
user_salary = input("请输入工资:").strip()
if user_salary.isdigit():
id_info[user_name][1] = int(user_salary)
break
else:
print("工资输入的不是数字,请重输!")
else:
break
# 用户往购物车循环添加商品,加入的商品需同时保存到历史记录,退出时写入文件保存
while True:
# 打印商品列表和高亮显示余额
print(s.center(30, '-'))
for index, i in enumerate(goods):
print("%s. %s 单价:%s元".center(30) % (index, i['name'], i['price']))
print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1])
choice = input("请输入商品数字编号加入购物车,\n查询历史消费记录按h,退出请按q:")
if choice.isdigit():
choice_num = int(choice)
if 0 <= choice_num < len(goods):
if id_info[user_name][1] >= goods[choice_num]['price']: # 余额足够
# 本次购物车无同种商品,则增加关键字num统计同种商品的购买数量
if cart[choice_num].get('num') is None:
cart[choice_num] = goods[choice_num]
cart[choice_num].setdefault('num', 1)
id_info[user_name][1] -= goods[choice_num]['price']
else:
cart[choice_num]['num'] += 1 # 如购物车已有同名商品则已购数量加1
id_info[user_name][1] -= goods[choice_num]['price']
# 历史购物记录同时加入本次购物记录
if cart_history[choice_num].get('num') is None:
cart_history[choice_num] = copy.deepcopy(goods[choice_num])
cart_history[choice_num].setdefault('num', 1)
else:
cart_history[choice_num]['num'] += 1 # 如历史记录已有同名商品则已购数量加1
print("\033[1;31;40m商品 %s 已加入购物车!\033[0m" % goods[choice_num]['name'])
else:
print("对不起,您账户中\033[1;31;40m余额不足\033[0m,不能购买本件商品!") # 余额不足
else:
print("您输入的商品数字编号有误,请重新输入:")
# 用户输入h,打印全部历史消费清单和余额,含当天已消费的商品
elif choice.casefold() == 'h':
empty_num = 4
print(s_h.center(30, '-'))
for index, i in enumerate(cart_history):
if i != {}:
empty_num -= 1
print("%s. %s 单价:%d元 数量:%d" % (index, i['name'], i['price'], i['num']))
if empty_num == 4:
print("您还没有任何历史消费记录,欢迎拨打客服\n电话反馈您的商品需求,谢谢!")
print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1])
# 用户输入q,打印本次购物车清单和余额,退出程序
elif choice.casefold() == 'q':
empty_num = 4
print(s_c.center(30, '-'))
for index, i in enumerate(cart):
if i != {}:
empty_num -= 1
print("%s. %s 单价:%d元 数量:%d" % (index, i['name'], i['price'], i['num']))
if empty_num == 4:
print("今天您还没有购买商品,购物车是空的。")
print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1])
# 退出前将历史消费记录和余额保存到文件中
id_info[user_name][2] = copy.deepcopy(cart_history)
f = open("id_info.txt", 'w', encoding="GBK")
f.write(str(id_info))
f.close()
break
else:
print("您输入的不是数字编号!")