购物车项目

hashlib加密模块

# 什么是加密
	将明文(人看得懂)数据通过一些手段变成密文数据(人看不懂)
  	密文数据的表现形式一般都是一串没有规则的字符串
    
# 加密算法
	加密算法就是将铭文变成密文的方法,算法的难易程度可以根据产生密文的长短来判断,越长意味着越复杂
    
# 什么时候使用加密
	涉及到隐私数据的时候 应该考虑使用加密
  	最为常见的就是对用户的密码加密 防止密码泄露

# 基本使用
import hashlib
# 1.指定算法
md5 = hashilib.md5
# 2.将明文数据传递给算法对象
md5.update(b'hello')  # 只能接收bytes类型
'''如果数据只有数字和字符,可以在前面加b直接转成bytes类型'''
# 3.获取加密后的密文数据
res = md5.hexdigest()
'''在传入数据是,明文一致则密文一致'''
  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

加密补充

# 加密后的结果无法直接反解密
所谓的反解密其实就是暴力破解,反复的猜
"""
  md5解密内部本质
  	提前想好很多可能是密码的组合
  		123						自己加密
  		321						自己加密
  		222						自己加密
    {'密文1':123,'密文2':321}
    然后将要破解的密文与提前想好的进行比对 
  """
# 加盐处理
	能够增加破解的难度
  import hashlib
  md5 = hashlib.md5()
  # 加盐处理(添加一些额外的干扰项)
  md5.update('你追我'.encode('utf8'))
  md5.update(b'123')
  print(md5.hexdigest())  # ce850e70febde5f3506fec0479dc0f96
# 动态加盐
	干扰项动态变化
    可以是用户名的一部分,也可以是当前时间
"""
加密应用场景
1.密码加密如何比对
	用户输入的还是明文但是到了程序里面之后会采用相同的加密算法变成密文
	之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误
	
2.文件内容一致性校验
	作为软件的提供者 我们在提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文
	用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
	如果是表示中途没有被修改 如果不是表示中途被修改过 可能存在病毒 
"""
针对大文件一致性校验的优化策略
	如果一个文件有10G 那么如果全部读取并加密速度太慢
  这个时候可以考虑对文件内容进行切片读取并加密的操作

login模块

'''日志模块就是在程序的各个环境记录 便于后续的查看'''
# 针对日志模块 我们只需要听流程思路 最后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('错了')

购物车项目

项目简介

# 首先是根据项目目录管理规范,创建了三个文件夹
db目录:该目录下存放用户信息文件
bin目录:该目录下存放项目的启动文件 start.py
core目录:该目录下存放项目的业务逻辑代码src.py

# 用户信息存储文件内容格式
{"name": "zhang", "pwd": "202cb962ac59075b964b07152d234b70", "balance": 15000, "shop_car": {"飞机": [6, 50000], "面包": [4, 10]}}
'''
将用户信息存放进字典 键name对应用户名,  键pwd对应密码,密码使用md5进行加密,  键balance对应账户余额,  键shop_car对应购物车里的商品信息, 商品信息用字典进行存储,键对应的是商品名,值是一个列表,对应的分别是商品个数和价格
'''
# 启动文件 start.py
执行该文件,即可启动项目

# 业务逻辑文件 src.py
该文件,封装了购物车项目需要用到的主要功能,包括登录功能、注册功能、商店购物功能,购物车结算功能,另外封装了一个装饰器,装饰器的作用为:用户使用购物以及购物车功能前需要进行登录,如未登录则会对用户进行提示,并跳转到登录函数

具体代码

src.py

import os
import json
import hashlib
md5 = hashlib.md5()

dic_flag = {'is_login': None}


# 装饰器,在用户使用购物车功能前进行是否已登录的判断
def outer(func_name):
    def inner(*args, **kwargs):
        if dic_flag.get('is_login'):
            func_name()
        else:
            print('请登录')
            login()

    return inner


# 用于获取用户信息文件路径,由于在项目运行中被频繁使用,所以单独封装成一个功能
def get_info_abs(name):
    a = os.path.dirname(os.path.dirname(__file__))
    b = os.path.join(a, 'db')
    c = os.path.join(b, f"{name}.json")
    return c



'''
登录功能:
	1.首先进行一个修改全局变量的声明,目的是为了修改项目登录状态的信息,以便于用于判断是否登录
	2.接收用户输入的账号及密码,并对密码进行加密
	3.获取用户信息文件中的内容,进行登录校验
'''
def login():
    global dic_flag
    user_name_login = input('请输入用户名:')
    user_pwd_login = input('请输入密码:')
    # 对用户密码进行加密
    md5.update(user_pwd_login.encode('utf8'))
    user_pwd_login = md5.hexdigest()
    # 获取用户信息存储路径
    d = get_info_abs(user_name_login)
    # 打开对应的文件夹并进行异常捕捉
    try:
        with open(d, 'r', encoding='utf8') as f1:
            userinfo = json.load(f1)
            pwd = userinfo['pwd']
            if user_pwd_login == pwd:
                print('登录成功')
                dic_flag['is_login'] = user_name_login
                return
            else:
                print('密码错误')
    except FileNotFoundError as e:
        print('用户名不存在')

        
        
'''
注册功能:
	1.接收注册信息,并对接收的密码进行加密
	2.进行查重,判断用户是否已经存在
	3.不存在,就新建一个json文件存储用户信息,存在就打印信息提示用户  用户名已存在
'''        
def register():
    user_name_register = input('请输入您要注册的用户名:')
    user_pwd_register = input('请输入账户密码:')
    # 对用户密码进行加密
    md5.update(user_pwd_register.encode('utf8'))
    user_pwd_register = md5.hexdigest()
    # 获取用户信息存储路径
    d = get_info_abs(user_name_register)
    # 判断用户名是否已存在
    if os.path.exists(d):
        print('用户名已存在')
    else:
        with open(d, 'w', encoding='utf8') as f:
            # 初始化用户信息
            dic = {"name": user_name_register, "pwd": user_pwd_register, "balance": 15000, "shop_car": {}}
            # 将用户信息写入文件
            json.dump(dic, f,ensure_ascii=False)
            print('注册成功')


            
            
'''
商店购物功能:
	1.首先是语法糖装饰,目的是使得该功能调用前必须进行登录
	2.打印出商品清单,提示并接收用户输入信息
	3.使用enumerate枚举出商品信息,并给出对应的序号
	4.接收用户的选择
	5.根据用户的选择将物品添加到用户信息文件中
'''
@outer
def shop():
    # 打印商品信息
    item = [['鸡蛋', 1], ['挂面', 5], ['薯片', 6], ['面包', 10], ['公仔', 50], ['飞机', 50000]]
    for i,j in enumerate(item):
        print(f"{i}{j[0]}  {j[1]}元")
    while True:
        user_choice = input('请输入您想要购买的物品编号(exit退出):')
        # 判断用户是否要退出
        if user_choice == 'exit':
            break
        # 当用户不是要退出,在判断用户输入的选项是否正确
        if not user_choice.isdigit():
            print('请输入对应的数字编号')
        user_choice = int(user_choice)
        if user_choice in range(len(item)):
            count_buy = input('请输入购买的数量:')
            # 将购买的物品信息罗列
            good_price = item[user_choice][1]
            count_buy = int(count_buy)
            good_name = item[user_choice][0]
            # 获取用户信息存储路径
            d = get_info_abs(dic_flag.get('is_login'))
            # 打开文件进行修改
            with open(d, 'r', encoding='utf8') as f1:
                userinfo = json.load(f1)
                # 获取用户购物车信息
                shop_list = userinfo['shop_car']
                # 判断物品购物车中是否已有
                if good_name in shop_list:
                    # 物品数量变更
                    shop_list.get(good_name)[0] += count_buy
                else:
                    shop_list[good_name] = [count_buy,good_price]
                # 对用户信息中的购物车进行修改
                userinfo['shop_car'] = shop_list
                print(f"您已将{count_buy}{good_name}加入购物车")
            # 更新数据
            with open(d, 'w', encoding='utf8') as f:
                json.dump(userinfo, f,ensure_ascii=False)

'''
购物车功能:
	1.给出功能选项
	2.接收用户选择
	3.根据用户选择,执行相应功能
	4.查看购物车,打开用户信息文件,读取出用户信息,遍历购物车字典,根据索引取值已经按key取值,获取出商品信息
	5.结算功能,根据获取的购物车字典,根据索引取值已经按key取值,取出商品价格以及购买个数,计算总价,与余额对比,余额充足就付费,并提示用户结算成功,余额不足则提示用户余额不足
'''
@outer
def shop_cort():
    # 获取用户信息存储路径
    while True:
        print('1.查看购物车\n2.结算\n3.退出')
        user_choice = input('请输入您的选择:')
        if user_choice == '1':
            # 获取用户信息存储路径
            d = get_info_abs(dic_flag.get('is_login'))
            # 打开用户信息文件
            with open(d, 'r', encoding='utf8') as f1:
                userinfo = json.load(f1)
                # 获取用户购物车信息
                shop_list = userinfo['shop_car']
                # 定义字符串接收购物车信息
                s = '购物车:\n'
                for i in shop_list:
                    # 计算物品价格
                    price = shop_list[i][0] * shop_list[i][1]
                    s = s + i + ':' + str(shop_list[i][0]) + '个  共计:' + str(price) + '元' + '\n'
                print(s)
        if user_choice == '2':
            # 定义变量接收总价
            sum_price = 0
            # 获取用户信息存储路径
            d = get_info_abs(dic_flag.get('is_login'))
            # 打开用户信息文件
            with open(d, 'r', encoding='utf8') as f1:
                userinfo = json.load(f1)
                # 获取用户购物车信息
                shop_list = userinfo['shop_car']
                # 获取余额
                balane2 = userinfo['balance']
                # 计算总价
                for i in shop_list:
                    # 计算物品价格
                    sum_price += shop_list[i][0] * shop_list[i][1]
                    # 判断余额是否足够
                if balane2 > sum_price:
                    # 计算余额
                    userinfo['balance'] = balane2 - sum_price
                    userinfo['shop_car'] = {}
                    print(f"您的余额为{userinfo['balance']}")
                    # 用户信息更新
                    with open(d, 'w', encoding='utf8') as f:
                        json.dump(userinfo, f,ensure_ascii=False)
                else:
                    print('余额不足')
        if user_choice =='3':
            return

start.py

'''
将功能名存进字典,根据用户选择按key取值并执行相应的函数
'''
from core import src

func_dic = {'1':src.login,'2':src.register,'3':src.shop,'4':src.shop_cort}
while True:
    while True:
        print('1.登录\n2.注册\n3.商店\n4.购物车')
        func_choice = input('请输入您的选项:')
        func_dic[func_choice]()
posted @   名字只需六字  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示