# 主程序运行

import time
from guanli import GuanLi
from atm import ATM
from user import User def main():
guanli = GuanLi()# 创建一个管理对象
guanli.welcome() # 欢迎界面
guanli.caozuo() # 管理员登陆验证
userinfo = User.load_user() # 加载已有用户信息
atm = ATM(userinfo=userinfo) # 创建操作对象
while True:
guanli.operation() # 管理菜单的操作方法
option = (input("请输入您的操作:")) # 等待用户操作
in_quit = False # 定义一个变量,记录是否退出操作
if option == "":
# print("开户")
atm.kaihu()
elif option == "":
# print("查询")
atm.chaxun()
elif option == "":
# print("取款")
atm.qukuan()
elif option == "":
# print("存款")
atm.cunkuan()
elif option == "":
# print("转账")
atm.zhuanzhang()
elif option == "":
# print("改密")
atm.gaimi()
elif option == "":
# print("锁定")
atm.suodin()
elif option == "":
# print("解锁")
atm.jiesuo()
elif option == "":
# print("销户")
atm.xiaohu()
elif option == "t":
in_quit = True
print("退出成功")
break
elif option == "":
print("查询所有用户信息")
atm.show()
else:
print("操作有误,请重新操作:")
time.sleep(2)
# 设置一个管理类ps:代码全程无英文,适合英语不好的新手看
import time
from atm import ATM
from user import User
class GuanLi(object):
admin = ""
passwd = ""
def welcome(self):
print("*" * 30)
print(" " * 5+"欢迎登陆使用银行管理系统")
print("*" * 30)
def caozuo(self):# 判断管理员账号正确
count = 0
while True:
inputAdmin = input("请输入管理员账号:")
inputPasswd = input("请输入管理员密码:")
if self.admin != inputAdmin or self.passwd != inputPasswd:
print("账号或密码输入有误!!")
count +=1
if count >= 3:
print("错误次数已达上限,锁定一小时,1小时后再试")
break
else:
continue
print("操作成功! 请稍后……")
time.sleep(3)
return 0
# 走到这里说明密码账号没错
def operation(self):
print("*******************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 查询所有用户信息(9) 销户(0) *")
print("* 退出(t) *")
print("********************************************")

#设置一个卡的类ps:密码隐藏不太会,哪位大神可评论区留言。蟹蟹
class Card(object):
def __init__(self,cid,pwd):
self.cid = cid # 卡号
self.pwd = pwd # 密码
self.money = 0 # 余额
self.is_lock = False # 是否锁定,默认不是

#设置一个用户类ps:包括用户信息
from os import path
import os
import pickle
class User(object):
def __init__(self, name, uid, card):
self.name = name # 用户名
self.uid = uid # 身份证
self.card = card # 银行卡
def __str__(self):
return ("姓名:{},身份证号:{},卡号:{}".format(self.name,self.uid,self.card.cid))
# 将用户对象保存到文件中
@staticmethod
def all_user(userinfo):
pathname = path.join(os.getcwd(),"userinfo.db")
with open(pathname, "wb") as fp:
pickle.dump(userinfo, fp)
# 从文件中加载数据重新转换为用户对象
@staticmethod
def load_user():
pathname = path.join(os.getcwd(), "userinfo.db")
if path.exists(pathname):
with open(pathname, "rb") as fp:
userinfo = pickle.load(fp)
return userinfo
else:
return {}
#设置一个辅助类
from random import randint
# 生成随机的银行卡号
class BankCard():
def get_cid(length=8):
cid = ""
for i in range(8):
cid += str(randint(0, 9))
return cid

# 创建一个ATM操作类
import time
import random
from card import Card
from helper import BankCard
from user import User
class ATM(object):
def __init__(self,userinfo):
self.userinfo = userinfo # 保存所有的用户信息
def kaihu(self): # 开户,目标是向用户列表中添加一对键值对(卡号:用户)
name = input("请输入您的姓名:")
uid = input("请输入身份证号:")
pwd = input("请输入密码:")
cid = BankCard.get_cid()
card = Card(cid, pwd)
user = User(name, uid, card)
print(user)
print("开户成功")
self.userinfo[cid] = user
User.all_user(self.userinfo)
def chaxun(self): # 查询
cid = input("请输入您的卡号")
user = self.userinfo.get(cid)
if user:
if user.card.is_lock:
print("该卡已锁定,请先解锁!")
return
else:
print("正在查询,请稍后")
time.sleep(1.5)
print("账户余额:¥{}元".format(user.card.money))
else:
print("无效的卡")
def qukuan(self): # 取款
cid = input("请输入您的卡号")
user = self.userinfo.get(cid)
if user.card.is_lock:
print("该卡已锁定,请先解锁!")
return
else:
money = (int(input("请输入您要取款的金额:")))
user.card.money -= money
User.all_user(self.userinfo)
print("取款成功")
def cunkuan(self): # 存款
count = 0
while True:
cid = input("请输入银行卡号:")
user = self.userinfo.get(cid)
if user:
if user.card.is_lock:
print("该卡已锁定,请先解锁!")
return
pwd = input("请输入您的银行卡密码:")
if pwd == user.card.pwd:
money = input("请输入您的存款金额:")
user.card.money+= int(money)
User.all_user(self.userinfo)
print("存钱成功")
break
elif count < 3:
print("密码错误")
count += 1
if count == 3:
user.card.is_lock = True
print("该卡被锁定,请本人携带身份证到柜台办理解锁")
user.all_user(self.userinfo)
break
else:
print("无效的卡")
def zhuanzhang(self): # 转账
count = 0
while count < 3:
cid = input("请输入您的卡号:")
user = self.userinfo.get(cid)
if user:
if user.card.is_lock:
print("该卡已锁定,请先解锁!")
return
else:
pwd = input("请输入您的密码:")
if pwd == user.card.pwd:
other_cid = input("请输入收款人的账户:")
other_user = self.userinfo.get(other_cid)
money = int(input("请输入转账的金额:"))
if user.card.money >= money:
other_user.card.money += money
user.card.money -= money
user.all_user(self.userinfo)
print("转账成功")
break
else:
print("密码错误,请重新输入:")
count += 1
continue
else:
print("无效的卡")
def gaimi(self): # 改密
cid = input("请输入您的卡号:")
user = self.userinfo.get(cid)
if user:
if user.card.is_lock:
print("该卡已锁定,请先解锁!")
return
else:
pwd = input("请输入您的银行卡原密码:")
count = 0
while True :
if pwd == user.card.pwd:
pwd = input("请输入您要修改的银行卡密码:")
pwd1= input("请再次输入您要修改的银行卡密码:")
if pwd == pwd1:
user.card.pwd = pwd
user.all_user(self.userinfo)
print("密码修改成功")
break
else:
print("两次密码输入不一致,请重新输入:")
continue
else:
print("原密码输入有误!")
count += 1
if count >= 3:
user.card.is_lock = True
print("该卡被锁定,请本人携带身份证到柜台办理解锁")
user.all_user(self.userinfo)
break
else:
print("剩余输入次数{}".format(3-count))
def suodin(self): # 锁定
cid = input("请输入您的卡号:")
user = self.userinfo.get(cid)
if user:
if user.card.is_lock:
print("该卡已被锁定!")
return
else:
user.card.is_lock = True
print("锁定成功!")
user.all_user(self.userinfo)
return
def jiesuo(self): # 解锁
cid = input("请输入您的卡号:")
user = self.userinfo.get(cid)
if user.card.is_lock:
uid = input("请出示您本人的身份证:")
if uid == user.uid:
user.card.is_lock = False
print("解锁成功")
else:
print("本银行暂不支持代解锁!!!")
def show(self): # 查询所有用户信息
for u in self.userinfo:
print(self.userinfo[u])
def xiaohu(self): # 销户
count = 0
while count < 3:
cid = input("请输入您的卡号")
user = self.userinfo.get(cid)
if user:
pwd = input("请输入您的密码:")
if pwd == user.card.pwd:
uid = input("请出示您的身份证:")
if uid == user.uid:
del self.userinfo[cid]
user.all_user(self.userinfo)
print("该账户已注销")
break
else:
print("暂不接受代理,ps:你丫逗我玩呢?")
else:
print("密码错误,请重新输入:")
count += 1
continue
else:
print("该卡已损坏")

银行系统ps:不太完善,蟹蟹评论的更多相关文章

  1. HttpDNS的坑以及一个针对安卓不太完善的测试方案

    背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...

  2. emouse思·睿—评论与观点整理之三

    虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...

  3. WP评论系统更换小结(转)

    第三方评论插件 多说 多说是一款追求极致体验的社会化评论框,可以用微博.QQ.人人.豆瓣等帐号登录并评论. 多说具备优质用户体验.速度和稳定性.社会化推荐.建站程序审核整合.垃圾评论过滤等特性. 自定 ...

  4. JavaScript OOP 之 this指向

    今天给大家分享一个JavaScript OOP中关于分辨this指向对象的小技巧,很实用呦! 我们先来看一段代码: 大家能判断出func();和obj.func();这两句的this指向吗? 首先,我 ...

  5. 还在繁琐的敲MVP接口和实现类吗,教你一秒搞定。

    只有程序员懒起来,才能提高开发效率 233333 在MVP的使用过程中,我们需要反复的去写各种MVP的接口和实现类, 实在是 太麻烦了!!所以抽时间撸了一款插件(只可用于Intellj IDEA 和 ...

  6. 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界

    0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...

  7. PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)

    菜鸡wing遇敌PorterDuffXferMode,不料过于轻敌,应战吃力.随后与其大战三天三夜,三百余回合不分胜负.幸得 @咪咪控 相助,侥幸获胜. 关键字:PorterDuffXferMode ...

  8. 2018-2019-2 20165315《网络对抗技术》Exp2 后门原理与实践

    2018-2019-2 20165315<网络对抗技术>Exp2 后门原理与实践 一.实验任务 使用netcat获取主机操作Shell,cron启动 使用socat获取主机操作Shell, ...

  9. [2017BUAA软工助教]团队alpha得分总表

    一.累计得分 项目 介绍 采访 贡献分 功能 技术 α例会 α发布 α测试 α展示 α事后 合计 满分 10 10 10 10 10 50 10 10 150 10 280 hotcode5 10 9 ...

随机推荐

  1. 浅谈DB2在线分析处理函数

    最近碰到一个测试需求,使用到了在线分析处理(OLAP),现总结记录一下,也希望能帮到有相关问题的朋友. 1. 测试环境是DB2,通过ETL(数据抽取,数据转换,数据加载)技术将数据源数据加载到目标数据 ...

  2. 使用nuget 打包并上传 nuget.org

    一. 准备工作 1 下载  Download NuGet.exe 2  windows 系统下设置环境变量 path中 或者 在dos 命令窗口下转到 nuget.exe 所在目录 3 在www.nu ...

  3. Django全面讲解(2/2)

    前戏 Django是Python语言编写的一个全栈式Web框架(其他的还有Tornado,Flask),可帮助我们快速编写一个具有数据库功能,增删改查.后台管理等功能的网站,若不考虑很高的执行速度,去 ...

  4. 使用 input[type=file]上传文件

    var $file = $('#file'); $('#btn').click(function() { var data = new FormData(); data.append('file', ...

  5. Oracle 常用脚本

    ORACLE 默认用户名密码 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMAL 登录,可作为默认的系统管理员 system/manager SYSDB ...

  6. 团体队列 UVA540 Team Queue

    题目描述 有t个团队的人正在排一个长队.每次新来一个人时,如果他有队友在排队,那么新人会插队到最后一个队友的身后.如果没有任何一个队友排队,则他会被排到长队的队尾. 输入每个团队中所有队员的编号,要求 ...

  7. chromium之ref_counted

    namespace subtle { class RefCountedBase { protected: RefCountedBase(); ~RefCountedBase(); void AddRe ...

  8. MySQL---正确使用索引、limit分页、执行计划、慢日志查询

    正确使用索引 数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效.即使建立索引,索引也不会生效: - like '%xx' se ...

  9. Linux中Zookeeper部署和集群部署

    自己网上下载安装包,我下载的是tar.gz安装包直接解压,也可以下载rpm格式 1.下载zookeeper安装包,放到/usr/local/zookeeper安装包网上下载 2.解压文件tar -zx ...

  10. 《MySQL必知必会》--使用cmd登陆数据库

    数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表:某种特定类型数据的结构化清单. 模式:关于数据库和表的布局及特性的信息. 列:表中的一个字段.所有表都是由一个或多个列组成的. 数据类 ...