银行 ATM 系统项目

取钱:卡是否存在,是否冻结,取钱金额是否正确
转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)
改密:(1)原密码改密  (2)身份证改密
解卡:判断卡号和身份证是否正确在选择解卡
补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)

# 类型要判断
	姓名不能为空,
	密码6位包含字母数字大小写,
	身份证号用正则匹配且不能为空,一个身份证号只能注册一次不能重复.
	不能给自己转账

  

from ATM.package.view import View
from ATM.package.operation import Operation

class Main():
	@staticmethod
	def run():
		if View.login():
			obj= Operation()
			while True:
				name=input("请输入您要办理的序号")
				if name=="1":
					obj.register()
				elif name=="2":
					obj.query()
				elif name=="3":
					obj.save_money()
				elif name=="4":
					obj.Withd_money()
				elif name=="5":
					obj.Transfer_counts()
				elif name=="6":
					obj.Modify_density()
				elif name=="7":
					obj.lock()
				elif name=="8":
					obj.unlock()
				elif name=="9":
					obj.new_card()
				elif name=="0":
					obj.save()
					break
if __name__ == '__main__':
	Main.run()

  

# ###建立卡类
# card卡类:
# 卡号,密码,余额,锁定状态
# cardid , password , money , islock

class Card():
	def __init__(self,cardid,password,money):
		self.cardid=cardid
		self.password =password
		self.money=money
		self.islock=False

  

###建立用户类person
# person 用户类:
# 用户名 身份证号 手机号 卡
# name userid phone card

class Person():
	def __init__(self,name,userid,phone,card):
		self.name=name
		self.userid=userid
		self.phone=phone
		self.card=card

  

### view 视图类
# 登录,  打印欢迎界面 , 打印操作界面

import time

class View():
	def login():
		user=input('请输入登录账号:')
		pwd=input("请输入用名密码")
		if user=="admin" and pwd =="111":
			# 打印欢迎页面
			View.longin_view()
			#设置延迟一秒
			time.sleep(1)
			# 打印操作页面
			View.operation_view()
			return True
		else:
			print("抱歉,你的账户或密码不正确")

	def longin_view():
		print("%s" % ('=' * 50))
		print()
		print('%25s' % ('欢迎来到界面'))
		print()
		print("%s" % ("=" * 50))

	def operation_view():
		print("%s" % ('=' * 50))
		print("%20s		%-40s" % ('开户:(1)','查询:(2)'))
		print("%20s		%-40s" % ( '存钱:(3)','取钱:(4)'))
		print("%20s		%-40s" % ( '转账:(5)','改密:(6)'))
		print("%20s		%-40s" % ( '锁卡:(7)','解卡:(8)'))
		print("%20s		%-40s" % ('补卡:(9)','退出:(0)'))
		print("%s" % ('=' * 50))

if __name__ == '__main__':
	View.login()

  

### operation 操作类
# 把十个功能都在operation里面完成实现
import pickle
import os
import random
from .person import Person
from.card import Card
import re

class Operation():
	# 当进入到系统的时,优先把数据库中的数据拿出来
	def __init__(self):
		self.load_user()
		self.load_userid()
		# {卡号:用户}
		print(self.user_dict)
		# (身份证号:卡号)
		print(self.user_id_dict)

	# 加载{卡号:用户} 字典数据
	def load_user(self):
		if os.path.exists("user.txt"):
			with open("user.txt","rb") as fp:
				self.user_dict = pickle.load(fp)
		else:
			self.user_dict = {}

	# 加载{身份证号:卡号} 字典数据
	def load_userid(self):
		if os.path.exists("userid.txt"):
			with open("userid.txt","rb") as fp:
				self.user_id_dict = pickle.load(fp)
		else:
			self.user_id_dict = {}

	# 当点击退出时,把数据重新更新到数据库
	def save(self):
		with open("user.txt", "wb") as fp:
			pickle.dump(self.user_dict,fp)

		with open("userid.txt","wb") as fp:
			pickle.dump(self.user_id_dict,fp)

	# 开户注册
	def register(self):
		while True:
			name = input("请输入您的姓名:")
			if name=='':
				print("账号不能为空请从新输入")
			else:
				break
		while True:
			phone = input("请输入您的身份证号码(18位):")
			obj = re.search("[1-9][\d+]{16}.", phone)
			if obj == None:
				print("输入身份证号码有误():")
			else:
				userid = obj.group()
				break

		while True:
			phone = input("请输入您的手机号(11位):")
			obj = re.search("^1[\d+]{10}", phone)
			if obj == None:
				print("请输入以1开头11位手机号")
			else:
				phone=obj.group()
				break

		# userid = input("请输入您的身份证号:")
		# phone = input("请输入您的手机号码:")
		if name == userid == phone == "":
			print('您输入的信息有误请从新输入')
		else:
			# 获取密码
			password =self.get_pwd()
			# 获取卡号
			cardid =self.get_cardid()
			money =10
			# 创建一张卡
			card =Card(cardid,password,money)
			# 创建一个用户
			user =Person(name,userid,phone,card)
			# 更新字典
			self.user_dict[cardid]=user
			self.user_id_dict[userid]=cardid
			print("恭喜%s开卡成功,您的卡号为:%s,卡内余额%s元"%(name,cardid,money))
	# 获取密码
	def get_pwd(self):
		while True:
			pwd1 = input("请输入密码:").strip()
			pwd2 = input("请再次输入密码:").strip()
			if pwd1 ==pwd2 and pwd1!="":
				return pwd1
			else:
				print('您输入两次密码不一致,请从新输入:')
	# 获取卡号
	def get_cardid(self):
		while True:
			cardid =str(random.randrange(100000,1000000))
			# 如果当前不在字典中,证明卡号可用
			if cardid not in self.user_dict:
				return cardid
	# 查询(得有卡信息才能查询)
	def query(self):
		card =self.get_card_info()
		if not card:
			print("抱歉,输入卡号不存在")
		else:
			if card.islock:
				print("抱歉,您的卡被锁住了")
			else:
				# 卡没有被锁住的情况下,让用户输入密码
				if self.check_pwd(card):
					print('您卡内余额是%s元'%(card.money))

	#卡的信息
	def get_card_info(self):
		cardid =input("请输入您的卡号信息:")
		if cardid not in self.user_dict:
			return False
		else:
			user =self.user_dict[cardid]
			card =user.card

			return card
	#检测密码(输入三次后锁卡)
	def check_pwd(self,card):
		count =1
		while count<4:
			pwd = input("请输入您的密码:").strip()
			if pwd == card.password:
				return True
			else:
				# 剩余次数 =总次数 - 已经有的次数
				print('密码错误,还剩余%s次机会'%(3-count))
				if count==3:
					card.islock=True
					print('抱歉,您输入密码次数已超过三次,卡已锁住')
			count+=1

	# 存钱业务
	def save_money(self):
		card=self.get_card_info()
		if not card:
			print('抱歉,您的卡不存在')
		else:
			if card.islock:
				print('抱歉,卡已锁住,请先解锁')
			else:
				user = self.user_dict[card.cardid]
				print("您这张卡的用名名是:%s"%(user.name))
				key_sure=input("确认存款请按 1 ,任意键返回上一层")
				if key_sure =="1":
					str_money=input("请输入您要存款金额").strip()
					if str_money.isdecimal():
						money=int(str_money)
						card.money+=money
						print("成功存入金额%s"%(money))
					else:
						print('您输入的金额有误')
	# 取款业务
	def Withd_money(self):
		card=self.get_card_info()
		if not card:
			print('抱歉,您的卡不存在')
		else:
			if card.islock:
				print("抱歉,卡已锁住,请先解锁")
			else:
				pwd=self.check_pwd(card)
				wd_money=input("请输入取款金额:")
				if wd_money.isdecimal():
					money=int(wd_money)
					if  money>card.money:
						print('您的余额不足,请从新输入:')
					else:
						card.money-=money
						print("您已成功取款%s元,卡内余额%s元"%(money,card.money))

	# 转账业务
	def Transfer_counts(self):
		card=self.get_card_info()
		if not card:
			print('抱歉,您的卡不存在')
		else:
			if card.islock:
				print('抱歉,卡已锁住,请先解锁')
			else:
				self.check_pwd(card)
				Other_party=input('请输入对方卡号:')
				if Other_party == card.cardid:
					print("抱歉,账号不能为空或给自己转账")
					return False
				if Other_party not in self.user_dict:
					print("抱歉,账号不能为空或给自己转账")
					return False
				else:
					user = self.user_dict[Other_party]
					Other_party= user.card

					count=input("您将给%s进行转账,确认请按 1 返回按任意键"%(user.name))
					if count=="1":
						Other_count = input("请输入转账金额:")
						Other_count=int(Other_count)
						if card.money<Other_count:
							print("抱歉,您的余额不足")
						else:
						# 原账号减掉的剩余的钱
							card.money-=Other_count
							# 对方账号
							Other_party.money+=Other_count
							print("您已经成功向%s转账%s元"%(user.name,Other_count))
					else:
						return False
	# 改密
	def Modify_density(self):
		card=self.get_card_info()
		if not card:
			print('抱歉,你的卡不存在')
		else:
			if card.islock:
				print('抱歉,卡已锁住,请先解锁后才能更改密码')
			else:
				Modify_count=input("请选择改密方式: (1) 原密修改 (2) 身份证信息验证")
				if Modify_count=="1":
					self.check_pwd(card)
					card.password=self.get_pwd2()
					print("=======改密成功=======")
				elif Modify_count =="2":
					while True:
						Modify_userid=input("请输入您的身份证号码:")
						# user=self.userid_dict[card.cardid]
						user=self.user_dict[card.cardid]
						if Modify_userid ==user.userid:
							self.check_pwd(card)
							card.password = self.get_pwd2()
							print("=======改密成功=======")
							break
						else:
							print("您输入身份证号码有误请从新输入")

	# 设置更改新密码 self.userid_dict[userid]
	def get_pwd2(self):
		while True:
			pwd1 = input("请输入新密码:").strip()
			pwd2 = input("请再次输新密码:").strip()
			if pwd1 ==pwd2 and pwd1!='':
				return pwd1
			else:
				print('您输入两次密码不一致,请从新输入:')

	# 锁卡业务
	def lock(self):
		card =self.get_card_info()
		if not card:
			print('抱歉.卡不存在')
		else:
			num =input('1:使用密码冻结	 2:使用身份证号冻结')
			if num =="1":
				if self.check_pwd(card):
					card.islock=True
					print('=======锁卡成功=======')
			elif num =="2":
				userid =input('请输入您身份证号码:').strip()
				user =self.user_dict[card.cardid]
				if userid == user.userid:
					card.islock =True
					print('=======锁卡成功=======')
				else:
					print('=======锁卡失败=======')

	# 解卡
	def unlock(self):
		card =self.get_card_info()
		if not card:
			print("抱歉,卡不存在")
		else:
			userid=input('请输入您的身份证号')
		user =self.user_dict[card.cardid]
		if userid == user.userid:
			card.islock=False
			print("=======解卡成功=======")
		else:
			print("=======解卡失败=======")

	# 补卡
	def new_card(self):
		card =self.get_card_info()
		if not card:
			print('抱歉,卡不存在')
		else:
			if card.islock:
				print('抱歉,卡已锁住,请先解锁后才能更补卡')
			else:
				userid=input("请输入身份证号:")
				user=self.user_dict[card.cardid]
				if userid==user.userid and userid!="":
					# print(card.cardid)
					del self.user_dict[card.cardid]
					card.cardid=self.get_cardid()
					self.user_dict[card.cardid] = user
					self.user_id_dict[userid] = card.cardid
					print('补卡成功,补卡号为:%s,当前余额为%s元'%(card.cardid,card.money))

  

上一篇:7-9次题目集总结


下一篇:[APIO2009]抢掠计划 tarjan缩点+spfa BZOJ1179