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

原文地址:https://www.cnblogs.com/Franciszw/p/12623242.html

时间: 2024-10-12 11:32:59

python 23 ATM的相关文章

python之ATM

每次做一点就发出来,大神不要嫌重复 2016/11/4 今天来搞ATM,反正逃不了的,说来惭愧,这个作业是我10/4号20天前拿到的,当时是万脸蒙比的,今天又做了一点,现在算是百脸蒙比吧. 一.需求:模拟实现一个ATM + 购物商城程序 额度 15000或自定义  实现购物商城,买东西加入 购物车,调用信用卡接口结账   其实是两套单独程序 可以提现,手续费5%  提现不能超过总余额一半    每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 支持多账户登录,每个用

python模拟ATM系统

一.环境及程序功能说明 python 2.7.12模拟与银行ATM功能,主要功能如下: 1,登录查询余额 2,转账功能 3,提现功能 4,流水查询 5,密码修改 6,还款功能 7,退出(切换账号) 采用pickle存储账号密码相关信息,以账号名为日志文件名存储该账号的流水日志~ 为了实现测试,先写一个提供测试文件的小脚本,代码如下: #coding:utf-8 import pickle import time import os IOSTIME = '%Y-%m-%d %X' Now = ti

Python实现atm机的功能

主要还是参考网上内容,自己做了修改.虽然代码有小bug,但是不影响学习和测试. 功能: 额度:8000 可以提现,手续费5% 每月最后一天出账单,写入文件 记录每月日常消费流水 提供还款接口 1.atm的脚本 [[email protected] atm]# cat atm.py #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Date:2017-03-23 Author:Bob ''' import os import time import

[Leetcode][Python]23: Merge k Sorted Lists

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 23: Merge k Sorted Listshttps://oj.leetcode.com/problems/merge-k-sorted-lists/ Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. ===Comments by

python之ATM(第五天)

ATM程序简介: 1.登录login.py 2.取现cash.py 3.还款cashin.py 4.日志查询query.py ATM主程序菜单 #!/usr/bin/env pythonimport sys,pickleimport pickleimport account,login,cash,cashin,query def main(name): while True: print '''\033[1mMain Menu: 1.cash 2.cashin 3.query 4.quit\03

python实现atm机的部分功能

环境:python2.7 缺陷:钱不变,待完善 # -*- coding: utf-8 -*- user_name = "C:\Users\95112\Desktop\ATM\username" #定义用户名和密码的位置 goods     = "C:\Users\95112\Desktop\ATM\goods"  #定义商品列表的的位置 #登录 def login(): global a global salary username=[] password=[]

Python 23种设计模式全(python例子)

从今年5月份开始打算把设计模式都写到博客里,持续到现在总算是写完了.写的很慢,好歹算是有始有终.对这些设计模式有些理解的不准确,有些甚至可能是错的,请看到的同学拍砖留言.内容来源很杂,大部分参考或者摘录链接都放到里面了.写下来的目的是让自己记忆更深刻,如果能让别人参考一下,带来帮助那最好不过了.设计模式就暂时写完了,今天往后我打算把之前学过用过的性能测试码在博客里.也算是工作生活之余时给自己找点事做. 创建型 1. Factory Method(工厂方法)-- https://www.cnblo

python版—ATM机

# 初始化存储变量 cards = [123456, 234567, 345678]   # 存放用户卡号 pwds = [111, 222, 333]            # 存放用户的密码 moneys = [1000, 1000, 100]       # 存放用户的余额 IsLogin = False  # 用户是否登录 loginUser = -1  # 登录的用户,保存数组的下标 loginCount = 0 # 登录次数 #主菜单 def menu():    while Tru

【Python 23】52周存钱挑战3.0(循环计数for)

1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+...+520=13780 2.0增加功能:记录每周存款金额(使用list) 3.0增加功能:使用循环直接计数(for) 2.案例分析 输入:每周递存金额(10元)和挑战总周数(52周) 处理:账户累计+=每周存入金额:每周存入金额 +=每周递存金额.从第1周开始循环,到52周结束. 输出:第几周,存