前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现ATM提款机系统

Python实现ATM提款机系统

作者头像
公众号---人生代码
发布2019-08-20 11:59:28
2K0
发布2019-08-20 11:59:28
举报
文章被收录于专栏:人生代码人生代码

Python实现ATM

Python实现ATM提款机系统

代码语言:javascript
复制
[csdn博客传送门](https://blog.csdn.net/zhanghao3389)
[github博客传送门](https://mrzhang3389.github.io/)

无聊写了个ATM提款机系统有个小bug不影响使用

本章所需知识:

1.简单的SQL语句(建数据库,建表,增删改查)

代码语言:javascript
复制
[简单的SQL语句学习点我](https://blog.csdn.net/zhanghao3389/article/details/82596863)

2.Python自带的小型数据库SQLite的使用 同理不会的可以看看下面的链接

代码语言:javascript
复制
[简单的Python-SQLite数据库学习点我](https://blog.csdn.net/zhanghao3389/article/details/82597085)

3.Python的基础知识(如果有不会的可以看我往期教程)

代码语言:javascript
复制
[基础知识第一课](https://blog.csdn.net/zhanghao3389/article/details/82117105)
[基础知识第二课](https://blog.csdn.net/zhanghao3389/article/details/82118215)

4.函数的定义

代码语言:javascript
复制
[基础知识第三课](https://blog.csdn.net/zhanghao3389/article/details/82119999)

5.面向对象

代码语言:javascript
复制
[基础知识第四课](https://blog.csdn.net/zhanghao3389/article/details/82216780)

6.简单的异常捕获

代码语言:javascript
复制
[错误和异常](https://blog.csdn.net/zhanghao3389/article/details/82347067)

好了话不多说,上列子,解释都在注释里.有看不懂的可以留言大家一起交流哦. 文件链接(Python文件和数据库文件):

代码语言:javascript
复制
https://download.csdn.net/download/zhanghao3389/10651270

代码如下

代码语言:javascript
复制
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 就是比如你存钱 进入了存钱选项 那就必须存了钱才能退出来,否则不能退出来.一般不影响使用. 不想解决了 留给后人 欢迎留言交流…

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python实现ATM
  • Python实现ATM提款机系统
  • 1.简单的SQL语句(建数据库,建表,增删改查)
  • 2.Python自带的小型数据库SQLite的使用 同理不会的可以看看下面的链接
  • 3.Python的基础知识(如果有不会的可以看我往期教程)
  • 4.函数的定义
  • 5.面向对象
  • 6.简单的异常捕获
  • 代码如下
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档