1)思路清晰
2)不会出现写一半代码时推翻重写
3)方便自己或以后的同事更好维护
1)把每个功能都分层三部分,逻辑清晰
2)如果用户更换不同的用户界面或不同,
的数据储存机制都不会影响接口层的核心
逻辑代码,扩展性强。
3)可以在接口层,准确的记录日志与流水。
一 用户视图层
用于与用户交互的,可以接受用户的输入,打印接口返回的数据。
二 逻辑接口层
接受 用户视图层 传递过来的参数,根据逻辑判断调用数据层加以处理,
并返回一个结果给 用户视图层。
三 数据处理层
接受接口层传递过来的参数,做数据的
- 保存数据 save()
- 查看数据 select()
- 更新数据
- 删除数据
1.在用户视图层,接收用户输入的数据,交给接口层处理
2.逻辑接口层接收到用户视图层传来的数据,进行核心逻辑校验
3.在2的校验过程中,数据处理层会接到逻辑接口层传来的阐述,并对数据进行增删改查
4.数据处理层将处理完的数据传回给逻辑接口层并完成校验
5.完成校验的逻辑接口层将结果返回给用户视图层给用户一个回应
以登录功能为例:
1.用户输入用户名和密码,用户视图层将得到数据传给逻辑接口层进行判断
2.逻辑层查询数据层查看用户名是否存在,若存在则继续校验密码,不存在则返回结果给用户视图层,让用户重新输入
3.逻辑层继续校验密码,查询数据层数据,判断该用户名的密码与输入的密码是否一致,若不一致则返回密码不一致,若一致则返回登陆成功
按三层展示:
1.用户视图层
‘‘‘ 第一层 用户视图层 ‘‘‘ from interface import user_interface from interface import bank_interface from lib import common login_user = None def register(): ‘‘‘ 注册功能 :return: ‘‘‘ while True: username = input(‘请输入用户名‘).strip() userpsd = input(‘请输入密码‘).strip() re_psd = input(‘再次输入密码‘).strip() if userpsd == re_psd: flag, msg = user_interface.register_interface(username, userpsd) if flag: print(msg) break else: print(msg) def login(): ‘‘‘ 登录功能 :return: ‘‘‘ while True: username = input(‘请输入用户名‘).strip() userpsd = input(‘请输入密码‘).strip() flag, msg = user_interface.login_interface(username, userpsd) if flag: print(msg) global login_user login_user = username break else: print(msg) @common.auth def check_balance(): ‘‘‘ 查看余额 :return: ‘‘‘ print(f‘欢迎使用余额查询功能,亲爱的{login_user}‘) while True: flag,msg = bank_interface.checkbalance_interface(login_user) if flag: print(msg) break @common.auth def withdraw(): ‘‘‘ 提现功能 :return: ‘‘‘ print(f‘欢迎使用提现功能,亲爱的{login_user}‘) while True: withdraw_money = input(‘请输入提现金额‘) if not withdraw_money.isdigit(): print(‘请正确输入数字‘) continue elif withdraw_money.isdigit(): flag, msg = bank_interface.withdraw_interface(login_user, withdraw_money) if flag: print(msg) break else: print(msg) @common.auth def transfer(): ‘‘‘ 转账功能 :return: ‘‘‘ print(f‘欢迎使用转账功能{login_user}‘) while True: user_out=login_user user_in = input(‘请输入你要转账的用户姓名‘) amount = input(‘请输入转账金额‘) if not amount.isdigit(): print(‘请正确输入数字‘) continue else: flag,msg=bank_interface.transfer_interface(user_out,user_in,amount) if flag: print(msg) break else: print(msg) @common.auth def payload(): ‘‘‘ 还款功能 :return: ‘‘‘ pass # 查看流水 def check_flow(): pass # 购物功能 def shop(): pass # 查看购物车 def check_shop(): pass def admin(): ‘‘‘ 管理员功能 :return: ‘‘‘ pass def get(): bank_interface.reader() get() func_dic = { ‘1‘: register, ‘2‘: login, ‘3‘: check_balance, ‘4‘: withdraw, ‘5‘: payload, ‘6‘: transfer, ‘7‘: check_flow, ‘8‘: shop, ‘9‘: check_shop, ‘0‘: admin, } def run(): while True: print( ‘‘‘ ======= ATM + 购物车 ======= 1、注册功能 2、登录功能 3、查看余额 4、提现功能 5、还款功能 6、转账功能 7、查看流水 8、购物功能 9、查看购物车 0、管理员功能 =========================== ‘‘‘ ) cmd = input(‘请输入功能编号‘) if not cmd.isdigit(): print(‘请正确输入功能编号‘) continue elif cmd.isdigit(): func_dic[cmd]()
2.逻辑接口层
用户接口 from conf import settings from db import db_handler from lib import common from logging import config from logging import getLogger import json import db config.dictConfig(settings.LOGGING_DIC) def register_interface(username,userpsd,balance=15000,load=0): ‘‘‘ 注册接口 :return: ‘‘‘ user_dic=db.db_handler.getinfo(username) if user_dic: return False,‘用户已存在‘ userpsd=common.hashpsd(userpsd) user_dic={ ‘username‘:username, ‘userpassword‘:userpsd, ‘balance‘:balance, ‘loads‘:load, ‘flow‘:[], ‘shop_car‘:{}, ‘islocked‘:False, } db_handler.saveinfo(user_dic) return True,‘注册成功‘ def login_interface(username,userpsd): ‘‘‘ 登录接口 :return: ‘‘‘ user_dic=db_handler.getinfo(username) if user_dic: userpsd= common.hashpsd(userpsd) if userpsd==user_dic.get(‘userpassword‘): return True,f‘{username}登陆成功‘ else: return False,‘登录失败‘ return False,‘用户不存在‘
‘‘‘‘‘ 银行相关业务接口 ‘‘‘ from db import db_handler def checkbalance_interface(username): ‘‘‘ 余额查询接口 :param username: :return: ‘‘‘ user_dic = db_handler.getinfo(username) if user_dic: balance = user_dic[‘balance‘] return True,f‘您的余额为:{balance}‘ def withdraw_interface(username, money): ‘‘‘ 提现功能接口 :param username: :param money: :return: ‘‘‘ user_dic = db_handler.getinfo(username) money = float(money) balance = float(user_dic.get(‘balance‘)) if balance < money * 1.05: return False, ‘余额不足,请先充值‘ if balance >= money * 1.05: balance -= money * 1.05 user_dic[‘balance‘] = balance db_handler.saveinfo(user_dic) return True, f‘提现成功,余额为:{balance},手续费为:{money * 0.05}‘ def transfer_interface(user_out, user_in, amount): ‘‘‘ 转账功能接口 :param user_out: :param user_in: :param amount: :return: ‘‘‘ user_dic_out = db_handler.getinfo(user_out) user_dic_in = db_handler.getinfo(user_in) amount = float(amount) if not user_dic_in: return False, ‘转账对象不存在‘ if user_dic_in: outbalance = float(user_dic_out.get(‘balance‘)) if outbalance < amount * 1.05: return False, ‘余额不足,请先充值‘ else: inbalance=float(user_dic_in.get(‘balance‘)) outbalance-=amount*1.05 inbalance+=amount db_handler.saveinfo(user_dic_out) db_handler.saveinfo(user_dic_in) return True,f‘转账成功,已向{user_in}转账{amount},手续费为{amount*0.05}‘
3.数据处理层
‘‘‘ 第三层 ‘‘‘ from conf import settings import os import json def getinfo(username): ‘‘‘ 获取用户数据 :param username: :return: ‘‘‘ userpath=os.path.join(settings.USER_DATA_PATH,f‘{username}.json‘) if os.path.exists(userpath): with open(userpath,‘r‘,encoding=‘utf-8‘)as f: user_dic=json.load(f) return user_dic def saveinfo(user_dic): ‘‘‘ 注册功能中将用户信息写入文件 :param user_dic: :return: ‘‘‘ username=user_dic.get(‘username‘) userpath=os.path.join(settings.USER_DATA_PATH,f‘{username}.json‘) with open(userpath,‘wt‘,encoding=‘utf-8‘)as f: json.dump(user_dic,f,ensure_ascii=False)
4.common
‘‘‘ 公共方法 ‘‘‘ import hashlib from core import src def hashpsd(password): m = hashlib.md5() m.update(‘zhouge‘.encode(‘utf-8‘)) m.update(password.encode(‘utf-8‘)) m.update(‘xiaobaobei‘.encode(‘utf-8‘)) res=m.hexdigest() return res def auth(func): ‘‘‘ 登录认证装饰器 :return: ‘‘‘ def wrapper(*args,**kwargs): if src.login_user is None: print(‘使用功能前请先登录‘) src.login() if src.login_user: res = func(*args, **kwargs) return res return wrapper
原文:https://www.cnblogs.com/heirenxilou/p/12622816.html