首页 > 编程语言 >python进阶之路19 地狱入口购物车!!!!

python进阶之路19 地狱入口购物车!!!!

时间:2022-10-25 16:13:59浏览次数:40  
标签:shop good 进阶 python car 购物车 num user path

地狱之门

#  # 项目功能
#     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

相关文章

  • python json和pickle
    json和pickle共用方法dumps把任意对象序列化成一个strloads把任意str反序列化成原来数据dump把对象序列化后写入到文件对象中load把文件对象中的内容反序列化jso......
  • python生成器
    在Python中,使用了yield的函数被称为生成器(generator)。在Python中,可以使用生成器来一次返回单个元素,从而可以避免大量占用内存。生成器的send()方法可以往生成器发送一......
  • Python3自动化打包项目发布到pypi
    效果D:\Program\Python310\python.exeD:\data\git\PythonLinuxBasicModule\upload.pyC:\Users\刘某usage:twine[-h][--version][--no-color]{register,check,upl......
  • python集合的相关操作
    set1={"1","2","3","4"}set2={"a","b","c","d,"1","2"}一、intersection()交集 res=set1.intersection(set2)print(res)#简写&res=set1&set2prin......
  • React进阶篇——二、组件与服务器通信
    二、组件与服务器通信1,组件挂载阶段通信componentDidMount是调用服务器API最安全的地方,也是React官方推荐的进行服务器通信的地方。除了在componentDidMount,在componentW......
  • python字典相关操作方法
    字典相关函数一、增dic={}dic["ww"]="一表人才,除了帅气的皮囊之外,一无所有"dic['ywz']="渣男"dic["hxl"]="抠脚老汉"print(dic)#fromkeys()使用一组键......
  • 将python2.7项目转为Python3问题记录
    将一个Python2.7开发的测试工具项目转化为Python3。工具:Python自带的2to3.py将所有.py文件进行转化,生成的python3文件为原文件名,python2文件在后面加.bak 1.代码如:b......
  • python列表操作方法
    列表的相关操作(1)列表的拼接(同元组)(2)列表的重复(同元组)(3)列表的切片(同元组)语法=>列表[::]完整格式:[开始索引:结束索引:间隔值](1)[开始索引:]从开......
  • [转载]python跨文件使用全局变量的实现
    python跨文件使用全局变量的实现更新时间:2022-10-2514:46:38发布时间:602天前朗读Python定义了全局变量的特性,使用global关键字修饰1global key_word......
  • python实现证件照排版功能-附代码
    环境要求安装python3环境安装pillow图片处理库开发前准备推荐使用conda创建python环境condacreate-nprpython=3.8#创建环境condaactivatepr#进入环境......