ATM实现流程

1.欢迎界面和菜单

显示部分的代码代码放到view.py中

import time

class View():
def login():
"""
管理员登录
:return:
"""
while True:
username = input("请输入管理员用户名:")
password = input("请输入管理员密码:")
if username == 'admin' and password == '':
View.welcome_view()
time.sleep(1)
View.operate_view()
return True
else:
print("管理员用户或密码错误,请重新输入") def welcome_view():
"""
欢迎界面
:return:
"""
print("**************************************")
print("* *")
print("* *")
print("* Welcome to Kengdie's Bank *")
print("* *")
print("* *")
print("**************************************") def operate_view():
"""
菜单
:return:
"""
print("**************************************")
print("* 开户(1) 查询(2) *")
print("* 存钱(3) 取钱(4) *")
print("* 转账(5) 改密(6) *")
print("* 锁卡(7) 解卡(8) *")
print("* 补卡(9) 退出(0) *")
print("**************************************")

实现效果如下图所示

2.创建Card类和Person类

Card类存储了一个卡的基本信息,Card类相关参数如下所示:

class Card:
def __init__(self,cardid,password,money):
self.cardid = cardid # 卡号
self.password = password # 卡号对应的密码
self.money = money # 卡内余额
self.islock = False # 卡的状态,False代表卡未被冻结

Person类存储了一个用户的基本信息,Person类相关参数如下所示:

class Person():
def __init__(self,name,userid,phone,card):
self.name = name # 用户姓名
self.userid = userid # 身份证号
self.phone = phone # 手机号
self.card = card # 用户卡对象

3.通过pickle获取user.txt和userid.txt中的数据

 def __init__(self):
"""
初始化方法,用来加载txt中文件数据
"""
self.get_user_dict()
self.get_userid_dict() def get_user_dict(self):
"""
加载user.txt中的数据
:return:
"""
if os.path.exists("user.txt"):
with open("user.txt", mode='rb') as fp:
self.user_dict = pickle.load(fp)
else:
self.user_dict = {} def get_userid_dict(self):
"""
加载userid.txt中的数据
:return:
"""
if os.path.exists("userid.txt"):
with open("userid.txt", mode='rb') as fp:
self.userid_dict = pickle.load(fp)
else:
self.userid_dict = {}

4.当我们选择为0,要实现保存操作

    def save(self):
"""
存储两个字典
:return:
"""
with open("user.txt", mode='wb') as fp:
pickle.dump(self.user_dict,fp) # 退出时,将字典写回文件中
with open("userid.txt", mode='wb') as fp:
pickle.dump(self.userid_dict,fp)

5.选择为1:开户(注册)功能

    def register(self):
"""
开户(注册)
:return:
"""
name = self.check_name()
userid = self.check_userid()
phone = self.check_phone()
password = self.get_pwd("请输入您的密码","请确认您的密码")
cardid = self.get_cardid()
money = 10
card = Card(cardid,password,money)
person = Person(name,userid,phone,card) self.user_dict[cardid] = person
self.userid_dict[userid] = cardid print("恭喜{}开卡成功,卡号{},卡上余额{}元".format(name,cardid,money))

1.关于输入的合法性:在注册时,我们需要输入名字、身份证号、手机号等众多信息,而这些输入内容都需要进行正则匹配后才可以通过的

下面的函数是专门用来判断用户输入的内容是否合法:

  def check_name(self):
"""
检查名字是否合法
:return:
"""
while True:
name = input("请输入您的名字:")
if name == "" or " "in name:
print("名字不符合规范")
else:
return name def check_userid(self):
"""
检查身份证号码是否规范
:return:
"""
while True:
userid = input("请输入您的身份证号:")
value = re.search("^\d{6}([1-9]\d{3})([0][1-9]|[1][0-2])([0][1-9]|[12][0-9]|[3][01])\d{3}[X\d]$", userid)
if value != None:
return userid
else:
print("身份证号码不符合规范") def check_phone(self):
"""
检查手机号是否规范
:return:
"""
while True:
phone = input("请输入您的手机号:")
value = re.findall("^[1][3-9]\d{9}$",phone)
if value != []:
return value
else:
print("手机号不符合规范") def check_pwd(self,check_pwd):
"""
检测密码是否规范
:param check_pwd:
:return:
"""
value = re.findall("^\w{6}$",check_pwd)
if value != []:
return value[0]
else:
print("密码不符合规范")

2.关于获取卡号:当用户正确的填写信息后,我们需要赋予用户一个卡号,所以我们需要一个生成卡号的函数:

    def get_cardid(self):
"""
获取随机卡号
:return:
"""
while True:
cardid = str(random.randrange(100000,1000000))
if cardid not in self.user_dict:
return cardid

3.关于user.txt和userid.txt中数据的存储形式:当我们注册成功时,我们应该存储一些用户信息放到字典中

下面规定了数据的存储形式:

user.txt : {卡号1:用户对象1,卡号2:用户对象2,卡号3:用户对象3}

userid.txt : {身份证号1:卡号1,身份证号2:卡号2,身份证号3:卡号3}

4.实现效果如下图所示:

选择为2:查询用户卡余额

    def query(self):
"""
查询用户卡内余额
:return:
"""
card = self.get_card_info()
if not card:
print("抱歉,这张卡不存在")
else:
if card.islock:
print("您的账户已经被冻结")
else:
if self.pwd_validation(card):
print("您的卡内余额为{}元".format(card.money))

1.输入卡号获取卡号所对应的用户对象:无论是现在的查询操作,还是后面的其他操作,我们会经常需要根据当前卡号获取当前卡号所对应的卡号对象

所以我们需要定义一个get_card_info方法,目的是根据输入的用户卡号获取卡号对象,方便后面的操作

    def get_card_info(self):
"""
获取卡号
:return:
"""
cardid = input("请输入您的卡号:")
if cardid not in self.user_dict:
return False
else:
user = self.user_dict[cardid]
return user.card

2.关于逻辑:如下图所示

3.关于输入密码正确与否,以及输错次数的限定,我们需要单独定义一个函数

    def pwd_validation(self,card):
"""
密码验证
:param card:
:return:
"""
times = 1
while times < 4:
password = input("请输入您的密码:")
if password == card.password:
return True
else:
print("密码输入错误,您还有{}次机会".format(3-times))
# print(card.password)
if times == 3:
card.islock = True
print("由于您多次输入密码错误,您的账户已经被冻结~")
times += 1

4.实现效果如下图所示

3.选择为3:存钱

    def save_money(self):
"""
存钱
:return:
"""
card = self.get_card_info()
if not card:
print("抱歉,这张卡不存在")
else:
user = self.user_dict[card.cardid] # 给卡号获取用户对象
print("您这张卡的用户名为{}".format(user.name)) # 根据用户对象取用户名
key_sure = input("确认存钱请按1 ,按其他键返回上一层:") # 确认按钮
if key_sure == "":
str_money = input("请输入您的存款金额:")
if str_money.isdecimal() and str_money != "": # 输入金额必须是纯数字且不可以存0元
money = int(str_money)
card.money += money # 存的钱+卡内的钱=现在卡里有多少钱
print("您已经成功存入{}元".format(money))
else:
print("输入存款金额非法")

1.需要注意的是:可以根据user_dict中的键:card.cardid获取到值:user(用户对象)-->用来显示用户名

2.实现效果如下图所示

4:选择为4:取钱

   def get_money(self):
"""
取钱
:return:
"""
card = self.get_card_info()
if not card:
print("抱歉,这张卡不存在")
else:
if card.islock:
print("您的账户已经被冻结")
else:
if self.pwd_validation(card):
while True:
money = input("请输入您的取款金额:")
if money.isdecimal() and money != "":
money = int(money)
if money <= card.money:# 只有输入的取款金额小于卡内的余额,才可以取款
card.money -= money
print("您已经成功取款{}元,还剩{}元".format(money,card.money))
break
else: # 如果输入的取款金额大于卡内的余额,提示余额不足
print("银行卡内余额不足,请重新输入")
else:
print("输入金额非法")

1.需要注意的是:只有取款金额小于卡内的余额,才可以成功取款

2.关于逻辑:如下图所示

3.实现效果如下图所示

小程序3:ATM小程序的更多相关文章

  1. 简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  2. 张小龙的野心:用小程序重构web|小程序好处及可能的不足

    一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...

  3. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  4. 微信小程序跳一跳辅助程序(手动版)

    最近,微信官方推出了demo小程序游戏<跳一跳>,这个游戏操作简单,容易上手,却又不容易获得高分,受到很多人的喜爱(emm...这游戏有毒).自己也尝试了玩了几次,作为一个手残+脑残的资深 ...

  5. 详解封装微信小程序组件及小程序坑(附带解决方案)

    一.序 上一篇介绍了如何从零开发微信小程序,博客园审核变智障了,每次代码都不算篇幅,好好滴一篇原创,不到3分钟从首页移出来了.这篇介绍一下组件封装和我的踩坑历程. 二.封装微信小程序可复用组件 首先模 ...

  6. 承接小程序外包 微信小程序外包 H5外包 就找北京动点软件

    承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询 QQ:372900288 微信:li ...

  7. 微信小程序代码大全 - 小程序开发福利

    小程序QQ交流群:131894955 小程序开发文档(Wepy) 小程序商城源码下载(weixin-app-shop) 小程序官网源码下载(weixin-app-cms) 微信管家平台JAVA版开源下 ...

  8. 微信小程序跳转小程序

    <navigator target="miniProgram" open-type="navigate" app-id="{{BappId}}& ...

  9. [微信小程序] 认识微信小程序及开发环境搭建

    微信公众平台首页 https://mp.weixin.qq.com 微信公众平台测试帐号系统 https://open.weixin.qq.com/connect/qrconnect?appid=wx ...

随机推荐

  1. X-Tag实战:给博客加一个隐藏侧栏的功能

    X-Tag是什么? X-Tag是一个库,这个库可以让你用面向对象的方式定义自定义标签并给与其功能,很适合用来写一些网页小组件. xtag.create('x-clock', class extends ...

  2. SparkCore

    一.概述 1,定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个不可变.可分区.里面的元素可 ...

  3. three.js 数学方法之Matrix3

    今天郭先生来说一说three.js的三维矩阵,这块知识需要结合线性代数的一些知识,毕业时间有点长,线性代数的知识大部分都还给了老师.于是一起简单的复习了一下.所有的计算都是使用列优先顺序进行的.然而, ...

  4. 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱

    先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理的面试题, ...

  5. 图片懒加载、ajax异步调用数据、lazyload插件的使用

    关于这个效果还是很简单的,样式部分我就不多说了,我就简单的写了一下布局, 这是css样式 我们先说一下实现的原理. 我们都知道在于图片的引入,我们都是用src来引入图片地址.从而实现图片的显示.那我们 ...

  6. Image Processing Using Multi-Code GAN Prior, CVPR2020

    论文:Image Processing Using Multi-Code GAN Prior, CVPR2020 代码:https://github.com/genforce/mganprior 这是 ...

  7. 2018年5月15日临下班前找的一个读取assets下数据库的例子

    网页   https://blog.csdn.net/li12412414/article/details/51958774 @Override protected void onCreate(Bun ...

  8. JAVA OOP 编程-常用设计模式

    smart-design-pattern 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看 ...

  9. idea 配置多个tomcat引发的血案

    javax.management.InstanceNotFoundException: Catalina:type=Server 修改tomcat端口时却仍是8080 没有使用在idea tomcat ...

  10. 每日一道 LeetCode (1):两数之和

    引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...