ATM项目三层结构
1 用户视图层
# 1.注册
import os
from interface import user_interface
from interface import shop_interface
from interface import bank_interface
from lib import common
online_user = None
# 注册功能
def register():
print("注册功能执行中,输入q退出")
while 1:
reg_user = input("请输入要注册的用户名:").strip()
if reg_user.upper() == "Q":
break
if not user_interface.reg_user_check(reg_user):
print("用户名已存在,请重新输入")
continue
reg_password1 = input("请输入密码:")
reg_password2 = input("请确认密码:")
if reg_password1 == reg_password2:
user_interface.new_user_info(reg_user, reg_password1)
print("注册成功!")
return
else:
print("两次密码不一致,请重新输入!")
continue
# register()
# 2 登录功能
def login():
while 1:
login_user = input("请输入用户名:[输入q退出]")
if login_user.upper() == "Q":
break
login_password = input("请输入密码")
flag, msg = user_interface.login_check(login_user, login_password)
if flag is False:
print(msg)
continue
print(msg)
global online_user
online_user = login_user
return login_user
# print(login())
# 3 查看余额
@common.user_identify
def check_account():
print("查询余额功能执行中")
res = bank_interface.check_account_func(online_user)
print('用户:{},您的余额为{},您的额度为{}'.format(online_user, res[0], res[1]))
# 4 提现
@common.user_identify
def with_draw():
while 1:
print("提现功能执行中")
money = input('请输入要提现的金额:')
if money.upper() == "Q":
break
if not money.isdigit():
print("只能输入数字,请重新输入")
continue
flag, msg = bank_interface.with_draw_func(money, online_user)
print(msg)
if flag is True:
break
else:
continue
# 5 还款
@common.user_identify
def pay_back():
pass
# 6 转账
@common.user_identify
def transfer():
pass
# 7 购物车功能
@common.user_identify
def shopping_cart():
cargo_dic = shop_interface.show_cargo()
while 1:
print("欢迎选购~~")
for name, price in cargo_dic.items():
print("商品名:[{}],价格:[{}]".format(name, price))
cargo_name = input("请输入商品名:").strip()
if cargo_name.upper() == "Q":
break
quantity = input("请输入购买的数量:").strip()
if cargo_name in cargo_dic and quantity.isdigit():
msg = shop_interface.choose_cargo(cargo_name, quantity, online_user)
print(msg)
else:
print("请输入正确的编号和数量")
# 8 查看流水
@common.user_identify
def current_account():
record = bank_interface.current_record(online_user)
for i in record:
print(i)
# 9 查看购物车
@common.user_identify
def check_shoppping_cart():
cart_dic = shop_interface.show_shopping_cart(online_user)
print("您购物车内的商品为:")
for cargo, num in cart_dic.items():
print("[{}]:[{}]个".format(cargo, num))
func_dic = {"1": ['注册', register],
"2": ['登录', login],
"3": ['查询余额', check_account],
"4": ['提现', with_draw],
"5": ['还款', pay_back],
"6": ['转账', transfer],
"7": ['购物车', shopping_cart],
"8": ['查看流水', current_account],
"9": ['查看购物车', check_shoppping_cart]}
def run():
while 1:
for k, v in func_dic.items():
print(k, v[0])
func = input("请输入功能编号:[温馨提示: 输入q退出]").strip()
if func.upper() == "Q":
break
if not func.isdigit():
print("功能只能输入数字!")
continue
if func in func_dic:
func_dic[func][1]()
else:
print("编号不存在")
continue
2 逻辑接口层
'''
逻辑接口层之user部分
'''
from conf import settings
from db import db_handler
import logging.config
logging.config.dictConfig(settings.LOGGING_DIC)
# 1 注册用户名检测
def reg_user_check(user_name):
'''
用于查看注册的用户名是否存在
:return: None ----->用户名存在,不能注册
:return: 1------>用户名不存在,可以注册
'''
if not db_handler.select_user(user_name):
return 1
# 2 登录验证用户名密码
def login_check(user_name, password):
user_dic = db_handler.select_user(user_name)
# 用户不存在
if user_dic is None:
return False, "用户名不存在"
password = db_handler.encrypt(password)
# 验证密码
if user_dic["password"] == password:
logger1 = logging.getLogger('用户登录')
logger1.info('用户{}登录'.format(user_name))
return True, "登陆成功"
else:
return False, "密码错误"
def new_user_info(reg_user, reg_password1):
password = db_handler.encrypt(reg_password1)
db_handler.save_data(
{"user": reg_user, "password": password, "balance": 0, "limit": 15000, "locked": False, "current_account": [],
"shopping_cart": {}})
'''
逻辑接口层之shop部分
'''
import json
from conf import settings
from db import db_handler
def show_cargo():
with open(settings.DB_CARGO_INFO_PATH,"rb") as f:
cargo_dic = json.load(f)
return cargo_dic
def choose_cargo(cargo_name,quantity,online_user):
user_dic = db_handler.select_user(online_user)
user_dic["shopping_cart"][cargo_name]=quantity
db_handler.save_data(user_dic)
return "所选商品:[{}]--[{}]个已加入购物车~".format(cargo_name,quantity)
def show_shopping_cart(online_user):
user_dic = db_handler.select_user(online_user)
return user_dic["shopping_cart"]
'''
逻辑接口层之bank部分
'''
import time
from db import db_handler
import logging.config
from conf import settings
logging.config.dictConfig(settings.LOGGING_DIC)
# 查询余额接口
def check_account_func(online_user):
user_dic = db_handler.select_user(online_user)
balance = user_dic["balance"]
logger = logging.getLogger('查询余额')
logger.info('用户{}查询余额'.format(online_user))
return balance
# 提现接口
def with_draw_func(money, online_user):
money = float(money)
cost = money * 1.05
user_dic = db_handler.select_user(online_user)
balance = float(user_dic["balance"])
# 判断余额
if cost < balance:
user_dic["balance"] = balance - cost
fee = money * 0.05
# 流水信息
record = "{}提现{}元,手续费{}元".format(time.strftime("%Y-%m-%d %X"), money, fee)
user_dic["current_account"].append(record)
db_handler.save_data(user_dic)
logger = logging.getLogger('提现')
logger.info("用户{}提现{},手续费{}".format(online_user, money, fee))
return True, "用户[{}]提现[{}]元成功,手续费为[{}]元".format(online_user, money, fee)
else:
return False, "余额不足,无法提现,共需{}元".format(cost)
def current_record(online_user):
user_dic = db_handler.select_user(online_user)
return user_dic["current_account"]
3 数据处理层
'''
数据处理层
'''
import json
import os
from conf import settings
# 获取用户信息
def select_user(user):
user_path = os.path.join(settings.DB_USER_PATH, "{}.json".format(user))
if os.path.exists(user_path):
with open(user_path, "r", encoding="utf-8") as f:
user_dic = json.load(f)
return user_dic
# 密码加密
def encrypt(info):
import hashlib
m = hashlib.md5()
salt = "嘟嘟喂嘟嘟"
m.update(salt.encode("utf-8"))
m.update(info.encode("utf-8"))
res = m.hexdigest()
return res
def save_data(user_dic):
user_name = user_dic["user"]
user_path = os.path.join(settings.DB_USER_PATH, "{}.json".format(user_name))
with open(user_path, "w", encoding="utf-8") as f1:
json.dump(user_dic, f1, ensure_ascii=False)