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.购物功能_商城加入购物车功能程序运行结果