启动文件
bin>>>start.py
from core.src import * cmd_dict = { '1': register, '2': login, '3': add_to_cart, '4': settle_cart } while True: print(''' 1.用户注册 2.用户登录 3.添加购物车 4.结算购物车 ''') cmd = input('请输入指令>>>:').strip() if cmd in cmd_dict: func = cmd_dict.get(cmd) func() else: print('请输入正确的指令')
core>>>src.py
import os import json
login_state = {'username': None}
# 获取项目文件所在的路径 current_path = os.path.dirname(os.path.dirname(__file__)) # 拼接db文件夹路径 db_path = os.path.join(current_path, 'db') # 创建db文件夹 if not os.path.exists(db_path): os.mkdir(db_path)
# 传入username参数实现拼接完整路径名 def load_userinfo(username): # 获取存储当前用户信息的文件路径 user_file_path = os.path.join(db_path, '%s.json' % username) with open(user_file_path, 'r', encoding='utf8') as f: # 获取用户数据 return json.load(f)
# 传入username参数实现拼接完整路径名 # data为想要保存的数据 def dump_userinfo(username, data): # 获取存储当前用户信息的文件路径 user_file_path = os.path.join(db_path, '%s.json' % username) with open(user_file_path, 'w', encoding='utf8') as f: # 保存数据 json.dump(data, f, ensure_ascii=False)
def register(): # 1.用户名 密码 重复密码 user_name = input('username>>>:').strip() user_pwd = input('password>>>:').strip() re_pwd = input('repassword>>>:').strip() # 2.判断两次密码是否一致 if user_pwd != re_pwd: print('两次密码不一致') return # 3.获取当前用户注册后生成的路径 user_file_path = os.path.join(db_path, '%s.json' % user_name) # 4.路径存在则表明用户已被注册 if os.path.exists(user_file_path): print('用户已存在') return # 5.生成用户信息 user_data = { 'username': user_name, 'password': user_pwd, 'balance': 20000, 'shopping_cart': {} } # 6.保存用户信息 dump_userinfo(user_name, user_data) print(f'用户 {user_name} 注册成功')
def login(): # 1.输入用户名 密码 user_name = input('username>>>:').strip() user_pwd = input('password>>>:').strip() # 2.生成用户名对应的文件路径 user_file_path = os.path.join(db_path, '%s.json' % user_name) # 3.判断用户名文件路径是否存在 if not os.path.isfile(user_file_path): print('用户名不存在') return # 4.存在则取出该用户名对应的文件信息 user_data = load_userinfo(user_name) # 5.判断密码是否正确 if user_pwd == user_data.get('password'): print(f'用户 {user_name} 登录成功') # 6.登录成功则修改全局字典 login_state['username'] = user_name print(login_state['username']) else: print('用户名或密码错误')
# 登录认证装饰器 def wrapper(func): def inner(*args, **kwargs): if login_state.get('username'): res = func(*args, **kwargs) return res else: print('还没有登录哦') login() return inner
# 添加到购物车 @wrapper def add_to_cart(): # 1.创建商品列表 goods_list = [['奥里给', 3], ['老八秘制小汉堡', 40], ['超甜的糖果', 20], ['好凉凉的桃桃', 15], ['没事就吃的溜溜梅', 5], ['太美的鸡', 100], ['人人果实原味', 99999]] # 2.创建临时的购物车 temp_cart = {} while True: # 3.循环格式化打印商品列表 for i, j in enumerate(goods_list, start=1): print(f'商品编号: {i}\t商品名: {j[0]}\t商品单价: {j[1]}' ) # 4.获取用户输入的商品编号 goods_num = input('请输入想要购买的商品编号或者输入q结束>>>:').strip() # 13.如果输入的是q 则修改用户真实购物车并保持 if goods_num == 'q': # 14.获取用户数据 user_data = load_userinfo(login_state.get('username')) # 15.取出真正的购物车数据(此处避免原购物车不为空 不能用临时购物车直接替换) real_cart = user_data.get('shopping_cart') # 16.取出临时购物车数据判断是否原购物车内就有该商品 for goods_name in temp_cart: if goods_name in real_cart: # 17.已存在则修改数量 real_cart[goods_name][0] += temp_cart[goods_name][0] else: # 18.不存在则加增 real_cart[goods_name] = temp_cart[goods_name] # 19.将取出的真正购物车放回原用户信息中 user_data['shopping_cart'] = real_cart # 20.保存用户信息 dump_userinfo(login_state.get('username'), user_data) break # 5.判断编号是否为纯数字 if not goods_num.isdigit(): print('编号格式必须是纯数字') return # 6.是纯数字则转为整型 goods_num = int(goods_num) # 7.判断编号是否在范围内 if goods_num not in range(1, len(goods_list) + 1): print('编号不存在') continue # 8.获取用户想要购买的商品信息 target_goods_list = goods_list[goods_num - 1] target_goods_name = target_goods_list[0] target_goods_price = target_goods_list[1] # 9.获取用户想要购买当前编号商品的数量 target_num = input('请输入想要购买的数量>>>:').strip() if not target_num.isdigit(): print('商品数量必须是纯数字') target_num = int(target_num) # 10.判断刚添加入临时购物车的商品名是否已存在于临时购物车 if target_goods_name not in temp_cart: # 11.不存在则新增商品信息 temp_cart[target_goods_name] = [target_num, target_goods_price] else: # 12.存在则修改数量 temp_cart[target_goods_name][0] += target_num
# 结算购物车 @wrapper def settle_cart(): # 1.取出登录用户的信息 user_data = load_userinfo(login_state.get('username')) # 2.取出购物车 cart = user_data.get('shopping_cart') # 3.定义总价进行判断 total_money = 0 # 5.计算购物车总价 for goods_num, goods_price in cart.values(): total_money += goods_num * goods_price # 6.判断余额够不够 balance = user_data.get('balance') # 7.余额够的话则扣费 并清空购物车 if balance >= total_money: rest_money = balance - total_money # 8.将余额存回 user_data['balance'] = rest_money # 9.清空购物车 user_data['shopping_cart'] = {} # 10.保存数据 dump_userinfo(login_state.get('username'), user_data) print(f'结算成功! 一共消费{total_money} 余额{rest_money}') else: print('哥哥~钱不够辣~赶快充值哦~')
效果展示