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