[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 就是好比你存钱 进入了存钱选项 那就必须存了钱才能退出来,不然不能退出来.通常不影响使用. 不想解决了 留给后人 欢迎留言交流…数据库