小程序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 ...
随机推荐
- 集训作业 洛谷P1100 高低位交换
这个题简单来说就是把一个数转成32位的2进制数,不够的补0.然后把这个数的前半部分和后半部分互换,再计算结果. 思路简单明了,接下来是代码: #include<iostream> #inc ...
- MySQL数据库---表的操作
存储引擎 表就是文件,表的存储引擎就是文件的存储格式,即数据的组织存储方式. 字段类型 1.整数类型 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 作用:存储年 ...
- VS code 的集成终端Integrated terminal 的颜色问题
其实是默认终端的配色问题在使用vs code时,运行代码时,控制台是这样子的,搞得我很难受 一块一块的 其实是默认终端的配色问题 默认终端一般是powershell,还可以是cmd,或者git bas ...
- es6 Proxy简单使用
es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...
- 快速配置webpack+vue项目
第一步:初始化项目 1.npm init 2. package name: (webpack+vue) webpackvue version: (1.0.0) description: this is ...
- 两种 HTTP 方法:GET 和 POST
区别 GET POST 可见性 数据在 URL 中对所有人都是可见的. post 方式通过body体进行传输,数据不会显示在 URL 中. 安全性 与 POST 相比,GET 的安全性较差,因为所发送 ...
- Python os.lchown() 方法
概述 os.lchown() 方法用于更改文件所有者,类似 chown,但是不追踪链接.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 lchown()方法语法格式如下: ...
- PHP serialize() 函数
serialize() 函数用于序列化对象或数组,并返回一个字符串.高佣联盟 www.cgewang.com serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型 ...
- PHP constant() 函数
实例 返回一个常量的值: <?php//define a constantdefine("GREETING","Hello you! How are you tod ...
- PDO::rollBack
PDO::rollBack — 回滚一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDO::rollBack ( void )高佣联 ...