首页 > 编程语言 > 详细

python学习25——ATM项目

时间:2020-04-02 21:24:21      阅读:73      评论:0      收藏:0      [点我收藏+]

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

 

python学习25——ATM项目

原文:https://www.cnblogs.com/heirenxilou/p/12622816.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!