【实战项目】使用Python 写一份关于银行自动提款机系统【已完结】

写在前面:本章需要一定的python基础,以及项目开发的一点点经验。

目录

一、项目分析及功能描述

二、整个项目编写的思路

三、功能的实现

四、最后整个代码


一、项目分析及功能描述

由于是利用python进行编写,所以我们采用面对对象编程的思想对整个项目进行搭建框架。

按照银行取款机的框架,我们采用四个对象进行模拟银行取款系统。

 

  • 对象一  取款机的显示界面和管理员登录——Admin

功能:

① 负责银行系统主界面的显示,这里由于使用的是控制台,所以以字符的形式显示主界面

② 拥有管理员登录和退出的操作,内置管理员账号和密码,与后面用户的对象区别开来。

 

  • 对象二 取款机对象——ATM

功能:开户、查询账户余额、取款、存款、转账、修改密码、锁定卡号、解锁卡号、补卡、销户等功能

 

  • 对象三 用户对象——User

功能:存放用户信息,包括用户的 用户真实姓名、用户身份证信息、用户电话号码以及用户持有卡的信息

 

  • 对象四 卡对象——Card

功能:存放卡的信息和状态,有卡号、卡的密码、卡上余额以及卡的锁定状态

 

二、整个项目编写的思路

下面来到 模拟银行取款机运作的环节,也是我们对项目分析环节。

一个银行取款机的日常操作应该是:

  1. 开机
  2. 管理员登录
  3. 等待用户操作
  4. 执行用户的各个操作,并保证每个操作的正确性
  5. 管理员退出系统
  6. 保存文件,关机

对于每个环节,在这里简单的进行功能分析

  • 开机

这个环节需要 有载入开机界面、载入用户数据(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()

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值