地狱之门
# # 项目功能
# 1.用户注册
# 2.用户登录
# 3.添加购物车
# 4.结算购物车
# # 项目说明
# 用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
# 数据格式 {"name":"jason","pwd":123}
# # ps:文件名可以直接用用户名便于校验
# 用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
# {"balance":15000,"shop_car":{}}
# 添加购物车功能 商品列表可以自定义或者采用下列格式
# good_list = [
# ['挂壁面',3]
# ['印度飞饼', 22]
# ['极品木瓜', 666],
# ['土耳其土豆', 999],
# ['伊拉克拌面', 1000],
# ['董卓戏张飞公仔', 2000],
# ['仿真玩偶', 10000]
# ]
# 用户可以反复添加商品,在购物车中记录数量
# {'极品木瓜':[个数,单价]}
# 结算购物车
# 获取用户购物车中所有的商品计算总价并结算即可
# 针对添加购物车和结算只有登录的用户才可以执行
import json
import os
# 3.校验用户名是否已存在(拼接存储用户数据的目录 拼接文件路径)
base_dir = os.path.dirname(__file__) # 获取执行文件所在的目录路径
db_dir = os.path.join(base_dir, 'db') # 拼接存储用户数据的目录路径
if not os.path.exists(db_dir): # 判断路径是否已存在 不存在则自动创建
os.mkdir(db_dir)
# 定义一个全局变量存储用户登录的相关信息
is_login = {
'username': '' # 一旦用户登录存储用户名 这样方便后续获取用户详细信息
}
# 校验用户是否登录的装饰器
def login_auth(func_name):
def inner(*args, **kwargs):
# 判断全局字典是否有值
if is_login.get('username'):
res = func_name(*args, **kwargs) # 执行真正被装饰的函数 并用变量名res接收函数的返回值
return res # 返回函数执行之后的返回值
else:
print('您尚未登录,请先登录')
login()
return inner
def regiter():
while True: # 3.添加循环
# 1.获取用户相关信息
username = input('请输入您的用户名>>>:').strip()
password = input('请输入您的密码>>>:').strip()
confirm_pwd = input('请确认您的密码>>>:').strip()
# 2.先校验两次密码是否一致 如果输入错误应该重新执行注册程序
if not password == confirm_pwd:
print('密码不一致!!!!')
continue
# 拼接当前用户名构成的文件路径 如果已存在则表示用户名已存在 不存在则可以完成用户注册
user_file_path = os.path.join(db_dir, f'{username}.json')
if os.path.exists(user_file_path):
print('用户名已存在 请重新注册')
continue
# 创建用户字典数据并序列化到文件中
user_dict = {
'username': username,
'password': password,
'balance': 15000,
'shop_car': {}
}
with open(user_file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print(f'用户{username}注册成功')
break
def login():
while True:
# 1.获取用户名
username = input('请输入您的用户名>>>:').strip()
# 判断用户名是否存在
user_file_path = os.path.join(db_dir, f'{username}.json')
if not os.path.exists(user_file_path):
print('用户名不存在')
continue
# 3.获取用户输入的密码
password = input('请输入您的密码>>>:').strip()
# 4.获取当前用户对应的真实数据
with open(user_file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# 5.判断用户输入的密码和文件中存储的真实密码是否一致
if not password == user_dict.get('password'):
print('密码错误')
continue
# 修改全局字典 记录当前登录用户名
is_login['username'] = username
# 6.完成登录操作
print(f'{username}登录成功')
return
@login_auth
def add_shop_car():
# 8.构造临时小字典存储商品信息
temp_shop_car = {}
while True:
# 1.获取商品信息
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 2.循环打印商品信息 供用户选择
for num, good_data in enumerate(good_list): # 0 []
print(f"商品编号{num} | 商品名称:{good_data[0]} | 商品单价:{good_data}")
# 3.获取用户输入的商品编号
choice_num = input('请输入您想要购买的商品编号(q)>>>:').strip()
# 添加结束标准用于保存购物车数据
if choice_num == 'q':
# 11.获取当前登录用户的字典数据
user_file_path = os.path.join(db_dir, f'{is_login.get("username")}.json')
with open(user_file_path, 'r', encoding='utf8') as f:
user_data_dict = json.load(f)
old_shop_car = user_data_dict.get('shop_car') # {'印度飞饼':[10,22]}
# 12.保存购物车数据
"""
user_data_dict['shop_car'] = temp_shop_car 不能直接替换 可能有原先的数据
{"username": "jason", "password": "123", "balance": 15000, "shop_car": {'印度飞饼':[10,22]}}
{'印度飞饼':[1999,22],'极品木瓜':[10,66]}
"""
for g_name, g_list in temp_shop_car.items():
if g_name in old_shop_car:
old_shop_car[g_name][0] += temp_shop_car[g_name][0]
else:
old_shop_car[g_name] = g_list
user_data_dict['shop_car'] = old_shop_car
with open(user_file_path, 'w', encoding='utf8') as f:
json.dump(user_data_dict, f, ensure_ascii=False)
print('添加商品成功')
break
# 4.判断编号是否是纯数字
if not choice_num.isdigit():
print('商品编号必须是纯数字')
continue
choice_num = int(choice_num)
# 5.判断数字是否超出范围
if choice_num not in range(len(good_list)):
print('商品编号不存在 无法选择购买')
continue
# 6.根据商品编号获取商品信息
target_good_list = good_list[choice_num] # [印度飞饼,22]
# 7.获取想要购买的商品个数
good_num = input(f'请输入您想购买的{target_good_list[0]}的商品数量>>>:').strip()
if not good_num.isdigit():
print('商品个数必须是数字')
continue
good_num = int(good_num)
# 9.写入临时小字典中
"""
temp_shop_car[target_good_list[0]] = [good_num,target_good_list[1]]
t = {'印度飞饼':[10,22]}
{'印度飞饼':[10,22] 字典的键存在会替换值
判断这个键是否已存在 如果存在则获取值列表 将第一个数据值数字自增用户输入的数据
"""
good_name = target_good_list[0]
if good_name in temp_shop_car:
temp_shop_car.get(good_name)[0] += good_num
else:
temp_shop_car[good_name] = [good_num, target_good_list[1]]
print(temp_shop_car)
@login_auth
def pay_shop_car():
# 1.拼接当前登录用户文件路径
user_file_path = os.path.join(db_dir,f'{is_login.get("username")}.json')
# 2.读取用户数据
with open(user_file_path,'r',encoding='utf8')as f:
user_data_dict = json.load(f)
# 3.获取当前用户购物车数据及账户余额
shop_car = user_data_dict.get('shop_car') # {'印度飞饼':[10,22],'公仔':[100,100]}
if not shop_car:
print('购物车空空如也 赶紧去添加商品吧!!!!')
return
current_balance = user_data_dict.get('balance')
# 4.统计购物车商品总价
total_money = 0
for g_list in shop_car.values(): # [10,22] [100,100]
total_money += g_list[0] * g_list[1]
# 5.比较余额是否充足
if total_money > current_balance:
print('账号余额不足')
return
user_data_dict['balance'] -= total_money
# 6.清空购物车
user_data_dict['shop_car'] = {}
with open(user_file_path,'w',encoding='utf8')as f:
json.dump(user_data_dict,f)
print(f'尊敬的{is_login.get("username")} 您本次消费{total_money} 卡上余额剩余{user_data_dict.get("balance")}欢迎下次再来')
func_dict = {
'1': regiter,
'2': login,
'3': add_shop_car,
'4': pay_shop_car
}
while True:
print(
"""
1.注册功能
2.登录功能
3.添加购物车
4.结算购物车
"""
)
choice_num = input('请输入想要执行的功能编号>>>:').strip()
if choice_num in func_dict:
func_name = func_dict.get(choice_num) # 获取函数名
func_name() # 调用函数
else:
print('功能编号不存在')
标签:shop,good,进阶,python,car,购物车,num,user,path
From: https://www.cnblogs.com/xm15/p/16825202.html