python进阶之路19 地狱之门购物车!!!!
地狱之门
# # 项目功能
# 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('功能编号不存在')
python进阶之路19 地狱之门购物车!!!!的更多相关文章
- python进阶之路20 正则表达式 re模块
正则表达式前情 案例:京东注册手机号校验 基本需求:手机号必须是11位.手机号必须以13.15.17.18.19开头.必须是纯数字 '''纯python代码实现''' # while True: # ...
- python进阶之路18 os、sys、json模块
os模块与sys模块 os模块主要与操作系统打交道 sys模块主要与python解释器打交道 os模块(重要) os模块主要与代码运行所在的操作系统打交道 import os os.path.spli ...
- python进阶之路3之数据类型
内容概要 pycharm下载与使用 python语法之注释 python语法之变量与常量 python基本数据类型(先大致了解有哪些) pycharm下载与使用 1.该软件分为收费版和免费版 免费版本 ...
- Python进阶之路---1.5python数据类型-字符串
字符串 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...
- python进阶之路之文件处理
Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- python进阶之路4.2---装饰器
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Python进阶之路---1.4python数据类型-数字
python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print print('hello,python') 1.1pyt ...
- Python进阶之路---1.3python环境搭建
python环境安装 windows python环境安装 下载安装包 https://www.python.org/downloads/ 安装并指定安装目录 C:\python2 ...
- Python进阶之路---1.2python版本差异
Python2.*与python3.*版本差异 作为一个初学者,我们应该如何选择python的版本进行学习呢,这两个版本有什么区别呢,接下来让我们简单了解一下,以便我们后续的学习. Python版本差 ...
随机推荐
- JPA入门学习集合springboot(一)
1.在pom.xml文件中添加相应依赖 SpringData jpa和数据库MySql <!-- Spring Data JPA 依赖(重要) --> <dependency> ...
- Unity——滚动的小球
Unity--滚动的小球 工程理解 本游戏为通过键盘上的W.A.S.D键控制小球的运动轨迹来对固定位置上的小方块进行碰撞,以此来进行加分计数的. 其中主要对象为小球和自转的小方块:在小球上,我们添加刚 ...
- 一、什么是celery
一.什么是Celery 1.1.celery是什么 celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,专注于是心爱处理的异步任务队列,同事也支持任务调度. Celery的架构由三部分组成 ...
- 恭喜磊哥喜提n+1
昨天下午两点多磊哥突然喊我下楼,第一反应是"这孙子,抽烟就直说,还说个事,你以外你是吉祥村大姐啊". 心里骂完以后我慢慢悠悠下楼了,见他在打电话我先默默点上一支,准备待他结束以后对 ...
- java学习之Servlet
0x00前言 Servlet就是一个接口我们需要写一个类然后去实现Servlet,就可以被服务器识别到.request是用来接受客户端传过来的参数,respone是用来响应客户端的页面.我们所用的容器 ...
- Spring Boot框架下实现Excel服务端导入导出
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.今天 ...
- IOT黑客入门篇之初探Badusb
什么是Badusb? BadUSB是一种使用带有恶意软件编程的USB设备的计算机安全攻击.例如,USB 闪存驱动器可以包含可编程的Intel 8051微控制器,该微控制器可以重新编程,将USB闪存 ...
- 流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排.工作流.审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-ea ...
- Axios +Vue + themeleay
1.pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- 处理get请求中文乱码tomcat请求
修改tomcat中server配置:添加 URIEncoding="UTF-8" <Connector port="8090" protocol=&quo ...