python 23 ATM

1,分析需求

1.额度15000或自定义     -->  注册功能
2.实现购物商城,买东西加入购物车,调用信用卡接口结账  --> 购物功能、支付功能
3.可以提现,手续费5%   --> 提现功能
4.支持多账户登录  --> 登录功能
5.支持账户间转账  --> 转账功能
6.记录日常消费 -->  记录流水功能
7.提供还款接口 -->  还款功能
8.ATM记录操作日志 --> 记录日志功能
9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。 ---> 管理员功能
10.用户认证用装饰器  --> 登录认证装饰器
  • "用户视图层" 展示给用户选择的功能
    1、注册功能
    2、登录功能
    3、查看余额
    4、提现功能
    5、还款功能
    6、转账功能
    7、查看流水
    8、购物功能
    9、查看购物车
    10、管理员功能

2,程序的架构设计

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

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

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

3,创建atm文件项目所有所需要的子文件夹及py文件

conf——sttings.py 配置文件
core——src.py 用户视图层
interface——user_interface.py(用户接口),bank_interface.py(银行接口),shopping_interface.py(购物接口)
db——db_handler.py 数据相关的操作
lib——common.py 公共功能
star.py 项目开始文件
log——存放日志
readme 项目介绍

4,开始写功能

star.py 项目开始文件

import os
import sys

from conf import settings
sys.path.append(settings.BASE_PATH)

from core import src
if __name__ == '__main__':
    src.run()

sttings.py 配置文件

import os
import sys

BASE_PATH=os.path.dirname(os.path.dirname(__file__))

USER_DATA_PATH = os.path.join(BASE_PATH, 'db', 'user_data')

src.py 用户视图层

from interface import user_interface
from interface import bank_interface
from lib import common

# 全局变量
login_user = None


def register():
    while True:
        username = input('请输入用户名: ').strip()
        password = input('请输入密码: ').strip()
        re_password = input('请确认密码: ').strip()
        if password == re_password:
            flag, msg = user_interface.register_interface(username, password)
            if flag:
                print(msg)
                break
            else:
                print(msg)



def login():
    while True:
        username = input('请输入用户名: ').strip()
        password = input('请输入密码: ').strip()
        flag, msg = user_interface.login_interface(username, password)
        if flag:
            print(msg)
            global login_user
            login_user = username
            break
        else:
            print(msg)

@common.login_auth
def check_balance():
    balance = user_interface.check_bal_interface(login_user)
    print(f'用户{login_user} 账户余额为: {balance}')

@common.login_auth
def withdraw():
    while True:
        input_money = input('请输入提现金额: ').strip()
        if not input_money.isdigit():
            print('请重新输入')
            continue
        flag, msg = bank_interface.withdraw_interface(login_user, input_money)
        if flag:
            print(msg)
            break
        else:
            print(msg)

@common.login_auth
def payback():
    pass

@common.login_auth
def transfer():
    pass

@common.login_auth
def check_flow():
    pass

@common.login_auth
def shopping():
    pass

@common.login_auth
def check_shopcar():
    pass


def admin():
    pass


#函数字典
funcdic={
    '1': register,
    '2': login,
    '3': check_balance,
    '4': withdraw,
    '5': payback,
    '6': transfer,
    '7': check_flow,
    '8': shopping,
    '9': check_shopcar,
    '10': admin,
    }

def run():
    while True:
        print('''
        ===== ATM + 购物车 =====
            1、注册功能
            2、登录功能
            3、查看余额
            4、提现功能
            5、还款功能
            6、转账功能
            7、查看流水
            8、购物功能
            9、查看购物车
            10、管理员功能
        ========= end =========
        ''')
        choice=input('请输入操作(q退出):')
        if choice=='q':
            break
        else:
            if choice not in funcdic:
                print('输入有误')
            else:
                funcdic[choice]()

user_interface.py(用户接口)

from db import db_handler
from lib import common

def register_interface(username, password, balance=15000):
    user_dic = db_handler.select(username)
    if user_dic:
        return False, '用户名已存在!'
    password = common.get_pwd_md5(password)
    user_dic = {
        'username': username,
        'password': password,
        'balance': balance,
        'flow': [],
        'shop_car': {},
        'locked': False
    }
    db_handler.save(user_dic)
    return True, f'{username} 注册成功!'


def login_interface(username, password):
    user_dic = db_handler.select(username)
    if user_dic:
        password = common.get_pwd_md5(password)
        if password == user_dic.get('password'):
            return True, f'用户: [{username}] 登录成功!'
        else:
            return False, '密码错误'
    return False, '用户不存在,请重新输入!'


def check_bal_interface(username):
    user_dic = db_handler.select(username)
    return user_dic['balance']

bank_interface.py(银行接口)

from db import db_handler


def withdraw_interface(username, money):
    user_dic = db_handler.select(username)
    balance = int(user_dic.get('balance'))
    money2 = int(money) * 1.05
    if balance >= money2:
        balance -= money2
        user_dic['balance'] = balance
        db_handler.save(user_dic)
        return True, f'用户[{username}] 提现金额[{money}$]成功,手续费为: [{money2 - float(money)}$]'
    return False, '金额不足,请重新输入!'

shopping_interface.py(购物接口)


db_handler.py 数据相关的操作

import json
import os
from conf import settings

def select(username):
    user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
    if os.path.exists(user_path):
        with open(user_path, 'r', encoding='utf-8') as f:
            user_dic = json.load(f)
            return user_dic

def save(user_dic):
    username = user_dic.get('username')

    user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
    with open(user_path, 'w', encoding='utf-8') as f:
        json.dump(user_dic, f, ensure_ascii=False)

common.py 公共功能

import hashlib

def get_pwd_md5(password):
    md5_obj = hashlib.md5()
    md5_obj.update(password.encode('utf-8'))
    salt = '一二三四五,上山打老鼠!'
    md5_obj.update(salt.encode('utf-8'))
    return md5_obj.hexdigest()


def login_auth(func):
    from core import src
    def inner(*args, **kwargs):
        if src.login_user:
            res = func(*args, **kwargs)
            return res
        else:
            print('未登录,请登录')
            src.login()
    return inner
上一篇:ATM+购物车完整版


下一篇:ATM与购物车---之需求分析