ATM机小程序

用规范化项目录的格式模拟一个ATM系统。
项目功能:
登录(可支持多个账户(非同时)登录)
注册
查看余额
存钱
转账(给其他用户转钱)
查看账户流水
退出
提供的思路:ATM直译就是取款机,但是咱们是模拟一个取款机,此取款机可以完成实现存钱,转账,查看余额,以及查看账户流水等功能。
要求以及分值分配:
利用装饰器完成登录验证功能(3,4,5,6功能需要验证)。
登录功能要求:用户名、密码(密码需要md5加密)从文件中读取,进行三次验证,验证不成功则退出整个程序。
注册功能要求:
用户名要求:只能含有字母数字不能含有特殊字符并且要确保唯一性。
密码的要求:长度在6与14个字符之间,密文存储。
初始钱数:money: 0.
注意:每个用户的以上信息通过字典以及json模块,以用户名.json的形式存储,用户的json文件存储在db文件夹中。
查看余额功能要求:
用户登录成功之后,选择此功能即可显示账户余额,并且将每次查看记录通过日志的方式记录到用户日志中(用户日志文件建议为:用户名.log)。
存钱功能要求:
用户通过输入存储的钱数,然后将存储的钱累加到用户名.json那个json文件的字典中,并且将每次存钱记录通过日志的方式记录到用户日志中(用户日志文件建议为:用户名.log)。
转账功能要求:
用户通过输入对方用户名以及转账钱数完成给对方转账功能。
要检测输入的对方用户账户是否存在。
要检测你账户余额是否够用。
将每次转账记录通过日志的方式记录到用户日志中(用户日志文件建议为:用户名.log)。
查看流水要求:
用户通过选择此功能将用户专属的log打印出来。
整个项目完成流畅,逻辑清楚,极少bug。
采用软件开发规范进行书写
start:
import sys
sys.path.append(r'C:\Users\zhoujinghua\PycharmProjects\project-nlp')
from qiche.ATM.core.src import start
start()
common:
from qiche.ATM.core import src
def warpper(f):
def func():
if src.dic1['state']==True:
f()
else:
print('请先登陆')
src.login()
f()
return func
src:
import json
import os
import hashlib
import re
import time
from ..conf import setting
from qiche.ATM.lib.common import warpper
def login():
count=2
while count>0:
user= input('user:')
if os.path.exists(os.path.join(setting.NAM,f'{user}.json')):
pwd =input('pwd:')
md5 = hashlib.md5()
md5.update(pwd.encode('utf-8'))
md5.hexdigest()
if md5.hexdigest()==json.load(open(os.path.join(setting.NAM,f'{user}.json'),'r',encoding='utf-8'))[user]:
print('登陆成功')
dic1['state']=True
dic1['user']=user
return
else:
print('账号或密码错误')
count-=1
else:
print('用户不存在')
return exit()
def register():
dic2={}
user=input('请输入注册用户名:')
if re.findall('[^a-zA-Z0-9]',user)==[] and os.path.exists(os.path.join(setting.NAM,f'{user}.json'))==False:
pwd=input('请输入注册密码:')
if 14>len(pwd)>6:
md5 = hashlib.md5()
md5.update(pwd.encode('utf-8'))
md5.hexdigest()
dic2.setdefault(user,md5.hexdigest())
dic2.setdefault('money',0)
json.dump(dic2,open(os.path.join(setting.NAM,f'{user}.json'),'a',encoding='utf-8'))
print('注册成功')
else:
print('密码长度不符,请输入6-14字符')
else:
print('用户名格式不对(只能是字母和数字)或用户已存在')
@warpper
def balance():
mo=json.load(open(os.path.join(setting.NAM,f"{dic1['user']}.json"),'r',encoding='utf-8'))['money']
print(f'账户余额{mo}')
dic3={}
dic3.setdefault(time.strftime(("%Y-%m-%d %H:%M:%S",time.localtime(time.time)))),f'查询一次余额,当前余额{mo}'
json.dump(dic3,open(os.path.join(setting.RIJI,f"{dic1['user']}.log."),'a',encoding='utf-8'))
@warpper
def Save():
moneys=input('请输入存钱的金额:')
se=json.load(open(os.path.join(setting.NAM, f"{dic1['user']}.json"), 'r', encoding='utf-8'))
mone=se['money']+int(moneys)
se['money']=mone
json.dump(se,open(os.path.join(setting.NAM, f"{dic1['user']}.json"), 'w', encoding='utf-8'))
with open(os.path.join(setting.RIJI, f"{dic1['user']}.log"), "a", encoding="utf-8") as f:
f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))}--{dic1['user']}--存款--存入{moneys}--余额为{mone}\n")
print(f'存款成功,余额{mone}')
@warpper
def Transfer():
user1=input('请输入转账用户')
if os.path.exists(os.path.join(setting.NAM,f'{user1}.json'))==True:
num=input('请输入转账金额:')
dic4=json.load(open(os.path.join(setting.NAM, f"{dic1['user']}.json"), 'r', encoding='utf-8'))
if dic4['money']>int(num):
dic4['money']=dic4['money']-int(num)
json.dump(dic4, open(os.path.join(setting.NAM, f"{dic1['user']}.json."), 'w', encoding='utf-8'))
with open(os.path.join(setting.RIJI, f"{dic1['user']}.log"), "a", encoding="utf-8") as f:
f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}, {dic1['user']}向{user1}转账{num}元账户余额{dic4['money']}")
dic5 = json.load(open(os.path.join(setting.NAM, f"{user1}.json"), 'r', encoding='utf-8'))
dic5['money'] = dic5['money'] + int(num)
json.dump(dic5, open(os.path.join(setting.NAM, f"{user1}.json."), 'w', encoding='utf-8'))
with open(os.path.join(setting.RIJI, f"{user1}.log"), "a", encoding="utf-8") as f:
f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}, {dic1['user']}向{user1}转账{num}元账户余额{dic5['money']}")
print('转行成功')
else:
print('您的余额不足')
else:
print('对方用户不存在')
@warpper
def streaming():
f=open(os.path.join(setting.RIJI, f"{dic1['user']}.log"), "r", encoding="utf-8")
for i in f:
print(i)
msg="""
1.登录(可支持多个账户(非同时)登录)
2.注册
3.查看余额
4.存钱
5.转账(给其他用户转钱)
6.查看账户流水
7.退出
"""
dic={'1':login,'2':register,'3':balance,'4':Save,'5':Transfer ,'6':streaming,'7':exit}
dic1={'user':'','state':False}
def start():
while 1:
print(msg)
Serial= input('请选择序号:')
if Serial in dic:
dicSerial
else:
print('输入有误,请重新输入')
setting:
NAM=R'C:\Users\zhoujinghua\PycharmProjects\project-nlp\qiche\ATM\db'
RIJI=r'C:\Users\zhoujinghua\PycharmProjects\project-nlp\qiche\ATM\log'
ATM机小程序的更多相关文章
- 01、模拟ATM机界面程序
一.概述 设计一个简单的模拟自动取款机ATM界面的程序,实现用户登录及取款等功能. 二.需求分析 (1)模拟自动取款机ATM界面,有常用功能. (2)主要功能包括;用户输入密码登录主界面.取款功能.取 ...
- JS基础——ATM机终端程序编写(3.0)
利用函数进行代码实现,要点:将每一项操作单独写成一个函数,在需要时进行调用,弄清参数的传递. 创建模拟账户 使用数组创建账户 let user = ["xiaohei", 1234 ...
- (初学JS)JS基础——ATM机终端程序编写<1.0>
初步学习了JS基础,为了更好地将所学知识熟练运用,我进行了银行ATM存取款机的模拟程序编写,主要通过VScode终端实现系列操作. 我的ATM程序包括6个主要功能:1.查询余额 2.存钱 3. 取钱 ...
- JS基础——ATM机终端程序编写(2.0)
在1.0版本上,利用数组进行用户的创建,通过调用数组下标,进行密码.余额的使用.新增了切换账户.修改密码的功能 以下为数组版代码. 创建模拟账户 个账户: let user = ["xiao ...
- 微信小程序 drawImage 问题
好久没写了,其实可写的还是挺多,主要还是懒吧... 最近公司项目使用小程序做序列帧动画,大概有 116 张图,共9.6M. 比较闲的日子里实验了一番,主要有以下几种方法, 1. css backgro ...
- 简单的小程序实现ATM机操作
简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...
- JAVA 小程序之ATM
一个JAVA的小程序,主要要求有模块化编程的思想,能够把ATM中各个功能独立成为一个一个的方法. ATM主要功能有: 查询余额: 取款: 存款: 修改密码: 退出. 以上功能均由独立的方法给出,具体实 ...
- 原创:跳坑指南——微信小程序真机预览跟本地不同的问题
微信小程序中出现最多的一个问题,就是真机跟本地不同:我简单列举一些我发现的原因,给大家参考,大家也可以把自己发现的东西回复给我,给我参考:本地看不到数据,就先让本地能看到数据,再看本帖.... 1:本 ...
- JAVA - ATM机程序
ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...
随机推荐
- AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)
在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...
- [笔记]共享内存(shm)
一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...
- Java 学习(六)
Java 学习(六) 标签(空格分隔): Java 枚举 JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便 ...
- CLOB、BLOB , CLOB与BLOB的区别
CLOB 定义 数据库中的一种保存文件所使用的类型. Character Large Object SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系.SQL CLOB 是内置类型,它将字 ...
- idea 远程代码调试
声明一点:重要的事情说3遍 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 第一步,创建remote 第二步.填写服务器信息 第三部.tomcat/bin/s ...
- JS将后台获取毫秒数转换为自定义格式日期
重写prototype Date.prototype.Format = function(fmt) { var o = { "M+" : this.getMonth()+1, / ...
- php改变header头返回值
$code = '400 Bad Request'; header('HTTP/1.1 '.$code);
- Anaconda 改为国内镜像的方法
Anaconda的conda 特别好用 但如果用国外的镜像,慢的出奇 可以改为了国内镜像会好很多 conda config --add channels https://mirrors.tuna.ts ...
- vue-cli构建的项目结构解析
参考: https://www.jianshu.com/p/32beaca25c0d
- “vmware 未能初始化监视器设备”的解决方法
从挂起状态唤醒时出现"vmware 未能初始化监视器设备"的提示,在cmd中输入命令 net start vmci net start vmx86 可能还不能成功启动,提示&quo ...