python进阶之路19 小垃圾 购物车!!!!

导读:本篇文章讲解 python进阶之路19 小垃圾 购物车!!!!,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

地狱之门

  # 项目功能
      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('功能编号不存在')

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98784.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!