Python实现的银行系统模拟程序完整案例


Posted in Python onApril 12, 2019

本文实例讲述了Python实现的银行系统模拟程序。分享给大家供大家参考,具体如下:

银行系统模拟程序

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中Genarator函数用法分析
Apr 08 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python实现比较两个列表(list)范围
Jun 12 Python
利用Python实现网络测试的脚本分享
May 26 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python编程线性回归代码示例
Dec 07 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
python 实现波浪滤镜特效
Dec 02 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
详解python--模拟轮盘抽奖游戏
Apr 12 #Python
Python实现的排列组合、破解密码算法示例
Apr 12 #Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 #Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 #Python
详解python执行shell脚本创建用户及相关操作
Apr 11 #Python
python中aioysql(异步操作MySQL)的方法
Apr 11 #Python
很酷的python表白工具 你喜欢我吗
Apr 11 #Python
You might like
星际实力自我测试
2020/03/04 星际争霸
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
进一步理解Python中的函数编程
2015/04/13 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
pandas分区间,算频率的实例
2019/07/04 Python
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
车间组长岗位职责
2013/12/20 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
校运会广播稿
2015/08/19 职场文书
决心书格式范文
2015/09/23 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
交通事故协议书范本
2016/03/19 职场文书
检讨书怎么写?
2019/06/21 职场文书
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python