【一】功能概要

【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的更多相关文章

  1. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

  2. VMware Workstation 10.0 正式版官方简体中文下载(附序列号)

    虚拟机界数一数二的王者软件VMWare Workstation 今日推出了最新的VMware Workstation 10.0 版本.该版本最大的更新是加入了简体中文语言,这意味着未来神马汉化包.中文 ...

  3. Moon.Orm 5.0(MQL版)的高性能,将发言权交给你!

    Moon.Orm 5.0性能问题,我将它交给关心它性能的您,让你自己测试,决不让你失望的. Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 火晋 ...

  4. Moon.Orm 5.0 (MQL版) 欣赏另一种Orm的设计风格----大道至简

    Moon.Orm 5.0(MQL版)使用指南(二) 一.使用sql及存储过程 1)使用List<Dictionary<))) 2)MQL 全面接触

  5. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  6. 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...

    开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...

  7. Axure 7.0 正式版 + 汉化包 安装

    详情如下: Axure 7.0 正式版终于发布了,现在提供简体中文版给大家使用. Axure 7.0 正式版: 链接: http://pan.baidu.com/s/1kV4OJ47 提取密码: be ...

  8. Moon.Orm 5.0(MQL版)及之前版本的开源计划

    开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...

  9. Moon.Orm 5.0 (MQL版) 驱动开发方案

    Moon.Orm 5.0 (MQL版) 配置说明 这一文中说明了如何配置,如何写自己的驱动.要写自己的驱动方法就是继承基类Db, Db的类结构,点击查看

  10. 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 ...

随机推荐

  1. delphi Wmi 获取操作系统信息

    uses ActiveX, ComObj; function GetWMIProperty(WMIProperty: string): string; var Wmi, Objs, Obj: OleV ...

  2. study Python3 【1】

    用VSCode来编辑Python代码,作为IDE使用,有点头晕. https://www.runoob.com/python3/python-vscode-setup.html有介绍.还有更好的博客介 ...

  3. 舵机SG90详解

    舵机,也叫伺服电机,在嵌入式开发中,舵机作为一种常见的运动控制组件,具有广泛的应用.其中,SG90 舵机以其高效.稳定的性能特点,成为了许多工程师和爱好者的首选,无论是航模.云台.机器人.智能小车中都 ...

  4. Text Bg ContentSizeFitter的另类控制

    using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Co ...

  5. Google发布A2A开源协议:“MCP+A2A”成未来标配?

    就在刚刚Google Cloud Next 25大会上,谷歌重磅开源Agent2Agent(A2A)协议,这项被类比为"AI界的HTTP协议"的技术标准,彻底打破了智能体间的信息孤 ...

  6. FastJSON序列化扩展接口与特性详解

    结论先行 FastJSON 的 SerializeFilter 接口通过 动态拦截和修改序列化过程,可实现字段名重命名.敏感数据脱敏.字段过滤等高级功能.其核心子接口包括 PropertyPreFil ...

  7. Java编程--String类和基本数据类型的相互转换

    基本数据类型:byte.short.int.long.char.float.double.boolean 基本数据类型->String:利用String类提供的ValueOf(基本类型)方法转换 ...

  8. cloudflare xss绕过未修复

  9. 【记录】Python3|Selenium4 极速上手入门(Windows)

    环境:Windows 版本:python3,selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium,懒得每次都重新找链接. 文章目录 1 装 Chrome Edge 其他浏 ...

  10. HarmonyOS NEXT开发实战教程—搜索页

    今天忙里偷闲,分享一个搜索页实现过程,先上效果图: 界面部分比较简单,大体分为导航栏.历史搜索.猜你想搜和热搜榜几个部分,历史搜索采用用户首选项进行存储数据. 导航栏部分相关代码如下: Flex({d ...