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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python使用django获取用户IP地址的方法
May 11 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
使用Python对微信好友进行数据分析
Jun 27 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
python内置函数sorted()用法深入分析
Oct 08 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 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 星际争霸
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP Pear 安装及使用
2009/03/19 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
python进程类subprocess的一些操作方法例子
2014/11/22 Python
python类中super()和__init__()的区别
2016/10/18 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python 基于opencv实现图像增强
2020/12/23 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
Intersport西班牙:在线体育商店
2019/11/06 全球购物
实习教师个人的自我评价
2013/11/08 职场文书
市三好学生主要事迹
2014/01/28 职场文书
公司授权委托书范文
2014/08/02 职场文书
五四演讲稿范文
2014/09/03 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
高中同学会致辞
2015/08/01 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
考研经验交流会策划书
2015/11/02 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL