小程序3:ATM小程序
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小程序的更多相关文章
- 简单的小程序实现ATM机操作
简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...
- 张小龙的野心:用小程序重构web|小程序好处及可能的不足
一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...
- [小程序开发] 微信小程序内嵌网页web-view开发教程
为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...
- 微信小程序跳一跳辅助程序(手动版)
最近,微信官方推出了demo小程序游戏<跳一跳>,这个游戏操作简单,容易上手,却又不容易获得高分,受到很多人的喜爱(emm...这游戏有毒).自己也尝试了玩了几次,作为一个手残+脑残的资深 ...
- 详解封装微信小程序组件及小程序坑(附带解决方案)
一.序 上一篇介绍了如何从零开发微信小程序,博客园审核变智障了,每次代码都不算篇幅,好好滴一篇原创,不到3分钟从首页移出来了.这篇介绍一下组件封装和我的踩坑历程. 二.封装微信小程序可复用组件 首先模 ...
- 承接小程序外包 微信小程序外包 H5外包 就找北京动点软件
承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询 QQ:372900288 微信:li ...
- 微信小程序代码大全 - 小程序开发福利
小程序QQ交流群:131894955 小程序开发文档(Wepy) 小程序商城源码下载(weixin-app-shop) 小程序官网源码下载(weixin-app-cms) 微信管家平台JAVA版开源下 ...
- 微信小程序跳转小程序
<navigator target="miniProgram" open-type="navigate" app-id="{{BappId}}& ...
- [微信小程序] 认识微信小程序及开发环境搭建
微信公众平台首页 https://mp.weixin.qq.com 微信公众平台测试帐号系统 https://open.weixin.qq.com/connect/qrconnect?appid=wx ...
随机推荐
- 不知道Linux内核到底长啥样?这幅漫画让你秒懂!
下面给大家分享一个[超全2020Linux学习教程],点击链接免费领取哦~ https://www.magedu.com/?p=84301&preview=true
- Linux内核功能介绍及如何使用保护您的网页安全
在本文中,我们快速浏览了Linux内核的许可流程,并向您展示了如何使用它们来保护您的网页或应用安全 传统上,Linux内核通过以下两类来区分其进程: 特权进程:这些进程使用户可以绕过所有内核权限检查. ...
- 手把手教你基于C#开发WinCC语音报警插件「附源代码」
写在前面 众所周知,WinCC本身是可以利用C脚本或者VBS脚本来做语音报警,但是这种方式的本质是调用已存在的音频文件,想要实现实时播报报警信息是不行的,灵活性还不够,本文主要介绍基于C#/.NET开 ...
- Dart函数
函数 Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function.这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征.同时意味着在Dart语言 ...
- 篮球30S定时器设计
一.设计介绍 本设计采用74LS192作为计数器,74LS192具有同步加减计数功能,可以通过引脚电平对它设置达到清零重置的目的,可以达到对计数器清零的功能,使用两片级联74LS192分别显示十位和个 ...
- java基础(六)--常用转义字符
1.换行:"\n"
- 开源项目推荐 - 巨鲸任务调度平台(Spark、Flink)
Big Whale(巨鲸),为美柚大数据研发的大数据任务调度平台,提供Spark.Flink等离线任务的调度(支持任务间的依赖调度)以及实时任务的监控,并具有批次积压告警.任务异常重启.重复应用监测. ...
- shell 格式化数据,转换为execl
awk ' BEGIN { OFS="\t"} ;{ $1=$1 ; print $8,$NF} ' >/root/log/aa.xlsx awk ' BEGIN { O ...
- seaborn线性关系数据可视化:时间线图|热图|结构化图表可视化
一.线性关系数据可视化lmplot( ) 表示对所统计的数据做散点图,并拟合一个一元线性回归关系. lmplot(x, y, data, hue=None, col=None, row=None, p ...
- apache配置Directory目录权限的一些配置
可以使用<Directory 目录路径>和</Directory>这对语句为主目录或虚拟目录设置权限,它们是一对容器语句,必须成对出现,它们之间封装的是具体 的设置目录权限语句 ...