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版本差 ...
随机推荐
- Docker安装MongoDB并使用Navicat连接
MongoDB简介: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库 ...
- Vue学习之--------组件在Vue脚手架中的使用(代码实现)(2022/7/24)
文章目录 1.第一步编写组件 1.1 编写一个 展示学校的组件 1.2 定义一个展示学生的信息组件 2.第二步引入组件 3.制作一个容器 4.使用Vue接管 容器 5.实际效果 6.友情提示: 7.项 ...
- JavaScript基础&实战(1)js的基本语法、标识符、数据类型
文章目录 1.JavaScript简介 2.输出语句 2.1 代码块 2.2 测试结果 3.JS编写位置 3.1代码 3.2 测试结果 4.基本语法 4.1 代码 5.标识符 5.1 代码 6.数据类 ...
- 我终于会写 Java 的定时任务了!
前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务 ...
- HTML元素大全(2)-表单
01.<form>表单 <form> 表单是比较重要的HTML元素,块元素,主要作用是向服务端提交数据.结合表单元素input使用,通过内部的button按钮提交(type=& ...
- JVM学习笔记——内存结构篇
JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...
- 洛谷 P3201 梦幻布丁 题解
(这篇题解可能没什么营养,主要是记录一下我用map乱搞启发式合并的神奇做法) 首先我们知道,我们肯定要用一堆集合维护每一种数当前的位置,并支持合并和数连续出现的段数两种操作 我发现这个东西并不好搞,但 ...
- 【题解】CF1722F L-shapes
题面传送门 其实这题根本不用搜索,有耐心即可. 可以发现,在 \(n\times m\) 范围内扫,可能合法的只有以下四种情况,其中蓝色代表示是 *,红色表示不能是 *,其中黄色五角星表示当前 \(i ...
- mindxdl--common--type.go
// Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common this file ...
- 关于python实现与体重秤蓝牙ble通信研究(Linux)
前言 前几天买一个带蓝牙的体重秤,功能就是可以通过手机app连接,然后每一次称重都会记录下来,然后进行一些计算(体脂等),但是我不想用手机来操作,我习惯用电脑,就想写一个软件来与体重秤通信,记录我的每 ...