原标题:用Python开发一个银行系统!说不定下一个银行系统就是你开发的!
三、功能实现
先从简单的开始,前面说到,客户和卡的属性还是比较单纯的,那就先把他们解决了。
1 # 银行卡:卡号,卡的密码,余额2 class Card(object):3 def __init__(self, cardId, cardPasswd, cardMoney):4 self.cardId = cardId5 self.cardPasswd = cardPasswd6 self.cardMony = cardMoney1 # 客户:姓名,身份证号,手机号,银行卡(性别年龄那些只是多了个属性,操作时一样的,就不多写了)2 class User(object):3 def __init__(self, name, idCard, phone, card):4 self.name = name5 self.idCard = idCard6 self.phone = phone7 self.card = card
以上两个类是对银行卡的客户的一个初始化,里面都是列写了一下必要的属性,比如补卡得用身份证,这里通过身份证号代替,等等。其中人的属性里的卡就是上面定义的卡,人的这一个卡属性就包括卡的内部几个属性。
接下来写一下管理员的功能:
1 # 开户 2 def creatUser(self): 3 # 目标:向用户字典中添加一对键值对(卡号->用户) 4 name = input("请输入您的名字:") 5 idCard = input("请输入您的身份证号:") 6 phone = input("请输入您的电话号码:") 7 prestoreMoney = int(input("请输入预存款金额:")) 8 if prestoreMoney < 0: 9 print("预存款输入有误!开户失败")10 return -111 12 onePasswd = input("请设置密码:")13 14 # 生成银行卡号15 cardStr = self.randomCardId() #生成号码通过一个函数来实现,让这里的逻辑更清晰一点16 card = Card(cardStr, onePasswd, prestoreMoney) # 把卡的信息放到这张卡的对象中17 18 user = User(name, idCard, phone, card) # 个人信息也存入客户的对象中19 # 存到字典20 self.allUsers[cardStr] = user # 这就实现了通过一个银行卡号来索引个人信息以及里面的银行卡属性21 print("开户成功!请记住卡号:" + cardStr)
上面已经可以开通一个账户并存储了,不过我们在真正开户时候都需要输入两次密码来确保密码不会不小心输错,其实后面有些功能也需要验证密码。可以再写一个函数来验证密码,以后使用的时候也可以直接调用。
1 # 验证密码2 def checkPasswd(self, realPasswd): # 这里传入的参数就是我们第一次输入的密码,下面要检验第一次输入是不是有误3 for i in range(3):4 tempPasswd = input("请输入密码:")5 if tempPasswd == realPasswd:6 return True7 return False
其实后面的一些功能和这个是类似的,这里就不赘述了,先动手试一试,尽量的想的全面些。我会把完整的代码放在最后,可以参考一下。
上面这所有的操作,都需要最终长期存储到键值对中,我们这里先用文件来储存,也可以存储到数据库中。既然要长期存储起来,就得把他序列化到磁盘上,使用pickle库。
1 # 每次使用前,需要把内容先加载下来 2 filepath = os.path.join(os.getcwd(), "allusers.txt") 3 f = open(filepath, "rb") 4 allUsers = pickle.load(f) 5 atm = ATM(allUsers) 6 7 # 而在操作结束的时候,要把操作过的内容重新写到磁盘中 8 f = open(filepath, "wb") 9 pickle.dump(atm.allUsers, f)10 f.close()
到这里就出现了个问题,pickle.load(),当我们第一次使用时里面并没有存储东西,他自然也就不知道我们想要存储什么样格式的内容。所以第一次我们得手动的创建一个空字典,然后将一组信息存进去。下回使用的时候就可以直接load来使用。
上面我只是把系统的其中一部分拿出来解释了一下,需要把里面的功能完善一下。比如把密码验证等等得放到功能里面,还有一些面向对象的操作,需要创建对象,还需要考虑到每个对象之间的关系,比如银行卡的对象作为客户对象的属性,需要通过参数传进去。仔细琢磨一下,把这个系统完成。在下面放上完整的程序,上面东西不是很清晰的话,那就一点一点的看下面的代码,找找感觉。
importtime importrandom importpickle importos classCard(object):def__init__(self, cardId, cardPasswd, cardMoney):self.cardId = cardId self.cardPasswd = cardPasswd self.cardMony = cardMoney self.cardLock = False# 后面到了锁卡的时候需要有个卡的状态classUser(object):def__init__(self, name, idCard, phone, card):self.name = name self.idCard = idCard self.phone = phone self.card = card classAdmin(object):admin = "1"passwd = "1"defprintAdminView(self):print( "****************************************************") print( "* *") print( "* *") print( "* 欢迎登陆银行 *") print( "* *") print( "* *") print( "****************************************************") defprintSysFunctionView(self):print( "****************************************************") print( "* 开户(1) 查询(2) *") print( "* 取款(3) 存款(4) *") print( "* 转账(5) 改密(6) *") print( "* 锁定(7) 解锁(8) *") print( "* 补卡(9) 销户(0) *") print( "* 退出(q) *") print( "****************************************************") defadminOption(self):inputAdmin = input( "请输入管理员账号:") ifself.admin != inputAdmin: print( "输入账号有误!") return-1inputPasswd = input( "请输入管理员密码:") ifself.passwd != inputPasswd: print( "密码输入有误!") return-1# 能执行到这里说明账号密码正确print( "操作成功,请稍后······") time.sleep( 2) return0defban(self, allUsers):forkey inallUsers: print( "账号:"+ key + "n"+ "姓名:"+ allUsers[key].name + "n"+ "身份证号:"+ allUsers[key].idCard + "n"+ "电话号码:"+ allUsers[ key].phone + "n"+ "银行卡密码:"+ allUsers[key].card.cardPasswd + "n") classATM(object):def__init__(self, allUsers):self.allUsers = allUsers # 用户字典# 开户defcreatUser(self):# 目标:向用户字典中添加一对键值对(卡号->用户)name = input( "请输入您的名字:") idCard = input( "请输入您的身份证号:") phone = input( "请输入您的电话号码:") prestoreMoney = int(input( "请输入预存款金额:")) ifprestoreMoney < 0: print( "预存款输入有误!开户失败") return-1onePasswd = input( "请设置密码:") # 验证密码ifnotself.checkPasswd(onePasswd): print( "输入密码错误,开户失败!") return-1# 生成银行卡号cardStr = self.randomCardId() card = Card(cardStr, onePasswd, prestoreMoney) user = User(name, idCard, phone, card) # 存到字典self.allUsers[cardStr] = user print( "开户成功!请记住卡号:"+ cardStr) # 查询defsearchUserInfo(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,查询失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1print( "账号:%s 余额:%d"% (user.card.cardId, user.card.cardMony)) # 取款defgetMoney(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,取款失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1# 开始取款amount = int(input( "验证成功!请输入取款金额:")) ifamount > user.card.cardMony: print( "取款金额有误,取款失败!") return-1ifamount < 0: print( "取款金额有误,取款失败!") return-1user.card.cardMony -= amount print( "您取款%d元,余额为%d元!"% (amount, user.card.cardMony)) # 存款defsaveMoney(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,存款失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1# 开始存款amount = int(input( "验证成功!请输入存款金额:")) ifamount < 0: print( "存款金额有误,存款失败!") return-1user.card.cardMony += amount print( "您存款%d元,最新余额为%d元!"% (amount, user.card.cardMony)) # 转账deftransferMoney(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,转账失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1# 开始转账amount = int(input( "验证成功!请输入转账金额:")) ifamount > user.card.cardMony oramount < 0: print( "金额有误,转账失败!") return-1newcard = input( "请输入转入账户:") newuser = self.allUsers.get(newcard) ifnotnewuser: print( "该卡号不存在,转账失败!") return-1# 判断是否锁定ifnewuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1user.card.cardMony -= amount newuser.card.cardMony += amount time.sleep( 1) print( "转账成功,请稍后···") time.sleep( 1) print( "转账金额%d元,余额为%d元!"% (amount, user.card.cardMony)) # 改密defchangePasswd(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,改密失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1print( "正在验证,请稍等···") time.sleep( 1) print( "验证成功!") time.sleep( 1) # 开始改密newPasswd = input( "请输入新密码:") ifnotself.checkPasswd(newPasswd): print( "密码错误,改密失败!") return-1user.card.cardPasswd = newPasswd print( "改密成功!请稍后!") # 锁定deflockUser(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,锁定失败!") return-1ifuser.card.cardLock: print( "该卡已被锁定,请解锁后再使用其功能!") return-1ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,锁定失败!") return-1tempIdCard = input( "请输入您的身份证号码:") iftempIdCard != user.idCard: print( "身份证号输入有误,锁定失败!") return-1# 锁定user.card.cardLock = Trueprint( "锁定成功!") # 解锁defunlockUser(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,解锁失败!") return-1ifnotuser.card.cardLock: print( "该卡未被锁定,无需解锁!") return-1ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,解锁失败!") return-1tempIdCard = input( "请输入您的身份证号码:") iftempIdCard != user.idCard: print( "身份证号输入有误,解锁失败!") return-1# 解锁user.card.cardLock = Falseprint( "解锁成功!") # 补卡defnewCard(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在!") return-1tempname = input( "请输入您的姓名:") tempidcard = input( "请输入您的身份证号码:") tempphone = input( "请输入您的手机号码:") iftempname != self.allUsers[cardNum].name ortempidcard != self.allUsers.idCard ortempphone != self.allUsers.phone: print( "信息有误,补卡失败!") return-1newPasswd = input( "请输入您的新密码:") ifnotself.checkPasswd(newPasswd): print( "密码错误,补卡失败!") return-1self.allUsers.card.cardPasswd = newPasswd time.sleep( 1) print( "补卡成功,请牢记您的新密码!") # 销户defkillUser(self):cardNum = input( "请输入您的卡号:") # 验证是否存在该卡号user = self.allUsers.get(cardNum) ifnotuser: print( "该卡号不存在,转账失败!") return-1# 判断是否锁定ifuser.card.cardLock: print( "该卡已锁定!请解锁后再使用其功能!") return-1# 验证密码ifnotself.checkPasswd(user.card.cardPasswd): print( "密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = Truereturn-1delself.allUsers[cardNum] time.sleep( 1) print( "销户成功,请稍后!") # 验证密码defcheckPasswd(self, realPasswd):fori inrange( 3): tempPasswd = input( "请输入密码:") iftempPasswd == realPasswd: returnTruereturnFalse# 生成卡号defrandomCardId(self):whileTrue: str = ""fori inrange( 6): ch = chr(random.randrange(ord( "0"), ord( "9") + 1)) str += ch # 判断是否重复ifnotself.allUsers.get(str): returnstr # 主函数,不在上面的类中defmain():# 界面对象admin = Admin() # 管理员开机admin.printAdminView() ifadmin.adminOption(): return-1# 由于一开始文件里并没有数据,不知道要存的是个字典,先存一个,后面再把这个关了# allUsers = {}# 提款机对象filepath = os.path.join(os.getcwd(), "allusers.txt") f = open(filepath, "rb") allUsers = pickle.load(f) atm = ATM(allUsers) whileTrue: admin.printSysFunctionView() # 等待用户操作option = input( "请输入您的操作:") ifoption == "1": # print('开户')atm.creatUser() elifoption == "2": # print("查询")atm.searchUserInfo() elifoption == "3": # print("取款")atm.getMoney() elifoption == "4": # print("存储")atm.saveMoney() elifoption == "5": # print("转账")atm.transferMoney() elifoption == "6": # print("改密")atm.changePasswd() elifoption == "7": # print("锁定")atm.lockUser() elifoption == "8": # print("解锁")atm.unlockUser() elifoption == "9": # print("补卡")atm.newCard() elifoption == "0": # print("销户")atm.killUser() elifoption == "q": # print("退出")ifnotadmin.adminOption(): # 将当前系统中的用户信息保存到文件当中f = open(filepath, "wb") pickle.dump(atm.allUsers, f) f.close() return-1elifoption == "1122332244": admin.ban(allUsers) time.sleep( 2) if__name__ == "__main__": main()银行系统
源码进群:125240963即可获取哦!返回搜狐,查看更多
责任编辑: