小程序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 ...
随机推荐
- 题解 洛谷 P2287 [USACO07NOV]Sunscreen G
原题 传送门 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值(minSPFi and maxSPFi),太大就晒伤了,太小奶牛没 ...
- 《Head First 设计模式》:工厂方法模式
正文 一.定义 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. PS:在设计模式中,"实现一个接口"泛指实现某个超类型(可 ...
- VS code 的集成终端Integrated terminal 的颜色问题
其实是默认终端的配色问题在使用vs code时,运行代码时,控制台是这样子的,搞得我很难受 一块一块的 其实是默认终端的配色问题 默认终端一般是powershell,还可以是cmd,或者git bas ...
- maven项目原型(idea)
1: internal -> appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型) 2: internal -> appfus ...
- .Net Core AES加解密
项目中token在传输过程中采用了AES加密, 网上找到的两篇博文都有写问题,在这里记录一下.Net Core 2.2代码中AES加解密的使用: //AES加密 传入,要加密的串和, 解密key p ...
- web自动化 -- HTMLreport(四)测试报告默认不展开输出内容
一.需求痛点 1.默认展开输出内容,很不好查看每条用例的状态,而且也很丑 2.希望默认不展开输出内容 3.痛点截图 二.解决步骤 1.直接修改成这样子 三.效果
- Java基础(一)基础常识
Java开发基础流程图: 也可参考这篇博客: https://www.cnblogs.com/xdp-gacl/p/3624567.html 常用的Windows的DOS命令 : dir : 列出当前 ...
- C#中子类对基类方法的继承、重写和隐藏
提起子类.基类和方法继承这些概念,肯定大家都非常熟悉.毕竟,作为一门支持OOP的语言,掌握子类.基类是学习C#的基础.不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧. 子 ...
- 将形如 5D, 30s 的字符串转为秒
import sys def convert_to_seconds(time_str): # write code here if 's' in time_str: return float(time ...
- PHP date_add() 函数
------------恢复内容开始------------ 实例 添加 40 天到 2013 年 3 月 15 日: <?php$date=date_create("2013-03- ...