python3 实现简单的ATM功能V2

仅实现还款,取款,转账,信息查询功能

程序结构:

atm(函数主执行程序):

#Author by Andy
#_*_ coding:utf-8 _*_
import os,sys
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(Father_path)
from core import main

if __name__  ==  ‘__main__‘:
    main.run()

main(程序主逻辑模块):

#Author by Andy
#_*_ coding:utf-8 _*_
import os,sys,time,json
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,Father_path)
from core import auth
from core import db_handle
from conf import settings
from conf import Color_set
from core import transaction
color=Color_set.Colorset()
user_data = {
    ‘account_id‘: None,
    ‘is_authentic‘: False,
    ‘account_data‘: None
}
def auth_transfer_id():
    trans_id = input("输入转账ID:").strip()
    trans_file = Father_path+"/db/accounts/%s.json" % trans_id
    if os.path.isfile(trans_file):
        return trans_id

def action_type(acc_data,action):
    Exit_flag = True
    while Exit_flag:
        values = input("请输入%s金额:" %action.strip())
        if values.isdigit():
            if action == "还款":
                action_result = transaction.make_transaction(acc_data,"repayment",values)
                if action_result:
                    print(color.red("您的最新余额为%s" %action_result[‘balance‘]))
                    break
            elif action == "取款":
                action_result = transaction.make_transaction(acc_data, "enchashment", values)
                if action_result:
                    print(color.red("您的最新余额为%s" % action_result[‘balance‘]))
                    break
            elif action == "转账":
                while True:
                    trans_id = auth_transfer_id()
                    if trans_id == acc_data[‘id‘]:
                        print(color.red("账户无效,请重新输入!"))
                    elif not trans_id:
                        Exit_flag = False
                        print(color.red("账户无效,请重新输入!"))
                    elif trans_id:
                        f = Father_path + "/db/accounts/%s.json" % trans_id
                        trans_file = open(f)
                        trans_dict = json.load(trans_file)
                        action_result = transaction.make_transaction(acc_data, "transfer", values)
                        if action_result:
                            print(color.red("您的最新余额为%s" % action_result[‘balance‘]))
                            # logger.logger(acc_data["id"], action_result[‘balance‘], "transfer")
                            break
                    else:
                        print("\033[31;1m 账户无效,请重新输入!!\033[;0m")
                        break

            elif values == "b":
                Exit_flag = False
            else:
                print(color.red("[%s]不是有效的金额,必需输入数字!" % values))

def account_info(acc_data):
    print("以下为您的个人账户基本信息:\n")
    print(color.red("卡号:%s\n信用额度:%s\n可用余度:%s\n还款日:%s\n出账日:%s\n账户状态:%s\n" %(acc_data[‘id‘],acc_data[‘credit‘],acc_data[‘balance‘],acc_data[‘pay_day‘],acc_data[‘account_day‘],acc_data[‘status‘]))
          )
def repayment(acc_data):
    action_type(acc_data,"还款")
def enchashment(acc_data):
    action_type(acc_data, "取款")
def transfer(acc_data):
    action_type(acc_data, "转账")
def billing(acc_data):
    print("账单查询功能正在建设中,给您造成不便,敬请谅解!")
def logout(acc_data):
    print("欢迎再次使用,祝生活愉快,再见!")
    exit()

def interactive(acc_data):
    menu = color.red(‘‘‘
    1.  账户信息\n
    2.  还款\n
    3.  取款\n
    4.  转账\n
    5.  账单\n
    6.  退出\n
    ‘‘‘)
    menu_dic = {
        ‘1‘ : account_info,
        ‘2‘ : repayment,
        ‘3‘ : enchashment,
        ‘4‘ : transfer,
        ‘5‘ : billing,
        ‘6‘ : logout
    }
    str = "欢迎使用银行信用卡自助服务系统!\n"
    for i in str:
        sys.stdout.write(i)
        sys.stdout.flush()
        time.sleep(0.3)
    Exit_flag = True
    while Exit_flag:
        print(menu)
        user_option = input("请选择服务项目:").strip()
        if user_option in menu_dic:
            menu_dic[user_option](acc_data)
        else:
            print(color.red("输入错误,请重新输入!"))

def run():
    acc_data = auth.acc_login(user_data)
    if user_data[‘is_authentic‘]:
        user_data[‘account_data‘] = acc_data
        interactive(acc_data)

db_handle(用于判断数据类型以及数据文件位置模块):

#Author by Andy
#_*_ coding:utf-8 _*_
‘‘‘
conn_params    must be a dict
以下定义了两个函数:
file_db_handle 来确定数据文件的路径
db_handle_type 来确定数据文件的类型

‘‘‘
def file_db_handle(conn_params):
    db_path = ‘%s/%s‘ %(conn_params[‘path‘],conn_params[‘name‘])
    return db_path

def db_handle_type(conn_params):
    if conn_params[‘engine‘] == ‘file_storage‘:
        return file_db_handle(conn_params)

auth(用户认证模块):

#Author by Andy
#_*_ coding:utf-8 _*_
import os,sys,json
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,Father_path)
from core import db_handle
from conf import settings
from conf import Color_set
color=Color_set.Colorset()

def acc_auth(account,passwd):
    db_path=db_handle.db_handle_type(settings.DATABASE)
    data_file=‘%s/%s.json‘ %(db_path,account)
    if os.path.isfile(data_file):
        with open(data_file,encoding=‘utf-8‘) as f:
            account_data=json.load(f)
            if account_data[‘password‘] == passwd:
                return account_data
            else:
                print(color.red("用户名或密码错误!"))
    else:
        print(color.red("账户不存在!"))

def acc_login(user_data):
    retry_times = 0
    while user_data["is_authentic"] is not True and retry_times < 3:
        account = input("请输入账号:")
        passwd = input("请输入密码:")
        auth = acc_auth(account,passwd)
        if auth:
            user_data["is_authentic"] = True
            user_data ["account_id"] = account
            return auth
        retry_times += 1
    else:
         print(color.red("账户 [%s] 错误登录次数已达上限,已被锁定,解锁请联系客服10086!" % account))
         exit()

accounts (读取和保存用户数据模块):

#Author by Andy
#_*_ coding:utf-8 _*_
import json,os,sys
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,Father_path)
from core import db_handle
from conf import settings

def load_current_balance(account_id):
    db_path = db_handle.db_handle_type(settings.DATABASE)
    account_file = "%s/%s.json" % (db_path, account_id)
    with open(account_file,encoding=‘utf-8‘) as f:
        acc_data = json.load(f)
        return acc_data

def dump_account(account_data):
    db_path = db_handle.db_handle_type(settings.DATABASE)
    account_file = "%s/%s.json" % (db_path, account_data["id"])
    with open(account_file, "w",encoding=‘utf-8‘) as f:
        json.dump(account_data, f)
    return True

settings(程序配置模块):

#Author by Andy
#_*_ coding:utf-8 _*_
import os,sys
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DATABASE = {
    ‘engine‘:‘file_storage‘,
    ‘name‘:‘accounts‘,
    ‘path‘:‘%s/db‘ %Father_path
}
TRANSACTIONE_TYPE = {
    ‘repayment‘: {‘action‘ : ‘plus‘, ‘interest‘: 0},
    ‘enchashment‘: {‘action‘ : ‘minus‘, ‘interest‘: 0.005},
    ‘transfer‘: {‘action‘ : ‘minus‘, ‘interest‘: 0.005}
}

Color_set(字体输出颜色设置模块):

#coding:gbk
# ------------------------------------------------
#   python终端显示彩色字符类,可以调用不同的方法
# 选择不同的颜色.使用方法看示例代码就很容易明白.
# ------------------------------------------------
#
# 显示格式: \033[显示方式;前景色;背景色m
# ------------------------------------------------
# 显示方式             说明
#   0                 终端默认设置
#   1                 高亮显示
#   4                 使用下划线
#   5                 闪烁
#   7                 反白显示
#   8                 不可见
#   22                非粗体
#   24                非下划线
#   25                非闪烁
#
#   前景色             背景色            颜色
#     30                40              黑色
#     31                41              红色
#     32                42              绿色
#     33                43              黃色
#     34                44              蓝色
#     35                45              紫红色
#     36                46              青蓝色
#     37                47              白色
# ------------------------------------------------
class Colorset(object):
    # 显示格式: \033[显示方式;前景色;背景色m
    # 只写一个字段表示前景色,背景色默认
    RED = ‘\033[31m‘       # 红色
    GREEN = ‘\033[32m‘     # 绿色
    YELLOW = ‘\033[33m‘    # 黄色
    BLUE = ‘\033[34m‘      # 蓝色
    FUCHSIA = ‘\033[35m‘   # 紫红色
    CYAN = ‘\033[36m‘      # 青蓝色
    WHITE = ‘\033[37m‘     # 白色

    #: no color
    RESET = ‘\033[0m‘      # 终端默认颜色

    def color_str(self, color, s):
        return ‘{}{}{}‘.format(
            getattr(self, color),
            s,
            self.RESET
        )

    def red(self, s):
        return self.color_str(‘RED‘, s)

    def green(self, s):
        return self.color_str(‘GREEN‘, s)

    def yellow(self, s):
        return self.color_str(‘YELLOW‘, s)

    def blue(self, s):
        return self.color_str(‘BLUE‘, s)

    def fuchsia(self, s):
        return self.color_str(‘FUCHSIA‘, s)

    def cyan(self, s):
        return self.color_str(‘CYAN‘, s)

    def white(self, s):
        return self.color_str(‘WHITE‘, s)

# ----------使用示例如下:-------------
# color = Colorset()
# print(color.red(‘I am red!‘))
# print(color.green(‘I am gree!‘))
# print(color.yellow(‘I am yellow!‘))
# print(color.blue(‘I am blue!‘))
# print(color.fuchsia(‘I am fuchsia!‘))
# print(color.cyan(‘I am cyan!‘))
# print(color.white(‘I am white‘))

transaction(转账、取款、还款实际执行模块):

#Author by Andy
#_*_ coding:utf-8 _*_
import os,sys,json
Father_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,Father_path)
from conf import settings
from conf import Color_set
from core import accounts
color = Color_set.Colorset()
def make_transaction(acc_data, action_type, values, **others):
    values = float(values)
    if action_type in settings.TRANSACTIONE_TYPE:
        interest = values * settings.TRANSACTIONE_TYPE[action_type][‘interest‘]
        old_balance = acc_data[‘balance‘]
        if settings.TRANSACTIONE_TYPE[action_type][‘action‘] == "plus":
            new_balance = old_balance + values + interest
            print("此次操作的手续费为:%s" %interest)
        elif settings.TRANSACTIONE_TYPE[action_type][‘action‘] == "minus":
            new_balance = old_balance - values - interest
            print("此次操作的手续费为:%s" % interest)
            if new_balance < 0:
                print(color.red("当前信用值%s不允许进行此交易[-%s],当前余额%s" %                 (acc_data["cridit"], (values + interest), old_balance)))
                return
        acc_data["balance"] = new_balance
        accounts.dump_account(acc_data)
        return acc_data
    else:
        print(color.red("交易类型 [%s] 不存在!" % action_type))

用户数据文件:

10086.jason:

{"id": 10010, "pay_day": "每月9日", "balance": 15000, "status": "nomal", "credit": 15000, "password": "abcd","account_day": "每月21日"}

  

10010.jason:

{"balance": 801645.0, "id": 10086, "pay_day": "\u6bcf\u670822\u65e5", "credit": 15000, "password": "abcd", "status": "nomal", "account_day": "\u6bcf\u67085\u65e5"}

 

时间: 2024-10-28 10:18:51

python3 实现简单的ATM功能V2的相关文章

简单实现下载功能--jsp,servlet

刚到公司,前天给我的第一个小任务,虽然只是做个简单的下载功能. 但一开始还是花了不少时间去理解导师的意思,而且还要用到一些公司的库类,花了一个下午才做好. 大概有三种方法 1.直接用a标签跳转到指定位置的目标文件.  <a href="doc/help.txt" /></a>(文件是位于doc文件夹下help.txt)(不推荐这种方法,而且这跳转会直接打开文件) 2.jsp跳转然后直接在jsp里面写下载功能 <a href="download.j

简单标签库功能

1 package cn.itcast.web.tag; 2 3 import java.io.IOException; 4 import java.io.StringWriter; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.JspFragment; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 10 //控制标签体内容为大

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) 如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示: game.weibo.com后面匹配到的项,指向了某个php页面,然后根

jQuery实现一个简单的购物车功能

最近由于工作需要的原因,开始系统学习jQuery的知识,然后跟着一个视频教程做了一个购物车的功能,现总结如下. 第一步:准备HTML页面,代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.

Unity UGUI 实现简单拖拽功能

说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因为鼠标的移动是屏幕坐标,而 UI 的移动是ugui坐标.转换的方法: RectTransformUtility.ScreenPointToLocalPointInRectangle ( - ); 这个方法可以把屏幕坐标转换成 ugui 坐标.这里我们只需要知道 UI 的坐标和鼠标的坐标是不一样的,他

js+html+css实现简单页面交互功能(2015知乎前端笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2 密码:hellozhihu

AngularJS实现简单的分页功能

本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅只是实现了简单的分页功能,使用 AngularJS 尝尝鲜. AngularJS Code (Users.js) var Users = angular.module('Users', []); Users.controller('UserList', function($scope, $http)

.net请求Webservice简单实现天气预报功能

很久没有接触Webservice的知识,今天稍微复习了一下关于webservice,简单做了一个天气预报的功能,虽然界面丑的厉害,但功能算是实现了,以下是效果展示. 这东西没什么难点,只是天气预报的功能在网站类的开发中会经常用到,所以就简单写下,以便以后查阅. 1.新建一个网站或者web应用程序,添加一个aspx页面,用于展示天气数据.(这个应该不用细讲吧) 2.在网上找一个免费的天气预报的接口,我用的是Webxml网站的,地址如下: http://webservice.webxml.com.c

使用JS完成一个简单的计算器功能

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById("id").value = 1: 取值:var = document.getElementById("id").value: 任务 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElement