【一】功能概要

【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. 为什么AI教师难以实现

    提供AI应用咨询+陪跑服务,有需要回复1 本周为一家教育公司提供了全天的AI的培训,后续涉及AI+教育领域的项目开发,而我去年就做过AI教师项目,所以对AI+教育有一定熟悉度. 下来后又拜访了一家互联 ...

  2. ASP.NET Core 静态资源的打包与压缩

    以 Visual Studio Community 2017 15.5.1 为例 配置文件 bundleconfig.json 新建一个AspNetCore MVC项目,项目中会有一个bundleco ...

  3. Codeforces Round 954 (Div. 3)

    A. X Axis 1.既然要求每个点到a到距离之和最小,不妨让点a为3个点中的中间点,也就是先对三个数从小到大排序,然后输出首尾数减中间值的绝对值之和即可 #include <bits/std ...

  4. Web前端入门第 29 问:CSS 盒模型:网页布局的基石

    在 Web 网页开发中,盒模型(Box Model) 是 CSS 的核心概念,它决定了每个 HTML 元素在页面中占据的空间和布局方式. 无论是文本.图片还是按钮,浏览器都会将它们视为一个矩形盒子,并 ...

  5. Spring 整合 Junit

    一.导入jar包 二.使用@RunWith 注解替换原有运行器 [main()] /** * * @Company http://www.ithiema.com * @Version 1.0 */ @ ...

  6. liunx git 免密码登录

    vscode远程git或在linux环境使用git时,每次clone都要输入帐号密码,很不方便,可以使用下面一行命令,系统会记录你输入的下一次帐号密码.(明文记录,注意规避风险)   # 执行   g ...

  7. excel 类模块的使用

    类模块代码如下: '类模块Cmds的代码 Option Explicit Public WithEvents testx As msforms.CommandButton '增加点击事件 Privat ...

  8. sonarqube+gitlab+jenkins+maven集成搭建(二)

    SonarQubeScanner 下载[root@localhost ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scan ...

  9. 前端速成之路——html、css

    项目一知识点 单表视图列表 标题标签 <h1>用户注册</h1> 分割线与换行 <hr> <br> 表单提交 get:通过浏览器地址栏传递值 post: ...

  10. 1.4K star!几分钟搞定AI视频创作,这个开源神器让故事可视化如此简单!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 story-flicks 是一个基于AI技术的自动化视频生成工具,能够将文字剧本快速转化为高 ...