购物车
4.周末大作业(尝试编写)
项目功能
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
# 1.先获取执行文件所在的路径
base_dir = os.path.dirname(__file__)
# 2.拼接db文件夹的路径
db_dir = os.path.join(base_dir, 'db')
# 3.判断db路径是否已存在 如果存在则无需创建 不存在则自动创建
if not os.path.exists(db_dir):
os.mkdir(db_dir)
is_login = {
'username': '', # 用户登录成功之后 记录用户名 便于后续查找并修改用户对应的数据
}
# 校验用户登录装饰器
def login_auth(func_name):
def inner(*args, **kwargs):
# 1.判断全局字典键username是否已经有值
if is_login.get('username'):
res = func_name(*args, **kwargs)
return res
else:
print('请先登录')
login() # 自动调用登录函数完成登录操作
return inner
def register():
while True:
# 1.获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
confirm_pwd = input('confirm_pwd>>>:').strip() # 密码的二次确认
# 2.先判断两次密码是否一致 (含有很多细小的判断 比如输入不能为空 结束符...)
if not password == confirm_pwd:
print('两次密码不一致')
continue
# 补充校验:用户名是否已存在(思路1:可以使用os.listdir() 思路2:拼接用户文件路径)
# 4.拼接存储用户数据的json文件完整路径
file_path = os.path.join(db_dir, '%s.json' % username) # ...db/jason.json
if os.path.exists(file_path):
print('用户名已存在')
continue
# 3.构建临时的用户字典数据
temp_user_dict = {
'name': username,
'pwd': password,
'balance': 15000,
'shop_car': {}
}
# 5.文件操作将用户字典序列化到json文件中
with open(file_path, 'w', encoding='utf8') as f:
json.dump(temp_user_dict, f)
print(f'用户{username}注册成功')
return
def login():
while True:
# 1.获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.拼接当前用户文件路径
file_path = os.path.join(db_dir, '%s.json' % username)
# 3.判断文件路径是否存在(如果存在说明有该用户名对应的用户 如果不存在表示没有该用户)
if not os.path.isfile(file_path):
print('用户名不存在')
continue
# 4.根据文件路径获取对应用户的字典数据
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# 5.判断用户密码是否一致
if password == user_dict.get('pwd'):
# 保存登录用户的用户名(登录状态)
is_login['username'] = user_dict.get('name')
print('登录成功')
return
else:
print('密码错误')
@login_auth
def add_shop_car():
# 1.获取商品数据(直接编写)
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 定义一个临时存储用户想要购买商品的字典数据 {'印度飞饼':[10, 22], '仿真玩偶':[1, 10000]}
temp_shop_dict = {}
# 2.循环打印商品信息购用户选择
while True:
# 3.打印商品数据
for i, j in enumerate(good_list): # i 数值 j 列表
print(f"商品编号:{i} | 商品名称:{j[0]} | 商品单价:{j[1]}")
# 4.获取用户想要添加的商品编号
target_good_id = input('请输入想要购买的商品编号(q)>>>:').strip()
# 添加一个结束添加购物车的标识 一旦用户输入q则将用户临时购物车字典添加到用户json数据中
if target_good_id == 'q':
# 拼接当前登录用户数据文件路径
file_path = os.path.join(db_dir, '%s.json' % is_login.get('username'))
# 获取当前用户的具体数据
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f) # {"name": "jason", "pwd": "123", "balance": 15000, "shop_car": {}}
# user_dict['shop_car'] = temp_shop_dict # "shop_car": {'印度飞饼':[10, 22],'土耳其土豆':[20, 999]}
"""
如果直接替换 那么可能会吧之前的购物车数据顶替 不够全面
"""
# 先获取用户原有的购物车数据
old_shop_car = user_dict.get('shop_car') # {'印度飞饼':[10, 22],'土耳其土豆':[20, 999]}
# 当前用户购物车数据 {'挂壁面': [300, 3], '土耳其土豆': [100, 999], '董卓戏张飞公仔': [200, 2000]}
for good_name in temp_shop_dict:
if good_name in old_shop_car:
old_shop_car.get(good_name)[0] += temp_shop_dict.get(good_name)[0]
else:
old_shop_car[good_name] = temp_shop_dict.get(good_name)
# 写入数据
user_dict['shop_car'] = old_shop_car
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print('添加购物车成功')
return
# 5.小的逻辑校验(是否是纯数字 是否在范围内)
if not target_good_id.isdigit():
print('商品编号只能是数字')
continue
target_good_id = int(target_good_id)
if target_good_id not in range(len(good_list)):
print('商品编号超出了范围')
continue
# 6.根据用户输入的商品编号获取商品信息
target_good_info = good_list[target_good_id] # ['印度飞饼', 22]
target_good_name = target_good_info[0]
target_good_price = target_good_info[1]
# 7.获取用户想要购买的数量
target_good_num = input('请输入想要购买的商品数量>>>:').strip()
if not target_good_num.isdigit():
print('商品数量只能是数字')
continue
target_good_num = int(target_good_num)
# 8.写入临时购物车字典
# temp_shop_dict[target_good_info[0]] = [target_good_num, target_good_info[1]]
"""
判断临时购物车中是否已经含有该商品键 如果有的话 应该获取对应的值然后自增
如果没有的话 才应该新增键值对
"""
if target_good_name in temp_shop_dict:
# 获取值列表 然后自增
value_list = temp_shop_dict.get(target_good_name) # [5, 22]
value_list[0] += target_good_num # [5+5, 22]
temp_shop_dict[target_good_name] = value_list #
else:
temp_shop_dict[target_good_name] = [target_good_num, target_good_price]
@login_auth
def buy_shop_car():
# 1.拼接用户文件完整路径
file_path = os.path.join(db_dir, '%s.json' % (is_login.get('username'),))
# 2.读取用户数据
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# print(user_dict) # {'name': 'jason', 'pwd': '123', 'balance': 15000, 'shop_car': {'挂壁面': [100, 3], '土耳其土豆': [50, 999], '印度飞饼': [33, 22]}}
# 3.获取购物车商品数据
shop_car = user_dict.get('shop_car') # {'挂壁面': [100, 3], '土耳其土豆': [50, 999], '印度飞饼': [33, 22]}
if not shop_car:
print('你先去买东西 行不行')
return
# 4.计算商品的总价
total_money = 0
current_balance = user_dict.get('balance')
for values in shop_car.values(): # [100, 3] [50, 999]
total_money += values[0] * values[1]
# 5.判断余额是否充足
if current_balance >= total_money:
rest_money = current_balance - total_money
user_dict['balance'] = rest_money
user_dict['shop_car'] = {}
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print(f'今日消费:{total_money} 卡上余额:{rest_money}')
else:
print(f'今日消费:{total_money} 当前余额:{current_balance} 余额不够哦')
return
@login_auth
def check_shop_car():
# 1.拼接用户文件完整路径
file_path = os.path.join(db_dir, '%s.json' % is_login.get('username'))
# 2.读取用户数据
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
shop_car_info = user_dict.get('shop_car')
if not shop_car_info:
print('请先购买商品')
for item in shop_car_info.items():
print(f"商品名称:{item[0]} | 商品数量:{item[1][0]} | 商品单价:{item[1][1]}")
@login_auth
def edit_shop_car():
# 1.拼接用户文件完整路径
file_path = os.path.join(db_dir, '%s.json' % is_login.get('username'))
# 2.读取用户数据
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
shop_car_info = user_dict.get('shop_car')
if not shop_car_info:
print('没有商品')
# print(shop_car_list)
while True:
shop_car_list = list(shop_car_info.items())
for i, j in enumerate(shop_car_list): # i 数值 j 列表
print(f"商品编号:{i} 商品名称:{j[0]} 商品数量:{j[1][0]} 商品单价:{j[1][1]}")
choice = input("""
1.移除商品
2.修改数量
3.退出修改购物车
请选择想要执行的操作:""").strip()
if choice == '1':
good_id = input('请输入想要移除的商品编号>>>:')
if not good_id.isdigit():
print('商品编号必须是纯数字:')
return
good_id_int = int(good_id)
if good_id_int not in range(len(shop_car_list)):
print('商品编号超出了范围')
return
good_name = shop_car_list[good_id_int][0]
shop_car_info.pop(good_name)
print(shop_car_info)
elif choice == '2':
# 获取要修改的商品编号
good_id = input('请输入想要修改的商品编号(q)>>>:')
# 对输入的商品编号进行数字判断
if not good_id.isdigit():
print('商品编号必须是纯数字:')
good_id_int = int(good_id)
# 判断输入的商品编号是否超出范围
if good_id_int not in range(len(shop_car_list)):
print('商品编号超出了范围')
return
update_good_num = input('请输入要修改上的的数量:')
shop_car_list[good_id_int][1][0] = update_good_num
user_dict['shop_car'] = dict(shop_car_list)
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print(shop_car_list)
elif choice == '3':
return
else:
print('无此操作')
func_dic = {
'1': register,
'2': login,
'3': add_shop_car,
'4': buy_shop_car,
'5': check_shop_car,
'6': edit_shop_car
}
while True:
print("""
1.注册功能
2.登录功能
3.添加购物车
4.结算购物车
5.查看购物车
6.修改购物车
""")
choice = input('请输入功能编号(q)>>>:').strip()
if choice in func_dic:
func_dic.get(choice)()
elif choice == 'q':
break
else:
print('输入不合法')
浙公网安备 33010602011771号