## ATM购物车项目思路
三层架构
功能展示:
1.注册功能
2.登陆功能
3.查看余额
4.提现功能
5.还款功能
6.转账功能
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能
功能逻辑
1.注册功能
'用户展示层'
1.获取用户输入
2.判断用户两次密码是否一致
3.加密密码
4.连接代码逻辑核心层
def register(): # 注册
# 获取用户输入
while True:
username = input('请输入您想要注册的用户名').strip()
password = input('请输入您想要注册的用户密码').strip()
password1 = input('请确定您的密码>>>:').strip()
if password == password1:
hash_pwd = common.get_hash(password)
# 核对用户名是否存在
flag, msg = user_interface.register_interface(username, hash_pwd)
print(msg)
break
else:
print('您两次输入的密码不一致,请重新输入')
'代码逻辑核心层
1.判断用户名是否存在,连接用户数据
2.用户名不存在,写入用户
3.注册成功,返回值给第一层接收
def register_interface(username, password):
user_dict = db_handler.read_user(username)
if user_dict:
return False, f'用户名{username}已存在'
user_dict = {'username': username,
'password': password,
'balance': 15000,
'shop_car': {},
'state': False,
'bank_flow': []}
# 拼接用户路径
db_handler.save(user_dict)
logger.debug(f'用户{username}已注册成功') #日志
return True, f'用户{username}已注册成功'
2.登录成功
'用户展示层'
1.获取用户输入
2.加密用户密码
3.传递数据进代码核心层
4.通过第二层返回的用户状态修改全局变量,储存登录的用户名
5.添加装饰器
def login(): # 登录
while True:
username = input('请输入您的用户名>>>:').strip()
password = input('请输入您的用户密码>>>:').strip()
hash_pwd = common.get_hash(password)
# 调用第二层接口
flag, msg = user_interface.login_interface(username, hash_pwd)
if flag:
is_login['login_is'] = username
print(msg)
break
print(msg)
'代码核心层'
1.通过第一层传递的用户名获取用户字典
2.判断用户是否存在,不存在直接返回
3.用户存在,比对用户加密密码是否一致
4.返回登录成功或者密码错误
def login_interface(username, password):
user_dict = db_handler.read_user(username)
if not user_dict:
return False, f'用户{username}不存在,请确认后登录'
if user_dict['state']:
return False, '您的账户已被管理员冻结,请联系管理员'
if password == user_dict.get('password'):
logger.debug(f'用户{username}登录成功') #日志
return True, f'用户{username}登录成功'
else:
return False, '密码错误'
3.查看余额
'用户展示层'
1.通过全局变量获取当前登录用户
2.传数据进入代码核心层
def check_balance(): # 查看余额
username = is_login['login_is']
# 直接调用第二层
flag, msg = bank_intertface.check_balan_interface(username)
print(msg)
'代码核心层'
1.通过第一层传递的用户名调用数据层获得用户字典
2.将用户字典中的余额参数返回第一层
def check_balan_interface(username):
user_dict = db_handler.read_user(username)
logger.debug(f'用户{username}查看了自己的余额') #日志
return True, f'尊敬的{username}您的账户余额为{user_dict.get("balance")}元'
4.提现功能
'用户展示层'
1.通过全局变量获取当前登录用户
2.获取用户要提现的金额
3.传数据进入代码核心层(用户名,提现金额)
def withdraw(): # 提现
username = is_login.get('login_is')
withdraw_money = input('请输入您想要提现的金额').strip()
flag, msg = bank_intertface.withdraw_interface(username, withdraw_money)
print(msg)
'代码核心层'
1.通过第一层传递的用户名调用数据层获得用户字典
2.获取用户余额
3.转换用户要提现的金额为浮点型
4.对比用户需要提现的金额和余额
5.余额大于提现金额的情况下,计算用户体现的手续费
6.用于的余额减去提现的金额和手续费的金额
7.保存修改后的用户余额到数据库
def withdraw_interface(username, withdraw_money):
user_dict = db_handler.read_user(username)
balance = user_dict['balance']
# 这里调用转浮点型的函数,保证小数,整数都能够提现
flag, value = common.get_num(withdraw_money)
if flag:
if balance < value * (1 + settings.MONEY_RATIO):
return False, '您的余额不足以提现'
user_dict['balance'] -= value * (1 + settings.MONEY_RATIO)
db_handler.save(user_dict) # 保存修改后的数据
times = time.strftime('%Y-%m-%d %X')
logger.debug(f'用户{username}提现{value}元') #日志
user_dict['bank_flow'].append(f'时间{times}:成功提现{value}元,手续费{value * settings.MONEY_RATIO}元')
return True, f'{username}您成功提现{value}元,手续费{value * settings.MONEY_RATIO}元'
return False, '请输入正确的数字'
5.还款功能
'用户展示层'
1.通过全局变量获取当前登录用户
2.获取用户要还款的金额
3.传数据进入代码核心层(用户名,还款金额)
def pay_balance(): # 还款
username = is_login['login_is']
pay_num = input('请输入您想要还款的金额').strip()
flag, msg = bank_intertface.pay_balance_interface(username, pay_num)
print(msg)
'代码核心层'
1.通过第一层传递的用户名调用数据层获得用户字典
2.转换用户还款的金额为浮点型
3.获取用户余额直接加上还款余额
4.保存用户修改后的余额,并返回给第一层
def pay_balance_interface(username, pay_num):
user_dict = db_handler.read_user(username)
# 调用转浮点型的函数
falg, value = common.get_num(pay_num)
# 如果为True证明是小数或者整数
if falg:
user_dict['balance'] += value
times = time.strftime('%Y-%m-%d %X')
user_dict['bank_flow'].append(f'时间{times}:成功还款{value}元')
db_handler.save(user_dict)
logger.debug(f'用户{username}还款{value}元') #日志
return True, f'尊敬的{username},您成功还款{value}元'
return False, '请输入正确的还款金额'
6.转账功能
'用户展示层'
1.获取当前登录用户
2.获取用户转账账户
3.获取用户转账金额
4.传数据到第二层代码核心层(当前用户名,转账用户名,转账金额)
def transfer_money(): # 转账
username = is_login['login_is']
tranfer_name = input('请输入您想要转账的账户>>>:').strip()
tranfer_num = input('请输入您想要转账的金额>>>:').strip()
flag, msg = bank_intertface.transfer_money_interface(username, tranfer_name, tranfer_num)
print(msg)
'代码核心层'
1.读取转账用户数据,判断账户是否存在
2.转换转账金额会浮点型
3.判断当前用户余额是否足够转账
4.当前用户余额减去转账金额
5.被转账用户余额加上转账金额
6.保存两者新产生的余额到用户字典
7.保存两者新产生的用户字典到数据库
8.返回转账成功到第一层
def transfer_money_interface(username, tranfer_name, tranfer_num):
tranfer_name_dict = db_handler.read_user(tranfer_name)
if not tranfer_name_dict:
return False, '您所转账的账户不存在,请确认后输入'
user_dict = db_handler.read_user(username)
# 调用转数字的函数,把字符串转换
falg, value = common.get_num(tranfer_num)
if falg:
if value > user_dict['balance']:
return False, f'尊敬的用户{username}您的账户余额不足,无法转账'
else:
tranfer_name_dict['balance'] += value
times = time.strftime('%Y-%m-%d %X')
tranfer_name_dict['bank_flow'].append(f'时间{times}:收到{username}转账{value}元')
user_dict['balance'] -= value
user_dict['bank_flow'].append(f'时间{times}:向{tranfer_name}转账{value}元')
db_handler.save(tranfer_name_dict)
db_handler.save(user_dict)
logger.info(f'用户{username}向{tranfer_name}转账{value}元')
#日志
logger.info(f'用户{tranfer_name}收到{username}转账{value}元')
#日志
return True, f'尊敬的用户{username}您成功向用户{tranfer_name}转账{value}元'
return False, '请输入正确的数字'
7.查看流水
'用户交互层'
1.获取当前登录用户
2.直接传用户名到第二层
3.通过第二层的返回值循环打印用户流水
def check_flow(): # 查看流水
username = is_login['login_is']
# 直接调用第二层接口
flag, msg = bank_intertface.check_flow_interface(username)
if flag:
for i in msg:
print(i)
else:
print(msg)
'代码核心层'
1.获取用户字典
2.通过用户字典获取用户流水
3.返回用户流水到第一层
def check_flow_interface(username):
user_dict = db_handler.read_user(username)
logger.debug(f'用户{username}查看了自己的流水') #日志
if user_dict['bank_flow']:
return True, user_dict['bank_flow']
return False, '该账户暂无流水'
8.添加购物车
'用户交互层'
1.获取当前登录用户
2.传数据到第二层
def add_shop_car(): # 添加购物车
username = is_login['login_is']
flag, msg = shop_car_interface.add_shop_car_interface(username)
print(msg)
'代码核心层'
1.定义一个临时购物车在循环外
2.循环打印商品列表
3.获取用户选择的商品
4.判断用户选择是否是纯数字
5.判断用户选择是否在商品列表
6.获取用户购买数量
7.添加用户购买商品,商品数量,商品价格到临时购物车
8.用户重复添加或者选择退出保存购物车
9.调取用户数据获得用户购物车
10.判断临时购物车的商品在不在用户的购物车中
11.添加临时购物车的商品到用户购物车
12.保存用户数据到数据库
def add_shop_car_interface(username):
temp_shop_car = {}
while True:
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]]
for num, good_date in enumerate(good_list):
print(f'商品编号:{num} | 商品名:{good_date[0]} | 商品价格:{good_date[1]}')
choice_good = input('请输入您想购买的商品编号(q退出添加购物车)').strip()
if choice_good == 'q':
user_dict = db_handler.read_user(username)
old_shop_car = user_dict['shop_car']
for g_name, g_list in temp_shop_car.items():
if g_name in old_shop_car:
old_shop_car[g_name][0] += g_list[0]
else:
old_shop_car[g_name] = g_list
logger.debug(f'用户{username}购物车添加{g_list[0]}个{g_name}')
user_dict['shop_car'] = old_shop_car
times = time.strftime('%Y-%m-%d %X')
user_dict['bank_flow'].append(f'时间{times}:成功添加购物车')
db_handler.save(user_dict)
return True, f'尊敬的{username}您的购物车添加成功'
if not choice_good.isdigit():
print('请输入正确的商品编号')
continue
choice_good = int(choice_good)
if choice_good not in range(len(good_list)):
print('您输入的商品编号不存在')
continue
while True:
choice_good_num = input('请输入您购买的商品的数量')
if not choice_good_num.isdigit():
print('请输入正确的数字')
continue
else:
choice_good_num = int(choice_good_num)
break
good_date_list = good_list[choice_good]
good_name = good_date_list[0]
# 添加临时小字典
if good_name in temp_shop_car:
temp_shop_car[good_name][0] += choice_good_num
else:
temp_shop_car[good_name] = [choice_good_num, good_date_list[1]]
9.查看购物车
'用户展示层'
1.获取当前登录用户
2.调取用户第二层数据
3.循环打印第二层返回的用户购物车数据
def chenck_shop_car(): # 查看购物车
username = is_login['login_is']
flag, msg = shop_car_interface.chenck_shop_car_interface(username)
if flag:
for g_name, g_list in msg.items():
print(f'商品名:{g_name} | 商品数量:{g_list[0]} 商品单价:{g_list[1]}')
else:
print(msg)
'代码核心层'
1.通过用户名获取用户字典
2.获取用户购物车
3.返回用户购物车到第一层
def chenck_shop_car_interface(username):
user_dict = db_handler.read_user(username)
shop_car = user_dict['shop_car']
logger.debug(f'用户{username}查看了自己的购物车')
if shop_car:
return True, shop_car
return False, '您的购物车空空如也'
10.结算购物车
'用户展示层'
1.获取当前登录用户
2.传用户名到第二层
3.接收第二层返回
def pay_shop_car(): # 结算购物车
username = is_login['login_is']
flag, msg = shop_car_interface.pay_shop_car_interface(username)
print(msg)
'代码核心层'
1.获取当前用户字典
2.获取用户购物车数据
3.判断购物车是否有商品
4.计算用户购物车商品总价
5.判断用户余额是否足够支付商品
6.用户余额减去商品总价,保存用户字典
7.将用户字典写入数据库中
def pay_shop_car_interface(username):
user_dict = db_handler.read_user(username)
shop_car = user_dict.get('shop_car')
balance = user_dict['balance']
if shop_car:
# 计算购物车的总价
money_num = 0
for i in shop_car:
money_num += shop_car[i][0] * shop_car[i][1]
if money_num > balance:
return False, '您的余额不足,请充值'
else:
user_dict['balance'] -= money_num
user_dict['shop_car'] = {}
logger.debug(f'用户{username}购物消费{money_num}元')
times = time.strftime('%Y-%m-%d %X')
user_dict['bank_flow'].append(f'时间{times}:购物消费{money_num}元')
db_handler.save(user_dict)
return True, f'尊敬的{username}您购物成功,消费{money_num}元,欢迎下次光临'
else:
return False, '您购物车暂时没有任何物品,快去添加吧'
11.管理员功能
'用户展示层'
1.获取管理员登录
1.1调取第二层登录管理员账号
2.给出管理员选择
3.判断管理员选择执行
3.1调取第二层执行管理员选项
4.接收管理员执行结果
def admin(): # 管理员功能
username = input('请输入管理员账户>>>:').strip()
password = input('请输入管理员密码>>>:').strip()
flag, msg = admin_interface.admin_login(username, password)
if flag:
print("""
欢迎你管理员
1.冻结账户
2.删除账户
""")
admin_choice = input('请选择您想要执行的选择>>>:').strip()
if admin_choice == '1':
admin_name = input('请输入您想要冻结的账户>>>:').strip()
flag, msg = admin_interface.admin_freeze(admin_name)
print(msg)
elif admin_choice == '2':
admin_name = input('请输入您想要删除的账户>>>:').strip()
flag, msg = admin_interface.admin_def(admin_name)
print(msg)
'代码核心层'
1.判断当前管理员账号密码,登录操作
def admin_login(username, password): # 管理员登录
if username == 'zhanghong' and password == '123':
logger.info(f'管理员{username}登录')
return True, f'欢迎管理员{username}'
else:
return False, '管理员账号或者密码错误'
冻结账户:
1.读取管理员所要冻结的账户数据
2.修改账户状态为Ture
3.返回第一层
def admin_freeze(username):
user_dict = db_handler.read_user(username)
if user_dict:
user_dict['state'] = True
db_handler.save(user_dict)
logger.error(f'用户{username}被管理员冻结账户')
return True, f'用户{username}被管理员冻结账户'
else:
return False, '该账户不存在'
删除账户:
1.获取删除用户数据
2.拼接删除用户文件路径
3.删除用户
def admin_def(username):
user_dict = db_handler.read_user(username)
if user_dict:
user_path = os.path.join(settings.DB_PATH, f'{username}.json')
os.remove(user_path)
logger.warning(f'用户{username}被管理员删除')
return True, f'用户{username}已被删除'
else:
return False, '该账户不存在'