银行系统模拟程序

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

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. springboot集成swagger文档

    //此处省略springboot创建过程 1.引入swagger相关依赖(2个依赖必须版本相同) <dependency> <groupId>io.springfox</ ...

  2. Centos-bzip2压缩文件-bzip2 bunzip2

    bzip2 buzip2 对文件进行压缩与解压缩,类似 gzip gunzip命令,只能压缩文件,对目录则压缩目录下文件,生成以 .bz2为扩展名的文件 相关选项 -d 解压 -v 压缩或解压显示详细 ...

  3. Archive: ****** End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes

    Archive:  demoApi.zip   End-of-central-directory signature not found.  Either this file is not   a z ...

  4. 使用Ajax新闻系统管理需求分析

      新闻系统管理需求分析 1.1项目背景 新闻发布系统(News Release System or Content Management System),是一个基于新闻和内容管理的全站管理系统,本系 ...

  5. P5858 「SWTR-03」Golden Sword

    题面: Link 题面有点长,不想粘了,QAQ. 题解: 一句话题意,你有 \(n\) 件物品需要依次放进去,每个物品放进去之后会得到一定的权值,为当前锅炉里面的物品的数量乘以 \(a_i\) 每次在 ...

  6. Centos 6.9 安装 php5.6

    1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们, 如: yum remove php.x86_64 php-cli.x86_6 ...

  7. nrf528xx bootloader 模块介绍

    1. bootloader 的基本功能: 启动应用 几个应用之间切换 初始化外设 nordic nrf52xxx的bootloader主要功能用来做DFU, 可以通过HCI, UART 或BLE通信的 ...

  8. MeteoInfoLab脚本示例:FY-3A AOD HDF数据

    FY3A卫星有HDF格式的AOD产品数据,全球范围,分辨率为0.05度.读取数据文件变量后要重新设定X/Y维,数据是Y轴反向的,且需要除以10000得到AOD值. 脚本程序: #Add data fi ...

  9. 【C语言入门】"为什么这个又错了啊"来自编程初学者常见错误合辑!

    C语言的最大特点是:功能强,使用方便灵活. C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下"灵活的 余地",但还是由于这个灵活给程序的调试带来了许多不便,尤其 ...

  10. centOS7 查看防火墙状态 开放端口

    一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...