需求分析
1.实现用户的登录注册功能,并且用户分为普通用户和管理员用户,登录时需要先输入验证码
2.用户注册时会自动添加 20000 元的余额,与 0 元的银行卡信用余额
3.用户拥有–充值,提现,转账,还款,查询银行流水的基本功能
4.用户可以进入购物界面,能够添加物品进入购物车中
5.用户可以查询当前购物车中的物品,可以结算购物车中的所有商品
6.可以修改购物车中的商品
7.可以查询所有的购物历史
8.对于管理员的用户,可以冻结账户,重置账户密码,删除账户,解冻用户,查看指定用户信息
9.对于管理员用户,以及操作账户金额的所有功能需要记录日志
项目功能
1.注册
2.登陆
3.查看余额
4.提现
5.还款
6.转账
7.查看流水
8.添加购物车功能
9.查看购物车功能
10.结算购物车功能
11.管理员功能
架构设计
三层架构
视图层
视图层是应用程序的用户界面和通信层,供最终用户与应用程序进行交互。 其主要目的是向用户显示信息并从用户收集信息。 此顶级层可以在(例如)Web 浏览器上运行、作为桌面应用程序运行或作为图形用户界面 (GUI) 运行。 Web 表示层通常使用 HTML、CSS 和 JavaScript 开发。 可根据平台以各种不同语言编写桌面应用程序。
接口层
接口层,也称为逻辑层或中间层,是应用程序的核心。 在该层中,将采用业务逻辑(一组特定的业务规则)处理从表示层收集到的信息, 有时也会处理数据层中的其他信息 。 接口层还可以添加、删除或修改数据层中的数据。
接口层通常使用 Python、Java、Perl、PHP 或 Ruby 开发,并使用 API 调用与数据层通信。
数据处理层
数据处理层层(有时称为数据库层、数据访问层或后端)可供存储和管理应用程序所处理的信息。 这可以是关系 数据库管理系统,例如 PostgreSQL、MySQL、MariaDB、Oracle、DB2、Informix 或 Microsoft SQL Server,也可以是 NoSQL 数据库服务器,如 Cassandra、CouchDB 或 MongoDB。
在三层应用程序中,所有通信均通过接口层进行。 视图层和数据层无法直接彼此通信
项目代码
start.py
-启动文件
import sys
import osdir_path = os.path.dirname(os.path.dirname(__file__))
sys.path.append(dir_path)from ATM购物车.core import srcif __name__ == '__main__':src.run()
conf
文件夹
settings.py
–配置文件
import osGOOD_LIST = [['挂壁面', 3],['印度飞饼', 22],['极品木瓜', 666],['土耳其土豆', 999],['伊拉克拌面', 1000],['董卓戏张飞公仔', 2000],['仿真玩偶', 10000],['香奈儿', 20000],['GUCCI', 5000],['雅思兰黛粉底液', 599],['LV手链', 15000],['兰博基尼', 10000000]
]MONEY_RATE = 0.01Real_path = os.path.dirname(__file__)
File_path = os.path.join(Real_path, 'db')
if not os.path.exists(File_path):os.mkdir(File_path)
Bank_path = os.path.join(Real_path, 'bank')
if not os.path.exists(Bank_path):os.mkdir(Bank_path)# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \'[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'# 自定义文件路径
user_path1 = os.path.dirname(os.path.dirname(__file__))
db_path = os.path.join(user_path1, 'log')
if not os.path.exists(db_path):os.mkdir(db_path)
logfile_path = os.path.join(db_path, 'log.log')
# log配置字典
LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format},'simple': {'format': simple_format},},'filters': {}, # 过滤日志'handlers': {# 打印到终端的日志'console': {'level': 'DEBUG','class': 'logging.StreamHandler', # 打印到屏幕'formatter': 'simple'},# 打印到文件的日志,收集info及以上的日志'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler', # 保存到文件'formatter': 'standard','filename': logfile_path, # 日志文件'maxBytes': 1024 * 1024 * 5, # 日志大小 5M'backupCount': 5,'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了},},'loggers': {# logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕'level': 'DEBUG','propagate': True, # 向上(更高level的logger)传递}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置# '购物车记录': {# 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕# 'level': 'WARNING',# 'propagate': True, # 向上(更高level的logger)传递# }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置},
}
lib
文件夹
common.py
–公共方法
import logging
import logging.config
import hashlib
import random
from ATM购物车.conf import settings
from ATM购物车.core import src
from ATM购物车.database import db_handlerdef get_logger(msg):# 记录日志logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置logger1 = logging.getLogger(msg)# logger1.debug(f'{username}注册成功') # 这里让用户自己写更好return logger1def get_md5(pwd): # 函数传参的形式md = hashlib.md5()md.update('加盐'.encode('utf-8'))md.update(pwd.encode('utf-8'))return md.hexdigest()def random_verify():sum = ''for i in range(5):random_number = str(random.randint(0, 9))random_update = chr(random.randint(65, 90))random_lower = chr(random.randint(97, 122))res = random.choice([random_number, random_update, random_lower])sum = res + sumreturn sumdef outer(func_name):def inner(*args, **kwargs):if src.user_judge.get('username') and src.user_judge.get('is_tage') == False:res = func_name(*args, **kwargs)return reselif src.user_judge.get('is_tage') == True:print('该用户已经被冻结')else:print('你没有权限,请先登录')src.login()return innerdef out(func):def inn(*args, **kwargs):shop_operate_info = db_handler.select(src.user_judge.get('username'))if shop_operate_info.get('is_admin'):res = func(*args, **kwargs)return reselse:print('你不是管理员')return inn
database
文件夹–数据库
db_handler
–数据处理
import os
import json
from ATM购物车.conf import settingsdef register_db(user_dict, bank_dict):username = user_dict.get('username')user_path = os.path.join(settings.File_path, username)with open(user_path, 'w', encoding='utf8') as f:json.dump(user_dict, f)# 用户银行卡注册user_bank_path = os.path.join(settings.Bank_path, '%s.bank' % username)with open(user_bank_path, 'w', encoding='utf8') as f:json.dump(bank_dict, f)return f'用户{username}注册成功'def select(public):user_path = os.path.join(settings.File_path, public)if os.path.exists(user_path):with open(user_path, 'r', encoding='utf8') as f:user_info = json.load(f) # {"username": "lzq", "pwd": "f9eddd2f29dcb3136df2318b2b2c64d3", "balance": 20000, "shop_car": {}, "flow": [], "is_tage": false, "is_admin": false}return user_infodef select_bank(public):user_bank_path = os.path.join(settings.Bank_path, '%s.bank' % public)with open(user_bank_path, 'r', encoding='utf8') as f:user_bank_info = json.load(f)return user_bank_infodef shop_w_db(username, shop_info):user_path = os.path.join(settings.File_path, username)with open(user_path, 'w', encoding='utf8') as f: # 购物车json.dump(shop_info, f, ensure_ascii=False)def bank_w_db(username, bank_info):money_path = os.path.join(settings.Bank_path, '%s.bank' % username)with open(money_path, 'w', encoding='utf8') as f: # 银行json.dump(bank_info, f, ensure_ascii=False)
core
文件夹–视图层
src.py
-用户视图(主视图)
from ATM购物车.lib import common
from ATM购物车.interface import user_interface
from ATM购物车.interface import shop_car_interface
from ATM购物车.interface import bank_interface
from ATM购物车.interface import admin_interface
import os
from ATM购物车.conf import settingsuser_judge = {'username': '','is_tage': False
}def register():username = input('请输入你的用户名(q:退出):').strip()if username == 'q':returnpassword = input('请输入你的密码:').strip()password_confirm = input('请再确认一下密码无误:').strip()if password != password_confirm:print('你两次密码输入不一致')returnres = user_interface.register_interface(username, password)print(res)is_tall = Truedef login():global is_tallwhile is_tall:accept = common.random_verify()print(accept)verify = input('请输入你的验证码(q:退出):').strip()if verify == 'q':returnif accept.upper() != verify.upper():print('验证码输入不正确,请重新输入')continueelse:username = input('请输入你的用户名:').strip()password = input('请输入你的密码:').strip()if not password.isdigit():print('请输入纯数字')continueacct = user_interface.login_interface(username, password)if acct[2] == True:if user_judge.get('is_tage'):print('你已经被冻结')continueprint(acct[0])is_tall = acct[1]@common.outer
def addition():brevity_shop_car = {}while True:for i, j in enumerate(settings.GOOD_LIST, 1):print(f'''商品编号:{i} | 商品名称:{j[0]} | 商品价格:{j[1]}''')id = input('请输入你要购买商品的编号(q:退出):').strip()if id == 'q':shop_car_interface.add_write(brevity_shop_car, user_judge.get('username'))returnif int(id) > len(settings.GOOD_LIST):print('没有该物品编号')continuenumber = input('请输入你想购买的个数:').strip()shop_car_interface.add_interface(settings.GOOD_LIST, id, number, brevity_shop_car, user_judge.get('username'))@common.outer
def account():res = shop_car_interface.account_interface(user_judge.get('username'))print(res)@common.outer
def reduce():while True:print('''1.删除商品2.减少个数3.退出业务''')choice = input('请输入你的业务选择:').strip()if choice == '1':shop_car_interface.reduce_interface1(user_judge.get('username'))elif choice == '2':shop_car_interface.reduce_interface2(user_judge.get('username'))elif choice == '3':returnelse:print('没有该业务')@common.outer
def transfer():while True:print('''1.充值2.转账3.退出''')choice = input('请输入你的业务编号:').strip()if choice == '1':money = input('请输入你要充值的金额:').strip()if not money.isdigit():print('请输入纯数字')continueres = bank_interface.tr_bank_interface1(money, user_judge.get('username'))print(res)elif choice == '2':reduce_money = input('请输入你要转账的金额:').strip()if not reduce_money.isdigit():print('请输入纯数字')continueres = bank_interface.tr_bank_interface2(reduce_money, user_judge.get('username'))print(res)elif choice == '3':returnelse:print('没有该业务')@common.outer
def look_shop_car():accept = shop_car_interface.look_shop_inter(user_judge.get('username'))new_shop_car = accept.get('shop_car')name = accept.get('username')for i, j in enumerate(new_shop_car):v = new_shop_car.get(j)print(f'''-----------------------------info------------------------------商品编号:{i} * 商品名称:{j} * 商品个数:{v[0]} * 商品价格:{v[1]}---------------------------------------------------------------''')res = common.get_logger('查看购物车')res.debug(f'用户{name}查看了购物车')@common.outer
def balance():accept = shop_car_interface.balance_inter(user_judge.get('username'))balance_money = accept[0].get('balance')name = accept[0].get('username')bank_money = accept[1].get('bank_card') # 10000print(f'''-------------------money info-------------------\n你的购物卡余额为:{balance_money}\n你的银行卡余额为:{bank_money}\n------------------------------------------------''')res = common.get_logger('查看余额')res.debug(f'用户{name}查看了余额')@common.outer
def operate_log():print('''1.查看购物车流水信息2.查看银行卡流水信息3.退出查看''')choice = input('请输入你的查看选项:').strip()user_interface.operate_inter(choice)if choice == '3':return@common.out
@common.outer
def admin():print('''1.冻结用户2.删除用户3.解除冻结4.查看指定用户的信息5.退出业务''')choice = input('请你输入你的选择:').strip()if choice >= '6':print('没有该业务')returnif choice == '5':returndelete_admin = os.listdir(settings.File_path) # ['gsy', 'lzq']for i, j in enumerate(delete_admin):print(f'''用户编号:{i} | 用户名:{j}''')id = input('请输入你要(删除,冻结,解冻,查看)的用户编号:').strip()id1 = int(id)if id1 >= len(delete_admin):print('没有该用户')returnif choice == '1':res = admin_interface.admin_interface1(delete_admin, id1, user_judge.get('username'))print(res)elif choice == '2':res = admin_interface.admin_interface2(delete_admin, id1)print(res)elif choice == '3':res = admin_interface.admin_interface3(delete_admin, id1)print(res)elif choice == '4':print('''1.查看该用户的的余额2.给该用户购物车充值3.查看该用户的账单4.查看该用户的购物车5.该用户的密码重置''')change = input('请选择你的业务需求:').strip()res = admin_interface.admin_interface4(delete_admin, id1, change, user_judge.get('username'))print(res)@common.outer
def roll_out():print('''1.购物车余额提现2.用户交互转账3.退出业务''')choice = input('请你输入你的选择:').strip()if choice == '1':print('手续费是按照提现金额的%1收取')price = input('请输入你要提现的金额:').strip()res = bank_interface.roll_out_inter1(price, user_judge.get('username'))print(res)elif choice == '2':delete_admin = os.listdir(settings.File_path) # ['gsy', 'lzq']for i, j in enumerate(delete_admin):print(f'''用户编号:{i} | 用户名:{j}''')user_bank_id = input('请输入你要转入的用户名的编号:').strip()if int(user_bank_id) > len(delete_admin):print('用户编号不存在')returnelse:user_bank = delete_admin[int(user_bank_id)]shift_price = input('请输入你要转款的金额:').strip()shift_price = int(shift_price)res = bank_interface.roll_out_inter2(user_bank, shift_price, user_judge.get('username'))print(res)elif choice == '3':returnelse:print('没有该业务')data = {'1': register, '2': login, '3': addition, '4': account, '5': reduce, '6': transfer, '7': look_shop_car,'8': balance, '9': operate_log, '10': admin, '11': roll_out}def run():while True:print('''1.用户注册2.用户登录3.添加购物车4.结算购物车5.减少购物车6.充值与转账7.查看购物车8.查看余额9.查看流水10.管理员功能11.提现与相互转账''')choice = input('请输入你的业务需求(q:退出):')if choice == 'q':print('拜拜了你嘞!')res = common.get_logger('退出')res.debug('退出程序')breakelif choice in data:data.get(choice)()else:print('不好意思,没有该业务')
interface
文件夹–接口层
user_interface.py
–用户接口
from ATM购物车.lib import common
import os
from ATM购物车.conf import settings
from ATM购物车.core import src
from ATM购物车.database import db_handlerres = common.get_logger('用户信息')def register_interface(username, password):username_path = os.path.join(settings.File_path, username)if os.path.exists(username_path):return f'用户名{username}已存在'res1 = common.get_md5(password)user_dict = {'username': username,'pwd': res1,'balance': 20000,'shop_car': {},'flow': [], # 查看购物流水信息'is_tage': False, # 信息是否冻结'is_admin': False # 是否为管理员}bank_dict = {'username': username,'bank_card': 0,'flow': []}db_handler.register_db(user_dict, bank_dict)res.debug(f'用户{username}注册成功')return f'用户{username}注册成功'def login_interface(username, password):acct = db_handler.select(username)if not acct:return '用户不存在', True, Falsepwd = common.get_md5(password)if pwd == acct.get('pwd'):src.user_judge['username'] = usernamesrc.user_judge['is_tage'] = acct.get('is_tage')res.debug(f'用户{username}登录成功!')return f'用户{username}登录成功!', False, Trueelse:return '密码错误,请重新登录', True, Falsedef operate_inter(choice):if choice == '1':shop_operate_info = db_handler.select(src.user_judge.get('username')) # 购物车信息shop_flow = shop_operate_info.get('flow') # 操作流水列表if len(shop_flow) == 0:print('没有记录')else:for i, j in enumerate(shop_flow, 1):print(f'''流水步骤:{i} | 执行内容:{j}''')res.debug(f'用户查看了购物车流水操作!')elif choice == '2':bank_operate_info = db_handler.select_bank(src.user_judge.get('username'))bank_flow = bank_operate_info.get('flow')if len(bank_flow) == 0:print('没有记录')else:for c, d in enumerate(bank_flow, 1):print(f'''流水步骤:{c} | 执行内容:{d}''')res.debug(f'用户查看了银行流水操作!')else:print('没有该业务')
shop_car_interface.py
–购物接口
from ATM购物车.lib import common
import os
from ATM购物车.conf import settings
from ATM购物车.database import db_handler
from ATM购物车.core import srcres = common.get_logger('购物车管理')def add_interface(good_list, id, number, brevity_shop_car, username): # {"挂壁面": [138, 3], "仿真玩偶": [1, 10000]}shop_info = db_handler.select(username) # 购物车信息thing_info = good_list[int(id) - 1] # ['挂壁面', 3]if thing_info[0] not in brevity_shop_car:brevity_shop_car.update({thing_info[0]: [int(number), thing_info[1]]}) # {'挂壁面': [2, 3]}else:number_price = brevity_shop_car.get(thing_info[0]) # [2, 3]single = number_price[0] + int(number)brevity_shop_car.update({thing_info[0]: [single, thing_info[1]]})print(brevity_shop_car)for name in brevity_shop_car:if name in shop_info.get('shop_car'):new_number = shop_info.get('shop_car')[name][0] + brevity_shop_car.get(name)[0]brevity_shop_car.update({name: [new_number, brevity_shop_car[name][1]]})else:shop_info['shop_car'].update({name: [int(number), thing_info[1]]})def add_write(brevity_shop_car, username):shop_info = db_handler.select(username) # 购物车信息shop_info['shop_car'].update(brevity_shop_car)user_path = os.path.join(settings.File_path, username)db_handler.shop_w_db(user_path, shop_info)shop_name = shop_info.get('username')res.debug(f'用户{shop_name}的购物车有{brevity_shop_car}')def account_interface(username):accept = db_handler.select(username) # 购物车信息shop_car = accept.get('shop_car') # {"仿真玩偶": [1, 10000]}user_path = os.path.join(settings.File_path, username)sum = 0for i in shop_car: # {"仿真玩偶": [1, 10000]}shop_list = shop_car.get(i) # [1, 10000]sum = sum + (shop_list[0] * shop_list[1])if accept.get('balance') > sum:shop_car = {}accept['shop_car'] = shop_carnew_money = accept.get('balance') - sumaccept['balance'] = new_moneyaccept.get('flow').append(f'你本次消费{sum}')db_handler.shop_w_db(user_path, accept)res.debug(f'用户{username}已结算购物车')return f'支付成功,你本次消费{sum},你的余额还有{new_money}'else:return '你的余额不足,请先充值'def reduce_interface1(username):accept = db_handler.select(username) # 购物车信息new_shop_info = accept.get('shop_car') # {'仿真玩偶': [10, 10000], '挂壁面': [23, 3]}shop_info_list = list(new_shop_info.items()) # [('仿真玩偶', [10, 10000]), ('挂壁面', [23, 3])]if len(shop_info_list) == 0:change = input('你的购物车为空,是否购买(q/n):').strip()if change == 'q':src.addition()returnelse:returnfor i, j in enumerate(shop_info_list):print(f'商品编号:{i} | 商品名称:{j[0]} | 商品个数:{j[1][0]} | 商品价格:{j[1][1]}')id = input('请输入你想删除商品的编号:').strip()if int(id) not in range(len(shop_info_list)):print('没有该物品编号')returnif not id.isdigit():print('请输入纯数字')returnshop_name = shop_info_list[int(id)] # ('仿真玩偶', [10, 10000])new_shop_info.pop(shop_name[0])shop_info_list.pop(int(id))user_path = os.path.join(settings.File_path, username)db_handler.shop_w_db(user_path, accept)res.debug(f'商品{shop_name[0]}被删除')def reduce_interface2(username):accept = db_handler.select(username) # 购物车信息new_shop_info = accept.get('shop_car') # {'仿真玩偶': [10, 10000], '挂壁面': [23, 3]}shop_info_list2 = list(new_shop_info.items()) # [('仿真玩偶', [10, 10000]), ('挂壁面', [23, 3])]if len(shop_info_list2) == 0:change = input('你的购物车为空,是否购买(q/n):').strip()if change == 'q':src.addition()returnelse:returnfor i, j in enumerate(shop_info_list2):print(f'商品编号:{i} | 商品名称:{j[0]} | 商品个数:{j[1][0]} | 商品价格:{j[1][1]}')id1 = input('请输入你要减少物品的编号:').strip()if not id1.isdigit():print('请输入纯数字')returnif int(id1) not in range(len(shop_info_list2)):print('没有该物品编号')returnnumber = input('请输入你要减少的个数:').strip()if not number.isdigit():print('请输入纯数字')returnshop_name1 = shop_info_list2[int(id1)] # ('仿真玩偶', [10, 10000])new_number = shop_name1[1][0] - int(number)if new_number < 0:print('你还没有购买这么多')returnif new_number == 0:new_shop_info.pop(shop_name1[0])shop_info_list2.pop(int(id1))else:new_shop_info[shop_name1[0]] = [new_number, shop_name1[1][1]]user_path = os.path.join(settings.File_path, username)db_handler.shop_w_db(user_path, accept)res.debug(f'商品{shop_name1[0]}被减少{number}')def balance_inter(username):accept = db_handler.select(username) # {'username': 'lzq', 'pwd': '123', 'balance': 20000, 'shop_car': {}}bank_accept = db_handler.select_bank(username)return accept, bank_acceptdef look_shop_inter(username):accept = db_handler.select(username)return accept
bank_interface.py
–银行接口
from ATM购物车.lib import common
from ATM购物车.database import db_handler
import os
from ATM购物车.conf import settingsres = common.get_logger('银行功能')def tr_bank_interface1(money, username):accept = db_handler.select_bank(username) # {"username": "lzq", "bank_card": 0}bank_money = accept.get('bank_card')# name = accept.get('username')new_bank_money = bank_money + int(money)accept['bank_card'] = new_bank_moneyaccept.get('flow').append(f'用户{username}充值{int(money)}')db_handler.bank_w_db(username, accept)res.debug(f'用户{username}充值{money}')return f'你的银行卡余额为{new_bank_money}'def tr_bank_interface2(reduce_money, username):db_info = db_handler.select(username)bank_info = db_handler.select_bank(username)bank_money = bank_info.get('bank_card') # 10000# name = bank_info.get('username')if bank_money == 0:return '你的银行卡余额为0,请先充值'db_info['balance'] = db_info.get('balance') + int(reduce_money) # 20000 + 5000bank_info['bank_card'] = bank_money - int(reduce_money) # 10000 - 5000bank_reduce_money = bank_info.get('bank_card')db_info.get('flow').append(f'用户{username}转账{int(reduce_money)}')db_handler.shop_w_db(username, db_info)db_handler.bank_w_db(username, bank_info)res.debug(f'用户{username}转账{reduce_money}')return f'你的银行卡余额为{bank_reduce_money}'def roll_out_inter1(price, username): # 购物车往银行卡里转,还有手续费的收取price = int(price)username_path = os.path.join(settings.File_path, username)shop_roll_info = db_handler.select(username) # 购物车信息shop_balance = shop_roll_info.get('balance') # 购物车金额bank_roll_path = db_handler.select_bank(username) # 银行卡信息bank_car_price = bank_roll_path.get('bank_card') # 银行卡金额service_charge = price * settings.MONEY_RATE # 手续费new_shop_balance = shop_balance - price - service_charge # 购物车提现后的金额name = shop_roll_info.get('username')shop_roll_info.get('flow').append(f'用户{name}提现{price}') # []shop_roll_info['balance'] = new_shop_balancedb_handler.shop_w_db(username_path, shop_roll_info)new_bank_price = price + bank_car_price + service_charge # 银行卡提现后的钱bank_roll_path['bank_card'] = new_bank_priceres.debug(f'购物车余额为{new_shop_balance}')bank_path = os.path.join(settings.Bank_path, '%s.bank' % username)db_handler.shop_w_db(bank_path, bank_roll_path)return f'购物车余额为{new_shop_balance}, 银行卡余额为{new_bank_price}'def roll_out_inter2(user_bank, shift_price, username): # 输入的用户名 转款金额name = usernameif name == user_bank:return '不能给自己转账哦'else:shop_roll_path = db_handler.select(user_bank) # 被转款人购物车信息shop_balance = shop_roll_path.get('balance') # 被转款人购物车金额my_shop_info = db_handler.select(name) # 转款人购物车信息my_shop_price = my_shop_info.get('balance') # 转款人购物车金额new_shop_balance = shift_price + shop_balance # 转款后金额shop_roll_path['balance'] = new_shop_balanceusername_path = os.path.join(settings.File_path, user_bank)db_handler.shop_w_db(username_path, shop_roll_path)new_my_price = my_shop_price - shift_pricemy_shop_info['balance'] = new_my_pricemy_price_path = os.path.join(settings.File_path, username)my_name = my_shop_info.get('username')shop_name = shop_roll_path.get('username')my_shop_info.get('flow').append(f'用户{my_name}向用户{shop_name}转账{shift_price}')db_handler.shop_w_db(my_price_path, my_shop_info)res.debug(f'用户{name}向{user_bank}转款{shift_price}')return f'用户{name}购物车余额为{new_my_price}, 用户{user_bank}购物车余额为{new_shop_balance}'
admin_interface.py
-管理员接口
from ATM购物车.lib import common
import os
from ATM购物车.conf import settings
from ATM购物车.database import db_handlerres = common.get_logger('管理员功能')def admin_interface2(delete_admin, id1):name = delete_admin[id1]delete_name_path = os.path.join(settings.File_path, name) # D:\pythonProject\day29\ATM购物车\conf\db\lzqdelete_bank_path = os.path.join(settings.Bank_path, '%s.bank' % name)if os.path.exists(delete_name_path):os.remove(delete_name_path)os.remove(delete_bank_path)res.info(f'用户{name}已被管理员删除')return f'用户{name}已删除'else:return f'用户不存在'def admin_interface1(delete_admin, id1, username):name = delete_admin[id1]if username == name:return '不可以冻结自己哦'else:freeze_path = os.path.join(settings.File_path, name)accept = db_handler.select(name) # 购物车信息accept['is_tage'] = Truedb_handler.shop_w_db(freeze_path, accept)res.info(f'用户{name}被冻结!')return f'用户{name}已被冻结'def admin_interface3(delete_admin, id1):name = delete_admin[id1]freeze_path = os.path.join(settings.File_path, name)accept = db_handler.select(name) # 购物车信息accept['is_tage'] = Falsedb_handler.shop_w_db(freeze_path, accept)res.info(f'用户{name}已解冻!')return f'用户{name}已被解冻'def admin_interface4(delete_admin, id1, change, username):name = delete_admin[id1]if change == '1':user_dict = db_handler.select(name)bank_dict = db_handler.select_bank(name)print(f'''******************info*******************购物车余额:{user_dict.get('balance')} | 银行卡余额:{bank_dict.get('bank_card')}*****************************************''')res.info(f'已显示{name}余额')return f'已显示{name}余额'elif change == '2':user_dict = db_handler.select(name)balance_money = user_dict.get('balance')increase = input('请输入你要充值的金额:').strip()increase = float(increase)user_dict['balance'] = balance_money + increaseuser_dict.get('flow').append(f'用户{username}向用户{name}充值了{increase}')db_handler.shop_w_db(name, user_dict)res.info(f'用户{username}向用户{name}充值了{increase}')return f'用户{username}向用户{name}充值了{increase}'elif change == '3':user_dict = db_handler.select(name)bank_dict = db_handler.select_bank(name)print(f'''******************info*******************购物车账单:{user_dict.get('flow')} | 银行卡账单:{bank_dict.get('flow')}*****************************************''')res.info(f'已显示{name}账单')return f'已显示{name}账单'elif change == '4':user_dict = db_handler.select(name)print(f'''******************info*******************购物车账单:{user_dict.get('shop_car')}*****************************************''')res.info(f'已显示{name}购物车信息')return f'已显示{name}购物车信息'elif change == '5':user_dict = db_handler.select(name)old_pwd = input('请输入你的旧密码:').strip()res1 = common.get_md5(old_pwd)if res1 != user_dict.get('pwd'):return '密码不正确'new_pwd = input('请输入你的新密码:').strip()again_pwd = input('请再一次输入你的密码:').strip()if new_pwd != again_pwd:return print('新密码不一致')res1 = common.get_md5(new_pwd)user_dict['pwd'] = res1db_handler.shop_w_db(name, user_dict)res.info(f'用户{name}的密码已改为{res1}')return f'用户{name}的密码已改为{res1}'else:return '没有该业务'