python3 实现简单的信用卡还款,取款转账功能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"}

 

 

 

 

posted @ 2016-12-26 22:18  想自由  阅读(876)  评论(0编辑  收藏  举报