写在前面:本章需要一定的python基础,以及项目开发的一点点经验。
目录
一、项目分析及功能描述
由于是利用python进行编写,所以我们采用面对对象编程的思想对整个项目进行搭建框架。
按照银行取款机的框架,我们采用四个对象进行模拟银行取款系统。
- 对象一 取款机的显示界面和管理员登录——Admin
功能:
① 负责银行系统主界面的显示,这里由于使用的是控制台,所以以字符的形式显示主界面
② 拥有管理员登录和退出的操作,内置管理员账号和密码,与后面用户的对象区别开来。
- 对象二 取款机对象——ATM
功能:开户、查询账户余额、取款、存款、转账、修改密码、锁定卡号、解锁卡号、补卡、销户等功能
- 对象三 用户对象——User
功能:存放用户信息,包括用户的 用户真实姓名、用户身份证信息、用户电话号码以及用户持有卡的信息
- 对象四 卡对象——Card
功能:存放卡的信息和状态,有卡号、卡的密码、卡上余额以及卡的锁定状态
二、整个项目编写的思路
下面来到 模拟银行取款机运作的环节,也是我们对项目分析环节。
一个银行取款机的日常操作应该是:
- 开机
- 管理员登录
- 等待用户操作
- 执行用户的各个操作,并保证每个操作的正确性
- 管理员退出系统
- 保存文件,关机
对于每个环节,在这里简单的进行功能分析
-
开机
这个环节需要 有载入开机界面、载入用户数据(allUsers,一个字典类型)操作。这个字典类型键应当存放卡号、值存放的是卡号所对应的用户信息,
-
管理员登录
这个环节需要 验证管理员信息是否正确,否则就会自动关机
-
等待用户操作
这个环节需要 一个用户操作功能的界面
-
执行用户的各个操作,并保证每个操作的正确性
这个环节对应 ATM对象的各个操作
-
管理员退出系统
对管理员信息进行再一次验证,然后关闭自动取款机
-
保存文件,关机
把当前的allUsers字典变量存储到当前文件夹下的txt文件,使得以后重新开机能够加载用户数据
三、功能的实现
这部分是按照各个对象进行写各自的功能模块。
- 对象一 —— Admin
在同一目录下 创建 admin.py 文件
功能目标:
① 显示取款机的界面
② 存储管理员账号和密码便于管理员登录
class Admin(object):
Admin = "1" #管理员账号
passwd = "1" #管理员密码
def printAdminView(self):
# 开机界面
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
print("********************正在进入取款机系统*************************")
def sysFunctionView(self):
# 用户操作功能界面以及管理员退出界面
print("***************************************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 补卡(9) 销户(0) *")
print("* 退出(t) *")
print("* *")
print("***************************************************************")
def adminOption(self):
# 管理员登录的一个判断操作
Input_Admin = input("请输入管理员账号:")
if self.Admin != Input_Admin:
print("你输入的账号不正确!")
return -1
Input_passwd = input("请输入管理员密码:")
if self.passwd !=Input_passwd:
print("你输入的账号不正确!")
return -1
print("以管理员身份操作系统")
#time.sleep(2)
return 0
- 对象二——ATM
在同一目录下创建atm.py 文件
功能目标:开户、查询账户余额、取款、存款、转账、修改密码、锁定卡号、解锁卡号、补卡、销户等功能
from card import Card
from user import User
import random
class ATM(object):
# 属性
def __init__(self, allUsers):
self.allUsers = allUsers # 用户字典
# 方法:对应管理员界面的各个指令
def createUser(self):
# 开户
# 目标:向用户字典中添加键值对(卡号【我们随机分配号码】-键对值-用户【用户内部编码】)
# 提示:字典类型里面可以存放对象(所以是面对对象编程)
name = input("请输入您的姓名:")
idCard = input("请输入您的身份证号:")
phone_number = input("请输入您的电话号码:")
perstoreMoney = int(input("请输入预存款金额:"))
if perstoreMoney < 0:
print("预存款输入有误!开户失败")
return -1
# 注意:对上面的输入应当有一个输入检测机制防止乱输入
# 设置密码
Passwd_once = input('请设置密码:')
# 验证密码的一个方法
if not self.checkPasswd(Passwd_once):
print('密码输入3次有误,开户失败')
return -1
# 信息搜集结束
# 随机配置一个系统卡号
cardID = self.randomCardID()
card = Card(cardID, Passwd_once, perstoreMoney)
user = User(name, idCard, phone_number,card)
# 存入字典
self.allUsers[cardID] = user
print('请牢记卡号:',cardID)
# 到此开户成功
print('开户成功')
# 查询
def searchUserInfo(self):
Want_CardID = input('请输入您要查询的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 验证成功返回卡号信息
print('卡号:%s 余额:%f'%(user.card.cardID, user.card.card_Money))
def getMoney(self):
# 取款
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 判断取钱阶段
Money = int(input('请输入您想取钱的金额:'))
if Money < 0:
print('输入有误,返回主界面')
return -1
if Money > user.card.card_Money:
print('余额不足,取钱操作失败,返回主界面')
return -1
# 这里成功取钱
print('取钱成功,取出金额',Money)
user.card.card_Money -= Money
print('账户余额:',user.card.card_Money)
def saveMoney(self):
# 存款
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 身份判断成功
Money = int(input('请输入您想存钱的金额:'))
if Money < 0:
print('输入有误,返回主界面')
user.card.card_Money += Money
print('存钱成功,账户余额:',user.card.card_Money)
def transMoney(self):
# 转账
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 身份判断成功
# 转账目标
goal_CardID = input('请输入你想转账的账号:')
goal_user = self.allUsers.get(goal_CardID)
if not goal_user:
print('该卡号不存在')
return -1
# 判断是否锁定
if goal_user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
# 转账目标判断成功
# 开始转账
Money = int(input('请输入转账金额:'))
if Money < 0:
print('输入有误,返回主界面')
if Money > user.card.card_Money:
print('余额不足,取钱操作失败,返回主界面')
return -1
user.card.card_Money -= Money
goal_user.card.card_Money += Money
print('转账成功,转账金额为:',Money)
print('您的账户余额为:', user.card.card_Money)
def changePasswd(self):
# 改密
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 身份判断成功
new_passwd = input('请输入您的新密码:')
print('请再次输入您的新密码')
if not self.checkPasswd(new_passwd):
print('三次输入输入失败,修改密码操作失败,返回主界面')
return -1
print('修改密码成功')
ser.card.card_passwd = new_passwd
def lockUser(self):
# 锁定
cardNum = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
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(Want_CardID)
if not user:
print('该卡号不存在')
return -1
if not user.card.cardLock :
print('改卡号没有锁定,无需解锁,请继续其他操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,解锁失败')
return -1
tempIDcard = input('请输入您的身份证号进行验证:')
if tempIDcard != user.idCard:
print('身份证号输入有误,解锁失败!')
return -1
# 到此解锁账号
user.card.cardLock = False
print('账号解锁成功')
def newCard(self):
# 补卡
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 身份判断成功
print('补卡申请已提交,请等候短信通知')
def killUser(self):
# 销户
Want_CardID = input('请输入您的卡号:')
# 验证这个卡号是否存在
# 提取用户出来
user = self.allUsers.get(Want_CardID)
if not user:
print('该卡号不存在')
return -1
# 判断是否锁定
if user.card.cardLock :
print('该卡号已被锁定,请解锁后再进行操作')
return -1
if not self.checkPasswd(user.card.card_passwd):
print('密码输入错误,该卡被锁定,请解锁后再进行操作')
user.card.cardLock = True
return -1
# 身份判断成功
# 开始进行销户
del self.allUsers[Want_CardID]
print('销户成功')
def checkPasswd(self, realPasswd):
# 验证密码的一个方法
for i in range(3):
tempPasswd = input('尝试第%d次请输入密码:'%(i+1))
if tempPasswd == realPasswd:
return True
return False
def randomCardID(self):
# 随机生成一个卡号
while True:
CardId = ''
for i in range(6):
ch = chr(random.randrange(ord('0'), ord('9')+1))
CardId = CardId + ch
# 判断是否重复
if not self.allUsers.get(CardId):
return CardId
- 对象三——User
在同一目录下创建user.py 文件
功能目标:用户真实姓名、用户身份证信息、用户电话号码 以及 用户持有卡的信息
class User(object):
# 属性
def __init__(self, name, idCard, phone_number, card):
self.name = name
self.idCard = idCard
self.phone_number = phone_number
self.card = card
- 对象四——Card
在同一目录下创建card.py 文件
功能目标:保存卡号信息、卡号对应的密码信息、卡上余额以及卡的锁定状态
class Card(object):
# 属性
def __init__(self, cardID, card_passwd, card_Money):
self.cardID = cardID
self.card_passwd = card_passwd
self.card_Money = card_Money
self.cardLock = False # 卡的锁定情况
四、最后整个代码
这里则是把上面功能全部整合一遍,按照自动提款机的运行流程进行执行任务。
由于是在notepad++上运行的,所以文件地址需要手动输入。
如果是其他IDE 可以利用os库下的这个命令自动获取txt的文件地址
filepath = os.path.join(os.path.cwd(), 'allUsers.txt')#保存文件的路径
from admin import Admin
from atm import ATM
import pickle
import os
def main():
# 开机界面
admin = Admin()
#管理员开机
admin.printAdminView()
if admin.adminOption():
print("登录失败")
return -1
print("登录成功")
# 存储所有用户的信息
# AllUser = {}# 放置一个 字典用来存储用户信息
# 这里可以传入 外置的一个文件夹
# 提款机对象
filepath = r' ' # 这里填写当前目录的地址
# 因为空的txt加载会失败,所以加一个错误异常的模块
try:
f = open(filepath, 'rb')
allUsers = pickle.load(f)
f.close()
except Exception as e:
allUsers = {}
print(allUsers)
atm = ATM(allUsers) #初始化了一个类属性
# 登陆界面
while True:
admin.sysFunctionView()
option = input("请输入您所需要的操作:")
if option == "1":
print('开户')
atm.createUser()
elif option == "2":
print('查询')
atm.searchUserInfo()
elif option == "3":
#取款
print('取款')
atm.getMoney()
elif option == "4":
#存款
print('存款')
atm.saveMoney()
elif option == "5":
#转账
print('转账')
atm.transMoney()
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 == "t":
if not admin.adminOption():
f = open(filepath, 'wb')
pickle.dump(atm.allUsers, f)
f.close()
print('已退出')
return -1
if __name__ == "__main__":
main()