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.實現效果如下圖所示