创建银行卡账户类
# 银行卡类
class Card(object):
def __init__(self, card_id, password, money=10, is_valid=False):
self.card_id = card_id # 银行卡账号
self.password = password # 银行卡密码
self.money = money # 余额
self.is_valid = is_valid # 是否锁卡,false未锁卡 true是锁卡
创建用户类
class User(object):
def __init__(self, username, user_id, phone, card):
self.username = username # 用户名
self.user_id = user_id # 身份证号
self.phone = phone # 手机号码
self.card = card # 银行卡对象
需要提醒用户输入的视图
import time
class Views(object):
def __init__(self):
# showbank()
self.__showbank()
time.sleep(1)
self.__userbank()
def __showbank(self):
wecome = '''
**** ****
**** ****
**** welcome TO Bank ATM ****
**** ****
**** ****
系统加载中...
'''
print(wecome)
def __userbank(self):
userquery = """
*******************************************
** (1) 注册 (2) 查询 **
** (3) 取款 (4) 存款 **
** (5) 转账 (6) 锁卡 **
** (7) 解卡 (8) 补卡 **
** (9) 改密 (10) 销户 **
** (0) 保存 **
********************************************
"""
print(userquery)
if __name__ == '__main__':
Views()
创建控制用户和银行卡账户进行交互的控制类
import os
# sys.setrecursionlimit(100000)
import time
import random
import pickle
import logging
import Card
import User
class Controller(object):
userid_cardnum = {}
cardid_userobj = {}
card_url = './databases/card.txt'
user_url = './databases/user.txt'
def __init__(self):
# pass
#
# 加载所有数据信息
self.__loaddata()
def __loaddata(self):
try:
if os.path.exists(self.user_url):
# 读取数据 身份证和卡号的信息
with open(self.user_url, 'rb') as fp:
self.userid_cardnum = pickle.load(fp)
# print(res)
if os.path.exists(self.card_url):
# 读取数据 卡号和用户的信息
with open(self.card_url, 'rb') as fp:
self.cardid_userobj = pickle.load(fp)
except Exception as f:
print(f'文件不存在或者文件没有内容{f}')
# 1 注册
def register(self):
# 需要用户名,身份证,手机号,密码
username = self.__getusername()
userid = self.__getuserid()
phone = self.__getphone()
password = self.__getpassword()
print('输入的用户名为{},身份证号码为{},手机号码为{},密码为{}'.format(username, userid, phone, password))
# 创建一个银行卡号
cardid = random.randint(100000, 999999)
cardnum = Card(cardid, password)
# 创建用户对象和银行卡进行绑定
userobj = User(username, userid, phone, cardnum)
# 保存信息
# {身份证:'银行卡绑定,cardnum'}
# {'银行卡cardid':'用户对象绑定userobj'}
self.userid_cardnum[userid] = cardid
self.cardid_userobj[cardid] = userobj
print(r'恭喜{}开户成功,卡号为{},余额为{}元'.format(username, cardid, cardnum.money))
# 2 查询
def query(self):
# 获取输入的卡号
print(self.cardid_userobj)
print(self.userid_cardnum)
cardid = int(input('请输入卡号:'))
# 通过卡号获取卡信息
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
# 获取卡对象
cardobj = self.cardid_userobj[cardid].card
if self.__chekpwd(cardobj):
# 验证是否锁卡
if cardobj.is_valid:
print('当前已被锁定,请先解卡')
cardobj.is_valid = True
# return cardobj.is_valid
# self.saflok()
else:
print(f'您当前卡号为{cardid},余额为{cardobj.money}')
# print('验证是否锁卡')
# 如果存在输入密码,不存在就提示
# else:
# 3 取款
def cash(self):
# 获取卡号
cardid = int(input('请输入卡号:'))
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
return
cardobj = self.cardid_userobj[cardid].card
if self.__chekpwd(cardobj):
# 验证是否锁卡
if cardobj.is_valid:
print('当前已被锁定,请先解卡')
return self.saflok()
else:
print(f'您当前卡号为{cardid},余额为{cardobj.money}')
e_money = int(input('请输入你需要取款的金额为:'))
if cardobj.money >= e_money >= 0:
cardobj.money -= e_money
self.__log()
print(f'取款成功,您当前卡号为{cardid},余额为{cardobj.money}')
# print('当前余额不足,请重新提取')
else:
print('当前余额不足,请重新提取')
# 4 存款
def deposit(self):
cardid = int(input('请输入卡号:'))
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
return
cardobj = self.cardid_userobj[cardid].card
# print(cardobj)
if self.__chekpwd(cardobj):
# 验证是否锁卡
if cardobj.is_valid:
print('当前已被锁定,请先解卡')
return self.saflok()
else:
c_money = int(input('请输入你需要存款的金额:'))
if c_money >= 0:
cardobj.money += c_money
print(f'存款成功,您当前卡号为{cardid},余额为{cardobj.money}')
else:
print('请输入正确的金额')
# 5 转账
def transfer(self):
print('转账')
# 获取卡号
cardid = int(input('请输入卡号:'))
zuan_cardid = int(input('请输入转账卡号:'))
if cardid == zuan_cardid or cardid not in self.cardid_userobj and zuan_cardid not in self.cardid_userobj:
print(f'你的卡号{cardid}不存在或对方卡号{zuan_cardid}不存在,不能使用同一个账号进行转账')
# print('')
return
else:
cardobj = self.cardid_userobj[cardid].card
if self.__chekpwd(cardobj):
# 验证是否锁卡
if cardobj.is_valid:
print('当前已被锁定,请先解卡')
return self.saflok()
else:
zhuancardobj = self.cardid_userobj[zuan_cardid].card
zhuan_money = int(input('请输入转账的金额:'))
# num = 0
if cardobj.money >= zhuan_money >= 0:
cardobj.money = cardobj.money - zhuan_money
zhuancardobj.money = zhuancardobj.money + zhuan_money
print(f'当前账户{cardid}所剩余额为{cardobj.money},转至账户{zuan_cardid}金额为{zhuan_money}')
else:
print('当前余额不足,请充值金额再来转账')
# 6 锁卡
def saflok(self):
cardid = int(input('请输入卡号:'))
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
return
cardobj = self.cardid_userobj[cardid].card
# cardobj.is_valid = False
if self.__chekpwd(cardobj):
# self.__chekpwd(cardobj)
print('你的账号和密码没有处于锁定状态不需要解锁')
return
else:
lock = input('你的卡处于锁定状态请输入原始密码进行解锁或者输入身份证号进行解锁:')
if cardobj.password == lock or lock == self.cardid_userobj[cardid].user_id:
print('密码或身份证号输入正确')
cardobj.is_valid = False
# return cardobj.is_valid
else:
print('密码和身份证输入错误')
cardobj.is_valid = True
# return cardobj.is_valid
# else:
# return False
# 7 解卡
def unfreezing(self):
cardid = int(input('请输入卡号:'))
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
return
else:
print('账号输入正确请输入密码')
cardobj = self.cardid_userobj[cardid].card
# # print(cardobj)
f = False
if self.__chekpwd(cardobj) and cardobj.is_valid == f:
print('你的账号不需要解卡')
else:
card_id = input('请输入你的身份证信息进行解卡:')
if card_id == self.cardid_userobj[cardid].user_id:
print('解卡成功')
cardobj.is_valid = f
else:
print('身份证信息输入错误。请重新输入')
return
# return True
# 8 补卡
def card_reissue(self):
new_card_id = input('请输入你需要补卡的身份证号码:')
userobj = self.userid_cardnum[new_card_id]
for key in self.userid_cardnum:
if new_card_id == key:
# 242156
print('验证成功')
del self.userid_cardnum[new_card_id]
del self.cardid_userobj[userobj]
self.register()
return
else:
print('身份证输入错误,请重新输入')
# 9 改密
def changepwd(self):
cardid = int(input('请输入卡号:'))
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
return
else:
# self.__chekpwd()
cardobj = self.cardid_userobj[cardid].card
self.__chekpwd(cardobj)
old_password = input('请输入密码或者身份证号码:')
if old_password == cardobj.password or old_password == self.cardid_userobj[cardid].user_id:
new_password = input('请输入新密码:')
cardobj.password = new_password
else:
print('密码或者身份证输入 错误')
# 销户
def account_cancellation(self):
# 获取输入的卡号
# self.saflok()
cardid = int(input('请输入你需要销户的卡号:'))
userid = input('请输入你需要销户的身份证:')
# 通过卡号获取卡信息
if cardid not in self.cardid_userobj:
print('当前卡号不存在')
# 获取卡对象
cardobj = self.cardid_userobj[cardid].card
if self.__chekpwd(cardobj):
# 验证是否锁卡
if cardobj.is_valid:
print('当前已被锁定,请先解卡')
cardobj.is_valid = True
else:
print(f'您当前卡号为{cardid},余额为{cardobj.money}')
del self.cardid_userobj[cardid]
del self.userid_cardnum[userid]
# print('验证是否锁卡')
# 10 退出
def retrue_card(self):
print('退出')
with open(self.card_url, 'wb+') as fp:
pickle.dump(self.cardid_userobj, fp)
with open(self.user_url, 'wb+') as fp:
pickle.dump(self.userid_cardnum, fp)
# 用户名
def __getusername(self):
while True:
username = input('请输入用户名:')
if not username:
print('输入有误请重新输入')
continue
else:
return username
# 身份证信息
def __getuserid(self):
while True:
userid = input('请输入身份证号:')
if not userid:
print('输入有误请重新输入')
continue
else:
if userid not in self.userid_cardnum and len(userid) == 18:
return userid
#
else:
print(f'当前用户的已经存在或低于18位,卡号为{self.userid_cardnum[userid]},请重新输入身份证')
# self.__getusername()
# 手机号码
def __getphone(self):
# self.__getphone()
while True:
phone = input('请输入手机号码:')
if phone and len(phone) == 11:
return int(phone)
else:
print('输入有误请重新输入(手机号码为11位数)')
continue
# 密码
def __getpassword(self):
while True:
password = input('请输入密码:')
if password and len(password) == 6:
pwd = input('请再次输入密码:')
if len(password) == len(pwd):
return password
else:
print('输入密码有误请重新输入')
else:
print('输入有误请重新输入')
continue
# self.__getpassword(password)
# 检测密码
def __chekpwd(self, cardobj):
num = 3
while True:
# 获取密码,检测密码是否正确
if cardobj.is_valid:
print('你的卡已经被锁了,请先解卡')
break
else:
pwd = input('请输入密码:')
if pwd == cardobj.password:
return True
else:
num = num - 1
if num == 0:
cardobj.is_valid = True
print('你当前的卡被锁定')
return cardobj.is_valid
else:
print(f'密码输入错误,你还有{num}次机会')
# return
# 日志交易功能
def __log(self):
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.warning()
rq = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
# logger.f
log_path = open('./databases/log.txt', 'w', encoding='utf-8')
log_path.write(rq)
log_path.close()
main类
from packages.views import *
from packages.controller import *
class Main(object):
def __init__(self):
# 实例化视图对象
view = Views()
# 实例化控制器对象
con = Controller()
while True:
try:
num = int(input('请输入你需要的操作:'))
# 验证用户是否输入正确
code = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
if num not in code:
print('输入的有误请重新输入')
continue
else:
if num == 1:
con.register()
elif num == 2:
con.query()
elif num == 3:
con.cash()
elif num == 4:
con.deposit()
elif num == 5:
con.transfer()
elif num == 6:
con.saflok()
elif num == 7:
con.unfreezing()
elif num == 8:
con.card_reissue()
elif num == 9:
con.changepwd()
elif num == 10:
con.account_cancellation()
elif num == 0:
con.retrue_card()
break
except Exception as f:
print(f'错误是{f}')
if __name__ == '__main__':
Main()