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{ // ...
随机推荐
- HDU 1711:Number Sequence(KMP)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- js获取当前页面url信息
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- canvas基础知识点(一)
给canvas设置宽高: canvas标签的宽高默认是300*150,是一个行内块元素 可以在canvas标签上通过width,height来设置 可以在js中给dom对象设置: mycanvas.w ...
- Bug集锦-Spring Cloud Feign调用其它接口报错
问题描述 Spring Cloud Feign调用其它服务报错,错误提示如下:Failed to instantiate [java.util.List]: Specified class is an ...
- LeetCode 238. 除自身以外数组的乘积( Product of Array Except Self)
题目描述 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输 ...
- 测试linux服务器是否能接入微信
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 php.代码 <?php $a = $_GE ...
- a标签的伪类
a 超链接 伪类:给元素添加特殊的效果 :link 未访问过的链接初始颜色 :visited 访问过后的链接颜色 :hover 鼠标移入(悬停)时的颜色 :active 鼠标按下时链接的颜色 书写时的 ...
- ModuleNotFoundError: No module named '_sqlite3'的解决办法:pipenv的用法
export PIPENV_VENV_IN_PROJECT=1pipenv --venvpipenv --where pipenv install -r requirements.txtpipenv ...
- ROC和AUC————摘在网络
ROC曲线 对于0,1两类分类问题,一些分类器得到的结果往往不是0,1这样的标签,如神经网络,得到诸如0.5,0,8这样的分类结果.这时,我们人为取一个阈值,比如0.4,那么小于0.4的为0类,大于等 ...
- LC 652. Find Duplicate Subtrees
Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only ne ...