用规范化项目录的格式模拟一个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机小程序的更多相关文章

  1. 01、模拟ATM机界面程序

    一.概述 设计一个简单的模拟自动取款机ATM界面的程序,实现用户登录及取款等功能. 二.需求分析 (1)模拟自动取款机ATM界面,有常用功能. (2)主要功能包括;用户输入密码登录主界面.取款功能.取 ...

  2. JS基础——ATM机终端程序编写(3.0)

    利用函数进行代码实现,要点:将每一项操作单独写成一个函数,在需要时进行调用,弄清参数的传递. 创建模拟账户 使用数组创建账户 let user = ["xiaohei", 1234 ...

  3. (初学JS)JS基础——ATM机终端程序编写<1.0>

    初步学习了JS基础,为了更好地将所学知识熟练运用,我进行了银行ATM存取款机的模拟程序编写,主要通过VScode终端实现系列操作. 我的ATM程序包括6个主要功能:1.查询余额 2.存钱 3. 取钱 ...

  4. JS基础——ATM机终端程序编写(2.0)

    在1.0版本上,利用数组进行用户的创建,通过调用数组下标,进行密码.余额的使用.新增了切换账户.修改密码的功能 以下为数组版代码. 创建模拟账户 个账户: let user = ["xiao ...

  5. 微信小程序 drawImage 问题

    好久没写了,其实可写的还是挺多,主要还是懒吧... 最近公司项目使用小程序做序列帧动画,大概有 116 张图,共9.6M. 比较闲的日子里实验了一番,主要有以下几种方法, 1. css backgro ...

  6. 简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  7. JAVA 小程序之ATM

    一个JAVA的小程序,主要要求有模块化编程的思想,能够把ATM中各个功能独立成为一个一个的方法. ATM主要功能有: 查询余额: 取款: 存款: 修改密码: 退出. 以上功能均由独立的方法给出,具体实 ...

  8. 原创:跳坑指南——微信小程序真机预览跟本地不同的问题

    微信小程序中出现最多的一个问题,就是真机跟本地不同:我简单列举一些我发现的原因,给大家参考,大家也可以把自己发现的东西回复给我,给我参考:本地看不到数据,就先让本地能看到数据,再看本帖.... 1:本 ...

  9. JAVA - ATM机程序

    ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...

随机推荐

  1. Java线程之Timer

    简述 java.util.Timer是一个定时器,用来调度线程在某个时间执行.在初始化Timer时,开启一个线程循环提取TaskQueue任务数组中的任务, 如果任务数组为空,线程等待直到添加任务: ...

  2. Java基础__ToString()方法

    Java toString() 方法 (一).方便println()方法的输出 public class TString { private String name; public TString(S ...

  3. Python之禅 this模块

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  4. LeetCode 80. 删除排序数组中的重复项 II(Remove Duplicates from Sorted Array II)

    题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  5. ShareX的使用

    给截图设置边框 https://github.com/ShareX/ShareX/issues/2509 TaskSettings-->Image-->Effects-->image ...

  6. mongodb 单节点集群配置 (开发环境)

    最近项目会用到mongodb的oplog触发业务流程,开发时的debug很不方便.所以在本地创建一个单台mongodb 集群进行开发debug. 大概:mongodb可以产生oplog的部署方式应该是 ...

  7. vue路由在keep-alive下的刷新问题 对watch的影响

    转载自:https://www.cnblogs.com/dansingal/p/8302100.html 问题描述: 在keep-alive中的在跳转到指定的路由时刷新对应的路由,其余不刷新. 1 2 ...

  8. tensorflow简介与结构介绍

    1.知识点 """ tensorflow前端系统:定义程序的图结构,主要是利用一些API实现 tensorflow后端系统:运算图结构 numpy的reshape,在原始 ...

  9. ubuntu14.04+安卓7.1(全志源码)+openjdk-8编译

    题记:编译花了将近4小时,所以编译源码是很费时的哦,可以在编译的时候可以学习其他的知识 编译环境准备 软件:WorkStation10 系统:ubuntu14.04 内存:8G 处理器:4个 磁盘大小 ...

  10. 在本地局域网 windows server 2008 下安装 Nginx 1.12.1

    简介: Nginx ("engine x") 是高性能 HTTP.反向代理服务器,也是 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗 ...