欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-26 21:29:14
本文实例讲述了python实现的银行系统模拟程序。分享给大家供大家参考,具体如下: 银行系统模拟程序 1、概述 ​ 使用面向对象思想模拟一个简单的银行系统...

本文实例讲述了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数据结构与算法教程》、《python函数使用技巧总结》、《python字符串操作技巧汇总》、《python编码操作技巧总结》及《python入门与进阶经典教程

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