python——银行自动提款机系统ATM

目录

管理员类Admin()

管理员Admin类最终代码

人类Person

Person类最终代码 

信用卡类Card

Card类最终代码 

ATM类

ATM类最终代码

main()方法

main()方法最终代码

银行自动提款机系统ATM演示效果


要制作一个简单的银行自动改提款机系统,首先要先分析有哪些类,各个类中有什么属性和行为

下面是各个类的设计方向

人
类名:Person
属性:姓名,身份证号,电话号,卡
行为:

卡
类名:Card
属性:卡号,密码,余额
行为:

提款机
类名:ATM
属性:用户字典
行为:开户,查询,取款,存款,转账,改密码,锁定,解锁,补卡,销户

管理员
类名:Admin
属性:
行为:管理员界面,显示界面(功能界面),管理员验证

首先需要先定义一个主函数main(),而这个函数main。然后我使用

if __name__ == "__main__":
    main()

去使得这个main()函数在运行时被调用。

管理员类Admin()

然后可以定义管理员Admin类,因为管理员类中的管理员界面与显示界面都是我们一进程序就要看到的。

管理员界面为一个函数,显示界面为一个函数

#管理员界面
    def AdminView(self):
        print("**********************************************")
        print("*                                            *")
        print("*                                            *")
        print("*               欢迎登录风暴银行              *")
        print("*                                            *")
        print("*                                            *")
        print("**********************************************")

    #功能界面
    def FunctionView(self):
        print("**********************************************")
        print("*           开户(1)     查询(2)          *")
        print("*           取款(3)     存款(4)          *")
        print("*           转账(5)     改密码(6)         *")
        print("*           锁定(7)     解锁(8)          *")
        print("*           补卡(9)     销户(10)         *")
        print("*                   退出(0)                *")
        print("**********************************************")

一旦运行程序我们先看到管理员界面,然后就需要一个管理员的登录函数了,我们可以先设置号管理员的id和密码

使用time类来使得登录成功后延时2秒进入功能界面

    admin = '1'
    passwd = '1'
#管理员验证
    def Check(self):
        inputAdmin = input("请输入管理员账户: ")
        if self.admin != inputAdmin:
            print("账号输入错误!")
            return -1
        inputPasswd = input("请输入管理员密码: ")
        if self.passwd != inputPasswd:
            print("密码输入错误!")
            return -1
        # 能执行到这里说明账号密码输入正确
        print("操作成功,请稍后...")
        time.sleep(2)
        return 0

管理员Admin类最终代码

class Admin(object):
    admin = '1'
    passwd = '1'
    #管理员界面
    def AdminView(self):
        print("**********************************************")
        print("*                                            *")
        print("*                                            *")
        print("*               欢迎登录风暴银行              *")
        print("*                                            *")
        print("*                                            *")
        print("**********************************************")

    #功能界面
    def FunctionView(self):
        print("**********************************************")
        print("*           开户(1)     查询(2)          *")
        print("*           取款(3)     存款(4)          *")
        print("*           转账(5)     改密码(6)         *")
        print("*           锁定(7)     解锁(8)          *")
        print("*           补卡(9)     销户(10)         *")
        print("*                   退出(0)                *")
        print("**********************************************")

    #管理员验证
    def Check(self):
        inputAdmin = input("请输入管理员账户: ")
        if self.admin != inputAdmin:
            print("账号输入错误!")
            return -1
        inputPasswd = input("请输入管理员密码: ")
        if self.passwd != inputPasswd:
            print("密码输入错误!")
            return -1
        # 能执行到这里说明账号密码输入正确
        print("操作成功,请稍后...")
        time.sleep(2)
        return 0

运行效果如下:

管理员界面

ATM系统功能界面 

人类Person

人这个类的定义就相对要简单一些,因为人的行为可以使用ATM取款机的行为来替代,所以人class只需要定义四个属性姓名,身份证号,电话号,卡 就足够了

Person类最终代码 

class Person(object):
    def __init__(self,name,idCard,phone,card):
        self.name = name  #用户名字
        self.idCard = idCard  #用户身份证
        self.phone = phone   #用户电话
        self.card = card  #用户的信用卡

信用卡类Card

信用卡这个类的定义也比较简单,信用卡只有三个属性卡号,密码,余额。但是在ATM机的行为中,需要对信用卡进行锁定,所以需要多添加一个锁定属性来判断信用卡是否被锁定。

Card类最终代码 

class Card(object):
    def __init__(self,cardid,cardpasswd,cardmoney):
        self.cardid = cardid  #信用卡号
        self.cardpasswd = cardpasswd  #信用卡密码
        self.cardmoney = cardmoney  #卡内余额
        self.cardlock = False  #是否被锁定

人与卡之间的关系为:

ATM类

在ATM类中,我把每个用户的所有数据存入字典当中,比如开户行为,目标就是向用户字典中添加一对键值对(卡号-用户)。

当然,除了我所要求的ATM机的功能行为外,还需要额外创建两个方法随机生成卡号和验证密码,因为这两个方法经常被使用,为了提高程序的复用性,我将这两个方法单独写了出来

ATM类最终代码

class ATM(object):
    def __init__(self,allusers):
        # 存储所有用户的信息,用字典
        self.allUsers = allusers

    #创建用户
    def CreatUser(self):
        #目标:向用户字典中添加一对键值对(卡号-用户)
        name = input("请输入您的姓名:")
        idCard = input("请输入您的身份证号:")
        phone = input("请输入您的电话号码:")
        preMoney = int(input("请输入您的预存款金额:"))
        if preMoney < 0:
            print("预存款输入有误,开户失败......")
            return -1
        #设置密码
        onePasswd = input("请输入密码:")
        #验证密码
        if not self.checkPasswd(onePasswd):
            print("密码输入有误,开户失败......")
            return -1
        #信息收集完成
        #生成卡号
        cardId = self.creatCardId()

        card = Card(cardId,onePasswd,preMoney)
        user = Person(name,idCard,phone,card)
        #user存到字典
        self.allUsers[cardId] = user
        print("开户成功,请牢记卡号(%s)......" % cardId)

    #查询余额
    def searchUserInfo(self):
        cardnum = input("请输入您的卡号:")
        #验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        #判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        #验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        #查询成功,输出结果
        print("账户:%s     余额:%d" % (user.card.cardid,int(user.card.cardmoney)))
    #取款
    def getMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        getmoney = int(input("请输入您取款金额:"))
        nowmoney = int(user.card.cardmoney)
        if getmoney > nowmoney:
            print("余额不足,取款失败......")
            return -1
        nowmoney -= getmoney
        user.card.cardmoney = nowmoney
        print("取款成功,您目前余额为:%d" % user.card.cardmoney)
    #存款
    def saveMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        savemoney = int(input("请输入您存款金额:"))
        nowmoney = int(user.card.cardmoney)
        nowmoney += savemoney
        user.card.cardmoney = nowmoney
        print("取款成功,您目前余额为:%d" % user.card.cardmoney)
    #转账
    def transferMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        # 查询成功,输出结果
        print("账户:%s     余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
        tocardid = input("请输入您希望转账的账户:")
        # 验证是否存在该卡号
        usertoid = self.allUsers.get(tocardid)
        if not usertoid:
            print("该卡号不存在,查询失败......")
            return -1
        tomoney = int(input("请输入您希望转账的金额:"))
        nowmoney = int(user.card.cardmoney)
        tonowmoney = int(usertoid.card.cardmoney)
        if tomoney > nowmoney:
            print("余额不足,转账失败......")
            return -1
        nowmoney -= tomoney
        tonowmoney += tomoney
        user.card.cardmoney = nowmoney
        usertoid.card.cardmoney = tonowmoney
        print("转账成功,您目前余额为:%d" % user.card.cardmoney)

    #改密码
    def changePasswd(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        newpasswd = input("请输入新密码:")
        newpasswd2 = input("请确认新密码:")
        if newpasswd != newpasswd2:
            print("两次密码输入不一致,密码修改失败")
            return -1
        user.card.cardpasswd = newpasswd
        print("密码修改成功......")
    #锁定
    def lockUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        if user.card.cardlock:
            print("该卡已经被锁定,请结束后再使用其他功能")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误......")
            return -1
        #锁定
        user.card.cardlock = True
        print("锁定成功......")
    #解锁
    def unlockUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,解锁失败......")
            return -1
        if not user.card.cardlock:
            print("该卡没有锁定,无需解锁......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,解锁失败......")
            return -1
        temid = input("请输入您的身份证号:")
        if temid != user.idCard:
            print("身份证号输入错误,解锁失败......")
            return -1
        #解锁
        user.card.cardlock = False
        print("解锁成功......")

    #补卡
    def newCard(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误......")
            return -1
        #重新生成卡号
        newcard = self.creatCardId()
        user.card.cardid = newcard
        print("补卡办理成功,这是您的新卡号:%s" % user.card.cardid)
    #销户
    def killUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,销户失败......")
            return -1
        self.allUsers.pop(cardnum)
        print("该账户已经被销户......")

    #验证密码,循环三次没有正确就输出错误
    def checkPasswd(self,realPasswd):
        for i in range(3):
            temPasswd = input("请确认密码:")
            if temPasswd == realPasswd:
                return True
        return False

    #随机生成卡号
    def creatCardId(self):
        #验证密码是否重复
        while True:
            str = ""
            for i in range(6):
                ch = chr(random.randrange(ord('0'),ord('9')+1))
                str += ch
            #判断是否重复
            if not self.allUsers.get(str):
                return str

main()方法

在main方法中,因为ATM系统功能界面所示,将进行功能选择,所以使用了if...elif...的方式来输入1....10进行功能的选择,并且在0退出之后,将字典保存入txt文本中

可以先创建一个userinfo.txt文本,先输入一次字典的数值

#提款机对象
    filepath = "userinfo.txt"
    f = open(filepath,"rb")
    allusers = pickle.load(f)
    #allusers = {}
    #print(allusers)
    atm = ATM(allusers)

因为使用二进制存和读取,所以存入文本中的效果如下:

main()方法最终代码

def main():
    #界面对象
    admin = Admin()

    #管理员开机
    admin.AdminView()
    if admin.Check():
        return -1

    #提款机对象
    filepath = "userinfo.txt"
    f = open(filepath,"rb")
    allusers = pickle.load(f)
    #allusers = {}
    #print(allusers)
    atm = ATM(allusers)


    while True:
        admin.FunctionView()
        #等待用户操作
        option = input("请输入您的操作:")
        if option == '1':
            #开户
            atm.CreatUser()
        elif option == '2':
            #查询
            atm.searchUserInfo()
        elif option == '3':
            #取款
            atm.getMoney()
        elif option == '4':
            #存款
            atm.saveMoney()
        elif option == '5':
            #转账
            atm.transferMoney()
        elif option == '6':
            #改密码
            atm.changePasswd()
        elif option == '7':
            #锁定
            atm.lockUser()
        elif option == '8':
            #解锁
            atm.unlockUser()
        elif option == '9':
            #补卡
            atm.newCard()
        elif option == '10':
            #销户
            atm.killUser()
        elif option == '0':
            #退出
            if not admin.Check():
                # 将当前系统中的用户信息保存到文件中
                f = open(filepath,"wb")
                pickle.dump(atm.allUsers,f)
                f.close()
                return -1


        time.sleep(2)

银行自动提款机系统ATM演示效果

********************************************************************************************************************************************

********************************************************************************************************************************************

功能1:开户成功

********************************************************************************************************************************************

开户失败1:输入的预存款金额小于0

开户失败2:确认信用卡密码时三次输入都失败

********************************************************************************************************************************************

功能2:查询成功,查询之间开户成功的信用卡

********************************************************************************************************************************************

查询失败1:卡号输入错误

查询失败1:密码输入错误,然后该信用卡将被锁定

********************************************************************************************************************************************

功能8:信用卡解锁

一旦信用卡被锁定,该信用卡将不能执行其他的功能操作,除注销这张信用卡和解锁信用卡

 成功解锁

解锁成功之后就可以进行其他功能的操作了 

********************************************************************************************************************************************

功能3:取款

一旦取款输入密码错误,信用卡也将锁定 

********************************************************************************************************************************************

功能4:存款,存款与取款类似

********************************************************************************************************************************************

功能5:转账,转账需要两个账户,由一个账户转资金到另一个账户

所以再创建一个新的账户

将086828账户中的资金转600到新创建的605989账户中

查询被转的账户 605989

如果输入的被转账户不存在,将会报错

 ********************************************************************************************************************************************

功能6:可以修改账户的信用卡密码,需要输入原密码

在查询或其他功能中就能用新密码了

********************************************************************************************************************************************

功能7:锁定,就是与密码连续三次输错一样,信用卡将被锁定住,不能使用其他功能

********************************************************************************************************************************************

功能10:销户,销户功能不受锁定影响

现在已经没有086828这个账户了 

********************************************************************************************************************************************

按0之后,输入管理员的id和密码就能退出系统,并将字典中的信息保存入txt文本

********************************************************************************************************************************************

一起学习,一起进步 -.- ,如有错误,可以发评论 

猜你喜欢

转载自blog.csdn.net/qq_36171287/article/details/92633947