1,分析需求
1.额度15000或自定义 --> 注册功能
2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能、支付功能
3.可以提现,手续费5% --> 提现功能
4.支持多账户登录 --> 登录功能
5.支持账户间转账 --> 转账功能
6.记录日常消费 --> 记录流水功能
7.提供还款接口 --> 还款功能
8.ATM记录操作日志 --> 记录日志功能
9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。 ---> 管理员功能
10.用户认证用装饰器 --> 登录认证装饰器
- "用户视图层" 展示给用户选择的功能
1、注册功能
2、登录功能
3、查看余额
4、提现功能
5、还款功能
6、转账功能
7、查看流水
8、购物功能
9、查看购物车
10、管理员功能
2,程序的架构设计
三层架构
一 用户视图层
用于与用户交互的,可以接受用户的输入,打印接口返回的数据。
二 逻辑接口层
接受 用户视图层 传递过来的参数,根据逻辑判断调用数据层加以处理,
并返回一个结果给 用户视图层。
三 数据处理层
接受接口层传递过来的参数,做数据的
- 保存数据 save()
- 查看数据 select()
- 更新数据
- 删除数据
3,创建atm文件项目所有所需要的子文件夹及py文件
conf——sttings.py 配置文件
core——src.py 用户视图层
interface——user_interface.py(用户接口),bank_interface.py(银行接口),shopping_interface.py(购物接口)
db——db_handler.py 数据相关的操作
lib——common.py 公共功能
star.py 项目开始文件
log——存放日志
readme 项目介绍
4,开始写功能
star.py 项目开始文件
import os
import sys
from conf import settings
sys.path.append(settings.BASE_PATH)
from core import src
if __name__ == '__main__':
src.run()
sttings.py 配置文件
import os
import sys
BASE_PATH=os.path.dirname(os.path.dirname(__file__))
USER_DATA_PATH = os.path.join(BASE_PATH, 'db', 'user_data')
src.py 用户视图层
from interface import user_interface
from interface import bank_interface
from lib import common
# 全局变量
login_user = None
def register():
while True:
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
re_password = input('请确认密码: ').strip()
if password == re_password:
flag, msg = user_interface.register_interface(username, password)
if flag:
print(msg)
break
else:
print(msg)
def login():
while True:
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
flag, msg = user_interface.login_interface(username, password)
if flag:
print(msg)
global login_user
login_user = username
break
else:
print(msg)
@common.login_auth
def check_balance():
balance = user_interface.check_bal_interface(login_user)
print(f'用户{login_user} 账户余额为: {balance}')
@common.login_auth
def withdraw():
while True:
input_money = input('请输入提现金额: ').strip()
if not input_money.isdigit():
print('请重新输入')
continue
flag, msg = bank_interface.withdraw_interface(login_user, input_money)
if flag:
print(msg)
break
else:
print(msg)
@common.login_auth
def payback():
pass
@common.login_auth
def transfer():
pass
@common.login_auth
def check_flow():
pass
@common.login_auth
def shopping():
pass
@common.login_auth
def check_shopcar():
pass
def admin():
pass
#函数字典
funcdic={
'1': register,
'2': login,
'3': check_balance,
'4': withdraw,
'5': payback,
'6': transfer,
'7': check_flow,
'8': shopping,
'9': check_shopcar,
'10': admin,
}
def run():
while True:
print('''
===== ATM + 购物车 =====
1、注册功能
2、登录功能
3、查看余额
4、提现功能
5、还款功能
6、转账功能
7、查看流水
8、购物功能
9、查看购物车
10、管理员功能
========= end =========
''')
choice=input('请输入操作(q退出):')
if choice=='q':
break
else:
if choice not in funcdic:
print('输入有误')
else:
funcdic[choice]()
user_interface.py(用户接口)
from db import db_handler
from lib import common
def register_interface(username, password, balance=15000):
user_dic = db_handler.select(username)
if user_dic:
return False, '用户名已存在!'
password = common.get_pwd_md5(password)
user_dic = {
'username': username,
'password': password,
'balance': balance,
'flow': [],
'shop_car': {},
'locked': False
}
db_handler.save(user_dic)
return True, f'{username} 注册成功!'
def login_interface(username, password):
user_dic = db_handler.select(username)
if user_dic:
password = common.get_pwd_md5(password)
if password == user_dic.get('password'):
return True, f'用户: [{username}] 登录成功!'
else:
return False, '密码错误'
return False, '用户不存在,请重新输入!'
def check_bal_interface(username):
user_dic = db_handler.select(username)
return user_dic['balance']
bank_interface.py(银行接口)
from db import db_handler
def withdraw_interface(username, money):
user_dic = db_handler.select(username)
balance = int(user_dic.get('balance'))
money2 = int(money) * 1.05
if balance >= money2:
balance -= money2
user_dic['balance'] = balance
db_handler.save(user_dic)
return True, f'用户[{username}] 提现金额[{money}$]成功,手续费为: [{money2 - float(money)}$]'
return False, '金额不足,请重新输入!'
shopping_interface.py(购物接口)
db_handler.py 数据相关的操作
import json
import os
from conf import settings
def select(username):
user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
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 save(user_dic):
username = user_dic.get('username')
user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
with open(user_path, 'w', encoding='utf-8') as f:
json.dump(user_dic, f, ensure_ascii=False)
common.py 公共功能
import hashlib
def get_pwd_md5(password):
md5_obj = hashlib.md5()
md5_obj.update(password.encode('utf-8'))
salt = '一二三四五,上山打老鼠!'
md5_obj.update(salt.encode('utf-8'))
return md5_obj.hexdigest()
def login_auth(func):
from core import src
def inner(*args, **kwargs):
if src.login_user:
res = func(*args, **kwargs)
return res
else:
print('未登录,请登录')
src.login()
return inner