ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 23 ATM

2020-04-02 21:56:36  阅读:217  来源: 互联网

标签:username 23 python ATM user interface login password def


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

标签:username,23,python,ATM,user,interface,login,password,def
来源: https://www.cnblogs.com/Franciszw/p/12623242.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有