python还款程序_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"}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值