Python——银行管理系统_银行管理系统python-程序员宅基地

技术标签: python  


目录上面

先需要分析,有那些类,类有什么属性

人
类名:Person
属性:姓名,身份证号,电话号,卡
行为:
 
卡
类名:Card
属性:卡号,密码,余额
行为:
 
提款机
类名:ATM
属性:用户字典
行为:开户,查询,取款,存款,转账,改密码,锁定,解锁,补卡,销户
 
管理员
类名:Admin
属性:
行为:管理员界面,显示界面(功能界面),管理员验证

管理员类Admin()

管理员界面和显示界面是一进去程序就能看见的
所以分2个函数,管理员界面一个,显示界面一个(即功能界面)。
在这里插入图片描述

Admin代码

import time
 
class Admin(object):
    admin = '1'
    passwd = '1'
 
    # 管理员界面
    def AdminView(self):
        print("**********************************************")
        print("*                                            *")
        print("*                                            *")
        print("*               欢迎登录联盟银行              *")
        print("*                                            *")
        print("*                                            *")
        print("**********************************************")
 
    # 功能界面
    def FunctionView(self):
        print("**********************************************")
        print("*           开户(1)     查询(2)          *")
        print("*           取款(3)     存款(4)          *")
        print("*           转账(5)     改密码(6)         *")
        print("*           锁定(7)     解锁(8)          *")
        print("*           补卡(9)     销户(10)         *")
        print("*                   退出(0)                *")
        print("**********************************************")
 
    # 管理员验证
    def Check(self):
        inputAdmin = input("请输入管理员账户: ")
        if self.admin != inputAdmin:
            print("账号输入错误!")
            return -1
        inputPasswd = input("请输入管理员密码: ")
        if self.passwd != inputPasswd:
            print("密码输入错误!")
            return -1
        # 能执行到这里说明账号密码输入正确
        print("操作成功,请稍后...")
        # time.sleep(2)
        return 0

管理员界面
在这里插入图片描述
功能界面
在这里插入图片描述

ATM()类

在ATM类中,我把每个用户的所有数据存入字典当中,比如开户行为,目标就是向用户字典中添加一对键值对(卡号-用户)。

当然,除了我所要求的ATM机的功能行为外,还需要额外创建两个方法随机生成卡号和验证密码,因为这两个方法经常被使用,为了提高程序的复用性,我将这两个方法单独写了出来
在这里插入图片描述

ATM代码

import random
from Card import Card
from Person import Person
 
class ATM(object):
    def __init__(self, allusers):
        # 存储所有用户的信息,用字典
        self.allUsers = allusers
 
    # 创建用户
    def CreatUser(self):
        # 目标:向用户字典中添加一对键值对(卡号-用户)
        name = input("请输入您的姓名:")
        idCard = input("请输入您的身份证号:")
        phone = input("请输入您的电话号码:")
        preMoney = int(input("请输入您的预存款金额:"))
        if preMoney < 0:
            print("预存款输入有误,开户失败......")
            return -1
        # 设置密码
        onePasswd = input("请输入密码:")
        # 验证密码
        if not self.checkPasswd(onePasswd):
            print("密码输入有误,开户失败......")
            return -1
        # 信息收集完成
        # 生成卡号
        cardId = self.creatCardId()
 
        card = Card(cardId, onePasswd, preMoney)
        user = Person(name, idCard, phone, card)
        # user存到字典
        self.allUsers[cardId] = user
        print("开户成功,请牢记卡号(%s)......" % cardId)
 
    # 查询余额
    def searchUserInfo(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        # 查询成功,输出结果
        print("账户:%s     余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
 
    # 取款
    def getMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        getmoney = int(input("请输入您取款金额:"))
        nowmoney = int(user.card.cardmoney)
        if getmoney > nowmoney:
            print("余额不足,取款失败......")
            return -1
        nowmoney -= getmoney
        user.card.cardmoney = nowmoney
        print("取款成功,您目前余额为:%d" % user.card.cardmoney)
 
    # 存款
    def saveMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        savemoney = int(input("请输入您存款金额:"))
        nowmoney = int(user.card.cardmoney)
        nowmoney += savemoney
        user.card.cardmoney = nowmoney
        print("取款成功,您目前余额为:%d" % user.card.cardmoney)
 
    # 转账
    def transferMoney(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        # 查询成功,输出结果
        print("账户:%s     余额:%d" % (user.card.cardid, int(user.card.cardmoney)))
        tocardid = input("请输入您希望转账的账户:")
        # 验证是否存在该卡号
        usertoid = self.allUsers.get(tocardid)
        if not usertoid:
            print("该卡号不存在,查询失败......")
            return -1
        tomoney = int(input("请输入您希望转账的金额:"))
        nowmoney = int(user.card.cardmoney)
        tonowmoney = int(usertoid.card.cardmoney)
        if tomoney > nowmoney:
            print("余额不足,转账失败......")
            return -1
        nowmoney -= tomoney
        tonowmoney += tomoney
        user.card.cardmoney = nowmoney
        usertoid.card.cardmoney = tonowmoney
        print("转账成功,您目前余额为:%d" % user.card.cardmoney)
 
    # 改密码
    def changePasswd(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        # 判断是否锁定
        if user.card.cardlock == True:
            print("该卡已经被锁定,请解锁后再使用其他操作......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,该卡已经被锁定......")
            user.card.cardlock = True
            return -1
        newpasswd = input("请输入新密码:")
        newpasswd2 = input("请确认新密码:")
        if newpasswd != newpasswd2:
            print("两次密码输入不一致,密码修改失败")
            return -1
        user.card.cardpasswd = newpasswd
        print("密码修改成功......")
 
    # 锁定
    def lockUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
        if user.card.cardlock:
            print("该卡已经被锁定,请结束后再使用其他功能")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误......")
            return -1
        # 锁定
        user.card.cardlock = True
        print("锁定成功......")
 
    # 解锁
    def unlockUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,解锁失败......")
            return -1
        if not user.card.cardlock:
            print("该卡没有锁定,无需解锁......")
            return -1
        # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,解锁失败......")
            return -1
        temid = input("请输入您的身份证号:")
        if temid != user.idCard:
            print("身份证号输入错误,解锁失败......")
            return -1
        # 解锁
        user.card.cardlock = False
        print("解锁成功......")
 
    # 补卡
    def newCard(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误......")
            return -1
        # 重新生成卡号
        newcard = self.creatCardId()
        user.card.cardid = newcard
        print("补卡办理成功,这是您的新卡号:%s" % user.card.cardid)
 
    # 销户
    def killUser(self):
        cardnum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardnum)
        if not user:
            print("该卡号不存在,查询失败......")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardpasswd):
            print("密码错误,销户失败......")
            return -1
        self.allUsers.pop(cardnum)
        print("该账户已经被销户......")
 
    # 验证密码,循环三次没有正确就输出错误
    def checkPasswd(self, realPasswd):
        for i in range(3):
            temPasswd = input("请确认密码:")
            if temPasswd == realPasswd:
                return True
        return False
 
    # 随机生成卡号
    def creatCardId(self):
        # 验证密码是否重复
        while True:
            str = ""
            for i in range(6):
                ch = chr(random.randrange(ord('0'), ord('9') + 1))
                str += ch
            # 判断是否重复
            if not self.allUsers.get(str):
                return str

人类person()类

人的行为可以使用在ATM行为来代替,所以这个class定义了4个属性
在这里插入图片描述

person代码

class Person(object):
    def __init__(self,name,idCard,phone,card):
        self.name = name  #用户名字
        self.idCard = idCard  #用户身份证
        self.phone = phone   #用户电话
        self.card = card  #用户的信用卡

银行卡类card()

银行卡这个类只有三个属性卡号,密码,余额。但是在ATM机的行为中,需要对信用卡进行锁定,所以需要多添加一个锁定属性来判断信用卡是否被锁定。
在这里插入图片描述

card代码

class Card(object):
    def __init__(self,cardid,cardpasswd,cardmoney):
        self.cardid = cardid  #信用卡号
        self.cardpasswd = cardpasswd  #信用卡密码
        self.cardmoney = cardmoney  #卡内余额
        self.cardlock = False  #是否被锁定

main()主函数

在main方法中,因为ATM系统功能界面所示,将进行功能选择
新建立一个银行自动提款机python

银行自动提款代码主函数main()代码

import time
from Admin import Admin
import pickle
from ATM import ATM
import os
 
def main():
    # 界面对象
    admin = Admin()
 
    # 管理员开机
    admin.AdminView()
    if admin.Check():
        return -1
 
    #存储信息的文件是否存在
    if os.path.exists("userinfo.txt"):
        filepath = "userinfo.txt"
    else:
        open("userinfo.txt", "wb")
        filepath = "userinfo.txt"
    # 提款机对象
 
    #如果存储信息的文件非空
    if os.path.getsize(filepath):
        f = open(filepath, "rb")
        # print(f)
        allusers = pickle.load(f)
    else:
        # print("*****")
        allusers = {
    }
    print((allusers))
    atm = ATM(allusers)
 
    while True:
        admin.FunctionView()
        # 等待用户操作
        option = input("请输入您的操作:")
        if option == '1':
            # 开户
            atm.CreatUser()
        elif option == '2':
            # 查询
            atm.searchUserInfo()
        elif option == '3':
            # 取款
            atm.getMoney()
        elif option == '4':
            # 存款
            atm.saveMoney()
        elif option == '5':
            # 转账
            atm.transferMoney()
        elif option == '6':
            # 改密码
            atm.changePasswd()
        elif option == '7':
            # 锁定
            atm.lockUser()
        elif option == '8':
            # 解锁
            atm.unlockUser()
        elif option == '9':
            # 补卡
            atm.newCard()
        elif option == '10':
            # 销户
            atm.killUser()
        elif option == '0':
            # 退出
            if not admin.Check():
                # 将当前系统中的用户信息保存到文件中
                f = open(filepath, "wb")
                pickle.dump(atm.allUsers, f)
                f.close()
                return -1
 
        time.sleep(2)
 
if __name__ == "__main__":
    main()

银行提款机演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42305234/article/details/105438868

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签