ATM1.0面条版test
【一】功能概要
【1】注册
【2】登陆
【3】取款
【4】存款
【5】查看流水
【6】查看银行信息(查看自己的卡号、余额)
【7】初始化银行信息
【8】退出
【二】功能需求
【1】注册
(1)身份信息构成
- 身份信息包括:用户名、密码、角色
(2)参数验证
- 验证用户名是未注册过的用户名
- 验证密码为三位数并且是数字类型
(3)信息存储
- 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 注册成功
【2】登陆
(1)参数验证
- 验证用户名是已注册过的用户名
- 验证密码为三位数并且是数字类型
(2)信息存储
- 登陆成功后存储个人信息,以备后面不定期使用
- 登陆成功后存储个人银行信息,以备后面不定期使用
(3)信息存储
- 将个人登陆信息存储到指定文件 username_log.txt 文件中
- 登陆成功 : 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 登陆成功
【3】取款
(1)参数验证
- 当前为登录用户且银行卡初始化成功
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
- 验证取款金额小于等于当前用户余额
(2)记录流水
- 需记录当前取款流水记录,流水信息包括,流水格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 取出金钱 balance 余额为 res
(3)信息存储
- 将个人银行信息存储到指定文件 username_flow.txt 文件中
【4】存款
(1)参数验证
- 当前为登录用户且银行卡初始化成功
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
(2)记录流水
- 需记录当前存款流水记录,流水信息包括,流水格式为
当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 存入 balance 余额为 res
(3)信息存储
- 将个人银行信息存储到指定文件 username_bank.txt 文件中
【5】查看流水
(1)参数验证
- 当前为登录用户且银行卡初始化成功
【6】查看银行信息(查看自己的卡号、余额)
(1)参数验证
- 当前为登录用户且银行卡初始化成功
【7】初始化银行卡信息
(1)银行信息构成
- 银行信息包括:用户名、支付密码、余额、银行卡号
(2)参数验证
- 验证支付密码必须是数字格式,并且符合三位
- 验证银行卡号必须是数字格式,并且符合六位
- 给予初识余额 1000 元
(3)信息存储
- 记录日志到 username_flow.txt 中,日志格式为
username 于 xx年xx月xx日 xx时xx分xx秒 初始化成功 余额为 balance
- 将个人银行信息存储到指定文件 username_flow.txt 文件中
【8】退出
- 直接退出程序
【三】代码实现
# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/16
import time
# 取款 : 验证你的取款密码,更改余额 余额(1000) ,记录你的提款信息 -- 文件里 - 加时间
# 转账 : 验证你的取款密码,更改余额 目标银行卡号去转 记录你的提款信息 -- 文件里
# 查看流水:查看存入文件的流水
# 查看银行信息:(查看自己的卡号、余额、流水等信息)
# 初始化银行信息:初始化银行卡密码和卡号,默认余额1000
# 退出:退出程序
login_auth_dict = {'username': '',
"is_admin": '',
'bank_id': '',
'bank_pwd': '',
'balance': ''
}
def read_data(tag, path):
user_pwd_dict = {}
user_info_dict ={}
user_flow_list = []
with open(path, 'r', encoding='utf-8') as f:
data = f.read()
data_list = data.split('\n') # 切分后是列表
data_list.pop() # 删除最后一个空值
if tag == 'login' or tag == 'reg':
for data in data_list:
username, password, role = data.split('|')
user_pwd_dict[username] = {'password': password, 'role': role}
return user_pwd_dict
if tag == 'flow':
for data in data_list:
user_flow_list.append(data)
return user_flow_list
if tag =='info':
for data in data_list:
username,bank_id,bank_pwd,balance = data.split('|')
user_info_dict= {'username':username,'bank_id':bank_id,'bank_pwd':bank_pwd,'balance':balance}
return user_info_dict
def save_data(path, data):
with open(path, 'a', encoding='utf8') as f:
f.write(data + '\n')
def create_format(**kwargs):
data = '|'.join(kwargs.values())
return data
def get_user_pass():
username = input('请输入用户名:>>>').strip()
password = input('请输入密码:>>>').strip()
return username, password
# 注册 : 存储到文件中 用户名 - 登录密码-权限
def register():
username, password = get_user_pass()
if not password.isdigit():
return False, '必须输入数字!'
if len(password) != 3:
return False, '必须是3位数!'
if username == 'heart' and password == '123':
role = 'admin'
else:
role = 'normal'
data_reg = create_format(username=username, password=password, role=role)
bank_data = create_format(username=username, bank_id='None', bank_pwd='None', balance='None')
save_data(path='user_pwd.txt', data=data_reg)
save_data(path=f'{username}_log.txt', data=f'用户{username} 于 {time.strftime("%x %X")} 注册成功! 银行卡未激活!')
save_data(path=f'{username}_bank.txt', data=bank_data)
return True, f'{username} 注册成功!'
# register()
# 登录 : 直接将用户信息从文件中取出,然后进行比对 用户名 - 密码
def login():
username, password = get_user_pass()
if not password.isdigit():
return False, '必须输入数字!'
if len(password) != 3:
return False, '必须是3位数!'
data = read_data(tag='login', path='user_pwd.txt')
data_dict = data.get(username)
if username not in data:
return False, '用户未注册!'
if password != data_dict.get('password'):
return False, '密码错误!'
login_auth_dict['username'] = username
login_auth_dict['is_admin'] = data_dict.get('role')
save_data(f'{username}_log.txt', data=f'用户{username} 于 {time.strftime("%x %X")}登陆成功!')
return True, f'{username}登陆成功!'
# login()
def login_auth(func):
def inner(*args, **kwargs):
if not login_auth_dict['username']:
return False, '必须先登录!'
if not login_auth_dict['bank_id'] and func.__name__ != 'init_bank_info':
return False, '必须先初始化银行卡!'
return func(*args, **kwargs)
return inner
@login_auth
def init_bank_info():
bank_id = input('请输入你的银行卡号:>>>').strip()
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
data = login_auth_dict["username"]
login_auth_dict['bank_id'] = bank_id
login_auth_dict['bank_pwd'] = bank_pwd
login_auth_dict['balance'] = '1000'
save_data(path=f'{data}_flow.txt', data=f'{data} 于 {time.strftime("%x %X")} 初始化银行卡成功! 当前余额{login_auth_dict["balance"]} 元')
bank_data = create_format(username=data, bank_id=bank_id, bank_pwd=bank_pwd, balance=login_auth_dict['balance'])
save_data(path=f'{data}_bank.txt', data=bank_data)
return True, f'{login_auth_dict["username"]} 初始化银行卡成功! 当前余额{login_auth_dict["balance"]} 元!'
def outer(func):
def inner(*args, **kwargs):
balance = input('请输入取款金额:>>>').strip()
if not balance.isdigit():
return False, '请输入数字!'
if int(balance) > int(login_auth_dict['balance']):
return False, '余额不足!'
bank_id = input('请输入你的银行卡号:>>>').strip()
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
if bank_id != login_auth_dict['bank_id']:
return False, '银行卡号不正确!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
if bank_pwd != login_auth_dict['bank_pwd']:
return False, '密码不正确!'
return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs)
return inner
# 取款 : 验证你的取款密码,更改余额 余额(1000) ,记录你的提款信息 -- 文件里 - 加时间\
@login_auth
@outer
def get_balance(*args, **kwargs):
balance = kwargs.get('balance')
bank_id = kwargs.get('bank_id')
bank_pwd = kwargs.get('bank_pwd')
username = login_auth_dict["username"]
res = int(login_auth_dict['balance']) - int(balance)
login_auth_dict['balance'] = str(res)
data1 = create_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
save_data(f'{username}_bank.txt', data=data1)
save_data(f'{username}_flow.txt',
data=f'用户 {username} 于 {time.strftime("%x %X")} 取款 {balance}元! 当前余额{res}元!')
return True, f'用户{username} 取款{balance}元 剩余余额{res}元!'
def outter(func):
def inner(*args, **kwargs):
balance = input('请输入存款金额:>>>').strip()
if not balance.isdigit():
return False, '请输入数字!'
bank_id = input('请输入你的银行卡号:>>>').strip()
if bank_id != login_auth_dict['bank_id']:
return False, '银行卡号不正确!'
if not bank_id.isdigit():
return False, '请输入数字!'
if len(bank_id) != 6:
return False, '银行卡号必须是6位数!'
bank_pwd = input('请输入你的银行卡密码:>>>').strip()
if bank_pwd != login_auth_dict['bank_pwd']:
return False, '密码不正确!'
if not bank_pwd.isdigit():
return False, '请输入数字!'
if len(bank_pwd) != 3:
return False, '密码必须是3位数!'
return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs)
return inner
@login_auth
@outter
def add_balance(*args, **kwargs):
username = login_auth_dict["username"]
balance = kwargs.get('balance')
bank_id = kwargs.get('bank_id')
bank_pwd = kwargs.get('bank_pwd')
res = int(login_auth_dict['balance']) + int(balance)
login_auth_dict['balance'] = str(res)
data1 = create_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
save_data(f'{username}_bank.txt', data=data1)
save_data(f'{username}_flow.txt',
data=f'用户 {username} 于 {time.strftime("%x %X")} 存款 {balance}元! 当前余额{res}元!')
return True, f'用户{username} 存款{balance}元 剩余余额{res}元!'
@login_auth
def check_flow():
username = login_auth_dict['username']
data_list = read_data(tag='flow', path=f'{username}_flow.txt')
count = 0
print(f"************* 流水打印开始 *************")
for data in data_list:
count += 1
print(f'当前第{count}条流水 :>>> {data}')
print(f"************* 流水打印结束 *************")
return True, f'{username}流水打印完成!'
@login_auth
def check_bank_info():
username = login_auth_dict['username']
data_info = read_data(tag='info',path=f'{username}_bank.txt')
card_id = data_info.get('bank_id')
balance = data_info.get('balance')
return True,f'用户{username} 卡号为{card_id} 当前余额{balance}'
def back():
print('欢迎再次使用!')
return True, 'back'
func_menu = '''
===================用户功能菜单=====================
1.注册
2.登陆
3.取款
4.存款
5.查看流水
6.查看银行信息(查看自己的卡号、余额)
7.初始化银行信息
8.退出
======================欢迎使用=======================
'''
func_dict = {
'1': register,
'2': login,
'3': get_balance,
'4': add_balance,
'5': check_flow,
'6': check_bank_info,
'7': init_bank_info,
'8': back
}
def main():
while True:
print(func_menu)
func_id = input('请输入功能id:>>>').strip()
if func_id not in func_dict.keys():
print('功能不存在!')
continue
func = func_dict[func_id]
flag, msg = func()
if flag:
if msg == 'back':
break
print(msg)
else:
print(msg)
continue
main()
ATM1.0面条版test的更多相关文章
- TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?
注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...
- VMware Workstation 10.0 正式版官方简体中文下载(附序列号)
虚拟机界数一数二的王者软件VMWare Workstation 今日推出了最新的VMware Workstation 10.0 版本.该版本最大的更新是加入了简体中文语言,这意味着未来神马汉化包.中文 ...
- Moon.Orm 5.0(MQL版)的高性能,将发言权交给你!
Moon.Orm 5.0性能问题,我将它交给关心它性能的您,让你自己测试,决不让你失望的. Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 火晋 ...
- Moon.Orm 5.0 (MQL版) 欣赏另一种Orm的设计风格----大道至简
Moon.Orm 5.0(MQL版)使用指南(二) 一.使用sql及存储过程 1)使用List<Dictionary<))) 2)MQL 全面接触
- Redis 3.0正式版发布,正式支持Redis集群
Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...
- 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...
- Axure 7.0 正式版 + 汉化包 安装
详情如下: Axure 7.0 正式版终于发布了,现在提供简体中文版给大家使用. Axure 7.0 正式版: 链接: http://pan.baidu.com/s/1kV4OJ47 提取密码: be ...
- Moon.Orm 5.0(MQL版)及之前版本的开源计划
开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...
- Moon.Orm 5.0 (MQL版) 驱动开发方案
Moon.Orm 5.0 (MQL版) 配置说明 这一文中说明了如何配置,如何写自己的驱动.要写自己的驱动方法就是继承基类Db, Db的类结构,点击查看
- Moon.Orm 5.0(MQL版)使用指南及代码生成器新版发布
相关博文1)Moon.Orm 5.0 (MQL版) 配置说明; 2)Moon.Orm 5.0 (MQL版) 版本维护及下载(跟踪发布); 3)Moon.Orm 5.0系列文章; 4)Moon.Orm ...
随机推荐
- CentOS——磁盘分区
Centos7-磁盘分区磁盘层次结构–磁盘分区方法情况一:磁盘分区–磁盘小于2T fdisk情况二:磁盘分区–磁盘大于2T centos6:parted centos7:fdisk一.磁盘小于2T情况 ...
- 可视化|数据可视化文档之 echarts 项目初始化
数据可视化文档之 echarts 项目初始化 环境搭建 # node 环境 nvm install v11.15.0 # or nvm use 11.15.0 # 查看 node 版本 node -V ...
- 【Python自动化测试环境管理】tox
1. tox基本介绍 1.1 tox是什么? tox 是一个用于管理 Python 项目的自动化测试和环境管理工具.它的主要功能是创建虚拟环境并运行项目的测试套件,tox能够让我们在同一个Host上自 ...
- MySQL-InnoDB行锁
InnoDB的锁类型 InnoDB存储引擎支持行锁,锁类型有两种: 共享锁(S锁) 排他锁(X锁) S和S不互斥,其他均互斥. 除了这两种锁以外,innodb还支持一种锁,叫做意向锁. 那么什么是意向 ...
- 【数据结构与算法】不同路径 III:使用哈密尔顿路径算法实现
[数据结构与算法]不同路径 III:使用哈密尔顿路径算法实现 Java 不同路径 III https://leetcode-cn.com/problems/unique-paths-iii/ 解题思路 ...
- 流式计算(五)-Flink核心概念
一手资料,完全来自官网,直接参考英文过来的,并加了一些自己的理解,希望能让看官君了解点什么,足矣. 环境:Flink1.9.1 难度:新手--战士--老兵--大师 目标: 理解Flink的计算模型 认 ...
- Linux centos8 VPS基本配置之SSH
Linux centos8 VPS基本配置之SSH 最近在使用阿里云的时候,需要安装一些nodejs模块,但是总是安装失败,我已经使用了淘宝镜像cnpm加速,查看了具体原因是有github的依赖. 阿 ...
- 基于Lighthouse搭建高颜值的YesPlayMusic网易云播放器
本文介绍了如何使用腾讯云的Lighthouse轻量应用服务器来搭建一个高颜值的第三方网易云播放器. 项目简介 本文使用的是YesPlayMusic项目,这是一款高颜值的第三方网易云播放器,它完全可以作 ...
- ArrayBlockingQueue的take()底层原理
一.ArrayBlockingQueue 的 take() 方法的底层源码的详细介绍 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个 ...
- 阿里云OSS前端直传
注意: oss直传request与global对象冲突 <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-6.9.0.m ...