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 3>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'

猜你喜欢

转载自www.cnblogs.com/shiguanggege/p/11438059.html