Day26.购物功能

1.购物功能_src.py中支付结算功能+添加购物车功能

   src.py中的购物功能代码:

# 8. 购物功能
@common.login_auth
def shopping():
    # 不从文件中读取商品数据,直接写
    # 1)创建一个商品列表,列表套列表的商品数据,使用枚举
    # [[商品名称1, 商品单价1], [商品名称2, 商品单价2]...]
    shop_list = [
        ['上海灌汤包', 30],
        ['写真抱枕', 250],
        ['凤爪', 28],
        ['鱼丸', 15],
        ['坦克', 100000],
        ['macbook', 20000],
    ]

    # 初始化当前购物车:
    shopping_car = {}   # {'商品名称': ['单价', '数量']}

    while True:
        # 1)打印商品信息,让用户选择
        # 枚举:enumerate(可迭代对象) -----> (可迭代对象的索引,索引对应的值)
        # 枚举:enumerate(可迭代对象) -----> (0, ['上海灌汤包', 30])
        print('商品列表'.center(50, '='))
        for index, shop in enumerate(shop_list):
            # 解压赋值,拿到商品名称和商品单价
            shop_name, shop_price = shop
            print('商品编号为:[{}]'.format(index), 
                  '商品名称:[{}]'.format(shop_name), 
                  '商品单价:[{}]'.format(shop_price))
        print('end'.center(50, '='))
        # 2)让用户根据商品编号进行选择
        choice = input('请输入商品编号(是否结账输入y or n):').strip()
        
        # 2.1)输入的是 y 进入支付结算功能
        if choice == 'y':
            if not shopping_car:
                print('购物车是空的,不能支付,请重新输入!')
                continue
            # 6)调用支付接口进行支付
            flag, msg = shop_interface.shopping_interface(login_user, shopping_car)
            if flag:
                print(msg)
                break
            else:
                print(msg)
                
        # 2.2)输入的是 n 添加购物车
        elif choice == 'n':
            # 判断当前用户是否添加购物车
            if not shopping_car:
                print('购物车是空的,不能添加,请重新输入!')
                continue
            
            # 7)调用添加购物车接口
            flag, msg =shop_interface.add_shop_car_interface(
                login_user, shopping_car
            )
            if flag:
                print(msg)
                break
            else:
                print(msg)

        # 如果输入不是数字
        if not choice.isdigit():
            print('请输入正确的编号!')
            continue
            
        choice = int(choice)

        # 3)判断choice是否在商品序号中存在
        if choice not in range(len(shop_list)):
            print('请输入正确的编号!')
            continue
        
        # 4)获取商品名称与单价
        shop_name, shop_price = shop_list[choice]

        # 5)加入购物车
        # 5.1)判断用户选择的商品是否重复,重复则数量 +1
        if shop_name in shopping_car:
            # shopping_car[shop_name][1] -----> 1 += 1
            # 添加商品数量
            shopping_car[shop_name][1] = shopping_car[shop_name][1] + 1

        else:
            # 否则数量默认为1
            # {'商品名称':['单价', '数量']}
            shopping_car[shop_name] = [shop_price, 1]

        print('当前购物车:', shopping_car)

2.购物功能_shop_interface.py中商城结算接口和购物车添加功能

  shop_interface.py中的商城结算接口和购物车添加功能接口代码:

'''
购物商城接口
'''
from ATM.db import db_handler


# 商城准备结算接口
def shopping_interface(login_user, shopping_car):

    # 1)计算消费总额
    # {'商品名称': ['单价', '数量']}
    # 总价
    cost = 0
    for price_number in shopping_car.values():
        price, number = price_number
        cost += price *number

    # 2) 导入银行接口
    from ATM.interface import bank_interface

    # 3) 逻辑校验成功后,在调用银行的支付接口
    flag = bank_interface.pay_interface(login_user, cost)
    if flag:
        return True, '支付成功,准备发货!'
    return False, '支付失败,金额不足!'

# 购物车添加接口
def add_shop_car_interface(login_user, shopping_car):
    # 1) 获取当前用户的购物车
    user_dic = db_handler.select(login_user)
    
    # 获取用户文件中的商品的数据
    shop_car = user_dic.get('shop_car')
    
    # 2) 添加购物车
    # 2.1) 判断当前用户选择的商品是否已经存在
    # shopping_car ----> {'商品名': []}
    for shop_name, price_number in shopping_car.items():
        # 获取商品当前的数量
        number = price_number[1]

        # 2.2)若商品重复,则累加商品数量
        if shop_name in shop_car:
            user_dic['shop_car'][shop_name][1] += number
        
        else:
            # 2.3) 若不是重复的,更新到商品字典中
            user_dic['shop_car'].update(
                {shop_name: price_number}
            )
    # 保存购物车数据
    db_handler.save(user_dic)

    return True, '添加购物车成功'

  bank_interface.py 中的支付接口

# 支付接口
def pay_interface(login_user, cost):
    user_dic = db_handler.select(login_user)
    
    # 判断用户金额是否足够
    if user_dic.get('balance') >= cost:
        # 账户余额扣钱
        user_dic['balance'] -= cost

        # 记录消费流水
        flow = '用户消费金额:{}'.format(cost)
        user_dic['flow'].append(flow)

        # 扣费后的用户信息保存到文件中
        db_handler.save(user_dic)
        # 记录日志
        admin_logger.info(flow)

    # return True 或 return False 交给购物接口来处理        
        return True
    return False

3.购物功能_bank_interface.py中商城结算接口调用银行接口中的支付接口(bank_interface.py)

   bank_interface.py中支付接口代码:

# 支付接口
def pay_interface(login_user, cost):
    user_dic = db_handler.select(login_user)
    
    # 判断用户金额是否足够
    if user_dic.get('balance') >= cost:
        # 账户余额扣钱
        user_dic['balance'] -= cost

        # 记录消费流水
        flow = '用户消费金额:{}'.format(cost)
        user_dic['flow'].append(flow)

        # 扣费后的用户信息保存到文件中
        db_handler.save(user_dic)
    # return True 或 return False 交给购物接口来处理        
        return True
    return False

  bank_interface.py中支付接口调用db_handler.py中的接口代码:

'''
数据处理层
    - 专门用户处理数据的
''' 
import os
from ATM.conf import settings
import json

# 查看数据
def select(username):
    # 1) 接收接口层传过来的username用户名,拼接用户json文件路径
    user_path =  os.path.join(
            settings.USER_DATA_PATH, '{}.json'.format(username)
            )
    # 2) 校验用户json文件是否存在
    if os.path.exists(user_path):
        # 3) 打开数据,并返回分接口层
        with open(user_path, 'r', encoding='utf-8') as f:
            user_dic = json.load(f)
            return user_dic
    # 3) 不return, 默认return None


# 保存数据
def save(user_dic):
    # 1) 拼接用户的数据字典
    username = user_dic.get('username')
    user_path =  os.path.join(
        settings.USER_DATA_PATH, '{}.json'.format(username)
    )
    print('user_path:{}'.format(user_path))
    
    # 2) 保存用户数据
    with open(user_path, 'w', encoding='utf-8') as f:
        # ensure_ascii=False 让文件中的中文数据,显示更美观
        json.dump(user_dic, f, ensure_ascii=False)
        print('用户`{}`数据更新成功'.format(username))

4.购物功能_商城结算功能程序运行结果

5.购物功能_商城加入购物车功能程序运行结果

posted on 2024-06-13 15:15  与太阳肩并肩  阅读(8)  评论(0编辑  收藏  举报

导航