小程序3:ATM小程序
ATM实现流程
1.欢迎界面和菜单
显示部分的代码代码放到view.py中
import time class View(): def login(): """ 管理员登录 :return: """ while True: username = input("请输入管理员用户名:") password = input("请输入管理员密码:") if username == 'admin' and password == '123': View.welcome_view() time.sleep(1) View.operate_view() return True else: print("管理员用户或密码错误,请重新输入") def welcome_view(): """ 欢迎界面 :return: """ print("**************************************") print("* *") print("* *") print("* Welcome to Kengdie's Bank *") print("* *") print("* *") print("**************************************") def operate_view(): """ 菜单 :return: """ print("**************************************") print("* 开户(1) 查询(2) *") print("* 存钱(3) 取钱(4) *") print("* 转账(5) 改密(6) *") print("* 锁卡(7) 解卡(8) *") print("* 补卡(9) 退出(0) *") print("**************************************")
实现效果如下图所示
2.创建Card类和Person类
Card类存储了一个卡的基本信息,Card类相关参数如下所示:
class Card: def __init__(self,cardid,password,money): self.cardid = cardid # 卡号 self.password = password # 卡号对应的密码 self.money = money # 卡内余额 self.islock = False # 卡的状态,False代表卡未被冻结
Person类存储了一个用户的基本信息,Person类相关参数如下所示:
class Person(): def __init__(self,name,userid,phone,card): self.name = name # 用户姓名 self.userid = userid # 身份证号 self.phone = phone # 手机号 self.card = card # 用户卡对象
3.通过pickle获取user.txt和userid.txt中的数据
def __init__(self): """ 初始化方法,用来加载txt中文件数据 """ self.get_user_dict() self.get_userid_dict() def get_user_dict(self): """ 加载user.txt中的数据 :return: """ if os.path.exists("user.txt"): with open("user.txt", mode='rb') as fp: self.user_dict = pickle.load(fp) else: self.user_dict = {} def get_userid_dict(self): """ 加载userid.txt中的数据 :return: """ if os.path.exists("userid.txt"): with open("userid.txt", mode='rb') as fp: self.userid_dict = pickle.load(fp) else: self.userid_dict = {}
4.当我们选择为0,要实现保存操作
def save(self): """ 存储两个字典 :return: """ with open("user.txt", mode='wb') as fp: pickle.dump(self.user_dict,fp) # 退出时,将字典写回文件中 with open("userid.txt", mode='wb') as fp: pickle.dump(self.userid_dict,fp)
5.选择为1:开户(注册)功能
def register(self): """ 开户(注册) :return: """ name = self.check_name() userid = self.check_userid() phone = self.check_phone() password = self.get_pwd("请输入您的密码","请确认您的密码") cardid = self.get_cardid() money = 10 card = Card(cardid,password,money) person = Person(name,userid,phone,card) self.user_dict[cardid] = person self.userid_dict[userid] = cardid print("恭喜{}开卡成功,卡号{},卡上余额{}元".format(name,cardid,money))
1.关于输入的合法性:在注册时,我们需要输入名字、身份证号、手机号等众多信息,而这些输入内容都需要进行正则匹配后才可以通过的
下面的函数是专门用来判断用户输入的内容是否合法:
def check_name(self): """ 检查名字是否合法 :return: """ while True: name = input("请输入您的名字:") if name == "" or " "in name: print("名字不符合规范") else: return name def check_userid(self): """ 检查身份证号码是否规范 :return: """ while True: userid = input("请输入您的身份证号:") value = re.search("^\d{6}([1-9]\d{3})([0][1-9]|[1][0-2])([0][1-9]|[12][0-9]|[3][01])\d{3}[X\d]$", userid) if value != None: return userid else: print("身份证号码不符合规范") def check_phone(self): """ 检查手机号是否规范 :return: """ while True: phone = input("请输入您的手机号:") value = re.findall("^[1][3-9]\d{9}$",phone) if value != []: return value else: print("手机号不符合规范") def check_pwd(self,check_pwd): """ 检测密码是否规范 :param check_pwd: :return: """ value = re.findall("^\w{6}$",check_pwd) if value != []: return value[0] else: print("密码不符合规范")
2.关于获取卡号:当用户正确的填写信息后,我们需要赋予用户一个卡号,所以我们需要一个生成卡号的函数:
def get_cardid(self): """ 获取随机卡号 :return: """ while True: cardid = str(random.randrange(100000,1000000)) if cardid not in self.user_dict: return cardid
3.关于user.txt和userid.txt中数据的存储形式:当我们注册成功时,我们应该存储一些用户信息放到字典中
下面规定了数据的存储形式:
user.txt : {卡号1:用户对象1,卡号2:用户对象2,卡号3:用户对象3}
userid.txt : {身份证号1:卡号1,身份证号2:卡号2,身份证号3:卡号3}
4.实现效果如下图所示:
选择为2:查询用户卡余额
def query(self): """ 查询用户卡内余额 :return: """ card = self.get_card_info() if not card: print("抱歉,这张卡不存在") else: if card.islock: print("您的账户已经被冻结") else: if self.pwd_validation(card): print("您的卡内余额为{}元".format(card.money))
1.输入卡号获取卡号所对应的用户对象:无论是现在的查询操作,还是后面的其他操作,我们会经常需要根据当前卡号获取当前卡号所对应的卡号对象
所以我们需要定义一个get_card_info方法,目的是根据输入的用户卡号获取卡号对象,方便后面的操作
def get_card_info(self): """ 获取卡号 :return: """ cardid = input("请输入您的卡号:") if cardid not in self.user_dict: return False else: user = self.user_dict[cardid] return user.card
2.关于逻辑:如下图所示
3.关于输入密码正确与否,以及输错次数的限定,我们需要单独定义一个函数
def pwd_validation(self,card): """ 密码验证 :param card: :return: """ times = 1 while times < 4: password = input("请输入您的密码:") if password == card.password: return True else: print("密码输入错误,您还有{}次机会".format(3-times)) # print(card.password) if times == 3: card.islock = True print("由于您多次输入密码错误,您的账户已经被冻结~") times += 1
4.实现效果如下图所示
3.选择为3:存钱
def save_money(self): """ 存钱 :return: """ card = self.get_card_info() if not card: print("抱歉,这张卡不存在") else: user = self.user_dict[card.cardid] # 给卡号获取用户对象 print("您这张卡的用户名为{}".format(user.name)) # 根据用户对象取用户名 key_sure = input("确认存钱请按1 ,按其他键返回上一层:") # 确认按钮 if key_sure == "1": str_money = input("请输入您的存款金额:") if str_money.isdecimal() and str_money != "0": # 输入金额必须是纯数字且不可以存0元 money = int(str_money) card.money += money # 存的钱+卡内的钱=现在卡里有多少钱 print("您已经成功存入{}元".format(money)) else: print("输入存款金额非法")
1.需要注意的是:可以根据user_dict中的键:card.cardid获取到值:user(用户对象)-->用来显示用户名
2.实现效果如下图所示
4:选择为4:取钱
def get_money(self): """ 取钱 :return: """ card = self.get_card_info() if not card: print("抱歉,这张卡不存在") else: if card.islock: print("您的账户已经被冻结") else: if self.pwd_validation(card): while True: money = input("请输入您的取款金额:") if money.isdecimal() and money != "0": money = int(money) if money <= card.money:# 只有输入的取款金额小于卡内的余额,才可以取款 card.money -= money print("您已经成功取款{}元,还剩{}元".format(money,card.money)) break else: # 如果输入的取款金额大于卡内的余额,提示余额不足 print("银行卡内余额不足,请重新输入") else: print("输入金额非法")
1.需要注意的是:只有取款金额小于卡内的余额,才可以成功取款
2.关于逻辑:如下图所示
3.实现效果如下图所示