ATM系统(修复bug且用了类,使用了精简版日志)

该代码实现了一个简单的ATM系统,包括用户注册、登录、提现、转账和充值等功能。用户信息加密存储,有错误处理和日志记录机制。
######################################################src.py

import os,sys,re,time,random

BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_PATH)
from lib import common
from conf import setting
id_login={"login":False}
id_user_information={}

def menu():
    print("""------------------欢迎使用ATM自助系统---------------------------
\t 1. 注册功能\t\t         6. 查看余额
\t 2. 登录功能\t\t         7. 查看流水
\t 3. 提现功能(5%的手续费)\t 8. 添加购物车(未开放)
\t 4. 转账功能\t\t         9. 查看购物车(未开放)
\t 5. 充值功能\t\t         0. 退出
-------------------------------------------------------------""")
def run():
    while True:
        menu()
        cmd=input("请输入您的选择").strip()
        if cmd=='0':break
        elif cmd in func_dict:
            func_dict.get(cmd)()
        else:print('错误,重来')
class Bank():######################
    # self表示card_id
    # @classmethod
    def __init__(self,card_id, id, name, phone, pwd, Check_Code,locked,account,money_flow,shopping_cart):
        self.card_id = card_id
        self.id = id
        self.name = name
        self.phone = phone
        self.pwd = pwd
        self.Check_Code = Check_Code
        self.locked = locked
        self.account=account
        self.money_flow = money_flow
        self.shopping_cart = shopping_cart


@setting.get_log
def register():
    '''
    1.输入身份证号码并验证
    2.输入姓名
    3.输入手机号并验证
    4.输入交易密码并验证,密码动态加盐
    5.随机生成卡号并校验是否存在,存在则重来,打印卡号
    6.记录日志
    '''

    # 输入身份证号码并验证
    while True:
        input_id=input("请输入您的身份证号码:").strip()
        if common.is_True(input_id,'id'):break
        else:print('错误,重来')
    input_name = input("请输入您的姓名:").strip()
    # 输入手机号并验证
    while True:
        input_phone=input("请输入您的手机号码:").strip()
        if common.is_True(input_phone,'phone'):break
        else:print('错误,重来')
    # 输入交易密码并验证,密码动态加盐
    while True:
        input_pwd=input("请输入您的6位交易密码:").strip()
        if common.is_True(input_pwd,'pwd'):
            # 动态加盐
            cryptograph_pwd,Check_Code=common.cryptograph_pwd(input_pwd)
            break
        else:print('错误,重来')
    # 5.随机生成卡号并校验是否存在,存在则重来,打印卡号
    while True:
        card_id='621723'+str(random.randint(0000000000000, 9999999999999))
        if common.is_exist(card_id):
            continue
        else:
            print(card_id)
            break
        # (self, id, name, phone, pwd, Check_Code, locked, account, money_flow, shopping_cart)
    # print(card_id,input_id,input_name,input_phone,input_pwd,Check_Code,False,1500,[],{})
    user=Bank(card_id,input_id,input_name,input_phone,cryptograph_pwd,Check_Code,False,1500,[],{})
    # print(Bank.__dict__)
    global id_user_information
    id_user_information==user.__dict__
    # 存储
    common.write_file(card_id,user.__dict__)#####################ensure_ascii=False,不然 中文字符会变成万国码
    # print(card_id)
    # 日志
    return f'{user.name}身份证号码{user.id}完成注册,银行卡号{user.card_id}'

@setting.get_log
def login():
    '''
    1.判断登录状态
    2.输入银行卡并校验是否存在
    3.输入交易密码,并验证是否正确
    '''
    if id_login.get('login'):
        print('已登录,请选择其他')
        return

    # 输入银行卡并校验是否存在
    while 1:
        input_card_id=input("请输入您的银行卡号").strip()
        if not common.is_exist(input_card_id):
            print("错误,重来")
            continue
        else:break
    # 判断是否锁定
    global id_user_information
    id_user_information=common.read_file(input_card_id)
    if id_user_information['locked']:
        print('已锁定,请联系管理员')
        return
    # 输入交易密码,并验证是否正确,3次锁定
    for i in range(3):
        input_pwd=input("请输入您的交易密码").strip()
        # if not common.isTrue_pwd(input_pwd):
        if common.cryptograph_pwd(input_pwd,id_user_information['Check_Code'])!=id_user_information['pwd']:
            print("错误")
            setting.logging.info(f'{id_user_information["card_id"]}输错密码')
            continue
        else:
            id_login["login"]=True
            break
    else:
        id_user_information['locked']=True
        print('输错超过3次,已锁定,请联系管理员解锁')
        common.write_file(input_card_id,id_user_information)
        return f'{id_user_information["card_id"]}输错密码3次,账户锁定'
    return f'{id_user_information["card_id"]}登录系统'

@common.login_auth
@setting.get_log
def withdraw():
    print('您的余额:',id_user_information['account'])

    while 1:
        str_input_money = input("请输入您的提现金额").strip()
        if not common.is_True(str_input_money,'money'):
            print('错误,重输')
            continue
        input_money=float(str_input_money)
        # service_charge=input_money*0.05
        if (input_money*1.05) >float(id_user_information['account']):
        # if (input_money+service_charge) <float(id_user_information['account']):
            print('错误,提现金额+手续费超过余额,重输')
            continue
        id_user_information['account']=str(float(id_user_information['account'])-(input_money*1.05))
        print(f"提现成功,提现{str_input_money},手续费{input_money*0.05},剩余{id_user_information['account']}")
        # 存储
        common.write_file(id_user_information['card_id'],id_user_information)
        # 流水
        id_user_information['money_flow'].append(f"{time.strftime('%y-%m-%d %X')}提现{str_input_money},手续费{input_money*0.05},剩余{id_user_information['account']}")
        # 存储
        common.write_file(id_user_information['card_id'], id_user_information)
        return f"{id_user_information['card_id']}提现{str_input_money},手续费{input_money*0.05},剩余{id_user_information['account']}"
@common.login_auth
@setting.get_log
def transfer():
    '''
    1.输入转入账号,判断是否存在/是否是自己的
    2.输入转账金额,判断数值,判断是否小于等于余额
    3.当前账号余额减,转入账户余额增加
    4.流水
    5.日志
    '''
    print('您的余额:', id_user_information['account'])
    while 1:
        input_transfer_id=input("请输入您要转入的的银行卡号").strip()
        if (input_transfer_id ==id_user_information['card_id']):
            print("不能转给本人")
            continue

        if not common.is_exist(input_transfer_id):
            print("查无此卡")
            continue
        else:
            break
    while 1:
        str_input_transfer_money = input("请输入您的转账金额").strip()
        if not common.is_True(str_input_transfer_money,'money'):
            print('错误,重输')
            continue
        input_transfer_money=float(str_input_transfer_money)
        if input_transfer_money >float(id_user_information['account']):
            print('错误,输入的转账金额超过余额,重输')
            continue
        id_user_information['account']=str(float(id_user_information['account'])-input_transfer_money)
        #获取转入账户信息
        id_transfer_information=common.read_file(input_transfer_id)
        id_transfer_information['account'] = str(float(id_transfer_information['account'])+ input_transfer_money)
        # 存储
        common.write_file(id_user_information['card_id'],id_user_information)
        common.write_file(id_transfer_information['card_id'],id_transfer_information)
        print(f"成功向账户{input_transfer_id}转账{str_input_transfer_money},余额{id_user_information['account']}")
        # 流水
        id_user_information['money_flow'].append(f"{time.strftime('%y-%m-%d %X')}向账户{input_transfer_id}转账{str_input_transfer_money},余额{id_user_information['account']}")
        id_transfer_information['money_flow'].append(f"{time.strftime('%y-%m-%d %X')}收到账户{id_user_information['card_id']}转账{str_input_transfer_money},余额{id_transfer_information['account']}")
        # 存储
        common.write_file(id_user_information['card_id'], id_user_information)
        common.write_file(id_transfer_information['card_id'], id_transfer_information)
        return f"{id_user_information['card_id']}向账户{input_transfer_id}转账{str_input_transfer_money},余额{id_user_information['account']}"# 日志


@common.login_auth
@setting.get_log
def pay():
    print('您的余额:', id_user_information['account'])

    while 1:
        str_input_money = input("请输入您的充值金额").strip()
        if not common.is_True(str_input_money, 'money'):
            print('错误,重输')
            continue
        input_money = float(str_input_money)

        id_user_information['account'] = str(float(id_user_information['account']) + input_money )
        print(f"充值成功,充值{str_input_money},余额{id_user_information['account']}")
        # 存储
        common.write_file(id_user_information['card_id'], id_user_information)
        # 流水
        id_user_information['money_flow'].append(f"{time.strftime('%y-%m-%d %X')}充值{str_input_money},余额{id_user_information['account']}")
        # 存储
        common.write_file(id_user_information['card_id'], id_user_information)
        return f"{id_user_information['card_id']}充值{str_input_money}"


@common.login_auth
@setting.get_log
def check_money():
    print('您的余额:', id_user_information['account'])
    return f"{id_user_information['card_id']}查看余额"

@common.login_auth
@setting.get_log
def check_flow():
    print('您的金额明细:', id_user_information['money_flow'])
    return f"{id_user_information['card_id']}查看流水"


func_dict = {
    '1': register,
    '2': login,
    '3': withdraw,
    '4': transfer,
    '5': pay,
    '6': check_money,
    '7': check_flow,
    # '8': add_shopping,
    # '9': check_shopping,
}
######################################################start.py

import os,sys
BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_PATH)
sys.path.append(BASE_PATH)
#
# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# sys.path.append(BASE_DIR)
from core import src
if __name__=='__main__':
    src.run()
######################################################setting.py

import logging
import os, json, hashlib,re,random,sys,logging,time
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

# 一:日志配置
logging.basicConfig(
    # 1、日志输出位置:1、终端 2、文件
    filename=BASE_DIR+'\\log\\log.log', # 不指定,默认打印到终端

    # 2、日志格式
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',

    # 3、时间格式
    datefmt='%Y-%m-%d %H:%M:%S %p',

    # 4、日志级别
    # critical => 50
    # error => 40
    # warning => 30
    # info => 20
    # debug => 10
    level=20,

)

def get_log(func):
    def inner(*args,**kwargs):
        res=func(*args,**kwargs)
        logging.info(res)
    return inner
######################################################commmon.py

import os,sys,re,time,random,hashlib,json
from  core import src


BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_PATH)
def is_True(input_id,id):# 判断...是否符号输入规范
    if id == "id":rep='^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'
    elif id=='phone':rep='^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$'
    elif id=='pwd':rep='^\d{6}$'
    elif id=='money':rep='^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$'

    if re.findall(rep,input_id) !=[]:return 1
    else:return 0

def is_exist(card_id):# 判断银行卡号是否存在
    if os.path.exists(BASE_PATH+'\\db\\'+card_id+'.json'):
        # print(BASE_PATH+'\\db\\'+card_id+'.json')
        print('卡存在')
        return 1
    else:return 0
# def isTrue_pwd(input_pwd):# 判断密码是否正确
#
#     pass
def cryptograph_pwd(input_pwd,*args): # 密码加盐(动态)
    md5=hashlib.md5()
    if args!=():
        md5.update((input_pwd+args[0]).encode('utf-8'))##########
        cryptograph_pwd = md5.hexdigest()
        # print(cryptograph_pwd)
        return cryptograph_pwd###########
    else:
        res=get_code(5)
        md5.update((input_pwd+res).encode('utf-8'))#######
        cryptograph_pwd=md5.hexdigest()
        # print(cryptograph_pwd)
        return cryptograph_pwd,res#########

def get_code(n):# 获取随机校验码
    code=''
    for i in range(n):
        a=str(random.randint(0,9))
        b=chr(random.randint(65,90))
        c=chr(random.randint(67,122))
        temp=random.choice([a,b,c])############
        code+=temp
    else:

        return code


def read_file(card_id):
    with open(BASE_PATH+'\\db\\'+card_id+'.json','r',encoding='utf-8')as f:
        return json.load(f)
def write_file(card_id,id_user_information):
    with open(BASE_PATH+'\\db\\'+card_id+'.json','w',encoding='utf-8')as f:
        return json.dump(id_user_information,f,ensure_ascii=False)#####################ensure_ascii=False,不然 中文字符会变成万国码

def login_auth(func):
    def inner(*aegs,**kwargs):
        if src.id_login.get("login"):
            func(*aegs,**kwargs)
        else:
            print('请登录')
            src.run()
        return
    return  inner

 购物车功能上一篇文章中有

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值