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{ // ...
随机推荐
- Python基础之Python介绍
Python的创始人为吉多·范罗苏姆(Guido Van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新 ...
- 2.nohup和&后台运行,进程查看及终止
1.nohup和& 语法:nohup Command [ Arg … ] [& ] nohup:不挂断地运行命令 &:在后台运行 示例:nohup java -jar app2 ...
- Linux配置tomcat开机自启
转自百度经验:https://jingyan.baidu.com/article/6525d4b1382f0aac7d2e9421.html 端口也需要保持开机自启详细请看:https://www.c ...
- TCP层sendmsg系统调用的实现分析
概述 sendmsg系统调用在tcp层的实现是tcp_sendmsg函数,该函数完成以下任务:从用户空间读取数据,拷贝到内核skb,将skb加入到发送队列的任务,调用发送函数:函数在执行过程中会锁定控 ...
- python3笔记二十:时间操作time
一:学习内容 time时间戳 time元组 time字符串 time时间转换图解 二:time 需要引入:import time 1.概念 UTC(世界协调时间):格林尼治天文时间,世界标准时间,在中 ...
- android canvas drawtext 字高
Paint pFont = new Paint(); Rect rect = new Rect(); pFont.getTextBounds("豆", 0, 1, rect); L ...
- 5.Hiveguigun滚(ノ`Д)ノ竟然竞争谨慎谨慎谨慎哈喇子罢工八公
1.Hive简介 2.Hive部署与安装 3.Hive的使用 4.Hive JDBC编程
- 测试的sql
幼教视频全部 '''sql中需传的参数为:phone_no,phone_no(当前登录账号),cid(视频分类),video_type(1 幼教视频, 2 合作方视频,3校方视频),del_flag( ...
- ORACLE PSU SPU (2015-11-04)
Quick Reference to Patch Numbers for Database PSU, SPU(CPU), Bundle Patches and Patchsets (文档 ID 145 ...
- tfserving 调用deepfm 并预测 java 【参考】
https://blog.csdn.net/luoyexuge/article/details/79941565?utm_source=blogxgwz8 首先是libsvm格式数据生成java代码, ...