######################################################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
购物车功能上一篇文章中有


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

被折叠的 条评论
为什么被折叠?



