银行系统模拟程序

关注公众号“轻松学编程”了解更多。

1、概述

​ 使用面向对象思想模拟一个简单的银行系统,具备的功能:管理员登录/注销、用户开户、登录、找回密码、挂失、改密、查询、存取款、转账等功能。

​ 编程语言:python。

2、目的

​ 通过这个编程练习,可以熟悉运用面向对象的思想来解决实际问题,其中用到的知识点有类的封装、正则表达式、模块等。

3、体会

​ 在编写这个程序时,实际上的业务逻辑还是要考虑的,比如修改密码时需要输入手机号、身份证号等。在进行类的封装时,实际上还是用面向过程的思想把一些基本的业务逻辑编写成函数,对一些重复使用的代码也可以封装成函数(就是自己造适合这个业务的轮子,实际开发中很多底层的函数是不用自己再次去实现的,可以直接调用),这些都是一些底层的封装,然后在实现主要业务时上就可以调用类中的方法实现,这时只需关注业务逻辑就好了。

​ 使用面向对象的思想进行编程,考虑的点是:实现一个功能,有哪些方法可以让我进行调用(指挥者)。

​ 使用面向过程的思想进行编程,考虑的点是:实现一个功能,我需要实现哪些方法(执行者)。

​ 编写这个程序还用到一个很重要的概念,就是对程序进行模块化。模块化的好处是可以更好的对程序进行维护,条理也更清晰。

4、代码

源码Github地址:https://github.com/liangdongchang/pyBankSystem.git

1、bankSystem.py文件
from view import View
from atm import ATM
from person import Person def func(view,atm,per):
view.funcInterface()
choice = input("请选择您要办理的业务:")
if choice == '1':
return per.checkMoney(atm)
elif choice == '2':
return per.saveMoney(atm)
elif choice == '3':
return per.getMoney(atm)
elif choice == '4':
return per.transferMoney(atm)
elif choice == '5':
return per.changePassword(atm)
elif choice == '6':
return per.unlockAccount(atm)
elif choice == '7':
return per.closeAccount(atm)
elif choice == 'T':
if per.exit(atm):
return True
else:
print("输入有误!") def main():
# 管理员登录名为'admin',密码为'123'
view = View("admin",'123')
view.initface()
atm = ATM()
view.login()
per = Person()
while True:
view.funcInit()
choice = input("请选择您要办理的业务:")
if choice == '1':
per.newAccount(atm)
elif choice == '2':
if per.login(atm):
while True:
if func(view,atm,per) == None:
continue
else:
break
elif choice == '3':
per.findBackPassword(atm)
elif choice == '4':
per.lockAccount(atm)
elif choice == 'T':
if per.exit(atm):
# 管理员注销系统
if view.logout():
return True
else:
print("输入有误!") if __name__ == '__main__':
main()
2、card.py文件:
'''
卡:
类名:Card
属性:卡号【6位随机】 密码 余额 绑定的身份证号 手机号
'''
class Card(object):
def __init__(self, cardId, password, money,identityId,phoneNum,cardLock='False'):
self.cardId = cardId
self.password = password
self.money = money
self.identityId = identityId
self.phoneNum = phoneNum
self.cardLock = cardLock
3、readAppendCard.py文件:
'''
功能:读取文件cardInfo.txt的信息
方法:读、写、删
'''
from card import Card
import json # 读
class ReadCard(Card):
def __init__(self, cardId='', password='', money=0, identityId='', phoneNum='', cardLock=''):
Card.__init__(self, cardId, password, money, identityId, phoneNum, cardLock) def dict2Card(self, d):
return self.__class__(d["cardId"], d["password"], d["money"],d["identityId"],d["phoneNum"], d["cardLock"]) def read(self):
# card对象转为字典
with open("cardinfo.txt","r",encoding="utf-8") as fr:
cards = []
for re in fr.readlines():
cards.append(self.dict2Card(eval(re)))
return cards # 写
class AppendCard(Card):
def __init__(self):
Card.__init__(self, cardId = '', password = '', money = 0, identityId = '', phoneNum = '', cardLock='') def card2Dict(self,card):
return {"cardId": card.cardId, "password": card.password,
"money": card.money, "identityId": card.identityId,
"phoneNum": card.phoneNum, "cardLock": card.cardLock
} def append(self,card,w= 'a'):
# 默认是追加,如果w='w'就清空文件
if w == 'w':
with open("cardinfo.txt", "w", encoding="utf-8") as fa:
fa.write('')
else:
with open("cardinfo.txt", "a", encoding="utf-8") as fa:
json.dump(card, fa, default=self.card2Dict)
fa.write('\n')
# 删
class Del(object): def del_(self,cardId):
readcard = ReadCard()
cards = readcard.read()
for card in cards:
# 删除输入的卡号
if cardId == card.cardId:
cards.remove(card)
break
else:
print("卡号不存在!")
return False
# 重新写入文件
appendcard = AppendCard()
appendcard.append('',w='w')
for card in cards:
appendcard.append(card)
return True
4、person.py
'''

类名:Person
行为:开户、查询、取款、存储、转账、改密、销户、退出 ''' class Person(object):
def __init__(self,name='',identity='',phoneNum='',card=None):
self.name = name
self.identity = identity
self.phoneNum = phoneNum
self.card = card
# 登录
def login(self,atm):
card = atm.login()
if card:
self.card = card
return True
else:
return False
# 开户
def newAccount(self,atm):
return atm.newAccount()
#找回密码
def findBackPassword(self,atm):
return atm.findBackPassword()
# 查询余额
def checkMoney(self, atm):
return atm.checkMoney(self.card)
# 存钱
def saveMoney(self, atm):
return atm.saveMoney(self.card)
# 取钱
def getMoney(self, atm):
return atm.getMoney(self.card)
# 转账
def transferMoney(self, atm):
return atm.transferMoney(self.card)
# 销户
def closeAccount(self, atm):
return atm.closeAccount(self.card)
# 挂失
def lockAccount(self, atm):
return atm.lockAccount()
# 解锁
def unlockAccount(self, atm):
return atm.unlockAccount(self.card)
# 改密
def changePassword(self, atm):
return atm.changePassword(self.card)
# 退出系统
def exit(self, atm):
return atm.exit()
5、view.py
'''
管理员界面
类名:View
属性:账号,密码
行为:管理员初始化界面 管理员登陆 系统功能界面 管理员注销 系统功能:开户 查询 取款 存储 转账 改密 销户 退出
'''
from check import Check
import time class View(object): def __init__(self,admin,password):
self.admin = admin
self.password = password
# 管理员初始化界面
def initface(self):
print("*------------------------------------*")
print("| |")
print("| 管理员界面正在启动,请稍候... |")
print("| |")
print("*------------------------------------*")
time.sleep(1)
return #管理员登录界面
def login(self):
print("*------------------------------------*")
print("| |")
print("| 管理员登陆界面 |")
print("| |")
print("*------------------------------------*")
check = Check()
check.userName(self.admin,self.password)
print("*-------------登陆成功---------------*")
print(" 正在跳转到系统功能界面,请稍候... ")
del check
time.sleep(1)
return # 管理员注销界面
def logout(self):
print("*------------------------------------*")
print("| |")
print("| 管理员注销界面 |")
print("| |")
print("*------------------------------------*")
#确认是否注销
check = Check()
if not check.isSure('注销'):
return False check.userName(self.admin,self.password)
print("*-------------注销成功---------------*")
print(" 正在关闭系统,请稍候... ")
del check
time.sleep(1) return True #系统功能界面
'''
系统功能:开户,查询,取款,存储,转账,销户,挂失,解锁,改密,退出
'''
def funcInit(self):
print("*-------Welcome To Future Bank---------*")
print("| |")
print("| (1)开户 (2)登录 |")
print("| (3)找回密码 (4)挂失 |")
print("| (T)退出 |")
print("| |")
print("*--------------------------------------*")
def funcInterface(self):
print("*-------Welcome To Future Bank---------*")
print("| |")
print("| (1)查询 (5)改密 |")
print("| (2)存款 (6)解锁 |")
print("| (3)取款 (7)销户 |")
print("| (4)转账 (T)退出 |")
print("| |")
print("*--------------------------------------*")
6、atm.py
'''
提款机:
类名:ATM
属性:
行为(被动执行操作):开户,查询,取款,存储,转账,销户,挂失,解锁,改密,退出
'''
from check import Check
from card import Card
from readAppendCard import ReadCard,AppendCard
import random
import time class ATM(object): def __init__(self):
# 实例化相关的类
self.check = Check()
self.readCard = ReadCard()
self.appendCard = AppendCard()
self.cards = self.readCard.read()
# 显示功能界面
def funcShow(self,ope):
if ope != "找回密码":
print("*-------Welcome To Future Bank-------*")
print("| %s功能界面 |"%ope)
print("*------------------------------------*")
else:
# 显示找回密码界面
print("*-------Welcome To Future Bank-------*")
print("| 找回密码功能界面 |")
print("*------------------------------------*")
# 卡号输入
def cardInput(self,ope=''):
while True:
cardId = input("请输入卡号:")
password = input("请输入密码:")
card = self.check.isCardAndPasswordSure(self.cards, cardId,password)
if not card:
print("卡号或密码输入有误!!!")
if ope == 'login' or ope == 'lock':
return False
else:
continue
else:
return card
# 登录
def login(self):
self.funcShow("登录")
return self.cardInput('login')
#找回密码
def findBackPassword(self):
self.funcShow("找回密码")
cardId = input("请输入卡号:")
card = self.check.isCardIdExist(self.cards,cardId)
if card:
if not self.check.isCardInfoSure(card,"找回密码"):
return
newpassword = self.check.newPasswordInput()
index = self.cards.index(card)
self.cards[index].password = newpassword
self.writeCard()
print("找回密码成功!请重新登录!!!")
time.sleep(1)
return True else:
print("卡号不存在!!!")
return True
# 开户
def newAccount(self):
self.funcShow("开户")
# 输入身份证号和手机号
pnum = self.check.phoneInput()
iden = self.check.identifyInput()
print("正在执行开户程序,请稍候...")
while True:
# 随机生成6位卡号
cardId = str(random.randrange(100000, 1000000))
# 随机生成的卡号存在就继续
if self.check.isCardIdExist(self.cards,cardId):
continue
else:
break
# 初始化卡号密码,卡里的钱,卡的锁定状态
card = Card(cardId, '888888', 0, iden, pnum , 'False')
self.appendCard.append(card)
print("开户成功,您的卡号为%s,密码为%s,卡余额为%d元!"%(cardId,'888888',0))
print("为了账户安全,请及时修改密码!!!")
# 更新卡号列表
self.cards = self.readCard.read()
return True # 查询
def checkMoney(self,card):
self.funcShow("查询")
if self.check.isCardLock(card):
print("查询失败!")
else:
print("卡上余额为%d元!" %card.money)
time.sleep(1) # 存款
def saveMoney(self,card):
self.funcShow("存款")
if self.check.isCardLock(card):
print("存钱失败!")
else:
mon = self.check.moneyInput("存款")
# 找到所有卡中对应的卡号,然后对此卡进行存款操作
index = self.cards.index(card)
self.cards[index].money += mon
print("正在执行存款程序,请稍候...")
time.sleep(1)
self.writeCard()
print("存款成功!卡上余额为%d元!"%self.cards[index].money)
time.sleep(1) # 取款
def getMoney(self,card):
self.funcShow("取款")
if self.check.isCardLock(card):
print("取钱失败!")
else:
print("卡上余额为%d元!" %card.money)
mon = self.check.moneyInput("取款")
if mon:
if mon > card.money:
print("余额不足,您当前余额为%d元!"%card.money)
time.sleep(1)
else:
print("正在执行取款程序,请稍候...")
time.sleep(1)
# 找到所有卡中对应的卡号,然后对此卡进行存款操作
index = self.cards.index(card)
self.cards[index].money -= mon
self.writeCard()
print("取款成功!卡上的余额为%d元!"%self.cards[index].money)
time.sleep(1) # 转账
def transferMoney(self,card):
self.funcShow("转账")
if self.check.isCardLock(card): #如果卡已锁定就不能进行转账操作
print("转账失败!")
return
while True:
cardId = input("请输入对方的账号:")
if cardId == card.cardId:
print("不能给自己转账!!!")
return
cardOther = self.check.isCardIdExist(self.cards,cardId) #判断对方卡号是否存在
if cardOther == False:
print("对方账号不存在!!!")
return
else:
break
while True:
print("卡上余额为%d元"%card.money)
mon = self.check.moneyInput("转账")
if not mon: #输入的金额不对就返回
return
if mon > card.money: #输入的金额大于卡上余额就返回
print("余额不足,卡上余额为%d元!" % card.money)
return
else:
break
print("正在执行转账程序,请稍候...")
time.sleep(1)
index = self.cards.index(card) # 找到所有卡中对应的卡号,然后对此卡进行转账操作
self.cards[index].money -= mon
indexOther = self.cards.index(cardOther) #找到对卡卡号所处位置
self.cards[indexOther].money += mon
self.writeCard()
print("转账成功!卡上余额为%d元!" % self.cards[index].money)
time.sleep(1) # 销户
def closeAccount(self,card):
self.funcShow("销户")
if not self.check.isCardInfoSure(card,"销户"):
return
if card.money >0:
print("卡上还有余额,不能进行销户!!!")
return
if self.check.isSure("销户"):
self.cards.remove(card) #移除当前卡号
self.writeCard()
print("销户成功!")
time.sleep(1)
return True # 挂失
def lockAccount(self):
self.funcShow("挂失")
card = self.cardInput('lock')
if not card:
return
if card.cardLock == "True":
print("卡已处于锁定状态!!!")
return
if not self.check.isCardInfoSure(card,"挂失"):
return
if self.check.isSure("挂失"):
index = self.cards.index(card) #找到所有卡中对应的卡号,然后对此卡进行挂失操作
self.cards[index].cardLock = "True"
self.writeCard()
print("挂失成功!")
time.sleep(1)
return True # 解锁
def unlockAccount(self,card):
self.funcShow("解锁")
if card.cardLock == 'False':
print("无需解锁,卡处于正常状态!!!")
return
if not self.check.isCardInfoSure(card,"解锁"):
return
index = self.cards.index(card)
self.cards[index].cardLock = "False"
self.writeCard()
print("解锁成功!")
time.sleep(1)
return True # 改密
def changePassword(self,card):
self.funcShow("改密")
if self.check.isCardLock(card):
print("卡处于锁定状态,不能进行改密!!!")
return
if not self.check.isCardInfoSure(card,"改密"):
return
# 输入旧密码
while True:
password = input("请输入旧密码:")
if self.check.isPasswordSure(password,card.password):
break
else:
print("卡号原密码输入错误!")
return
newpassword = self.check.newPasswordInput()
index = self.cards.index(card) #找到所有卡中对应的卡号,然后对此卡进行改密操作
self.cards[index].password = newpassword
self.writeCard()
print("改密成功!请重新登录!!!")
time.sleep(1)
return True # 写入文件
def writeCard(self):
self.appendCard.append('', w='w') #先清除原文件再重新写入
for card in self.cards:
self.appendCard.append(card)
# 退出
def exit(self):
if self.check.isSure("退出"):
return True
else:
return False
7、check.py
'''
验证类:
用户名、密码、卡号、身份证、手机号验证
使用正则表达式进行文本搜索
'''
import re class Check(object):
def __init__(self):
pass
#用户验证
def userName(self,admin,password):
self.admin = admin
self.password = password
while True:
admin = input("请输入用户名:")
password = input("请输入密码:")
if admin != self.admin or password != self.password:
print("用户名或密码输入有误,请重新输入!!!")
continue
else:
return #是否确认某操作
def isSure(self,operate):
while True:
res = input("是否确认%s?【yes/no】"%operate)
if res not in ['yes','no']:
print("输入有误,请重新输入!!!")
continue
elif res == 'yes':
return True
else:
return False # 手机号验证
def phoneInput(self):
# 简单的手机号验证:开头为1且全部为数字,长度为11位
while True:
pnum = input("请输入您的手机号:")
res = re.match(r"^1\d{10}$",pnum)
if not res:
print("手机号输入有误,请重新输入!!!")
continue
return pnum
# 身份证号验证
def identifyInput(self):
# 简单的身份证号验证:6位,只有最后一可以为x,其余必须为数字
while True:
iden = input("请输入您的身份证号(6位数字):")
res = re.match(r"\d{5}\d|x$",iden)
if not res:
print("身份证号输入有误,请重新输入!!!")
continue
return iden # 卡号是否存在
def isCardIdExist(self,cards,cardId):
for card in cards:
if cardId == card.cardId:
return card
else:
return False
# 卡号和密码是否一致
def isCardAndPasswordSure(self,cards,cardId,password):
card = self.isCardIdExist(cards,cardId)
if card:
if card.password == password:
return card
return False # 密码二次确认是否正确
def isPasswordSure(self, newassword,oldpassword):
if newassword == oldpassword:
return True
else:
return False
# 卡号完整信息验证
def isCardInfoSure(self,card,ope):
phoneNum = input("请输入手机号:")
iden = input("请输入身份证号:")
if card.phoneNum == phoneNum and card.identityId == iden:
return True
print("%s失败!!!\n密码、手机号或身份证号与卡中绑定的信息不一致!!!"%ope)
return False # 卡号是否锁定
def isCardLock(self,card):
if card.cardLock == "True":
print("此卡已挂失!")
return True
return False
# 输入金额验证
def moneyInput(self,ope):
mon = input("输入%s金额(100的倍数):"%ope)
# 输入的钱必须是100的倍数
if re.match(r"[123456789]\d*[0]{2}$", mon):
return int(mon)
print("输入有误,%s金额必须是100的倍数!请重新输入!!!"%ope)
return False def newPasswordInput(self):
while True:
newpassword = input("请输入新密码:")
if not re.match(r"\d{6}$",newpassword):
print("密码必须是6位的纯数字!!!")
continue
newpasswordAgain = input("请重复输入新密码:")
if self.isPasswordSure(newpassword, newpasswordAgain):
break
else:
print("两次输入不一致!")
continue
return newpassword

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python实现银行系统模拟程序的更多相关文章

  1. python实现DFA模拟程序(附java实现代码)

    DFA(确定的有穷自动机) 一个确定的有穷自动机M是一个五元组: M=(K,∑,f,S,Z) K是一个有穷集,它的每个元素称为一个状态. ∑是一个有穷字母表,它的每一个元素称为一个输入符号,所以也陈∑ ...

  2. python实战案例--银行系统

    stay hungry, stay foolish.求知若饥,虚心若愚. 今天和大家分享一个python的实战案例,很多人在学习过程中都希望通过一些案例来试一下,也给自己一点动力.那么下面介绍一下这次 ...

  3. 尝试用 Python 写了个病毒传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...

  4. 怎么用Python写一个三体的气候模拟程序

    首先声明一下,这个所谓的三体气候模拟程序还是很简单的,没有真的3D效果或数学模型之类的,只不过是一个文字表示的模拟程序.该程序的某些地方可能不太严谨,所以也请各位多多包涵. 所谓三体气候模拟,就是将太 ...

  5. 源码篇:Python 实战案例----银行系统

    import time import random import pickle import os class Card(object): def __init__(self, cardId, car ...

  6. python 银行系统

    目前代码只写到这 主要部分已经实现 功能部分展现 首先我们需要五个类 用户类  : 成员属性 name  id  以及 card 卡类: 成员属性 卡号  密码  余额   锁 界面类:   管理员界 ...

  7. Python爬虫小白入门(一)写在前面

    一.前言 你是不是在为想收集数据而不知道如何收集而着急? 你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼? Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...

  8. python之路 - 爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  9. python之进程与线程

    什么是操作系统       可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...

随机推荐

  1. Hadoop框架:HDFS简介与Shell管理命令

    本文源码:GitHub·点这里 || GitEE·点这里 一.HDFS基本概述 1.HDFS描述 大数据领域一直面对的两大核心模块:数据存储,数据计算,HDFS作为最重要的大数据存储技术,具有高度的容 ...

  2. _1_html_框架

    创:18_3_2017修:20_3_2017 什么是html? --超文本标记语言 --告诉浏览器内容的语义 html页面的框架是什么? <!DOCTYPE html> <!--DT ...

  3. 浙大《数据结构》学习&练习(一)算法初步

    1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取. 2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称,数据对象集和操作集. ...

  4. [POI2005]SAM-Toy Cars 贪心+堆

    [POI2005]SAM-Toy Cars 题目:Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们:为了让他的房间有足够的空 ...

  5. JVM 第二篇:垃圾收集器以及算法

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 0. 引言 一说到 JVM ,大多数人第一个想到的可能就是 GC ,今天我们就来聊一聊和 GC 关系最大的垃圾收集器以及垃圾收集算法,希望能通过 ...

  6. antd pro table中的文件上传

    概述 示例代码 列表页面 form 页面 model.js service.js 总结 概述 项目中经常会遇到在表格中展示图片的需求(比如展示用户信息时, 有一列是用户的头像). antd pro t ...

  7. 一道算法题,引出collections.Counter的特殊用法

    题目描述: 题目编号:1002. 查找常用字符 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次, ...

  8. Git 高级用法,你会了吗?

    请注意我有意跳过了 git commit.git pull/push 之类的基本命令,这份小抄的主题是 git 的一些「高级」用法. 导航 -- 跳到之前的分支 git checkout - 查看历史 ...

  9. centos平台scp通过密钥远程复制文件(免密登录)

    一,说明:两台机器的平台和ip 1,a服务器: centos8:ip:121.122.123.47 版本 [root@yjweb ~]# cat /etc/redhat-release CentOS ...

  10. rabbitmq与erlang版本

    来源自https://www.rabbitmq.com/which-erlang.html erlang安装包下载地址 https://packages.erlang-solutions.com/er ...