python学习25——ATM项目

1.项目的架构图

二 程序的架构设计

 1、程序设计的好处

1)思路清晰
2)不会出现写一半代码时推翻重写
3)方便自己或以后的同事更好维护

 2、三层架构设计的好处

1)把每个功能都分层三部分,逻辑清晰
2)如果用户更换不同的用户界面或不同,
的数据储存机制都不会影响接口层的核心
逻辑代码,扩展性强。
3)可以在接口层,准确的记录日志与流水。

 3、三层架构

一 用户视图层
用于与用户交互的,可以接受用户的输入,打印接口返回的数据。

二 逻辑接口层
接受 用户视图层 传递过来的参数,根据逻辑判断调用数据层加以处理,
并返回一个结果给 用户视图层。

三 数据处理层
接受接口层传递过来的参数,做数据的
- 保存数据 save()
- 查看数据 select()
- 更新数据
- 删除数据

 三.项目各功能具体流程

1.在用户视图层,接收用户输入的数据,交给接口层处理

2.逻辑接口层接收到用户视图层传来的数据,进行核心逻辑校验

3.在2的校验过程中,数据处理层会接到逻辑接口层传来的阐述,并对数据进行增删改查

4.数据处理层将处理完的数据传回给逻辑接口层并完成校验

5.完成校验的逻辑接口层将结果返回给用户视图层给用户一个回应

以登录功能为例:

1.用户输入用户名和密码,用户视图层将得到数据传给逻辑接口层进行判断

2.逻辑层查询数据层查看用户名是否存在,若存在则继续校验密码,不存在则返回结果给用户视图层,让用户重新输入

3.逻辑层继续校验密码,查询数据层数据,判断该用户名的密码与输入的密码是否一致,若不一致则返回密码不一致,若一致则返回登陆成功

四.ATM部分代码

按三层展示:
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

猜你喜欢

转载自www.cnblogs.com/heirenxilou/p/12622816.html