购物车

思路

代码

思路

1.先利用空函数搭建基础框架
def register():
    pass

def login():
    pass

def add_shop_car():
    pass

def clear_shop_car():
    pass

2. 添加购物车和清空购物车需要验证身份,必须是本人登录状态下才可以进行, 所以需要做一个登录功能的装饰器方便后续调用.

def login_auth(func_name):
    def inner(*args,**kwargs):
        if is_login.get('username'):
            res = func_name(*args,**kwargs)
            return res
        else:
            print('您还没有登录,请先登录')
            login()
        return inner

3. 功能编号要循环打印

# func_dict = {'1': register, '2': login, '3': add_shop_car, '4': clear_shop_car}
# while True:
#     print("""
#     1.用户注册
#     2.用户登录
#     3.添加购物车
#     4.结算购物车
#     """)
#     choice = input('请输入您想要执行的功能编号>>>:').strip()
#     if choice in func_dict:
#         func_name = func_dict.get(choice)
#         func_name()
#     else:
#         print('功能编号不存在')


4. 全局变量要修改为默认无人注册登陆状态,后期注册登录后再修改信息
 is_login = {
        'username = None'   # 登陆后可修改,默认不登陆状态
    }


5. 注册功能
5.1 文件路径获取/创建/拼接
# 获取文件路径
current_path = os.path.dirname(__file__)
# 拼接路径
data_path = os.path.join(current_path,'db')
if not os.path.exists(data_path):  # 如果路径存在就创建
    os.mkdir(data_path)

5.2需要一个空字典来存放用户信息
 user_dict = {'username': username,'pwd': pwd,'balance':15000,'shop_car':{}}

5.3 序列化到文件
文件编写和读取及传输
with open(w/r)  \  json.dump()
   
6. 登录功能
密码身份验证, 登录装饰器

7. 购物车: 
7.1.商品名称, 数量,价格等数据信息需要一个空字典进行存放.
   {'西瓜':[1,66]} >>> [一个,66元]
7.2 商品添加购物车
7.2.1 临时购物车 temp_car, 商品数量的更改 商品名[0]索引  (商 
       品名[1] 价格索引)
     保存数据 [序列化到文件] json.dump()
7.2.2 真实购物车
      real_shop_car, 商品数量更改: 在临时购物车里出现过就自 
     增, 没出现过就添加.+=/+
  数据保存: 序列化 json.dump()  读取 反序列化 json.load()


8.清空购物车
8.1 结算购物车里商品总价
   商品价格*数量=总价 total_money
8.2 判断是否能结算成功
balance-total_money
8.3 提示结果[可以后续充值,暂时没写]

 以上基本上完成了一个购物车代码所需要考虑的情况.

购物车代码

import os
import json

# 获取执行文件所在的路径
current_path = os.path.dirname(__file__)
# 拼接db文件夹的路径
data_path = os.path.join(current_path, 'db')
if not os.path.exists(data_path):  # 如果文件夹路径不存在
    os.mkdir(data_path)  # 创建该文件夹

# 定义一个记录用户是否登录的全局变量
'''不要直接记录整个用户字典 安全性较低 不符合编程原则!!!'''
is_login = {
    'username': None  # 用户登录成功之后修改为当前用户名
}


# 登录认证装饰器
def login_auth(func_name):
    def inner(*args, **kwargs):
        if is_login.get('username'):
            res = func_name(*args, **kwargs)
            return res
        else:
            print('您还没有登录 请先登录')
            login()

    return inner


def register():
    # 1.获取用户名和密码、确认密码
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    confirm_pwd = input('confirm_pwd>>>:').strip()
    # 2.先比对两次密码是否一致
    if not password == confirm_pwd:
        print('两次密码不一致')
        return  # 结束函数运行
    # 3.拼接用户数据文件路径
    file_path = os.path.join(data_path, f'{username}.json')  # ...db/tony.json
    # 4.校验用户名是否已存在>>>:校验文件路径是否存在
    if os.path.isfile(file_path):  # 文件存在了 就是用户存在了 那用户名肯定就存在了
        print('用户名已存在')
        return  # 结束函数运行
    # 5.初始化用户数据
    user_dict = {'username': username, 'password': password, 'balance': 15000, 'shop_car': {}}
    # 6.序列化到文件中
    with open(file_path, 'w', encoding='utf8') as f:
        json.dump(user_dict, f, ensure_ascii=False)
    print(f'{username}注册成功')


def login():
    # 1.获取用户名和密码
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 2.拼接用户文件路径
    file_path = os.path.join(data_path, f'{username}.json')
    # 3.判断文件路径是否存在  如果存在表示有这个用户 不存在表示没有
    if not os.path.isfile(file_path):
        print('用户名不存在')
        return
    # 4.用户名存在 获取用户详细数据 再比对密码
    with open(file_path, 'r', encoding='utf8') as f:
        user_dict = json.load(f)  # {'username':'jason','password':123}
    # 5.判断密码是否正确
    if password == user_dict.get('password'):
        print('登录成功')
        # 6.修改全局字典
        is_login['username'] = username
    else:
        print('密码错误')


@login_auth
def add_shop_car():
    """
    购物车数据格式    {'西瓜':[个数,单价]}
    """
    # 1.定义购物车数据(代码直接写死 也可以通过专门的商品文件便于后期维护更新)
    good_list = [
        ['西瓜', 33],
        ['南瓜', 12],
        ['黄瓜', 18],
        ['冬瓜', 16],
        ['窝瓜', 22],
        ['佛手瓜', 20],
        ['傻瓜', 1000]
    ]
    # 11.创建一个临时存储商品数据的字典
    temp_shop_car = {}  # {'西瓜':[10,33]}
    # 2.商品可以反复购买 所以这里极品木瓜加循环
    while True:
        # 3.循环打印商品信息供用户选择  最好给商品添加编号
        for i, j in enumerate(good_list):  # i=0 j=['西瓜', 33]
            print("商品编号:%s  |  商品名称:%s  |   商品单价:%s" % (i, j[0], j[1]))
        # 4.获取用户想要购买的商品编号
        choice = input('请输入您想要购买的商品编号或者输入y退出添加>>>:').strip()
        # 12.如果是y那么修改用户购物车数据保存
        if choice == 'y':
            file_path = os.path.join(data_path, '%s.json' % is_login.get('username'))
            with open(file_path, 'r', encoding='utf8') as f:
                user_dict = json.load(f)
            # 修改用户购物车数据(不能直接替换 还应该考虑购物车内是否已经存在数据)
            real_shop_car = user_dict.get('shop_car')  # {'西瓜':[1,33]}
            for good_name in temp_shop_car:
                if good_name in real_shop_car:
                    real_shop_car[good_name][0] += temp_shop_car[good_name][0]
                else:
                    real_shop_car[good_name] = temp_shop_car[good_name]
            user_dict['shop_car'] = real_shop_car
            # 重新写入文件
            with open(file_path, 'w', encoding='utf8') as f:
                json.dump(user_dict, f, ensure_ascii=False)
            print('商品数据添加购物车成功')
            break

        # 5.校验商品编号是否是纯数字
        if not choice.isdigit():
            print('商品编号必须是数字')
            continue
        # 6.将用户输入的字符串类型编号转成整数类型便于后续索引取值
        choice = int(choice)
        # 7.校验数字范围是否在商品列表的索引范围内
        if not choice in range(len(good_list)):
            print('商品编号超出了现有的范围')
            continue
        # 8.获取用户想要购买的商品数据
        target_good_list = good_list[choice]
        target_good_name = target_good_list[0]
        target_good_price = target_good_list[1]
        # 9.获取用户想要购买的当前商品的数量
        target_num = input('请输入你想要购买的数量>>>:').strip()
        if target_num.isdigit():  # 数量在付钱之前 你想要多少都可以
            target_num = int(target_num)
            # 10.确定了商量和数量 添加购物车 但是要考虑用户还可能购买其他商品
            """临时购物车字典里面可能已经存在一些商品 也可能是第一次购买"""
            if target_good_name not in temp_shop_car:  # {'西瓜':[1,33]}
                temp_shop_car[target_good_name] = [target_num, target_good_price]
            else:
                temp_shop_car[target_good_name][0] += target_num  # {'西瓜':[1+9,33]}
        else:
            print('商品的个数必须是纯数字')


@login_auth
def clear_shop_car():
    # 1.先获取用户购物车数据
    file_path = os.path.join(data_path, '%s.json'%is_login.get('username'))
    # 2.获取用户购物车
    with open(file_path, 'r', encoding='utf8') as f:
        user_dict = json.load(f)
    shop_car = user_dict.get('shop_car')  # {'商品名称':[个数,单价]}
    # 定义一个总价
    total_money = 0
    # 3.计算商品总价(只需要字典的value 可以使用字典的内置方法values())
    for good_num,good_price in shop_car.values():  # [个数,单价]
        total_money += good_num * good_price
    # 4.有了总价还需要判断用户能否买得起
    balance = user_dict.get('balance')
    if balance > total_money:
        rest_money = balance - total_money
        user_dict['balance'] = rest_money
        # 5.扣钱完毕 清空购物车
        user_dict['shop_car'] = {}
        # 6.保存数据
        with open(file_path,'w',encoding='utf8') as f:
            json.dump(user_dict, f, ensure_ascii=False)
        print(f'结算成功 今日消费{total_money} 余额{rest_money} 欢迎下次光临!!!')
    else:
        print('请充值!!!')




func_dict = {'1': register, '2': login, '3': add_shop_car, '4': clear_shop_car}
while True:
    print("""
    1.用户注册
    2.用户登录
    3.添加购物车
    4.结算购物车
    """)
    choice = input('请输入您想要执行的功能编号>>>:').strip()
    if choice in func_dict:
        func_name = func_dict.get(choice)
        func_name()
    else:
        print('功能编号不存在')

posted @ 2022-04-05 00:16  Yietong  阅读(75)  评论(0)    收藏  举报