#-*-UTF-8-*-
importosimportsysimportreimportlogging
BASE_DIR= (os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)#添加core目录的绝对路径#获取ATM目录的绝对路径
BASE_DIRR_REMOTE =(
os.path.dirname(
os.path.dirname(
os.path.abspath(__file__))))from login importauth_namefrom core importlogin
@auth_namedef verify_password(): #定义装饰账户密码验证的函数
return 'ok'
defcredit_platform():"""信用卡登录界面选项"""
whileTrue:print('1.登录\n2.注册\n3.退出')
bk_server= input("请选择你的服务编号:")ifbk_server.isdigit():
bk_server=int(bk_server)if bk_server <= 3 and bk_server >=0:if bk_server == 1:#调用装饰账户密码验证的函数
username, loginSucces =verify_password()#判断如果loginSucces的返回结果为Ture,进入信用卡服务平台
if str(loginSucces) == 'True':
user_menu(username)elif bk_server == 2:#调用创建新账户功能,并判断是否创建成功
loginSucces =login.create_account()#判断如果loginSucces的返回结果为Ture,返回信用卡登录界面
if str(loginSucces) == 'True':continue
#退出信用卡登录界面
elif bk_server == 3:break
else:print("请输入规范的服务编号!")continue
else:print("错误的服务编号!")continue
defuser_menu(username):"""信用卡用户服务选项
:param username:登录的信用卡账户名"""
whileTrue:print('1.提现\n2.还款\n3.转账\n4.查看额度\n5.冻结账户\n6.退出账户')
bk_server= input("请选择你的服务编号:")ifbk_server.isdigit():
bk_server=int(bk_server)if bk_server <= 6 and bk_server >=0:if bk_server == 1:
creditcard(username)#调用提取现金
elif bk_server == 2:
repayment_Savingsdeposit(username)#调用信用卡还款
elif bk_server == 3:#调用信用卡转账
account_name_a, transfer_money =judge_account(username)
transfer_accounts(account_name_a, transfer_money)elif bk_server == 4:
query_money(username)#调用查询金额
elif bk_server == 5:
loginSucces= Frozen_account(username) #调用冻结账户
if str(loginSucces) == 'True':
credit_platform()elif loginSucces == 'False':pass
elif bk_server == 6:break #退出信用卡服务平台
defcredit_card_field(username, file_name, money_key, line):"""定义一个方法处理信用卡的金额变动
:param username: 信用卡账户名
:param file_name: 账户文件
:param money_key: 金额字段
:param line: 读取账户文件
:return: 返回两个金额数"""total_old=line[money_key]
total_new=line[money_key]
total_new= re.match("^\d\d*", total_new)
total_new=total_new.group()
total_new=int(total_new)returntotal_old, total_new, linedefcreditcard(username):"""服务类型:提取现金
扣取信用卡金额
:param username: 信用卡账户名"""
#获取账户文件
file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查账户文件是否存在
login.file_exist_check(file_name)#调用读取账户文件
file_line = login.configure_file(file_name, 'r')whileTrue:
with open(file_name,'w', encoding="utf-8")as f:for line infile_line:
line= eval(line) #将每条账户信息转成字典
user = line["account"][0] #获取账户名
#如果账户名在这条字典里,就提示输入金额数
if username inuser:#调用信用卡字段处理方法获取两个金额数
total_old, total_new, line =credit_card_field(
username, file_name,"credit_money", line)
draw_money= input("请输入提取的金额数:").strip()ifdraw_money.isdigit():
draw_money=int(draw_money)#如果输入的金额数小于等于总金额数,就扣取金额
if draw_money <=total_new:
total_new-= draw_money #减去金额
total_new *= 0.5 #减去%5手续费金额
#把新的金额数跟之前的金额数做替换并写入账户文件
line_update =str(line).replace(
str(total_old), str(total_new))
f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数
logging.info("username:%s,business:Withdrawals,credit card---Amount of deducted amount:%s" %(str(username), str(draw_money)))#调用现金储蓄文件,把扣取的金额数加入到文件中
savingsdeposit_card(username, draw_money)continue #递归查询账户文件
else:print("取款数额超出信用卡金额范围!")break
#如果这个账户名不在这条字典里,直接写入原文件
else:
line=str(line)
f.write("%s\n" %line)else:break
defsavingsdeposit_card(username, draw_money):"""服务类型:提取现金
存入金额到现金储蓄文件
:param username: 账户名
:param draw_money: 信用卡扣取的金额数"""
#获取储蓄文件
file_name = (BASE_DIRR_REMOTE + r"\core\savings.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取储蓄文件
file_line = login.configure_file(file_name, 'r')
with open(file_name,'w', encoding='utf-8')as f:for line infile_line:
line= eval(line) #将每条账户信息转成字典
user = line["cash_money"][0] #获取账户名
#如果账户名在这条字典里,就加上金额数并替换之前的金额数写入储蓄文件
if username inuser:
line_old= line["cash_money"][1]
line_new= line["cash_money"][1]
line_new=int(line_new)
line_new+=draw_money
line_update=str(line).replace(str(line_old), str(line_new))
f.write("%s\n" %line_update)print("\033[1;32m----提现成功----\033[0m")#调用日志文件记录存入的金额数
logging.info("username:%s,business:Withdrawals,Memory card---Amount of deposit:%s" %(str(username), str(draw_money)))#如果账户名不在这条字典里,直接写入原文件
else:
line=str(line)
f.write("%s\n" %line)defrepayment_Savingsdeposit(username):"""服务类型:信用卡还款
扣取储蓄文件金额
:param username: 账户名"""
#获取储蓄文件
file_name = (BASE_DIRR_REMOTE + r"\core\savings.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取储蓄文件
file_line = login.configure_file(file_name, 'r')whileTrue:
with open(file_name,'w', encoding='utf-8')as f:for line infile_line:
line= eval(line) #将每条账户信息转成字典
user = line["cash_money"][0] #获取账户名
#如果账户名在这条字典里,提示输入金额数
if username inuser:
line_old= line["cash_money"][1]
line_new= line["cash_money"][1]
repay_money= input("请输入还款的金额数:").strip()ifrepay_money.isdigit():
repay_money=int(repay_money)
line_new=int(line_new)#如果输入的金额数小于等于总金额数,就扣取金额并替换原来的金额数并写入储蓄文件
if repay_money <=line_new:
line_new-=repay_money
line_update=str(line).replace(
str(line_old), str(line_new))
f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数
logging.info("username:%s,business:repayment,Memory card---Amount of deducted amount:%s" %(str(username), str(repay_money)))#调用信用卡账户文件,把扣取的金额数加入到文件中
repayment_creditcard(username, repay_money)else:print("取款数额超出信用卡金额范围!")break
else:print("请输入规范的金额数!")break
#如果账户名不在这条字典里,直接写入原文件
else:
line=str(line)
f.write("%s\n" %line)continue #递归查询储蓄文件
else:break
defrepayment_creditcard(username, repay_money):"""服务类型:信用卡还款
存入金额到信用卡账户文件
:param username: 账户名
:param repay_money: 储蓄文件扣取的金额数"""
#获取账户文件
file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取账户文件
file_line = login.configure_file(file_name, 'r')
with open(file_name,'w', encoding='utf-8')as f:for line infile_line:
line= eval(line) #将每条账户信息转成字典
user = line["account"][0] #获取账户名
#如果账户名在这条字典里,就调用信用卡字段处理方法获取两个金额数
if username inuser:
total_old, total_new, line=credit_card_field(
username, file_name,"credit_money", line)
total_new+= repay_money #加上金额数到信用卡账户文件
#把新的金额数跟之前的金额数做替换,并写入信用卡账户文件
line_update =str(line).replace(str(total_old), str(total_new))
f.write("%s\n" %line_update)print("\033[1;32m----还款成功----\033[0m")#调用日志文件记录存入的金额数
logging.info("username:%s,business:repayment,credit card---Amount of deposit:%s" %(str(username), str(repay_money)))else:#如果账户名不在这条字典里,直接写入原文件
line =str(line)
f.write("%s\n" %line)defjudge_account(username):"""服务类型:信用卡转账
信用卡账户转账服务
:param username: 账户名
:return 返回输入的账户名和扣取的金额数"""
#获取信用卡账户文件
file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取信用卡账户文件
file_line = login.configure_file(file_name, 'r')whileTrue:#获取输入的两次账户名
account_name_a = input("请输入转账的用户名:").strip()
account_name_b= input("请再次输入转账的用户名:").strip()#判断账户名是否是字符串类型
if account_name_a.isalpha() andaccount_name_b.isalpha():#如果两次输入的账户名不一致打印错误信息,并要求重新输入
if account_name_a !=account_name_b:print("两次用户名不一致!")continue
#如果两次输入的账户名都等于当前登录的账户名,就提示错误信息,并要求重新输入
elif account_name_a == username and account_name_b ==username:print("不可以给自己转账!")continue
else:
with open(file_name,'r+', encoding='utf-8')as f:#将每条账户信息转成字典
for line_transfer_money infile_line:
line_transfer_money=eval(line_transfer_money)#获取每条字典的账户名
user = line_transfer_money["account"][0]#如果账户名在这条字典里就截取这条账户信息的金额数
if username inuser:
total_old= line_transfer_money["credit_money"]
total_new= line_transfer_money["credit_money"]#获取输入的转账金额数
transfer_money = input("请输入转账的金额:").strip()#判断是否是整数类型
iftransfer_money.isdigit():
transfer_money=int(transfer_money)
total_new=int(total_new)#如果输入的金额数小于等于总金额数,就扣取金额并替换原来的金额数并写入账户文件
if transfer_money <=total_new:
total_new-=transfer_money
line_update=str(line_transfer_money).replace(
str(total_old), str(total_new))
f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数
logging.info("username:%s,business:Transfer accounts,credit card---Number of transfers:%s" %(str(username), str(transfer_money)))#调用转账功能需要被转账的账户
#transfer_accounts(account_name_a,transfer_money)
else:print("取款数额超出信用卡金额范围!")break
else:print("请输入规范的金额数!")break
else:#如果账户名不在这条字典里,直接写入原文件
line_transfer_money =str(line_transfer_money)
f.write("%s\n" %line_transfer_money)#transfer_accounts(account_name_a, transfer_money)
continue
else:returnaccount_name_a, transfer_moneydeftransfer_accounts(account_name_a, transfer_money):"""服务类型:信用卡转账
:param account_name_a: 被转账的账户名
:param transfer_money:信用卡账户扣取的金额数"""
#获取账户文件
file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取账户文件
file_line = login.configure_file(file_name, 'r')whileTrue:
with open(file_name,'r+', encoding='utf-8')as f:for line_transfer_money infile_line:
line_transfer_money= eval(line_transfer_money) #将每条账户信息转成字典
user = line_transfer_money["account"][0] #获取每条字典的账户名
#如果账户名在这条字典里就将金额数加到总金额数,并替换字典原来的金额数后写入账户文件
if account_name_a inuser:
line_old= line_transfer_money["credit_money"]
line_new= line_transfer_money["credit_money"]
line_new=int(line_new)
line_new+=transfer_money
line_update=str(line_transfer_money).replace(
str(line_old), str(line_new))
f.write("%s\n" %line_update)print("\033[1;32m----转账成功----\033[0m")#调用日志文件记录存入的金额数
logging.info("username:%s,business:Transfer accounts,Memory card---Amount of deposit:%s" %(str(account_name_a), str(transfer_money)))else:#如果账户名不在这条字典里,直接写入原文件
line_transfer_money =str(line_transfer_money)
f.write("%s\n" %line_transfer_money)else:break
defquery_money(username):"""查询信用卡账户余额
:param username: 账户名"""
#获取账户文件
file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取账户文件
file_line = login.configure_file(file_name, 'r')for line infile_line:
line= eval(line) ## 将每条账户信息转成字典
user = line["account"][0] #获取每条字典的账户名
#如果账户名在这条字典里,就打印这个账户的余额信息
if username inuser:print('%s\n用户名:%s 信用卡剩余余额:%s\n%s\n' %('=' * 50, username, line['credit_money'], '=' * 50))defFrozen_account(username):"""冻结账户
:param username: 账户名
:return 返回冻结账户是否成功状态"""
#获取冻结文件
file_name = (BASE_DIRR_REMOTE + r"\core\frozen.txt")#检查文件是否存在
login.file_exist_check(file_name)#读取冻结文件
file_line = login.configure_file(file_name, 'r')whileTrue:
loginSucces=False#如果文件的行数不等于0,就把每条信息转成字典
if len(file_line) !=0:for line_locking infile_line:
line_locking=eval(line_locking)#如果账户名在冻结文件里就输出打印信息
if username in line_locking['frozen_username']:print("该账户已处于冻结状态!")#如果账户名不在冻结文件里,就输出是否冻结该用户提示
elif username not in line_locking['frozen_username']:
locking= input("是否确定冻结该账户?y/n:")iflocking.isalpha():#如果等于y,就把该账户名追加写入冻结文件,并返回loginSucces状态
if locking == "y":
with open(file_name,'a+', encoding='utf-8')as f:
f.write("\n{'frozen_username':'%s'}" %username)print("\033[1;32m该账户冻结成功!\033[0m")
loginSucces=TruereturnloginSucces#如果等于n,直接返回loginSucces状态
elif locking == "n":returnloginSucceselse:print("错误的选项请重新输入!")continue
else:print("输入的数据类型不符合规范,请重新输入!")continue
#如果行数等于0,就输出是否冻结该账户提示
if len(file_line) ==0:
locking= input("是否确定冻结该账户?y/n:")iflocking.isalpha():#如果等于y,就把该账户名追加写入冻结文件,并返回loginSucces状态
if locking == "y":
with open(file_name,'w', encoding='utf-8')as f:
f.write("{'frozen_username':'%s'}\n" %username)print("\033[1;32m该账户冻结成功!\033[0m")
loginSucces=TruereturnloginSucces#如果等于n,直接返回loginSucces状态
elif locking == "n":returnloginSucceselse:print("\033[1;31m错误的选项请重新输入!\033[0m")continue
else:print("\033[1;31m输入的数据类型不符合规范,请重新输入!\033[0m")continue