day22
总结
hashkib加密模块
# 加密
将明文数据转变为密文数据(没有规律的字符串),一般在设计隐私数据时应考虑使用加密
# 加密算法
加密算法有很多种,算法的难以成都可根据生成的密文长度判断,一般密文越长,算法越复杂
# 用法
import hashlib
# 1.指定算法>>>:md5算法(最为常见 一般的业务需求足够了)
md5 = hashlib.md5()
# 2.将明文数据传递给算法对象
md5.update(b'hello world') # 只能接收bytes类型
# 如果字符串中是纯数字和英文 在前面加b可以直接转成bytes类型
# 3.获取加密之后的密文数据
res = md5.hexdigest()
print(res) # 5eb63bbbe01eeed093cb22bb8f5acdc3
# 在传入数据的时候 只要内容一致 那么算法的结果肯定一致
# 加密之后的结果是无法直接反解密的,反解密其实是暴力破解(反复的猜)
# 加盐处理(添加一些额外的干扰项增加破解难度)
md5 = hashlib.md5()
md5.update(b'hello world')
md5.update('你好世界'.encode('utf8'))
print(md5.hexdigest()) # ae8824a8c72230e74a6e8b0a1186a4fb
# 应用场景
1.密码加密
用户输入明文数据后采用相同的加密方法转成密文,再比对他们的密文是否一致
2.文件内容一致性校验
软件开发者 在提供安全软件的同时给该软件内容做加密处理得到一个该安全软件独有的密文
用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
如果是表示中途没有被修改 如果不是表示中途被修改过
作业
'''
# 项目功能
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 os
import json
import hashlib
# 获取路径
current_path = os.path.dirname(__file__)
# 拼接路径,创建文件夹
db_path = os.path.join(current_path, 'db')
if not os.path.exists(db_path):
os.mkdir(db_path) # 不存在则创建文件夹
# 定义全局变量方便否面使用装饰器判断用户有无权限操作
is_login = {
'username': None
}
# 装饰器:判断是否经过登录
def dec_is_login(fun_name):
def inner(*args, **kwargs):
if is_login.get('username'):
res = fun_name(*args, **kwargs)
return res
else:
print('请先登录')
login() # 没登录的情况跳转到登录
return inner
def register():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
sec_password = hashlib.md5() # 给用户密码做加密处理
sec_password.update(password.encode('utf8'))
password = sec_password.hexdigest()
file_path = os.path.join(db_path, f'{username}.json') # 创建以用户名为名的json文件
if os.path.exists(file_path):
print('用户名已存在')
return
# 初始化用户字典
user_dict = {'username': username, 'password': password, 'balance': 15000, 'shop_car': {}}
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False) # 序列化生成json数据
print('注册成功')
def login():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
sec_password = hashlib.md5() # 给用户密码做加密处理
sec_password.update(password.encode('utf8'))
password = sec_password.hexdigest()
file_path = os.path.join(db_path, f'{username}.json')
if not os.path.exists(file_path):
print('用户名不存在,请注册')
register()
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f) # 将json数据反序列化拿出来
if password == user_dict.get('password'): # 比对加密后的密码
print('登陆成功')
is_login['username'] = username
else:
print('密码错误')
@dec_is_login
def add_shop_car():
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
temp_car = {} # 临时购物车,临时存储数据
while True:
for i, j in enumerate(good_list): # 用枚举把货物列出来
print("商品编号:%s | 商品名称:%s | 商品单价:%s" % (i, j[0], j[1]))
choice = input('请输入商品编号或者输入end退出>>>:').strip()
if choice == 'end': # 输入end停止想临时购物车加数据
file_path = os.path.join(db_path, f'{is_login.get("username")}.json')
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# 不能直接替换 还应该考虑购物车内是否已经存在数据
real_good_car = user_dict.get('shop_car')
for good in temp_car:
if good in real_good_car:
real_good_car[good[0]] += temp_car[good[0]]
else:
real_good_car[good] = temp_car[good]
user_dict['shop_car'] = real_good_car
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
print('添加成功')
break
if not choice.isdigit():
print('商品编号必须是数字')
continue
# 字符串类型编号转成整数类型便于后续索引取值
choice = int(choice)
# 校验数字是否超出预期
if not choice in range(len(good_list)):
print('商品编号超出了现有的范围')
continue
target_good_list = good_list[choice]
target_good_name = target_good_list[0]
target_good_price = target_good_list[1]
target_num = input('请输入您要购买的数量>>>:').strip()
target_num = int(target_num)
if target_good_name not in temp_car:
temp_car[target_good_name] = [target_num, target_good_price]
# 不存在就常见键值对
else:
temp_car[target_good_name][0] += target_num # 存在则通过索引添加数量
@dec_is_login
def clear_shop_car():
file_path = os.path.join(db_path, f'{is_login.get("username")}.json')
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
total_money = 0
for good_num, good_price in user_dict.get('shop_car').values():
total_money += good_num * good_price # 这里+=写成=了,一直覆盖,找了好久,好无语
balance = user_dict.get('balance')
# 判断余额是否支付的起
if total_money > balance:
print('买不起')
else:
rest_money = balance - total_money # rest_money余额
user_dict['balance'] = rest_money
user_dict['shop_car'] = {} # 注意只要给一个key,不然全重置的话就登不上啦
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
print(f'结算成功 今日消费{total_money} 余额{rest_money} 欢迎下次光临!!!')
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('功能编号不存在')
有点小困,logging放到明天吧,周末估计有大作业,加油
:

浙公网安备 33010602011771号