[csdn博客傳送門](https://blog.csdn.net/zhanghao3389) [github博客傳送門](https://mrzhang3389.github.io/)
無聊寫了個ATM提款機系統有個小bug不影響使用git
本章所需知識:github
[簡單的SQL語句學習點我](https://blog.csdn.net/zhanghao3389/article/details/82596863)
[簡單的Python-SQLite數據庫學習點我](https://blog.csdn.net/zhanghao3389/article/details/82597085)
[基礎知識第一課](https://blog.csdn.net/zhanghao3389/article/details/82117105) [基礎知識第二課](https://blog.csdn.net/zhanghao3389/article/details/82118215)
[基礎知識第三課](https://blog.csdn.net/zhanghao3389/article/details/82119999)
[基礎知識第四課](https://blog.csdn.net/zhanghao3389/article/details/82216780)
[錯誤和異常](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 就是好比你存錢 進入了存錢選項 那就必須存了錢才能退出來,不然不能退出來.通常不影響使用. 不想解決了 留給後人 歡迎留言交流…數據庫