一、功能模块图
二、代码
import random #用来随机产生卡号
import pickle #序列化,用来存放和取出产生的用户数据
import os #产生文件
import re #正则表达式,用来判断身份证和手机号,其他地方也可以使用
def welcomeView():
print("*" * 51)
print("***", " " * 42, " ***")
print("***", " " * 12, "欢迎进入银行管理系统", " " * 9, "***")
print("***", " " * 42, " ***")
print("*" * 51)
def functionView(): #菜单
print("*" * 51)
print("***", " " * 42, " ***")
print("***\t1.开户(1)", " " * 12, "2.查询(2)\t***")
print("***\t3.取款(3)", " " * 12, "4.存款(4)\t***")
print("***\t5.转账(5)", " " * 12, "6.修改密码(6)\t***")
print("***\t7.锁卡(7)", " " * 12, "8.解锁(8)\t***")
print("***\t 0.退出(0) \t***")
print("***", " " * 42, " ***")
print("*" * 51)
class Card:
def __init__(self,cardId,password,money,isclok=1):
self.cardId=cardId
self.password=password
self.money=money
self.isclok=isclok
class User(Card):
def __init__(self,username,phone,uid,card):
self.username=username
self.phone=phone
self.uid=uid
self.user_card=card #User继承Card对象
class Bank(User): #Bank 继承User,Bank是序列化的对象,所以将其变为字典
def __init__(self,user):
self.cardId=user.user_card.cardId
self.user=user
self.users={self.cardId:self.user} #键,卡号 :值,User对象
def generate_cardid(): #产生卡号
list=[]
for i in range(0,11):
n=random.randint(0,9)
n=str(n)
list.append(n)
# str="".join(list)
return list
def create_user(): #功能1:开户
username=input("请输入姓名:")
while True:
uid=input("请输入身份证:")
realut=re.fullmatch("\d{17}[\d,X]",uid) #正则判断身份证是否合理
if realut:
uid=realut.group()
break
else:
print("身份证格式不正确,请重新输入!")
continue
while True:
phone=input("请输入手机号码:")
realut = re.fullmatch("1\d{10}", phone) #正则判断手机号是否合理,其他需要判断的地方都可以判断,我就不再使用了
if realut:
phone=realut.group()
# print(phone)
break
else:
print("手机号码格式错误,请重新输入!")
continue
while True:
password1=input("请输入6位数字密码:")
password2=input("再次输入6位数字密码确认:")
if len(password1)==6 and len(password2)==6:
if password1==password2:
password=password1
break
else :
print("两次密码不同,请重新输入!")
continue
else:
print("格式不合法,请重新输入:")
continue
money=int(input("请您输入您的预存金额:"))
list=generate_cardid() #得到卡号列表
cardId="".join(list) #将卡号变成字符串,字符串的卡号才能做成键
print(' 开户成功! ')
print(f"您的卡号为:{cardId}")
print(f"您的卡余额为:{money}")
card=Card(cardId,password,money)
user=User(uid,username,phone,card)
bank=Bank(user) #产生bank对象
with open(f"data\\{cardId}.txt","ab") as file_w: #重点:创建一个文件夹data来存放产生的bank对象,每个对象根据卡号产生一个txt文件,用来存放用户的所有数据
pickle.dump(bank,file_w) #将bank 序列化保存到文档中
def select_user(user_cardId): # 功能2:查询
if user_login(user_cardId):
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
print("查询成功,您的余额为:",u_data.user.user_card.money)
def user_login(user_cardId): #用户登录
if os.path.exists(f"data\\{user_cardId}.txt"):
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r) #根据卡号取出txt文档,反序列化取出数据
if u_data.user.user_card.isclok==0:
print("您的卡号已被锁,请先解锁:")
else:
if u_data.cardId == user_cardId: #u_data是一个字典,键是卡号,值是user对象
n = 1
while True:
if n <= 3:
user_pw = input("请输入密码:")
if u_data.user.user_card.password == user_pw:
return True
else:
print("密码错误!")
n+=1
continue
else:
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
u_data.user.user_card.isclok=0
print("三次输入密码错误,该卡已被锁!")
return
else:
print("正在返回功能页面...")
def save_money(user_cardId): # 功能4:存款
if user_login(user_cardId): #如果注册成功
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
print("您的余额为:",u_data.user.user_card.money)
money=int(input("请您输入存钱金额:"))
if money<0:
print('输入格式错误')
else:
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
u_data.user.user_card.money=u_data.user.user_card.money+money
print("存钱成功,您的余额为:",u_data.user.user_card.money)
with open(f"data\\{user_cardId}.txt", "wb") as file_w: #这里要用wb,而不是ab,改变数据后,需要覆盖原来的数据,而不是添加
pickle.dump(u_data, file_w)
def withdraw_money(user_cardId): # 功能3:取款
if user_login(user_cardId):
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
print("您的余额为:",u_data.user.user_card.money)
money=int(input("请您输入取款金额:"))
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
if money>u_data.user.user_card.money:
print("余额不足")
elif money<0:
print("输入格式错误")
else:
u_data.user.user_card.money=u_data.user.user_card.money-money
print("取款成功,您的余额为:", u_data.user.user_card.money)
with open(f"data\\{user_cardId}.txt", "wb") as file_w:
pickle.dump(u_data, file_w)
def transfer_accounts(user_cardId): #功能5:转账
if user_login(user_cardId):
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
print("您的余额为:",u_data.user.user_card.money)
while True:
money = int(input("请您转账金额:"))
if money > u_data.user.user_card.money:
print("余额不足")
break
elif money<0:
print("输入格式错误")
break
else:
cardId=int(input("请您对方卡号:"))
if os.path.exists(f"data\\{cardId}.txt"): #如果对方卡号存在
u_data.user.user_card.money = u_data.user.user_card.money - money #自己的money减
print("您的余额为:", u_data.user.user_card.money)
with open(f"data\\{user_cardId}.txt", "wb") as file_w:
pickle.dump(u_data, file_w)
with open(f"data\\{cardId}.txt", "rb") as file_r1: #根据对方的卡号进行查找对方的数据
u_data1 = pickle.load(file_r1)
with open(f"data\\{cardId}.txt", "wb") as file_w1:
u_data1.user.user_card.money = u_data1.user.user_card.money + money #对方money加
pickle.dump(u_data1, file_w1)
print("转账成功")
break
else:
print("该用户不存在")
break
def isclo(user_cardId): #功能7:锁卡
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"): #如果对方卡号存在
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
mima=input("请输入密码:")
if mima==u_data.user.user_card.password:
if u_data.user.user_card.isclok==0:
print("您的卡号已被锁,无需再锁卡")
elif u_data.user.user_card.isclok==1:
print("正在锁定银行卡,请稍等...")
u_data.user.user_card.isclok=0
print("您的卡号锁定成功!")
else:
print("密码错误,退出!")
else:
print("解锁失败,原因:没有此账号,正在返回功能页面...")
def unisclo(user_cardId): #功能8:解卡
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"): #如果对方卡号存在
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
mima=input("请输入密码:")
if mima==u_data.user.user_card.password:
if u_data.user.user_card.isclok==0:
print("正在锁定银行卡,请稍等...")
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
u_data.user.user_card.isclok=1
print("您的卡号解锁成功!")
elif u_data.user.user_card.isclok==1:
print("您的卡号已解锁状态,无需再解锁!")
else:
print("密码错误,已退出!")
else:
print("解锁失败,原因:没有此账号,正在返回功能页面...")
def update_password(user_cardId): # 功能6:修改密码
if user_login(user_cardId):
while True:
pw1=input("请输入6位数新密码:")
pw2=input("请再次输入6位数新密码:")
if len(pw1)==6 and len(pw2)==6:
if pw1==pw2:
with open(f"data\\{user_cardId}.txt", "rb") as file_r:
u_data = pickle.load(file_r)
u_data.user.user_card.password=pw1
with open(f"data\\{user_cardId}.txt", "wb") as file_w:
pickle.dump(u_data, file_w)
print("新密码修改成功,正在返回功能界面...")
break
else :
print("两次密码不同,请重新输入!")
continue
else:
print("格式不合法,请重新输入:")
continue
while True:#主程序
welcomeView()
functionView()
x = input("请选择需要的操作输入(0-8)对应的数字功能:")
if x=="0": #退出
break
elif x=="1": #开户
create_user()
continue
elif x=="2": #查询
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"):
select_user(user_cardId)
continue
else:
print("查询失败,原因:没有此账号,正在返回功能页面...")
elif x=="3": #取款
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"):
withdraw_money(user_cardId)
continue
else:
print("取款失败,原因:没有此账号,正在返回功能页面...")
elif x=="4": #存款
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"):
save_money(user_cardId)
continue
else:
print("存款失败,原因:没有此账号,正在返回功能页面...")
elif x=="5": #转账
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"):
transfer_accounts(user_cardId)
continue
else:
print("转账失败,原因:没有此账号,正在返回功能页面...")
elif x=="6": #修改密码
user_cardId=input("请输入您的账号:")
if os.path.exists(f"data\\{user_cardId}.txt"):
update_password(user_cardId)
continue
else:
print("修改密码失败,原因:没有此账号,正在返回功能页面...")
elif x=="7": #锁卡
isclo(user_cardId)
continue
elif x=="8": #解锁
unisclo(user_cardId)
continue
else: #数字不对
print("输入错误,请重新输入功能:")
continue
三、效果截图
1.菜单截图:
2.功能1截图:
3.功能2截图:
(1)输入错误:
(2)输入正确:
4.功能3截图:
(1)输入错误:
(2)输入正确:
5.功能4截图:
(1)输入错误:
(2)输入正确:
6.功能5截图:
(1)输入不正确:
(2)输入正确:
7.功能6截图:
(1)输入不正确:
(2)输入正确:
8.功能7截图:
(1)输入错误:
(2)输入正确:
9.功能8截图:
(1)输入错误:
(2)输入正确:
10.功能0截图:
11.输入功能不正确截图: