Python實現ATM提款機系統

Python實現ATM

Python實現ATM提款機系統

[csdn博客傳送門](https://blog.csdn.net/zhanghao3389)
[github博客傳送門](https://mrzhang3389.github.io/)

無聊寫了個ATM提款機系統有個小bug不影響使用git

本章所需知識:github

1.簡單的SQL語句(建數據庫,建表,增刪改查)

[簡單的SQL語句學習點我](https://blog.csdn.net/zhanghao3389/article/details/82596863)

2.Python自帶的小型數據庫SQLite的使用 同理不會的能夠看看下面的連接

[簡單的Python-SQLite數據庫學習點我](https://blog.csdn.net/zhanghao3389/article/details/82597085)

3.Python的基礎知識(若是有不會的能夠看我往期教程)

[基礎知識第一課](https://blog.csdn.net/zhanghao3389/article/details/82117105)
[基礎知識第二課](https://blog.csdn.net/zhanghao3389/article/details/82118215)

4.函數的定義

[基礎知識第三課](https://blog.csdn.net/zhanghao3389/article/details/82119999)

5.面向對象

[基礎知識第四課](https://blog.csdn.net/zhanghao3389/article/details/82216780)

6.簡單的異常捕獲

[錯誤和異常](https://blog.csdn.net/zhanghao3389/article/details/82347067)

好了話很少說,上列子,解釋都在註釋裏.有看不懂的能夠留言你們一塊兒交流哦.
文件連接(Python文件和數據庫文件):sql

https://download.csdn.net/download/zhanghao3389/10651270

代碼以下

import sqlite3

'''沒有數據庫時必須先 取消註釋這段代碼 執行一遍後便可正常使用程序了 再次註釋 用戶數據就能夠保存到數據庫了.'''
# def create_database():
#     '''建立了一個數據庫結構'''
#     conn = sqlite3.connect(database='atm_data.db')  # 建立一個數據庫名稱爲atm_data.db

#     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#     若是建立不了數據庫 就把刪除USERS表這句註釋掉就能建立數據庫了.
#     conn.execute("DROP TABLE USERS; ")  # 刪除USERS這個表
#     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#     # 建立一個USERS表 裏面建立一些字段 ID PASSWORD NAME MONEY
#     conn.execute('''CREATE TABLE IF NOT EXISTS USERS
#                 (ID INT PRIMARY KEY     NOT NULL ,
#                  PASSWORD    CHAR(16)   NOT NULL ,
#                  NAME        TEXT(10)   NOT NULL ,
#                  MONEY       REAL);''')
#     conn.commit()  # 提交
#     conn.close()  # 關閉鏈接
# create_database()


def insert_db(ID_user, PASSWORD_user, NAME_user, MONEY_user=0):
    '''將用戶輸入的用戶信息寫入到數據庫'''
    conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
    cmd = "INSERT INTO USERS (ID,PASSWORD,NAME,MONEY) VALUES ({},\"{}\",\"{}\",{})".format(ID_user,PASSWORD_user,NAME_user,MONEY_user)  # 將用戶輸入的信息寫入數據庫
    print(cmd)
    conn.execute(cmd)  # 寫入數據到數據庫
    conn.commit()  # 提交
    conn.close()  # 關閉數據庫連接


def del_db(user_ID):
    '''註銷帳戶用,將帳戶的用戶信息刪除'''
    conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
    cmd = "DELETE FROM USERS WHERE ID = {}".format(user_ID)  # 命令
    conn.execute(cmd)  # 刪除該帳號
    # 驗證一下用戶名 和 密碼 確認刪除 不然 return 請從新輸入帳號
    conn.commit()
    conn.close()


def register_user():
    '''註冊 / 註銷 用戶輸入信息入口'''
    while True:
        try:
            user_ID = int(input('請輸入您的帳號:\n'))
            user_password = str(input('請輸入您的密碼:\n'))
            user_password2 = str(input('請再次輸入您的密碼:\n'))
            user_name = str(input('請輸入開戶人的姓名:\n'))
        except:
            print('輸入信息不符合規範,請重試...')
            continue
        listA = [user_ID, user_password, user_password2, user_name]  # 將用戶輸入的信息以列表的方式返回.
        return listA


def login_user():
    '''登陸信息錄入'''
    while True:
        try:
            user_ID = int(input('請輸入您須要登陸的帳號:\n'))
            user_password = str(input('請輸入您的密碼:\n'))
        except:
            print('登陸信息有誤,請重試.')
            continue
        listA = [user_ID, user_password]  # 將用戶輸入的信息以列表的方式返回.
        return listA


class Database():
    '''定義了一個數據庫操做類.'''

    def __init__(self, id):
        self.id = id  # 當用戶登陸成功後 記錄登陸id

    def select_db(self):
        '''查詢該帳戶的全部信息'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        message = conn.execute("SELECT MONEY FROM USERS WHERE ID = {}".format(self.id))  # 查詢該用戶信息的SQL語句
        for i in message:
            print('你餘額爲:{}'.format(i))
            conn.commit()
            conn.close()
            return i
        else:
            return '沒有此用戶的信息...'

    def select_other_db(self, other_ID):
        '''查詢該帳戶的全部信息'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        message = conn.execute("SELECT MONEY FROM USERS WHERE ID = {}".format(other_ID))  # 查詢指定id的餘額信息.
        for i in message:
            print('你餘額爲:{}'.format(i))
            conn.commit()
            conn.close()
            return i
        else:
            return '沒有此用戶的信息...'

    def updata_db(self, user_password):
        '''更改密碼'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        conn.execute("UPDATE USERS SET PASSWORD = \"{}\" WHERE ID = {}".format(user_password, self.id))  # 傳入用戶的新密碼 進行更改
        print('更新信息完成.')
        conn.commit()
        conn.close()

    def withdraw(self, user_money):
        '''取錢'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        before_money = self.select_db()  # 取錢以前的餘額
        conn.execute("UPDATE USERS SET MONEY = \"{}\" WHERE ID = {}".format(before_money[0] - user_money, self.id))  # 執行取錢的SQL操做
        print('取出{}元,還剩{}元.'.format(user_money, before_money[0] - user_money))  # 打印出 取出的金額和餘下的金額
        conn.commit()
        conn.close()

    def transfer_accounts(self, other_ID, turn_money):
        '''轉帳'''
        if self.id == other_ID:
            print('不能給本身轉帳')
            return None
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        user_money = self.select_db()  # 己方轉帳以前的餘額
        conn.execute("UPDATE USERS SET MONEY = \"{}\" WHERE ID = {}".format(user_money[0] - turn_money, self.id))  # 執行己方的轉帳操做
        other_money = self.select_other_db(other_ID)  # 對方轉帳以前的餘額
        conn.execute("UPDATE USERS SET MONEY = \"{}\" WHERE ID = {}".format(other_money[0] + turn_money, other_ID))  # 執行對方的轉帳操做
        print('本身轉出:{},還剩{}'.format(turn_money, user_money[0] - turn_money))  # 打印出己方的餘額
        print('對方轉入:{},還剩{}'.format(turn_money, other_money[0] + turn_money))  # 打印出對方的餘額
        conn.commit()
        conn.close()

    def wallet(self, user_money):
        '''存錢'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        before_money = self.select_db()  # 存錢以前的餘額
        conn.execute("UPDATE USERS SET MONEY = {} WHERE ID = {}".format(before_money[0] + float(user_money), self.id))  # 執行存錢的操做
        print('存入{}元,如今{}元.'.format(user_money, before_money[0] + float(user_money)))  # 打印出存錢後的餘額
        conn.commit()
        conn.close()

    def checking_money(self, turn_money):
        '''檢查餘額是否足夠,足夠返回True,不然返回False'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        before_money = self.select_db()  # 使用錢以前的錢
        if before_money[0] - turn_money >= 0:  # 餘額不能爲負數
            conn.commit()
            conn.close()
            return True
        else:
            conn.commit()
            conn.close()
            return False

    def checking_password(self, password):
        '''檢查密碼是否正確,正確返回True,不然返回False'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        before_password = conn.execute("SELECT PASSWORD FROM USERS WHERE ID = {}".format(self.id))  # SQL查詢正確密碼
        for i in before_password:  # 判斷舊密碼是否正確
            if i[0] == password:
                conn.commit()
                conn.close()
                return True
            else:
                conn.commit()
                conn.close()
                return False
        else:
            conn.commit()
            conn.close()
            return '沒有找到此帳戶.'


class People():
    def __init__(self, id):
        self.id = id

    def modify_information(self):
        '''用戶修改密碼的輸入'''
        while True:
            try:
                user_password0 = str(input('請輸入你的舊密碼:\n'))
                user_password = str(input('請輸入你的新密碼:\n'))
                user_password2 = str(input('請再次輸入你的新密碼:\n'))
            except ValueError:
                print('您的輸入不符合規範,請從新輸入.')
                continue
            listA = [user_password0, user_password, user_password2]  # 輸入合規範後 將數據以列表的方式返回
            return listA

    def cun(self):
        '''獲取存錢的輸入'''
        while True:
            try:
                user_money = int(input('請輸入您存入的金額:\n'))
            except:
                print('您的輸入不符合規範,請重試.')
                continue
            listA = [user_money]  # 輸入合規範後 將數據以列表的方式返回
            return listA

    def qu(self):
        '''獲取取錢的輸入'''
        while True:
            try:
                user_money = int(input('請輸入您取出的金額:\n'))
            except:
                print('您的輸入不符合規範,請重試.')
                continue
            listA = [user_money]  # 輸入合規範後 將數據以列表的方式返回
            return listA

    def zhuan(self):
        '''獲取轉帳的輸入'''
        while True:
            try:
                other_ID = int(input('請輸入對方帳號:\n'))
                turn_money = float(input('請輸入轉帳金額:\n'))
            except:
                print('您的輸入不符合規範,請重試.')
                continue
            listA = [other_ID, turn_money]  # 輸入合規範後 將數據以列表的方式返回
            return listA


class Verification():
    '''檢查帳戶是否合規的類'''

    def validate_logon(self, user_ID, user_password):
        '''查詢該帳戶的全部信息,覈對密碼是否正確'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        check = conn.execute("SELECT PASSWORD FROM USERS WHERE ID = {}".format(user_ID))  # 覈對帳戶密碼是否正確
        for i in check:
            if i[0] == str(user_password):
                conn.commit()
                conn.close()
                return True
            else:
                conn.commit()
                conn.close()
                return False

    def checking_ID(self, user_ID):
        '''檢查該ID是否存在,如已存在返回False,不然返回True'''
        conn = sqlite3.connect('atm_data.db')  # 建立一個數據庫連接
        check = conn.execute("SELECT ID FROM USERS WHERE ID = {}".format(user_ID))  # 查詢數據庫中的ID是否存在
        for i in check:
            if i[0] == user_ID:
                conn.commit()
                conn.close()
                return False
            else:
                conn.commit()
                conn.close()
                return True
        else:
            return True


# 登陸以後的主函數
def after_logging():
    database = Database(listA[0])  # 將登陸成功的用戶數據庫操做類實例化
    people = People(listA[0])  # 將登陸成功的用戶輸入類實例化
    while True:
        print('1.查詢\n2.取款\n3.存款\n4.轉帳\n5.修改密碼\n6.退出')
        try:
            select2 = int(input('請輸入您本次的操做序號:\n'))
        except (IOError, ValueError):
            print('輸入錯誤,請從新輸入.')
            continue
        list_people = []
        if select2 == 1:  # 查詢餘額
            database.select_db()
        elif select2 == 2:  # 取款操做
            list_people = people.qu()  # 獲取用戶輸入的 取款金額 存放在列表裏
            if database.checking_money(list_people[0]):  # 檢查用戶餘額是否足夠
                database.withdraw(list_people[0])  # 執行取錢操做
                continue
            else:
                print('餘額不足,請重試.')
                continue
        elif select2 == 3:  # 存款操做
            list_people = people.cun()  # 獲取用戶存款的金額
            if list_people[0] > 0:  # 判斷存款金額是否正常
                database.wallet(list_people[0])
                continue
            else:
                print('您存款的金額不對請重試.')
                continue
        elif select2 == 4:  # 轉帳操做
            list_people = people.zhuan()  # 獲取對方帳號 獲取轉帳金額
            if verification.checking_ID(list_people[0]) or (
            not database.checking_money(list_people[1])):  # 檢查對方ID存在爲False 檢查餘額不足夠就False
                print('對方帳戶不存在或轉出金額超出餘額,請覈對後再試...')
                continue
            else:
                database.transfer_accounts(list_people[0], list_people[1])  # 執行轉帳操做
                continue
        elif select2 == 5:  # 修改密碼
            list_people = people.modify_information()  # 獲取一箇舊密碼 兩個新密碼
            if list_people[1] == list_people[2] and database.checking_password(list_people[0]):  # 兩個新密碼一致 而且 舊密碼正確
                database.updata_db(list_people[1])  # 知足上述條件  執行修改密碼操做
                continue
            else:
                print('舊密碼不正確,或兩次新密碼不一致.')
                continue
        elif select2 == 6:  # 退出
            print('正在退出,請稍候.')
            return '本次交易已退出'
        else:
            print('輸入錯誤,請從新輸入.')
            continue


if __name__ == '__main__':  # 主函數入口
    verification = Verification()  # 實例化一個檢查類
    while True:
        print('1.登陸\n2.註冊帳號\n3.註銷帳號\n4.關機')
        try:
            select = int(input('請輸入您本次的操做序號:\n'))
        except (IOError, ValueError):
            print('輸入錯誤,請從新輸入.')
            continue
        if select == 1:
            listA = login_user()  # 獲取用戶帳號 密碼
            if verification.validate_logon(listA[0], listA[1]):  # 檢查帳戶密碼是否一致
                print('登陸成功')
                after_logging()  # 進入登陸後的主程序
                continue
            else:
                print('帳號或密碼錯誤,請從新登陸.')
                continue

        elif select == 2:
            while True:
                print('您正在執行註冊帳戶的操做.')
                listA = register_user()  # 獲取用戶註冊信息 帳戶 密碼 用戶名
                if verification.checking_ID(listA[0]) and listA[1] == listA[2]:  # 檢查註冊ID是否重複 兩次密碼是否一致
                    insert_db(listA[0], listA[1], listA[3])  # 將用戶信息寫入數據庫
                    print('註冊成功,您如今能夠登陸使用了.')
                    break
                else:
                    print('您沒有輸入正確帳戶信息,請從新選擇您要操做的選項.')
                    break
        elif select == 3:
            while True:
                print('您正在執行註銷帳戶的操做,沒有取出的餘額將不予退還.')
                listA = register_user()  # 獲取 帳號 密碼 密碼 用戶名
                # 檢查帳戶是否存在 帳號密碼是否一致 兩次密碼是否一致
                if (not verification.checking_ID(listA[0])) and verification.validate_logon(listA[0], listA[1]) and (listA[1] == listA[2]):
                    del_db(listA[0])  # 執行註銷操做
                    print('註銷成功,系統中已經再也不有您的我的信息了.')
                    break
                else:
                    print('您沒有輸入正確的帳戶信息,請從新選擇您要操做的選項.')
                    break
        elif select == 4:
            print('關機中,請稍候...')
            print('------------------------------')
            exit()
        else:
            print('輸入錯誤,請從新輸入.')
            continue

好吧 仍是解釋一下那個小 bug 就是好比你存錢 進入了存錢選項 那就必須存了錢才能退出來,不然不能退出來.通常不影響使用. 不想解決了 留給後人 歡迎留言交流…數據庫

請繼續關注我

圖片描述

相關文章
相關標籤/搜索