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装饰器与递归算法详解
Feb 18 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
Oct 15 Python
python生成随机图形验证码详解
Nov 08 Python
Python进程间通信Queue实例解析
Jan 25 Python
详解python算法之冒泡排序
Mar 05 Python
详解python的argpare和click模块小结
Mar 31 Python
Python数据类型之Set集合实例详解
May 07 Python
python求平均数、方差、中位数的例子
Aug 22 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
python之生成多层json结构的实现
Feb 27 Python
Python的PIL库中getpixel方法的使用
Apr 09 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中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Python如何获取文件指定行的内容
2020/05/27 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
女娲补天教学反思
2014/02/05 职场文书
邀请函样本
2015/02/02 职场文书
内勤岗位职责范本
2015/04/13 职场文书
公司出差管理制度范本
2015/08/05 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
python 远程执行命令的详细代码
2022/02/15 Python
nginx 配置指令之location使用详解
2022/05/25 Servers