이 글의 내용은 실용적인 소규모 프로젝트의 뱅킹 시스템 구현을 파이썬으로 소개하는 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
우리 모두 알고 있듯이 프로그래밍 과정에서 이론적 지식이 아무리 풍부하더라도 프로젝트의 연금석을 통과해야 합니다. 제 견습생이 작업한 소규모 프로젝트의 실제 요구 사항을 보여 드리겠습니다. 그것은 은행 시스템을 구축하는 것이었습니다. 우리가 사업을 위해 은행에 갈 때 이제 대부분의 사업은 셀프 서비스 ATM 기계가 있을 것입니다. 그에 의해 해결되었습니다. 먼저 객체 지향적 사고를 사용하여 이 시스템을 구현하는 방법에 대해 스스로 생각해 보십시오. 어떤 물건이 있나요? 각각의 기능은 무엇입니까? 생각을 많이 할수록 좋은데, 구현을 하다 보면 문제가 생기고 해결이 쉽지 않습니다. 하지만 이 과정을 통해 새로운 것을 배울 수 있습니다.
먼저 은행 문으로 들어가면 직원이 어떤 업무를 처리해야 하는지 물어볼 것입니다. 사실을 말씀드리지만, 시스템과는 아무런 관련이 없습니다(* ̄︶ ̄). 다음으로, 처리할 사업이 비교적 인기가 있고 기계로 완료할 수 있다면 그녀는 우리를 거대하고 작은 기계로 데려갈 것입니다. 기계가 우리를 위해 작동하도록 하려면 여전히 몇 가지 작업이 필요합니다. 때때로 우리는 상급 직원에게 지문을 입력하도록 요청할 수 있습니다. 우리는 이것을 관리자가 시스템을 시작하는 것으로 이해할 수 있습니다(어떤 사람들은 그것이 너무 번거롭다고 생각합니다. 주로 제가 여기서 말하는 것은 단지 단순한 ATM이 아니라 상대적으로 완전한 기능을 갖춘 은행에 있는 것들입니다).
다음으로 사업을 처리할 차례입니다. 어떤 종류의 사업이 있나요? 먼저 몇 가지를 나열해 보겠습니다. 잔액 확인, 입금, 출금, 이체, 비밀번호 변경, 분실 신고 및 카드 잠그기 등이 가능하며, 이에 따라 가장 기본적인 작업을 어떻게 수행할 수 있는지 잊어버렸습니다. 카드를 신청하지 않고 계좌를 개설하는 경우에도 카드교체, 계좌해지 등이 포함되어야 합니다.
현 시점에서는 실제 상황에 비해 실물 카드가 없어 약간의 차이가 있을 수 있습니다. 나머지 과정은 생각나는대로 이야기하겠습니다.
구현해야 할 기능은 대략적으로 결정했지만 결국 코드를 작성해야 하므로 이를 고려해야 합니다. 프로그래밍 관점에서 요구 사항.
우선 사람부터 은행 ATM까지 이 시스템에 어떤 객체가 있는지 고려해야 합니다. 사람, 은행카드, ATM기 이 세 가지는 꼭 필요한 것인데, 사업을 시작할 때 많은 업무를 도와주는 사람은 우리의 사용자와 다릅니다.
사람. 인간 개체는 어떤 속성을 가지고 있습니까? 사람들은 자신만의 정보와 은행카드를 갖고 있고, 우리는 나머지 처리할 업무를 인위적으로 결정합니다.
카드. 카드에는 카드 자체에 대한 몇 가지 정보도 있습니다.
ATM. ATM 기계에는 더 많은 기능이 있습니다. 우선, 위에 나열된 입출금 기능을 구현해야 합니다. 게다가 그에 대한 직원의 수술도 있는데, 그 역시 처리해야 한다.
직원. 시스템을 켜고 끌 수 있는 권한이 있습니다.
이제 대략적인 방향이 잡혔으니 나머지는 조금씩 완성해가는 것뿐입니다.
앞서 언급했듯이 고객과 카드의 속성은 비교적 간단하므로 먼저 해결해 보겠습니다.
# 银行卡:卡号,卡的密码,余额 class Card(object): def __init__(self, cardId, cardPasswd, cardMoney): self.cardId = cardId self.cardPasswd = cardPasswd self.cardMony = cardMoney
# 客户:姓名,身份证号,手机号,银行卡(性别年龄那些只是多了个属性,操作时一样的,就不多写了) class User(object): def __init__(self, name, idCard, phone, card): self.name = name self.idCard = idCard self.phone = phone self.card = card
위의 두 클래스는 은행 카드 고객을 위한 초기화입니다. 예를 들어 카드를 대체하려면 ID 카드를 사용해야 합니다. 번호 등 잠깐만요. 그 중 인물 속성에 있는 카드는 위에서 정의한 카드이고, 인물 카드 속성에는 카드의 여러 내부 속성이 포함되어 있다.
다음으로 관리자 기능을 작성합니다.
import time class Admin(object): # 为管理员设置个账号密码,为了不随便让人能操作一些危险的内容。 admin = "1" passwd = "1" # 我们把初始的界面就放在管理员的类里了,他是第一个操作这个机器的嘛 def printAdminView(self): print("****************************************************") print("* *") print("* *") print("* 欢迎登陆银行 *") print("* *") print("* *") print("****************************************************") def printSysFunctionView(self): print("****************************************************") print("* 开户(1) 查询(2) *") print("* 取款(3) 存款(4) *") print("* 转账(5) 改密(6) *") print("* 锁定(7) 解锁(8) *") print("* 补卡(9) 销户(0) *") print("* 退出(q) *") print("****************************************************") # 这里就是开始时候得验证一下是不是管理员,然后再决定是不是给他这些权利 def adminOption(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
위 코드에는 time.sleep()이 있습니다. 이는 시스템을 더욱 활성화하고 지연을 설정하기 위한 것입니다. , 대용량 데이터를 처리할 때 시스템 작동 지연을 시뮬레이션합니다.
처음 몇 가지는 비교적 이해하기 쉽습니다. 이제 시스템 기능을 구현하기 시작합니다. 이는 ATM 기계의 모듈에 배치되며 필요한 경우 전략을 수정하고 추가할 수 있습니다.
위 디렉터리의 순서에 따라 가장 먼저 구현되는 기능은 계좌 개설입니다. 계좌를 개설하려면 일련의 속성을 생성해야 합니다. 그리고 이 정보를 저장해야 합니다. 그렇지 않으면 다음에 올 때 신청한 카드가 더 이상 유효하지 않다는 것을 알게 될 것입니다. 이 정보는 키-값 쌍을 사용하여 저장할 수 있으므로 키에 어떤 속성을 사용해야 합니다. 생각해 보세요, 이름: 중복된 이름이 있을 수 있습니다. ID 번호: 이 사람은 두 개 이상의 카드를 신청할 수 있습니다. 가장 안전한 것은 카드 번호입니다. 동일한 번호의 카드가 두 개는 없습니다. 그러면 카드번호가 키로 사용되며 기타 개인정보, 은행카드 정보 등이 해당 값에 저장됩니다. 이제 ATM에서 사전을 초기화합니다(여기에는 여전히 몇 가지 문제가 있습니다. 이에 대해서는 나중에 설명하겠습니다).
def __init__(self, allUsers): self.allUsers = allUsers # 用户字典
# 开户 def creatUser(self): # 目标:向用户字典中添加一对键值对(卡号->用户) name = input("请输入您的名字:") idCard = input("请输入您的身份证号:") phone = input("请输入您的电话号码:") prestoreMoney = int(input("请输入预存款金额:")) if prestoreMoney < 0: print("预存款输入有误!开户失败") return -1 onePasswd = input("请设置密码:") # 生成银行卡号 cardStr = self.randomCardId() #生成号码通过一个函数来实现,让这里的逻辑更清晰一点 card = Card(cardStr, onePasswd, prestoreMoney) # 把卡的信息放到这张卡的对象中 user = User(name, idCard, phone, card) # 个人信息也存入客户的对象中 # 存到字典 self.allUsers[cardStr] = user # 这就实现了通过一个银行卡号来索引个人信息以及里面的银行卡属性 print("开户成功!请记住卡号:" + cardStr)
위에는 은행 카드 생성에 대한 언급이 없습니다. 실제로는 어렵지 않습니다. 하지만 무작위로 생성된 번호는 이전 카드 번호와 중복되어서는 안 됩니다. 인덱스에 문제가 있을 것입니다.
# 生成卡号 def randomCardId(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): # 这里是通过找一下原来的字典中是否有这个key,如果没有的话那么这个卡号就合法,前面要有个not,没有找到这个卡号那么我们创建这个卡号 return str
위에서 이미 계좌를 개설하고 저장할 수 있지만 실제로 계좌를 개설할 때 실수로 비밀번호가 잘못 입력되지 않도록 비밀번호를 두 번 입력해야 하는 경우도 있습니다. 나중에 기능을 수행하려면 비밀번호 확인이 필요합니다. 비밀번호를 확인하기 위해 다른 함수를 작성할 수도 있고, 나중에 사용할 때 직접 호출할 수도 있습니다.
# 验证密码 def checkPasswd(self, realPasswd): # 这里传入的参数就是我们第一次输入的密码,下面要检验第一次输入是不是有误 for i in range(3): tempPasswd = input("请输入密码:") if tempPasswd == realPasswd: return True return False
其实后面的一些功能和这个是类似的,这里就不赘述了,先动手试一试,尽量的想的全面些。我会把完整的代码放在最后,可以参考一下。
最终要实现这些功能还是再写一个主程序比较好,更直观,也方便把理清他们之间的关系。首先主程序里需要调用管理员的登录,之后是客户的使用。管理员的登录上面写了,再调用一下就可以。客户的需求需要把每项功能和操作对应起来。先显示出都有哪些功能可以选择,再操作。比如像这样:
while True: admin.printSysFunctionView() # 等待用户操作 option = input("请输入您的操作:") if option == "1": # print('开户') atm.creatUser() elif option == "2": # print("查询") atm.searchUserInfo() elif option == "3": # print("取款") atm.getMoney() elif option == "4": # print("存储") atm.saveMoney() elif option == "5": # print("转账") atm.transferMoney() elif option == "6": # print("改密") atm.changePasswd() elif option == "7": # print("锁定") atm.lockUser() elif option == "8": # print("解锁") atm.unlockUser() elif option == "9": # print("补卡") atm.newCard() elif option == "0": # print("销户") atm.killUser() elif option == "q": # print("退出")
上面这所有的操作,都需要最终长期存储到键值对中,我们这里先用文件来储存,也可以存储到数据库中。既然要长期存储起来,就得把他序列化到磁盘上,使用pickle库。
# 每次使用前,需要把内容先加载下来 filepath = os.path.join(os.getcwd(), "allusers.txt") f = open(filepath, "rb") allUsers = pickle.load(f) atm = ATM(allUsers) # 而在操作结束的时候,要把操作过的内容重新写到磁盘中 f = open(filepath, "wb") pickle.dump(atm.allUsers, f) f.close()
到这里就出现了个问题,pickle.load(),当我们第一次使用时里面并没有存储东西,他自然也就不知道我们想要存储什么样格式的内容。所以第一次我们得手动的创建一个空字典,然后将一组信息存进去。下回使用的时候就可以直接load来使用。
在一开始测试的时候记不得里面存储的内容,我就先写了个查看信息的隐藏功能。后来感觉也许银行后台应该也有这样的功能,就没有删掉,虽然是很简单的显示,至少可以体现出他的思想。有兴趣的同学可以做的更好点。
# 这是上面使用这个功能的入口,并没有显式的展示出来,仅当管理员这样操作时会调用函数 elif option == "1122332244": admin.ban(allUsers) # 这里是调用函数后显示所有存储的信息的内容 def ban(self, allUsers): for key in allUsers: print("账号:" + key + "\n" + "姓名:" + allUsers[key].name + "\n" + "身份证号:" + allUsers[key].idCard + "\n" + "电话号码:" + allUsers[ key].phone + "\n" + "银行卡密码:" + allUsers[key].card.cardPasswd + "\n")
上面我只是把系统的其中一部分拿出来解释了一下,需要把里面的功能完善一下。比如把密码验证等等得放到功能里面,还有一些面向对象的操作,需要创建对象,还需要考虑到每个对象之间的关系,比如银行卡的对象作为客户对象的属性,需要通过参数传进去。仔细琢磨一下,把这个系统完成。在下面放上完整的程序,上面东西不是很清晰的话,那就一点一点的看下面的代码,找找感觉。
import time import random import pickle import os class Card(object): def __init__(self, cardId, cardPasswd, cardMoney): self.cardId = cardId self.cardPasswd = cardPasswd self.cardMony = cardMoney self.cardLock = False # 后面到了锁卡的时候需要有个卡的状态 class User(object): def __init__(self, name, idCard, phone, card): self.name = name self.idCard = idCard self.phone = phone self.card = card class Admin(object): admin = "1" passwd = "1" def printAdminView(self): print("****************************************************") print("* *") print("* *") print("* 欢迎登陆银行 *") print("* *") print("* *") print("****************************************************") def printSysFunctionView(self): print("****************************************************") print("* 开户(1) 查询(2) *") print("* 取款(3) 存款(4) *") print("* 转账(5) 改密(6) *") print("* 锁定(7) 解锁(8) *") print("* 补卡(9) 销户(0) *") print("* 退出(q) *") print("****************************************************") def adminOption(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 def ban(self, allUsers): for key in allUsers: print("账号:" + key + "\n" + "姓名:" + allUsers[key].name + "\n" + "身份证号:" + allUsers[key].idCard + "\n" + "电话号码:" + allUsers[ key].phone + "\n" + "银行卡密码:" + allUsers[key].card.cardPasswd + "\n") class ATM(object): def __init__(self, allUsers): self.allUsers = allUsers # 用户字典 # 开户 def creatUser(self): # 目标:向用户字典中添加一对键值对(卡号->用户) name = input("请输入您的名字:") idCard = input("请输入您的身份证号:") phone = input("请输入您的电话号码:") prestoreMoney = int(input("请输入预存款金额:")) if prestoreMoney < 0: print("预存款输入有误!开户失败") return -1 onePasswd = input("请设置密码:") # 验证密码 if not self.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) # 查询 def searchUserInfo(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 print("账号:%s 余额:%d" % (user.card.cardId, user.card.cardMony)) # 取款 def getMoney(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 # 开始取款 amount = int(input("验证成功!请输入取款金额:")) if amount > user.card.cardMony: print("取款金额有误,取款失败!") return -1 if amount < 0: print("取款金额有误,取款失败!") return -1 user.card.cardMony -= amount print("您取款%d元,余额为%d元!" % (amount, user.card.cardMony)) # 存款 def saveMoney(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 # 开始存款 amount = int(input("验证成功!请输入存款金额:")) if amount < 0: print("存款金额有误,存款失败!") return -1 user.card.cardMony += amount print("您存款%d元,最新余额为%d元!" % (amount, user.card.cardMony)) # 转账 def transferMoney(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 # 开始转账 amount = int(input("验证成功!请输入转账金额:")) if amount > user.card.cardMony or amount < 0: print("金额有误,转账失败!") return -1 newcard = input("请输入转入账户:") newuser = self.allUsers.get(newcard) if not newuser: print("该卡号不存在,转账失败!") return -1 # 判断是否锁定 if newuser.card.cardLock: print("该卡已锁定!请解锁后再使用其功能!") return -1 user.card.cardMony -= amount newuser.card.cardMony += amount time.sleep(1) print("转账成功,请稍后···") time.sleep(1) print("转账金额%d元,余额为%d元!" % (amount, user.card.cardMony)) # 改密 def changePasswd(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 print("正在验证,请稍等···") time.sleep(1) print("验证成功!") time.sleep(1) # 开始改密 newPasswd = input("请输入新密码:") if not self.checkPasswd(newPasswd): 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 tempIdCard = input("请输入您的身份证号码:") if tempIdCard != user.idCard: 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 tempIdCard = input("请输入您的身份证号码:") if tempIdCard != 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 tempname = input("请输入您的姓名:") tempidcard = input("请输入您的身份证号码:") tempphone = input("请输入您的手机号码:") if tempname != self.allUsers[cardNum].name\ or tempidcard != self.allUsers.idCard\ or tempphone != self.allUsers.phone: print("信息有误,补卡失败!") return -1 newPasswd = input("请输入您的新密码:") if not self.checkPasswd(newPasswd): print("密码错误,补卡失败!") return -1 self.allUsers.card.cardPasswd = newPasswd time.sleep(1) print("补卡成功,请牢记您的新密码!") # 销户 def killUser(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("密码输入有误,该卡已锁定!请解锁后再使用其功能!") user.card.cardLock = True return -1 del self.allUsers[cardNum] time.sleep(1) print("销户成功,请稍后!") # 验证密码 def checkPasswd(self, realPasswd): for i in range(3): tempPasswd = input("请输入密码:") if tempPasswd == realPasswd: return True return False # 生成卡号 def randomCardId(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 # 主函数,不在上面的类中 def main(): # 界面对象 admin = Admin() # 管理员开机 admin.printAdminView() if admin.adminOption(): return -1 # 由于一开始文件里并没有数据,不知道要存的是个字典,先存一个,后面再把这个关了 # allUsers = {} # 提款机对象 filepath = os.path.join(os.getcwd(), "allusers.txt") f = open(filepath, "rb") allUsers = pickle.load(f) atm = ATM(allUsers) while True: admin.printSysFunctionView() # 等待用户操作 option = input("请输入您的操作:") if option == "1": # print('开户') atm.creatUser() elif option == "2": # print("查询") atm.searchUserInfo() elif option == "3": # print("取款") atm.getMoney() elif option == "4": # print("存储") atm.saveMoney() elif option == "5": # print("转账") atm.transferMoney() elif option == "6": # print("改密") atm.changePasswd() elif option == "7": # print("锁定") atm.lockUser() elif option == "8": # print("解锁") atm.unlockUser() elif option == "9": # print("补卡") atm.newCard() elif option == "0": # print("销户") atm.killUser() elif option == "q": # print("退出") if not admin.adminOption(): # 将当前系统中的用户信息保存到文件当中 f = open(filepath, "wb") pickle.dump(atm.allUsers, f) f.close() return -1 elif option == "1122332244": admin.ban(allUsers) time.sleep(2) if __name__ == "__main__": main()
上面就是整个系统了,其实主要还是思想,模块较多,没有全部解释,如果程序当中有哪里不理解,可以留言讨论。注意上述完整代码主要是供大家了解整个系统,想要实现还需在自己电脑上重新配置,注意那些文件的路径,还有一个存放信息的txt文件,把他搞懂后,相信让他运行起来不难。
위 내용은 Python의 실용적인 소규모 프로젝트 - 뱅킹 시스템 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!