Python实现ATM提款机系统
github博客传送门
csdn博客传送门
无聊写了个ATM提款机系统有个小bug不影响使用
本章所需知识:
1.简单的SQL语句(建数据库,建表,增删改查)
2.Python自带的小型数据库SQLite的使用
3.Python的基础知识(如果有不会的可以看我往期教程)
4.函数的定义
5.面向对象
6.简单的异常捕获
好了话不多说,上列子,解释都在注释里.有看不懂的可以留言大家一起交流哦.
文件链接(Python文件和数据库文件):
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('请输入您的账号:
'))
user_password = str(input('请输入您的密码:
'))
user_password2 = str(input('请再次输入您的密码:
'))
user_name = str(input('请输入开户人的姓名:
'))
except:
print('输入信息不符合规范,请重试...')
continue
listA = [user_ID, user_password, user_password2, user_name] # 将用户输入的信息以列表的方式返回.
return listA
def login_user():
'''登录信息录入'''
while True:
try:
user_ID = int(input('请输入您需要登录的账号:
'))
user_password = str(input('请输入您的密码:
'))
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('请输入你的旧密码:
'))
user_password = str(input('请输入你的新密码:
'))
user_password2 = str(input('请再次输入你的新密码:
'))
except ValueError:
print('您的输入不符合规范,请重新输入.')
continue
listA = [user_password0, user_password, user_password2] # 输入合规范后 将数据以列表的方式返回
return listA
def cun(self):
'''获取存钱的输入'''
while True:
try:
user_money = int(input('请输入您存入的金额:
'))
except:
print('您的输入不符合规范,请重试.')
continue
listA = [user_money] # 输入合规范后 将数据以列表的方式返回
return listA
def qu(self):
'''获取取钱的输入'''
while True:
try:
user_money = int(input('请输入您取出的金额:
'))
except:
print('您的输入不符合规范,请重试.')
continue
listA = [user_money] # 输入合规范后 将数据以列表的方式返回
return listA
def zhuan(self):
'''获取转账的输入'''
while True:
try:
other_ID = int(input('请输入对方账号:
'))
turn_money = float(input('请输入转账金额:
'))
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.查询
2.取款
3.存款
4.转账
5.修改密码
6.退出')
try:
select2 = int(input('请输入您本次的操作序号:
'))
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.登录
2.注册账号
3.注销账号
4.关机')
try:
select = int(input('请输入您本次的操作序号:
'))
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