首页 > 其他分享 >22加密模块/日志模块

22加密模块/日志模块

时间:2023-08-06 11:55:55浏览次数:60  
标签:shop good 22 car 模块 print path 日志 md5

购物程序代码作业

import os
import json

# 获取执行文件所在的路径
current_path = os.path.dirname(__file__)
# 拼接db文件夹的路径
data_path = os.path.join(current_path, 'db')
if not os.path.exists(data_path):  # 如果文件夹路径不存在
    os.mkdir(data_path)  # 创建该文件夹

# 定义一个记录用户是否登录的全局变量
'''不要直接记录整个用户字典 安全性较低 不符合编程原则!!!'''
is_login = {
    'username': None  # 用户登录成功之后修改为当前用户名
}


# 登录认证装饰器
def login_auth(func_name):
    def inner(*args, **kwargs):
        if is_login.get('username'):
            res = func_name(*args, **kwargs)
            return res
        else:
            print('您还没有登录 请先登录')
            login()

    return inner


def register():
    # 1.获取用户名和密码、确认密码
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    confirm_pwd = input('confirm_pwd>>>:').strip()
    # 2.先比对两次密码是否一致
    if not password == confirm_pwd:
        print('两次密码不一致')
        return  # 结束函数运行(这里也可以在外层弄个大循环)
    # 3.拼接用户数据文件路径
    file_path = os.path.join(data_path, f'{username}.json')  # ...db/tony.json
    # 4.校验用户名是否已存在>>>:校验文件路径是否存在
    if os.path.isfile(file_path):  # 文件存在了 就是用户存在了 那用户名肯定就存在了
        print('用户名已存在')
        return  # 结束函数运行
    # 5.初始化用户数据
    user_dict = {'username': username, 'password': password, 'balance': 15000, 'shop_car': {}}
    # 6.序列化到文件中
    with open(file_path, 'w', encoding='utf8') as f:
        json.dump(user_dict, f, ensure_ascii=False)
    print(f'{username}注册成功')


def login():
    # 1.获取用户名和密码
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 2.拼接用户文件路径
    file_path = os.path.join(data_path, f'{username}.json')
    # 3.判断文件路径是否存在  如果存在表示有这个用户 不存在表示没有
    if not os.path.isfile(file_path):
        print('用户名不存在')
        return
    # 4.用户名存在 获取用户详细数据 再比对密码
    with open(file_path, 'r', encoding='utf8') as f:
        user_dict = json.load(f)  # {'username':'jason','password':123}
    # 5.判断密码是否正确
    if password == user_dict.get('password'):
        print('登录成功')
        # 6.修改全局字典
        is_login['username'] = username
    else:
        print('密码错误')


@login_auth
def add_shop_car():
    """
    购物车数据格式    {'极品木瓜':[个数,单价]}
    """
    # 1.定义购物车数据(代码直接写死 也可以通过专门的商品文件便于后期维护更新)

    # 11.创建一个临时存储商品数据的字典
    temp_shop_car = {}  # {'极品木瓜':[10,22],'印度飞饼':[100,3]}
    # 2.商品可以反复购买 所以这里加循环
    while True:
        # 3.循环打印商品信息供用户选择  最好给商品添加编号
        for i, j in enumerate(good_list):  # i=0 j=['挂壁面', 3]enumerater
            print("商品编号:%s  |  商品名称:%s  |   商品单价:%s" % (i, j[0], j[1]))
        # 4.获取用户想要购买的商品编号
        choice = input('请输入您想要购买的商品编号或者输入y退出添加>>>:').strip()
        # 12.如果是y那么修改用户购物车数据保存
        if choice == 'y':
            file_path = os.path.join(data_path, '%s.json' % is_login.get('username'))
            with open(file_path, 'r', encoding='utf8') as f:
                user_dict = json.load(f)
            # 修改用户购物车数据(不能直接替换 还应该考虑购物车内是否已经存在数据)
            real_shop_car = user_dict.get('shop_car')  # {'极品木瓜':[1,22]}
            for good_name in temp_shop_car:
                if good_name in real_shop_car:
                    real_shop_car[good_name][0] += temp_shop_car[good_name][0]
                else:
                    real_shop_car[good_name] = temp_shop_car[good_name]
            user_dict['shop_car'] = real_shop_car
            # 重新写入文件
            with open(file_path, 'w', encoding='utf8') as f:
                json.dump(user_dict, f, ensure_ascii=False)
            print('商品数据添加购物车成功')
            break

        # 5.校验商品编号是否是纯数字
        if not choice.isdigit():
            print('商品编号必须是数字')
            continue
        # 6.将用户输入的字符串类型编号转成整数类型便于后续索引取值
        choice = int(choice)
        # 7.校验数字范围是否在商品列表的索引范围内
        if not choice in range(len(good_list)):
            print('商品编号超出了现有的范围')
            continue
        # 8.获取用户想要购买的商品数据
        target_good_list = good_list[choice]
        target_good_name = target_good_list[0]
        target_good_price = target_good_list[1]
        # 9.获取用户想要购买的当前商品的数量
        target_num = input('请输入你想要购买的数量>>>:').strip()
        if target_num.isdigit():  # 数量在付钱之前 你想要多少都可以
            target_num = int(target_num)
            # 10.确定了商量和数量 添加购物车 但是要考虑用户还可能购买其他商品
            """临时购物车字典里面可能已经存在一些商品 也可能是第一次购买"""
            if target_good_name not in temp_shop_car:  # {'极品木瓜':[1,666]}
                temp_shop_car[target_good_name] = [target_num, target_good_price]
            else:
                temp_shop_car[target_good_name][0] += target_num  # {'极品木瓜':[1+9,666]}
        else:
            print('商品的个数必须是纯数字')


@login_auth
def clear_shop_car():
    # 1.先获取用户购物车数据
    file_path = os.path.join(data_path, '%s.json'%is_login.get('username'))
    # 2.获取用户购物车
    with open(file_path, 'r', encoding='utf8') as f:
        user_dict = json.load(f)
    shop_car = user_dict.get('shop_car')  # {'商品名称':[个数,单价]}
    # 定义一个总价
    total_money = 0
    # 3.计算商品总价(只需要字典的value 可以使用字典的内置方法values())
    for good_num,good_price in shop_car.values():  # [个数,单价]
        total_money += good_num * good_price
    # 4.有了总价还需要判断用户能否买得起
    balance = user_dict.get('balance')
    if balance > total_money:
        rest_money = balance - total_money
        user_dict['balance'] = rest_money
        # 5.扣钱完毕 清空购物车
        user_dict['shop_car'] = {}
        # 6.保存数据
        with open(file_path,'w',encoding='utf8') as f:
            json.dump(user_dict, f, ensure_ascii=False)
        print(f'结算成功 今日消费{total_money} 余额{rest_money} 欢迎下次光临!!!')
    else:
        print('钱不够 你个穷逼!!!')




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('功能编号不存在')

hashlib加密模块

# 什么是加密
    将明文(人看得懂)数据通过一些手段变成密文数据(人看不懂)
      密文数据的表现形式一般都是一串没有规则的字符串
 
# 加密算法
    加密算法有很多种>>>(将明文变密文的内部规则)
      算法的难易程度可以根据产生密文的长短来判断
        越长意味着算法越复杂
 
# 什么时候使用加密
    涉及到隐私数据的时候 应该考虑使用加密
      最为常见的就是对用户的密码加密 防止密码泄露
# 基本使用
    import hashlib
  # 1.指定算法>>>:md5算法(最为常见 一般的业务需求足够了)
  # md5 = hashlib.md5()
  # 2.将明文数据传递给算法对象
  # md5.update(b'hello')  # 只能接收bytes类型   这里以hello为例子
  """如果字符串中是纯数字和英文 那么直接在前面加b转成bytes类型"""
  # 3.获取加密之后的密文数据
  # res = md5.hexdigest()
  # print(res)  # 5d41402abc4b2a76b9719d911017c592
  # 在传入数据的时候 只要内容一致 那么算法的结果肯定一致(不管是一次传入,还是多次!)
  md5 = hashlib.md5()
  # md5.update(b'hello')
  # md5.update(b'world')
  # md5.update(b'jason')
  # print(md5.hexdigest())  # 8faebe82e744992e51c86845cac3e1b7
  md5.update(b'helloworldjason')
  print(md5.hexdigest())  # 8faebe82e744992e51c86845cac3e1b7
记忆这四句代码即可

加密补充

1.加密之后的结果是无法直接反解密的
    8faebe82e744992e51c86845cac3e1b7
  # 所谓的反解密其实是暴力破解>>>:反复的猜
  """
  md5解密内部本质
      提前想好很多可能是密码的组合
          123                        自己加密
          321                        自己加密
          222                        自己加密
    {'密文1':123,'密文2':321}
  """

2.加盐处理
    增加破解的难度
  import hashlib
  md5 = hashlib.md5()
  # 加盐处理(添加一些额外的干扰项)
  md5.update('你追我'.encode('utf8'))   #增加干扰项
  md5.update(b'123')
   print(md5.hexdigest())  # ce850e70febde5f3506fec0479dc0f963.动态加盐
    干扰项动态变化
      可以是用户名的一部分 也可以当前时间...
  比如time.time()等(干扰性更强)

logging模块(日志模块)

'''日志模块就是在程序的各个环境记录 便于后续的查看'''
# 针对日志模块 我们只需要听流程思路 最后CV即可 无需详细记忆

# 1.日志等级
    import logging
  # 日志按照重要程度分为五个级别:默认只有达到warning警告级别及以上才会记录日志
  # logging.debug('debug message')  # 10  大大小小都记录
  # logging.info('info message')  # 20    日常记录
  # logging.warning('warning message')  # 30  警告记录
  # logging.error('error message')  # 40     出错记录
  # logging.critical('critical message')  # 50    系统快瘫痪记录
 
# 2.基本使用
    import logging

  file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', )
  # 所有的格式不需要记忆 后续几乎都是拷贝加修改(下面的简单了解即可)
  logging.basicConfig(
      format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
      datefmt='%Y-%m-%d %H:%M:%S %p',
      handlers=[file_handler, ],
      level=logging.ERROR
  )

  logging.error('FBI警告宇帆 少看点 注意身体')

 

标签:shop,good,22,car,模块,print,path,日志,md5
From: https://www.cnblogs.com/Milk1/p/17609238.html

相关文章

  • 在 Spring Boot 应用程序中,可以通过命令行参数或环境变量来指定配置文件和日志文件的
    1、使用命令行参数java-jaryour-app.jar--spring.config.location=file:/path/to/application.properties--logging.file=/path/to/logs/your-app.log在上述命令中,--spring.config.location参数用于指定配置文件的位置,--logging.file参数用于指定日志文件的位置。2、使......
  • Visual Studio 2022的快捷键速查
    1.VisualStudio2022的默认快捷键2.VisualStudio2022的快捷键修改......
  • 记录小知识 springboot,maven创建的多模块 子模块无法使用父类版本
    使用依赖时发现依赖有问题,回来检查发现没有加springboot父工程检查父模块是否加入父标签:只需要在父模块中添加一次就可以了<parent><groupId>org.springframework.boot</groupId><cartifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELE......
  • origin软件下载 origin2022最新中文版下载 官方版特色
    origin官方版是款由originlab公司为用户们打造的函数绘图制图工具。origin拥有强大的数据导入功能,支持多种格式的数据,包括ASCII、Excel、NITDM、DIADem、NetCDF、SPC等。origin既可以满足一般用户的映射需求,也可以满足高级用户数据分析和功能拟合的需求。软件地址:看置顶贴Origin软......
  • Origin下载 - Origin 2022 官方最新版下载 官方版特色
    功能介绍1、绘图该软件拥有超过100种内置和扩展的图形类型以及所有元素的点击式自定义,可以轻松创建和自定义出版质量的图形。您可以添加额外的轴和面板,添加、删除绘图等以满足您的需要。批量绘制具有相似数据结构的新图形,或将自定义图形保存为图形模板或将自定义元素保存为图形主......
  • 2022 robocom 世界机器人开发者大赛-本科组(国赛)
    RC-u1智能红绿灯题目描述:RC-u1智能红绿灯为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。这个红绿灯是这样设计的:路的两旁设置了一个按钮,老年人希望通行马路时会按下按钮;在没有人按按钮的时候,红绿灯一直为绿灯;当红绿灯为绿灯......
  • 最完美WIN11_Pro_22H2.22631.2129软件选装纯净版VIP51.3
    【系统简介】=============================================================1.本次更新母盘来自UUP_WIN11_Pro_22H2.22631.2129。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为22631.2129。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo......
  • 11python日志类的简单应用
    代码如下:importlogging#日志类简单应用,方便规范格式化输出日志deft():foriinrange(10):logging.info("print%s",i)logging.error('发送错误')if__name__=='__main__':logging.basicConfig(level=logging.INFO,format='%(......
  • stm32用keil5新建C/C++写硬件串口模块的套路
    新建文件:写代码:就在这里开始写initSerial了..........
  • 日志的打印
    默认是info级别:log.info("info业务日志")log.debug("debug日志")log.warn("warn警告日志")log.error("error错误日志")如果想要修改日志答应的默认级别: ......