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的Django框架测试驱动开发的教程
Apr 22 Python
Python中datetime模块参考手册
Jan 13 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
浅析Python 条件控制语句
Jul 15 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 Python
Python Pandas 删除列操作
Mar 16 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
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
Python实现CET查分的方法
2015/03/10 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Python字典遍历操作实例小结
2019/03/05 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
客服工作职责
2013/12/11 职场文书
班级聚会策划书
2014/01/16 职场文书
化妆品促销方案
2014/02/24 职场文书
法律系毕业生求职信
2014/05/28 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
紧急通知
2015/04/17 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
超市主管竞聘书
2015/09/15 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书