python实现简单银行管理系统


Posted in Python onOctober 25, 2019

本文为大家分享了python银行管理系统的具体代码,供大家参考,具体内容如下

自己写的练手小程序,练习面向对象的概念,代码中都有注释,刚学的同学也可以很容易看懂(需要自己用pickle模块新建一个database.txt文件,用来存储用户数据信息)。

# atm.py
# 各种操作类
import random
from card import Card
from user import User
import time


class ATM(object):
 # 初始化
 def __init__(self, allUsersInfo):
 # 将所有用户信息传递过来,以便后续操作
 self.allUsersInfo = allUsersInfo # 卡号 :用户

 # 确认密码
 def checkPwd(self, realPwd):
 myList = [3, 2, 1, 0]
 for i in myList:
  # 如果密码输入错误超过三次
  if i == 0:
  return False
  rePass = input('请再次输入密码:')
  if realPwd == rePass:
  return True
  elif (i - 1) != 0:
  print('输入错误,你还有%d次输入的机会!' % (i - 1))

 # 随机生成开户卡号
 def randomId(self):
 while True:
  # 存储卡号
  str = ''

  # 随机生成6位卡号
  for i in range(6):
  ch = chr(random.randrange(ord('0'), ord('9') + 1))
  str += ch

  # 判断卡号是否重复
  if not self.allUsersInfo.get(str):
  return str

 # 开卡操作
 def createUser(self):
 try:
  name = input('请输入姓名:') # 用户姓名
  idCard = input('请输入身份证号码:') # 用户身份证号
  phone = input('请输入电话号码:') # 用户的电话号码
  preMoney = int(input('请输入预存金额:')) # 用户的预存金额

  # 预存金额少于0则开户失败
  if preMoney < 0:
  print('预存金额有误,开户失败!')
  return -1

  # 设置密码
  onePwd = input('请输入密码:') # 第一次密码
  twoPwd = self.checkPwd(onePwd)

  if not twoPwd:
  print('确认密码错误,开户失败!')
  return -1

  # 以上全部完成,则开户所需的信息准备齐全,开户成功
  # 系统生成开户卡号

  # 生成卡号
  cardStr = self.randomId()

  # 创建一个卡的实例,用于存储卡的信息
  card = Card(cardStr, onePwd, preMoney)

  # 创建一个用户实例,用于存储用户的信息
  user = User(name, idCard, phone, card)

  # 按 卡号 : 用户信息 键值对的形式存入字典中
  self.allUsersInfo[cardStr] = user

  # 提示用户,已经开户成功
  time.sleep(1)
  print('开户成功,请牢记卡号({})...'.format(cardStr))

 except Exception as e:
  print('抱歉,系统出现故障,暂时无法操作!')
  return

 # 判断卡号是否存在
 def isExistence(self, cardStrInp):
 # 卡号不存在,直接退回到选项界面
 if self.allUsersInfo.get(cardStrInp):
  return True

 # 卡号不存在的情况下
 else:
  print('卡号不存在!')
  return False

 # 做查询等操作时,输入密码
 def secretOption(self, cardStrInp):
 myList = [3, 2, 1, 0]
 for i in myList:
  # 如果密码输入错误超过三次
  if i == 0:
  return False
  passInp = input('请输入密码:')
  if passInp == self.allUsersInfo[cardStrInp].cardInfo.cardPwd:
  return True
  elif (i - 1) != 0:
  print('输入错误,你还有%d次输入的机会!' % (i - 1))


 # 查询用户信息
 def searchUserInfo(self):
 cardStrInp = input('请输入卡号:') # 用户想要查询的卡号

 # 判断卡号的状态
 isExist = self.isExistence(cardStrInp)

 # 卡号存在
 if isExist:
  # 是否被锁定
  if not self.allUsersInfo[cardStrInp].cardInfo.isLock:
  # 输入密码并判断
  # 密码正确则输出余额
  if self.secretOption(cardStrInp):
   print('账号:%s 余额:%d' % (cardStrInp, self.allUsersInfo[cardStrInp].cardInfo.cardMoney))
   return 0

  # 密码错误则锁定卡号
  else:
   print('密码输入错误超过3次,卡号已被锁定,请先解锁!')
   self.allUsersInfo[cardStrInp].cardInfo.isLock = True
   return -1
  else:
  print('该卡号已被锁定,请先解锁!')
  return -1


 # 取钱
 def getMoney(self):
 cardStrInp = input('请输入卡号:')

 isExist = self.isExistence(cardStrInp)
 # print(isExist)

 # 如果卡号存在
 if isExist:
  # 如果没被锁定
  if not self.allUsersInfo[cardStrInp].cardInfo.isLock:

  # 如果密码正确
  if self.secretOption(cardStrInp):
   getMoney = int(input('请输入取款金额:'))

   # 如果取款金额超出余额
   if getMoney > self.allUsersInfo[cardStrInp].cardInfo.cardMoney:
   print('余额不足,取款失败!')
   return -1

   # 余额足够的情况,取款成功
   else:
   self.allUsersInfo[cardStrInp].cardInfo.cardMoney -= getMoney
   print('取款成功,卡上余额:%d' % self.allUsersInfo[cardStrInp].cardInfo.cardMoney)
   return 0
  else:
   print('密码输入错误超过3次,卡号已被锁定,请先解锁!')
   self.allUsersInfo[cardStrInp].cardInfo.isLock = True
   return -1
  else:
  print('该卡号已被锁定,请先解锁!')
  return -1


 # 存钱
 def saveMoney(self):
 cardStrInp = input('请输入卡号:')

 isExist = self.isExistence(cardStrInp)

 if isExist:
  # 如果没被锁定
  if not self.allUsersInfo[cardStrInp].cardInfo.isLock:

  # 如果密码正确
  if self.secretOption(cardStrInp):
   saveMoney = int(input('请输入存款金额:'))
   if saveMoney <= 0:
   print('无效的存款金额!')
   return -1
   else:
   # 存款成功
   self.allUsersInfo[cardStrInp].cardInfo.cardMoney += saveMoney
   print('存款成功,卡内余额为%d!' % self.allUsersInfo[cardStrInp].cardInfo.cardMoney)
  else:
   print('密码输入错误超过3次,卡号已被锁定,请先解锁!')
   self.allUsersInfo[cardStrInp].cardInfo.isLock = True
   return -1
  else:
  print('该卡号已被锁定,请先解锁!')
  return -1

 # 转账
 def transMoney(self):
 cardInp = input('请输入卡号:')

 isExist = self.isExistence(cardInp)

 # 卡号存在
 if isExist:
  # 没被锁定
  if not self.allUsersInfo[cardInp].cardInfo.isLock:
  # 密码正确
  if self.secretOption(cardInp):
   transCardInp = input('请输入要转账的卡号:')
   isExistTrans = self.isExistence(transCardInp)

   # 要转账的卡号存在
   if isExistTrans:
   # 要转账的卡号没被锁定
   if not self.allUsersInfo[transCardInp].cardInfo.isLock:
    # 要转账的卡号不是自己的卡号
    if transCardInp != cardInp:
    transMoneyInp = int(input('请输入要转账的金额:'))
    # 判断转账金额是否大于卡内余额
    if transMoneyInp > self.allUsersInfo[cardInp].cardInfo.cardMoney:
     print('余额不足,转账失败!')
     return -1
    else:
     self.allUsersInfo[cardInp].cardInfo.cardMoney -= transMoneyInp
     self.allUsersInfo[transCardInp].cardInfo.cardMoney += transMoneyInp
     print('转账成功,卡内余额为%d!' % self.allUsersInfo[cardInp].cardInfo.cardMoney)
    else:
    print('无法转入自己的账户!')
    return -1
   else:
    print('对方卡号已被锁定,无法转账,请先解锁!')
    return -1
  else:
   print('密码输入错误超过3次,卡号已被锁定,请先解锁!')
   self.allUsersInfo[cardInp].cardInfo.isLock = True
   return -1
  else:
  print('该卡号已被锁定,请先解锁!')
  return -1


 # 改密
 def changePwd(self):
 cardStrInp = input('请输入卡号:')

 isExist = self.isExistence(cardStrInp)

 if isExist:
  # 如果没被锁定
  if not self.allUsersInfo[cardStrInp].cardInfo.isLock:

  # 如果密码正确
  if self.secretOption(cardStrInp):
   # 输入修改后的密码
   changePwd = input('请输入新密码:')

   # 不允许新密码和旧密码相同
   if changePwd != self.allUsersInfo[cardStrInp].cardInfo.cardPwd:
   myList = [3, 2, 1, 0]
   for i in myList:
    # 如果密码输入错误超过三次
    if i == 0:
    print('确认密码错误次数超过3次,修改密码失败!')
    return -1
    passInp = input('请确认新密码:')

    # 如果新密码确认成功,则修改密码
    if passInp == changePwd:
    print('密码修改成功!')
    self.allUsersInfo[cardStrInp].cardInfo.cardPwd = changePwd
    return 0
    elif (i - 1) != 0:
    print('输入错误,你还有%d次输入的机会!' % (i - 1))
   # 新密码和旧密码相同,不允许修改,提示并退出
   else:
   print('新密码不允许和旧密码相同!')
   return -1
  # 密码不正确
  else:
   print('密码输入错误超过3次,卡号已被锁定,请先解锁!')
   self.allUsersInfo[cardStrInp].cardInfo.isLock = True
   return -1
  else:
  print('该卡号已被锁定,请先解锁!')
  return -1


 # 解锁
 def unlockUser(self):
 cardStrInp = input('请输入卡号:')

 isExist = self.isExistence(cardStrInp)

 # 存在
 if isExist:
  # 被锁定
  if self.allUsersInfo[cardStrInp].cardInfo.isLock:
  # 如果密码正确
  if self.secretOption(cardStrInp):
   # 输入身份证号信息做确认
   idCardInp = input('请输入身份证号:')

   # 身份证号信息匹配
   if idCardInp == self.allUsersInfo[cardStrInp].idCard:
   # 解锁成功
   print('解锁成功!')
   self.allUsersInfo[cardStrInp].cardInfo.isLock = False
   return 0
   else:
   print('身份证号信息不匹配,解锁失败!')
   return -1
  # 密码不正确
  else:
   print('密码输出错误,解锁失败!')
   return -1
  else:
  print('该卡号未被锁定,无需解锁!')
  return -1
# card.py
# 卡类
class Card(object):
 def __init__(self, cardStr, cardPwd, cardMoney):
 self.cardStr = cardStr # 卡号
 self.cardPwd = cardPwd # 卡密
 self.cardMoney = cardMoney # 卡中余额

 self.isLock = False # 卡号是否被锁
# main.py
# 主函数
from view import View
import pickle
from atm import ATM
import time

def main():
 # 定义管理员对象
 admin = View()

 # 管理员登录界面
 admin.printAdminView()

 # 如果管理员账号、密码输入错误则退出
 if admin.adminOption():
 return -1

 # 读取存储在文件中的所有用户的信息
 file = open('database.txt', 'rb')
 allUsersInfo = pickle.load(file) # 将所有用户信息存储到 allUsersInfo中去
 file.close() # 关闭文件

 # 打印所有用户信息,以便验证
 print('*' * 10)
 print('usersInfo:', allUsersInfo)

 # 创建atm实例,并将所有用户信息传递过去,进行初始化
 atm = ATM(allUsersInfo)

 # 循环进行操作选项
 while True:
 # 调用功能显示方法,显示功能选项
 admin.printSysFunctionView()

 # 提示用户输入功能选项进行操作
 option= input('请输入操作选项(数字):')

 # 对用户的操作选项进行判断
 if option == "1": # 开户操作
  atm.createUser()

 elif option == "2": # 查询余额操作
  atm.searchUserInfo()

 elif option == "3": # 取钱操作
  atm.getMoney()

 elif option == "4": # 存钱操作
  atm.saveMoney()

 elif option == "5": # 转账操作
  atm.transMoney()

 elif option == "6": # 改密码操作
  atm.changePwd()

 elif option == "7": # 解锁操作
  atm.unlockUser()

 # 以下操作暂时未写
 # elif option == "q": # 退出操作
 # # atm.quitSys()
 # print('退出')

 # elif option == "9": # 补卡操作
 # print("补卡")
 #
 # elif option == "0": # 销户操作
 # print("销户")

 elif option == "8": # 退出系统
  return 0

 # 如果用户输入的不是上述操作
 else:
  print('无效的操作选项!')
  return -1

 # 将新信息写入文件
 # 将当前系统中的用户信息保存到文件中
 f = open('database.txt', "wb")
 pickle.dump(allUsersInfo, f)
 f.close()

if __name__ == '__main__':
 main()
# user.py
# 用户信息类
class User(object):
 def __init__(self, name, idCard, phone, cardInfo):
 self.name = name # 用户姓名
 self.idCard = idCard # 用户身份证号
 self.phone = phone # 用户的手机号码
 self.cardInfo = cardInfo # 用户的卡的信息(卡号、密码、余额)
# view.py
# 视图类
import time


class View(object):
 admin = '1'
 pwd = '1'

 # 管理员登录界面
 def printAdminView(self):
 print("*****************************************************************")
 print("*        *")
 print("*        *")
 print("*   欢迎登陆丹丹的银行   *")
 print("*        *")
 print("*        *")
 print("*****************************************************************")


 def printSysFunctionView(self):
 print("*****************************************************************")
 print("* 开户(1)    查询(2)  *")
 print("* 取款(3)    存款(4)  *")
 print("* 转账(5)    改密(6)  *")
 print("* 解锁(7)    退出(8)  *")
 # print("* 补卡(9)    销户(0)  *")
 # print("*    退出(t)    *")
 print("*****************************************************************")

 def adminOption(self):
 inputAdmin = input('请输入管理员账号:')

 if inputAdmin != self.admin:
  print('账号错误!')
  return -1

 inputPwd = input('请输入管理员密码:')

 if inputPwd != self.pwd:
  print('密码错误!')
  return -1

 # 管理员账号和密码全部正确
 print('操作成功,请稍后...')
 time.sleep(2)
 return 0

# view = View()
# view.printAdminView()
# view.adminOption()
# view.printSysFunctionView()

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python聚类算法之基本K均值实例详解
Nov 20 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Python实现的下载网页源码功能示例
Jun 13 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
django rest framework 自定义返回方式
Jul 12 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 Python
Python银行系统实战源码
Oct 25 #Python
python实现银行管理系统
Oct 25 #Python
Django视图扩展类知识点详解
Oct 25 #Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 #Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 #Python
Python下应用opencv 实现人脸检测功能
Oct 24 #Python
Python迭代器iterator生成器generator使用解析
Oct 24 #Python
You might like
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
php url路由入门实例
2014/04/23 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
浅谈json_encode用法
2015/03/05 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
python实现飞机大战项目
2020/03/11 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技