import time
import random
import pickle
import os class Card(object):
def __init__(self, cardId, cardPasswd, cardMoney):
self.cardId = cardId
self.cardPasswd = cardPasswd
self.cardMony = cardMoney
self.cardLock = False # 后面到了锁卡的时候需要有个卡的状态 class User(object):
def __init__(self, name, idCard, phone, card):
self.name = name
self.idCard = idCard
self.phone = phone
self.card = card class Admin(object):
admin = "1"
passwd = "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("* 退出(q) *")
print("****************************************************") def adminOption(self):
inputAdmin = input("请输入管理员账号:")
if self.admin != inputAdmin:
print("输入账号有误!")
return -1
inputPasswd = input("请输入管理员密码:")
if self.passwd != inputPasswd:
print("密码输入有误!")
return -1 # 能执行到这里说明账号密码正确
print("操作成功,请稍后······")
time.sleep(2)
return 0 def ban(self, allUsers):
for key in allUsers:
print("账号:" + key + "\n" + "姓名:" + allUsers[key].name + "\n" + "身份证号:" + allUsers[key].idCard + "\n" + "电话号码:" + allUsers[
key].phone + "\n" + "银行卡密码:" + allUsers[key].card.cardPasswd + "\n") class ATM(object):
def __init__(self, allUsers):
self.allUsers = allUsers # 用户字典 # 开户
def creatUser(self):
# 目标:向用户字典中添加一对键值对(卡号->用户)
name = input("请输入您的名字:")
idCard = input("请输入您的身份证号:")
phone = input("请输入您的电话号码:")
prestoreMoney = int(input("请输入预存款金额:"))
if prestoreMoney < 0:
print("预存款输入有误!开户失败")
return -1 onePasswd = input("请设置密码:")
# 验证密码
if not self.checkPasswd(onePasswd):
print("输入密码错误,开户失败!")
return -1 # 生成银行卡号
cardStr = self.randomCardId()
card = Card(cardStr, onePasswd, prestoreMoney) user = User(name, idCard, phone, card)
# 存到字典
self.allUsers[cardStr] = user
print("开户成功!请记住卡号:" + cardStr) # 查询
def searchUserInfo(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,查询失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1
print("账号:%s 余额:%d" % (user.card.cardId, user.card.cardMony)) # 取款
def getMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,取款失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始取款
amount = int(input("验证成功!请输入取款金额:"))
if amount > user.card.cardMony:
print("取款金额有误,取款失败!")
return -1
if amount < 0:
print("取款金额有误,取款失败!")
return -1
user.card.cardMony -= amount
print("您取款%d元,余额为%d元!" % (amount, user.card.cardMony)) # 存款
def saveMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,存款失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始存款
amount = int(input("验证成功!请输入存款金额:"))
if amount < 0:
print("存款金额有误,存款失败!")
return -1
user.card.cardMony += amount
print("您存款%d元,最新余额为%d元!" % (amount, user.card.cardMony)) # 转账
def transferMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始转账
amount = int(input("验证成功!请输入转账金额:"))
if amount > user.card.cardMony or amount < 0:
print("金额有误,转账失败!")
return -1 newcard = input("请输入转入账户:")
newuser = self.allUsers.get(newcard)
if not newuser:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if newuser.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1
user.card.cardMony -= amount
newuser.card.cardMony += amount
time.sleep(1)
print("转账成功,请稍后···")
time.sleep(1)
print("转账金额%d元,余额为%d元!" % (amount, user.card.cardMony)) # 改密
def changePasswd(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,改密失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1
print("正在验证,请稍等···")
time.sleep(1)
print("验证成功!")
time.sleep(1) # 开始改密
newPasswd = input("请输入新密码:")
if not self.checkPasswd(newPasswd):
print("密码错误,改密失败!")
return -1
user.card.cardPasswd = newPasswd
print("改密成功!请稍后!") # 锁定
def lockUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,锁定失败!")
return -1
if user.card.cardLock:
print("该卡已被锁定,请解锁后再使用其功能!")
return -1
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,锁定失败!")
return -1
tempIdCard = input("请输入您的身份证号码:")
if tempIdCard != user.idCard:
print("身份证号输入有误,锁定失败!")
return -1
# 锁定
user.card.cardLock = True
print("锁定成功!") # 解锁
def unlockUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,解锁失败!")
return -1
if not user.card.cardLock:
print("该卡未被锁定,无需解锁!")
return -1
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,解锁失败!")
return -1
tempIdCard = input("请输入您的身份证号码:")
if tempIdCard != user.idCard:
print("身份证号输入有误,解锁失败!")
return -1
# 解锁
user.card.cardLock = False
print("解锁成功!") # 补卡
def newCard(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在!")
return -1
tempname = input("请输入您的姓名:")
tempidcard = input("请输入您的身份证号码:")
tempphone = input("请输入您的手机号码:")
if tempname != self.allUsers[cardNum].name\
or tempidcard != self.allUsers.idCard\
or tempphone != self.allUsers.phone:
print("信息有误,补卡失败!")
return -1
newPasswd = input("请输入您的新密码:")
if not self.checkPasswd(newPasswd):
print("密码错误,补卡失败!")
return -1
self.allUsers.card.cardPasswd = newPasswd
time.sleep(1)
print("补卡成功,请牢记您的新密码!") # 销户
def killUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 del self.allUsers[cardNum]
time.sleep(1)
print("销户成功,请稍后!") # 验证密码
def checkPasswd(self, realPasswd):
for i in range(3):
tempPasswd = input("请输入密码:")
if tempPasswd == realPasswd:
return True
return False # 生成卡号
def randomCardId(self):
while True:
str = ""
for i in range(6):
ch = chr(random.randrange(ord("0"), ord("9") + 1))
str += ch
# 判断是否重复
if not self.allUsers.get(str):
return str # 主函数,不在上面的类中
def main():
# 界面对象
admin = Admin() # 管理员开机
admin.printAdminView()
if admin.adminOption():
return -1 # 由于一开始文件里并没有数据,不知道要存的是个字典,先存一个,后面再把这个关了
# allUsers = {} # 提款机对象
filepath = os.path.join(os.getcwd(), "allusers.txt")
f = open(filepath, "rb")
allUsers = pickle.load(f)
atm = ATM(allUsers) while True:
admin.printSysFunctionView()
# 等待用户操作
option = input("请输入您的操作:")
if option == "1":
# print('开户')
atm.creatUser()
elif option == "2":
# print("查询")
atm.searchUserInfo()
elif option == "3":
# print("取款")
atm.getMoney()
elif option == "4":
# print("存储")
atm.saveMoney()
elif option == "5":
# print("转账")
atm.transferMoney()
elif option == "6":
# print("改密")
atm.changePasswd()
elif option == "7":
# print("锁定")
atm.lockUser()
elif option == "8":
# print("解锁")
atm.unlockUser()
elif option == "9":
# print("补卡")
atm.newCard()
elif option == "0":
# print("销户")
atm.killUser()
elif option == "q":
# print("退出")
if not admin.adminOption():
# 将当前系统中的用户信息保存到文件当中
f = open(filepath, "wb")
pickle.dump(atm.allUsers, f)
f.close()
return -1
elif option == "1122332244":
admin.ban(allUsers) time.sleep(2) if __name__ == "__main__":
main()

源码篇:Python 实战案例----银行系统的更多相关文章

  1. python实战案例--银行系统

    stay hungry, stay foolish.求知若饥,虚心若愚. 今天和大家分享一个python的实战案例,很多人在学习过程中都希望通过一些案例来试一下,也给自己一点动力.那么下面介绍一下这次 ...

  2. MySQL Master High Available 源码篇

    https://m.aliyun.com/yunqi/users/1287368569594542/articles https://yq.aliyun.com/articles/59233 MySQ ...

  3. MyBatis 源码篇-日志模块2

    上一章的案例,配置日志级别为 debug,执行一个简单的查询操作,会将 JDBC 操作打印出来.本章通过 MyBatis 日志部分源码分析它是如何实现日志打印的. 在 MyBatis 的日志模块中有一 ...

  4. MyBatis 源码篇-资源加载

    本章主要描述 MyBatis 资源加载模块中的 ClassLoaderWrapper 类和 Java 加载配置文件的三种方式. ClassLoaderWrapper 上一章的案例,使用 org.apa ...

  5. MyBatis 源码篇-SQL 执行的流程

    本章通过一个简单的例子,来了解 MyBatis 执行一条 SQL 语句的大致过程是怎样的. 案例代码如下所示: public class MybatisTest { @Test public void ...

  6. 深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)>为大家介绍了mybatis中别名的使用,以及其源码.本篇将为大家介绍TypeH ...

  7. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  8. 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...

  9. 源码篇:SDWebImage

    攀登,一步一个脚印,方能知其乐 源码篇:SDWebImage 源码来源:https://github.com/rs/SDWebImage 版本: 3.7 SDWebImage是一个开源的第三方库,它提 ...

随机推荐

  1. 【CSS学习】--- 背景

    一.前言 元素的背景区域包括:元素的内容.内边距和边框区域. CSS中用于设置背景的属性有: background-color 设置背景颜色 background-image 设置背景图片 backg ...

  2. Tarjan中栈的分析与SLT栈的实现

    首先看一下手写的栈: do{ printf("%d ",stack[index]); visit[stack[index]]=; index--; }]);//出栈,并且输出. p ...

  3. SD从零开始67-70 后勤信息系统中的标准分析, 信息结构, 信息的更新规则, 建立统计数据

    SD从零开始67 后勤信息系统中的标准分析 标准分析中的报表Reporting in Standard Analyses 标准分析为高质量的表达和分析LIS中的数据基础提供了大量的功能: 当你决定了一 ...

  4. 安卓开发_浅谈Notification(通知栏)

    Notification通知栏是显示在手机状态的消息,代表一种全局效果的通知 快速创建一个Notification的步骤简单可以分为以下四步: 第一步:通过getSystemService()方法得到 ...

  5. HTML5文件API之FileReader

    在文件上传之前,我们总想预览一下文件内容,或图片样子,html5 中FileReader正好提供了2种方法,可以在不上传文件的情况下,预览文件内容. 图片预览:readAsDataURL(file); ...

  6. 自己写bitmap

    备注:1.原创文章,转载请标明出处: 2.欢迎建议和意见 3.我的实现是C语言,为了保护公司隐私,下述数据类型被我改了.实际上int应改是无符号4个字节的类型,byte是有符号1个字节,才能保证移植性 ...

  7. SolrCloud集群搭建(基于zookeeper)

    1. 环境准备 1.1 三台Linux机器,x64系统 1.2 jdk1.8 1.3 Solr5.5 2. 安装zookeeper集群 2.1 分别在三台机器上创建目录 mkdir /usr/hdp/ ...

  8. Linux 下查看系统当前登录用户信息

    当你新登录一个主机,过着管理一个主机,这时候你就需要这些命令来进行查看了: 1. w : Show who is logged on and what they are doing. w [optio ...

  9. HDU ACM 1869 六度分离(Floyd)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 3.6Python数据处理篇之Numpy系列(六)---Numpy随机函数

    目录 目录 前言 (一)基础的随机函数 (二)轴的随机函数 (三)概率的随机函数 目录 前言 前一段日子学了numpy,觉得无趣,没有学完,不过后来看了看matplotlib,sympy等库时,频频用 ...