python的银行管理系统

一、功能模块图

二、代码

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.输入功能不正确截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值