• 疫情环境下的网络学习笔记 python 4.3


    4.3

    复习目录搭建

    conf 配置
    	--settings.py
    	
    lib
    	--common.py 公共方法
    	
    core
    	--src.py
    	
    db
    	--user_data
    	--user.json
    	--db_handlder.py
    
    interface 核心业务逻辑代码
    	--user_interface
    	--bank_interface
    	--shop_interface
    	
    log
    	--.log
    
    start.py
    
    readme.md
    

    写程序

    start.py

    sys.path.append(os.path.dirname(__file__))
    
    from core import src
    
    if __name__ == '__main__':
    	src.run()
    

    编写顺序

    注册

    1. start.py,添加环境变量
    2. src.py ----> run()
    	1. while循环打印菜单
    	2. 接收输入编号
    3. 创建src中一系列函数及函数字典
    	1. 在src中,调用用户选择的函数
    4. 注册功能
    	1. while循环,接收输入用户名和两次密码
    	2. 判断两次密码是否一致
    	3. 调用逻辑接口层的`register_interface`
    		1. 调用 `db_handler` 中的`getUserIfo`,查看是否有数据返回
    			1. 写数据处理层中的getUserIfo
    				1. 根据传来的用户名拼接json文件
    				2. 判断json文件是否存在 `os.path.exist`
    					1. 存在则返回文件内容
    					2. 不存在则返回空
    			2. 接收dbhandler的数据,判断
    				1. 存在,返回False,跳转步骤4
    					1. 视图层提示用户已经注册,重新输入
    			3. 不存在,返回True
    			4. 创建user_dic
    			5. 密码md5加密
    				1. lib --->common.py 写加密方法
    		2. 调用db_handler中的save方法
    			1. 从user_dic 得到用户名,拼接用户名.json路径
    			2. 从settings中得到`db/user_data`的路径
    			3. 拼接user.json 和user_data
    			4. with open(user_path),json.dump(user_dic)
    	4. flag,msg = register_interface(),返回结果到视图层
    		1. 用户名存在,continue,重新输入
    		2. 注册成功,提示信息
    
    登陆功能
    

    登陆接口

    1. login函数
    2. 接收用户名,密码的输入
    3. 调用login_interface
    	1. db_handler 中的getUserInfo,看用户是否存在
    		1. 用户不存在,return False,note
    		2. 用户存在,使用common中的方法加密密码
    		3. 与user_dic中的密码比较
    			1. 一致,return True,成功
    			2. global login_user ,改变全局变量
    

    登陆认证装饰

    1. from src import login_user
    2. login_user 是否为None
    	1. 不是None,正常运行被装饰的方法,res = func(*args,*kwargs),return res
    	2. Login_user为None,调用src.login
    	3. res = func(*args,*kwargs),return res
    3. return wrapper
    

    src.查看余额

    调用db_handler getUserInfo(account)
    得到user_dic['balance']
    

    src.提现

    1. 接收金额
    2. 判断是否是数字
    	1. 不是,重新输入
    3. 是数字,调用withdraw_interface(account,amount)
    	1. getUserInfo---->user_dic[’balance’]
    	2. 金额*5% 手续费 int
    	3. 金额+手续费是否小于余额
    		1. 大于,return False ,余额不足
    	4. 小于,balance - 提现金额,得到新的user_dic
    	5. db_handler 中save方法,保存新的user_dic
    	6. return True,提现成功
    4. 视图层接收return,输出msg
    

    还款

    @login_auth
    src.还款()
    1. while循环
    2. 接收用户输入金额
    3. 判断是否是纯数字
    4. 调用bank_interface中的repay_interface
    	1. getUserInfo(acount)
    	2. 原来的余额 加 还款的金额 
    		int(user_dic[’balance’]) +=  int(repay_amount)
    	3. 更新更改后的数据,调用db_handler中的save(user_dic)
    	4. 纪录日志
    	5. return True,还款成功提示消息
    5. flag,msg = True,还款成功
    6. 打印msg
    

    转账

    @login_auth
    src.转账
    
    1. 接收用户输入的转账目标用户to_user
    2. 接收转账的金额
    3. 判断输入的金额是否是纯数字
    	1. 不是数字,continue 重新输入
    4. 是纯数字,调用bank_interface 中的transfer_interface
    
    	1. transfer_interface(account,to_user,amount)
    		接收当前用户login_user,要转账的对象to_user,转账金额amount
    	2. 获取当前用户的信息,db_handler.getUserInfo(account),user_dic
    	3. 判断目标用户是否存在
    		getUserInfo(to_user)
    		1. 用户不存在,return False,提示用户不存在
    	4. 用户存在,判断当前用户余额是否足够
    		1. 余额不足,return False,提示余额不足
    	5. 余额足够,给当前用户减钱,目标用户加钱
    		login_user_dic[’balance’] -= amount
    		to_user_dic[’balance’] += amount
    	6. 保存当前用户数据,目标用户数据
    		db_handler.save(login_user_dic)
    		db_handler.save(to_user_dic)
    	7. 纪录日志
    	8. return True,转账成功
    	
    5. 视图层打印接收判断
    	if flag: 成功
    	else: 失败
    

    查看流水

    纪录bank_interface中的所有操作,转账操作需要给当前用户和目标用户都纪录流水

    每次使用save_json(user_dic)之前,对用户的user_dic写入流水

    user_dic['flow'].append(f'{login_user} 转账 {amount}')
    

    查看流水

    @common.login_auth
    def check_flow():
    	flow = bank_interface.chec_flow_interface(login_user)
    	if flow:
    		for i in flow:
    			print(i)
    	else:
    		print('当前没有流水')
    	
    def chec_flow_interface(login_user):
    	return db_handler.getUserInfo(login_user)['flow']
    

    管理员功能

    在user_dic 里再加一个属性,account_type,如果是user就普通登陆,如果是admin就是管理员用户。把管理员功能放到core下的admin里

    冻结账户:改变user_dic中的locked 为True,登陆的时候加一层判断 if user_dic['locked'] ,则提示已被锁定

    from core import admin
    
    def admin_run():
    	admin.run()
    
    # core---->admin.py
    from core import src
    from interface import admin_interface
    def add_user():
    	src.register()
    	
    def change_balance():
    	# 输入需要修改的用户
        while True:
            change_user = input('请输入需要修改额度的用户:').strip
            change_balance = input('输入要修改的额度:')
            if not change_balance.isdigit():
                print('请输入数字')
                continue
            # 调用修改额度接口
            flag,msg = admin_interface.change_balance_interface(change_user,change_balance)
            if flag:
                print(msg)
                break
            else:
                print(msg)
    	
    # 修改user_dic中的locked,由false 改为true
    def lock_account():
    	while True:
            
    
    admin_func = {
    	'1': add_user,
    	'2':change_balance,
    	'3':lock_account,
    }
    
    def admin_run():
    	while True:
    		print('''
    		1 添加账户 add user
    		2 修改额度 change balance
    		3 冻结账户 lock account
    		''')
    		choice = input('输入管理员功能编号:').strip()
    		if choice not in func_dic:
    			print('功能编号错误')
    			continue
    		admin_func[choice]()
    
    # admin_interface
    
    def change_balance_interface(uer_name,balance):
        user_dic = db_handler.getUserInfo(user_name)
        if user_dic:
            user_dic['balance'] = int(balance)
            
            
            
    def lock_user(user_name):
        user_dic = db_handler.getUserInfo(user_name)
        if user_dic:
            user_dic['locked'] = True
            ...
        
    

    购物功能

    @common.login_auth

    shopping

    1. 创建商品字典

      shop_lis = [

      ['灌汤包',30],

      ['车仔面',20],

      ['牛杂',40],

      ]

    2. 在视图层初始化购物车字典,商品名作为字典键,[单价,数量] 列表作为字典值

    3. 打印商品信息,让用户选择,使用枚举

      # enumerate (可迭代对象) ----> 可迭代对象的索引,索引对应的值
      for item in enumerate(shop_lis):
      	shop_name,shop_price = shop
      	print(f'商品编号[{index}]',f'商品名称[{shop_name}]',f'商品价格[{shop_price}]')
          choice = input('请输入商品编号:')
          if not choice.isdigit():
              print('商品编号错误')
              continue
              
          # 获取商品名和单价
          shop_name,shop_price = shop_list[choice]
          # 加入购物车
          # 判断用户选择的商品是否重复,重复则数量+1
          if shop_name in shopping_car:
              shopping_car[shop_name][1] += 1
          else:
              shopping_cart[shop_name] = [shop_price,1]
              ...
      

    文字流程

    1. 登陆认证装饰器
    2. 创建商品列表,[商品名,单价]
    3. 初始化购物车,空字典
    4. while循环
    	1. for 循环商品列表,打印商品,用enumerate
    	2. 接收用户输入的商品编号,输入y可以支付,输入n退出
    	3. 判断编号是否正确
    		1. 不正确,continue再循环
    	4. 输入编号,将商品加入购物车
    		1. 判断当前商品是否添加过购物车
    			1. 添加过,则购物车数量 + 1
    			2. 没添加过,创建key:value对,商品名:单价,数量默认为1
    	5. 输入y,结算
    		1. 购物车为空,输出提示信息
    		2. 购物车不为空,调用shop_interface中的功能
    			1. 计算消费总金额
    				for value,num in shopping_car:
    				coust += value*num
    			2. 导入银行接口 pay_interface(login_user,cost)
    				1. getUserInfo
    				2. 判断用户金额是否足够
    					1. 余额不足,return False,提示信息
    				3. 余额够,user_dic[’balance’] -= cost
    				4. flow 纪录消费流水
    				5. db_handler.save(user_dic)保存数据
    				6. return True
    		3. 判断银行接口返回值
    	6. 判断结果打印msg
    

    改进:

    • 将视图层中的添加购物车功能改为使用shop_interface中的接口
    • 每次选择完成后打印当前购物车

    清空购物车:getUserInfo后改变user_dic为空,再save

    查看购物车

    user_dic = db_handler.getUserInfo(ccount)
    user_dic[’shop_car’]
    

    日志

    日志功能在接口层使用

    # common.py
    import logging.config
    from conf import settings
    
    def get_logger(log_type):
        	logging.config.dictConfig(settings.LOGGING_DIC)
            logger = logging.getLogger(log_type)
            return logger
    

    使用的时候,在不同的逻辑处理层,根据不同的类型传入不同的对象给logger

    from lib import common
    user_logger = common.getLogger()
    user_
    
  • 相关阅读:
    22.Collections排序
    21.Collections常用方法的使用
    20.ArrayList获取并打印新闻标题
    19. Set接口的一般用法
    JS脚本显示当前日期+星期几[转]
    java流下载
    技术书籍分类[转]
    Javascript 继承 call与prototype
    SpringMVC访问静态资源[转]
    获取调用者Class和method、反射获取get方法、获取注解信息
  • 原文地址:https://www.cnblogs.com/telecasterfanclub/p/12628357.html
Copyright © 2020-2023  润新知