ATM+购物车
项目分析
1.项目功能需求
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.充值功能
6.转账功能
7.查看流水
8.添加购物车
9.结算购物车
10.管理员功能
2.项目框架设计
当前项目使用三层架构比较合适
1.用户交互层 只负责与用户交互,获取用户输入与信息展示给用户
2.核心逻辑层 负责项目的逻辑判断和运算
3.数据处理层 负责数据的保存与读取
搭建项目框架
1.项目目录搭建
根据软件开发目录创建出相应的目录与文件
bin文件夹 start.py 启动文件
conf文件夹 settings.py文件 配置文件
core文件夹 src.py 原本是存放项目的核心功能,这里充当第一层,与用户交互
interface文件夹 存放接口文件,这里充当项目的第二层,核心逻辑层,且根据功能划分不同的 文件,这里可大致分为四个文件
user_interface.py 存放与用户相关的功能
bank_interdace.py 存放银行相关的功能
shop_interface.py 存放购物相关的功能
admin_interface.py 存放管理员相关的功能
lib文件夹 common.py 存放项目的公共功能
db文件夹 db_handler.py 存放数据操作相关的代码,这里充当第三层数据处理层
2.项目功能搭建
使用空函数先搭建出第一层和启动文件
项目具体编写
1.注册功能
第一层
1.获取用户信息输入(用户名密码与确认密码)
2.比对密码与确认密码
3.将用户名和密码传入第二层,由第二层来执行相应的逻辑判断和运算
4.获取第二层处理后的结果,并展示给用户
def register():
username = input('注册用户名:').strip()
password = input('注册密码:').strip()
surepassword = input('确认密码:').strip()
if not password == surepassword:
print('两次密码不一致')
return
password = common.hashlib_msg(password)
res = user_interface.register_interface(username, password)
print(res)
第二层
1.将用户名传入数据库判断用户名是否存在
2.编写用户相关字典
3.将用户字典传入数据库存储
def register_interface(username, password):
is_username = db_handler.select(username)
if is_username:
return '用户名已存在'
user_dict = {
'username': username,
'password': password,
'balance': 1000000,
'shop_car': {},
'bank_water': [],
'is_blaklist': False
}
db_handler.save(user_dict)
loger.info(f'用户{username}注册成功')
return '注册成功'
第三层
1.获取用户字典并存储 (创建存储数据相关的函数)
2.获取用户名判断用户是否存在然后再读取 (创建查询数据相关的函数)
def save(user_dict):
username = user_dict.get('username')
user_file = os.path.join(settings.DB_DIR, f'{username}.json')
with open(user_file, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
def select(username):
user_file = os.path.join(settings.DB_DIR, f'{username}.json')
if not os.path.exists(user_file):
return False
with open(user_file, 'r', encoding='utf8') as f:
return json.load(f)
2.登录功能
第一层
1.获取用户输入
2.调用第二层登录函数,将用户名密码传入并打印返回值
def login():
username = input('登录用户名:').strip()
password = input('登录密码:').strip()
password = common.hashlib_msg(password)
res, res1 = user_interface.login_interface(username, password)
if res:
is_login['username'] = username
print(res1)
第二层
1.调用第三层的查数据函数查询用户名是否存在,并获取返回值
2.判断返回值的布尔值
3.判断输入的用户密码和存储的用户密码是否一致
def login_interface(username, password):
user_dict = db_handler.select(username)
if not user_dict:
return False, '用户名不存在'
if user_dict.get('is_blaklist'):
return False, '您已被拉入黑名单中,无法登陆'
if user_dict.get('password') == password:
loger.info(f'用户{username}登录成功')
return True, '登录成功'
else:
return False, '密码错误'
第三层
由于编写注册功能代码时就已经将第三层代码写好了,所以之后就可以直接调用第三层的函数
登录功能编写完以后需要考虑用户密码的安全性和之后的功能都是基于登录用户的
1.用户密码的安全性
用户注册登录都需要对密码进行加密,那么可以将加密代码封装成公共函数在登录注册时直接调用即可
2.获取用户登录状态
在本地使用全局变量来记录用户登录状态,也就是写在第一层,用户登录后全局变量的值更改为当前登录用户,第二步后面的每个函数在执行时都需要校验用户是否登录,在公共功能中编写用户登录校验装饰器
3.查看余额
第一层
1.调用第二层对应函数,将全局变量记录的用户名作为参数传入
2.获取返回值并打印
@common.outer
def select_balance():
res = user_interface.select_balance_interface(is_login.get('username'))
print(res)
第二层
1.调用第三层的查询函数
2.获取用户字典
3.获取用户字典中的余额作为返回值
def select_balance_interface(username):
user_dict = db_handler.select(username)
balabce = user_dict.get('balance')
loger.info(f'用户{username}查看了余额')
return balabce
第三层
执行查询函数即可
4.提现功能
第一层
1.获取用户想要提现的金额
2.调用第二层相应函数
3.获取返回值并打印
@common.outer
def withdraw():
transfer_money = input('请输入要提现的金额(收取0.02%手续费):').strip()
res = bank_interface.withdraw_interface(is_login.get('username'), transfer_money)
print(res
第二层
1.获取的用户提现金额为字符串需要转为整型
2.调用第三层查询函数获取用户字典
3.用户余额减去提现金额并扣除手续费
4.调用第三层保存函数,保存修改后的用户字典
def withdraw_interface(username, transfer_money):
transfer_money = int(transfer_money)
user_dict = db_handler.select(username)
if transfer_money > user_dict.get('balance'):
return '余额不足'
user_dict['balance'] -= transfer_money
service_charge = transfer_money * settings.SERVICE_CHARGE
user_dict['balance'] -= service_charge
ctime = time.strftime('%Y-%m-%d %X')
user_dict['bank_water'].append(f'{ctime}成功提现{transfer_money}元,收取{service_charge}元手续费,余额为{user_dict.get("balance")}')
db_handler.save(user_dict)
loger.info(f'用户{username}提现了{transfer_money}')
return f'成功提现{transfer_money}元,收取{service_charge}元手续费,余额为{user_dict.get("balance")}元'
注意:提现的金额为整数和小数或其他字符的处理
手续费为可调,可以写入配置文件
5.充值功能
第一层
1.获取用户充值金额
2.调用第二层相应函数
3.获取返回值并打印
@common.outer
def recharge():
recharge_money = input('请输入要充值的金额').strip()
res = bank_interface.recharge_interface(is_login.get('username'), recharge_money)
print(res)
第二层
1.将用户输入的充值金额转为整型
2.调用第三层查询函数获取用户字典
3.用户余额数据处理
4.保存处理过的用户字典,需调用第三层保存函数
def recharge_interface(username, recharge_money):
recharge_money = int(recharge_money)
user_dict = db_handler.select(username)
user_dict['balance'] += recharge_money
ctime = time.strftime('%Y-%m-%d %X')
user_dict['bank_water'].append(f'{ctime}成功充值{recharge_money}元,充值后余额{user_dict.get("balance")}元')
db_handler.save(user_dict)
loger.info(f'用户{username}充值{recharge_money}')
return f'充值成功,充值后余额{user_dict.get("balance")}元'
6.转账功能
第一层
1.获取转账目标用户和转账金额
2.调用第二层相应函数
3.获取返回值并打印
@common.outer
def transfer_accounts():
target_user = input('您要转账的用户是:').strip()
transfer_money = input('您要转账的金额是:').strip()
res = bank_interface.transfer_accounts_interface(is_login.get('username'), target_user, transfer_money)
print(res)
第二层
1.对获取的金额进行处理转为整型
2.调用第三层查询函数,根据返回值的布尔值判断目标用户是否存在
3.调用第三层查询函数,获取当前用户字典
4.对当前用户和目标用户的余额进行相应的运算处理
5.将处理过后的两个用户字典调用第三层保存函数进行保存
def transfer_accounts_interface(username, target_user, transfer_money):
transfer_money = int(transfer_money)
target_user_dict = db_handler.select(target_user)
if not target_user_dict:
return f'要转账的用户{target_user}不存在'
user_dict = db_handler.select(username)
user_dict['balance'] -= transfer_money
target_user_dict['balance'] += transfer_money
ctime = time.strftime('%Y-%m-%d %X')
user_dict['bank_water'].append(f'{ctime},成功转账{transfer_money}元,转账后余额{user_dict.get("balance")}元')
target_user_dict['bank_water'].append(f'{ctime}从{username}转入{transfer_money}元')
db_handler.save(user_dict)
db_handler.save(target_user_dict)
loger.info(f'用户{username}转账给{target_user}{transfer_money}元')
return f'转账成功,本次转账{transfer_money}元,转账后余额{user_dict.get("balance")}元'
7.查看流水
在注册功能构造用户字典时,在用户字典内创建一个存储用户流水的键值对,之后每一次对用户余额进行操作时都记录下并存入用户字典】
查询时质询查找到对应用户的用户字典打印存储流水的键值对的值即可
用户可以记录用户流水那么也可以记录软件操作日志,将日志字典放入配置文件中,在公共功能中构造一个自动加载日志字典配置的函数,每执行一次功能就调用一次该函数并产生日志
@common.outer
def select_water():
res = bank_interface.select_water_interface(is_login.get('username'))
print(res)
def select_water_interface(username):
loger.info(f'{username}查看了银行流水')
userdict = db_handler.select(username)
if not userdict.get('bank_water'):
return '尚未产生流水'
for i in userdict.get('bank_water'):
print(i)
return
8.添加购物车
第一层
1.直接调用第二层相应函数
@common.outer
def add_shop_car():
res = shop_interface.add_shop_car_interface(is_login.get('username'))
print(res)
第二层
1.获取商品信息并构造一个临时存储商品的字典
2.循环展示商品信息
3.用户选择商品
4.验证用户输入的商品编号
5.输入购买个数
6.将购买的商品存入临时字典中
7.用户退出购买,将临时字典中的数据保存到购物车中
def add_shop_car_interface(username):
temp_good_dict = {}
# 1.获取商品信息
while True:
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 2.循环展示商品信息
for num, good in enumerate(good_list):
print(f'{num} | {good[0]} | {good[1]}')
# 3.用户选择商品,输入商品编号
num = input('请输入您要选择的商品编号(q):').strip()
# 5.用户买完商品将商品数据保存到购物车中
if num == 'q':
username_dict = db_handler.select(username)
user_shop_char = username_dict.get('shop_car')
for g_name, g_list in temp_good_dict.items():
if g_name in user_shop_char:
user_shop_char[g_name][0] += g_list[0]
else:
user_shop_char[g_name] = g_list
loger.info(f'用户{username}购买了'
f'商品:{g_name} | 数量:{g_list[0]} | 单价:{g_list[1]}')
db_handler.save(username_dict)
return
if not num.isdigit(): # 验证用户输入的商品编号是否为数字
print('商品编号为纯数字')
continue
num = int(num)
if num not in range(len(good_list)): # 验证用户输入的商品编号是否存在
print('无此编号商品')
continue
good_num = input('您要买多少个').strip()
good_num = int(good_num)
# 4.将用户购买的商品保存到临时字典中
good_name = good_list[num][0]
if good_list[num][0] in temp_good_dict:
temp_good_dict[good_name][0] += good_num
else:
temp_good_dict[good_name] = [good_num, good_list[num][1]]
9.购物车支付
第一层
1.直接调用第二层相关函数
@common.outer
def pay_shop_car():
res = shop_interface.pay_shop_car_interface(is_login.get('username'))
print(res)
第二层
1.调用第三层查询函数,获取用户字典
2.获取用户购物车
3.计算购物车中商品总额
4.比较购物车商品总额与用户余额
5.支付
6.将修改后的用户字典重新保存
def pay_shop_car_interface(username):
username_dict = db_handler.select(username)
user_shop_char = username_dict.get('shop_car')
pay_money = 0
balance = username_dict.get('balance')
for good_list in user_shop_char.values():
pay_money += good_list[0] * good_list[1]
if balance < pay_money:
print('余额不足')
else:
username_dict['balance'] -= pay_money
username_dict['shop_car'] = {}
loger.info(f'用户{username}支付购物车{pay_money}')
print('结算成功')
db_handler.save(username_dict)
标签:username,money,ATM,用户,购物车,dict,user,interface
From: https://www.cnblogs.com/zyg111/p/16845705.html