项目启动
'''
bin目录下start.py
用来启动项目
'''
# coding:utf-8
import os
import sys
# 定义全局变量
root_dir = os.path.dirname(os.path.dirname(__file__))
sys.path.append(root_dir)
if __name__ == '__main__':
from core import src
src.run()
项目配置
'''
conf目录下setting.py
用来存放公用的配置
'''
# coding:utf-8
import os
# 配置全局变量根目录
root_dir = os.path.dirname(os.path.dirname(__file__))
# 配置存储数据的目录
user_db = os.path.join(root_dir, 'db')
if not os.path.exists(user_db):
os.mkdir(user_db)
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'
# 自定义文件路径
LOG_DIR = os.path.join(root_dir, 'log')
if not os.path.isdir(LOG_DIR):
os.mkdir(LOG_DIR)
LOGFILE_PATH = os.path.join(LOG_DIR, 'ATM.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', 'console'], # 这里把上面定义的两个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配置
},
}
用户展示层
'''
core目录下src.py文件
用户展示层
'''
# coding:utf-8
import lib.common
from interface import user_interface, bank_interface, shop_interface, admin_interface
from lib import common
import os
import sys
root_dir = os.path.dirname(os.path.dirname(__file__))
user_db = os.path.join(root_dir, 'db')
sys.path.append(root_dir)
if not os.path.exists(user_db):
os.mkdir(user_db)
user_status = {
'user_name': None,
'black_user': None,
'is_admin': 'jason',
'is_lock': False
}
def register():
user_name = input('Please input your name>>>:')
pass_word = input('Please input your password>>>:')
pass_word_again = input('Please input your password again>>>:')
if not pass_word == pass_word_again:
print('Your twice password is different!')
return
# 直接调用用户注册接口
flag, msg = user_interface.register_interface(user_name, pass_word)
print(msg)
def login():
# 获取用户的相关数据
user_name = input('Please input your name>>>:')
pass_word = input('Please input your password>>>:')
# 调用用户登录接口
flag, msg = user_interface.login_interface(user_name, pass_word)
if flag:
user_status['user_name'] = user_name
print(msg)
@common.outer('normal')
def check_money():
# 调用查看余额的接口
flag, msg = bank_interface.check_balance_interface(user_status.get('user_name'))
print(msg)
@common.outer('normal')
def withdraw_money():
withdraw_money_number = input('Please input your need withdraw number>>>:').strip()
flag, msg = bank_interface.withdraw_money_interface(user_status.get('user_name'), withdraw_money_number)
print(msg)
@common.outer('normal')
def return_money():
deposit_money = input('Please deposit more money,Baby>>>:').strip()
flag, msg = bank_interface.return_money_interface(user_status.get('user_name'), deposit_money)
print(msg)
@common.outer('normal')
def transfer_money():
target_user = input('Please input your transfer username>>>:')
transfer_money_number = input('Please input transfer number>>>:')
flag, msg = bank_interface.transfer_money_interface(user_status.get('user_name'), target_user, transfer_money_number)
print(msg)
@common.outer('normal')
def money_view():
msg = bank_interface.money_view_interface(user_status.get('user_name'))
print(msg)
@common.outer('normal')
def add_shop():
msg = shop_interface.add_shop_car(user_status.get('user_name'))
print(msg)
@common.outer('normal')
def check_shop():
msg = shop_interface.check_shop_interface(user_status.get('user_name'))
print(msg)
@common.outer('normal')
def pay_shop():
msg = shop_interface.pay_shop_interface(user_status.get('user_name'))
print(msg)
@common.outer('admin')
def admin():
def lock_user():
print(lib.common.get_file_names())
lock_username = input('please input you need lock name>>>:')
flag, msg = admin_interface.lock_user_interface(user_status.get('is_admin'), lock_username)
print(msg)
def remove_lock():
print(lib.common.get_file_names())
remove_username = input('please input you need remove lock name>>>:')
flag, msg = admin_interface.remove_lock_interface(user_status.get('is_admin'), remove_username)
print(msg)
def del_user():
print(lib.common.get_file_names())
del_username = input('please input you need delete username>>>:')
flag, msg = admin_interface.del_user_interface(user_status.get('is_admin'), del_username)
print(msg)
def add_user():
register()
def check_user():
print(lib.common.get_file_names())
check_username = input('please input you need check username>>>:')
flag, msg = admin_interface.check_user_interface(user_status.get('is_admin'), check_username)
print(msg)
admin_operator = {
'1': lock_user,
'2': remove_lock,
'3': del_user,
'4': add_user,
'5': check_user
}
def admin_choose():
while True:
print('''
1.locked user
2.remove lock
3.delete user
4.add_user
5.check_username
6.quit system
''')
admin_choose = input('Please input admin choose number>>>:').strip()
if admin_choose in admin_operator.keys():
admin_operator.get(admin_choose)()
elif admin_choose == '6':
break
else:
print('Please input right number!')
admin_choose()
user_operator = {
'1': register,
'2': login,
'3': check_money,
'4': withdraw_money,
'5': return_money,
'6': transfer_money,
'7': money_view,
'8': add_shop,
'9': check_shop,
'10': pay_shop,
'11': admin,
}
def run():
while True:
print('''
'1': register,
'2': login,
'3': check_money,
'4': withdraw_money,
'5': deposit_money,
'6': transfer_money,
'7': water_flow,
'8': add_shop,
'9': check_shop,
'10': pay_shop,
'11': admin,
'12': quit_system
''')
user_choose = input('Please input your choose number>>>:').strip()
if user_choose in user_operator.keys():
user_operator.get(user_choose)()
elif user_choose == '12':
break
else:
print('Please input right number!')
数据存储层
'''
db目录下handler
数据存储层
数据库功能——(查询、保存)
'''
# coding:utf-8
import json
import os
from conf import setting
# 数据的保存
def save(user_dict):
user_name = user_dict.get('user_name')
user_real_db = os.path.join(setting.user_db, f'{user_name}.json')
with open(user_real_db, 'w', encoding='utf-8') as f:
json.dump(user_dict, f, ensure_ascii=False)
# 数据的查询
def select(user_name):
user_real_db = os.path.join(setting.user_db, f'{user_name}.json')
if os.path.exists(user_real_db):
with open(user_real_db, 'r', encoding='utf-8') as f:
return json.load(f)
业务逻辑层——管理员功能
'''
interface
业务逻辑层——管理员功能
'''
# coding:utf-8
import conf.setting
import core.src
import db.db_handler
import lib.common
from db import db_handler
from lib import common
import os
logger = common.get_logger('admin')
def get_username_list():
file_name_list = db_handler.get_file_names()
return True, file_name_list
def lock_user_interface(admin_name, lock_username):
user_dict = db.db_handler.select(lock_username)
name = user_dict.get('user_name')
if name in lib.common.get_file_names():
user_dict['is_lock'] = True
core.src.user_status['is_lock'] = True
logger.info(f'{admin_name}locked{lock_username}')
db_handler.save(user_dict)
logger.error(f'{admin_name}:locked:{lock_username}')
return True, f'{lock_username}: locked'
def remove_lock_interface(admin_name, remove_username):
user_dict = db.db_handler.select(remove_username)
name = user_dict.get('user_name')
if name in lib.common.get_file_names():
user_dict['is_lock'] = False
core.src.user_status['is_lock'] = False
logger.info(f'{admin_name}removed:{remove_username}')
db_handler.save(user_dict)
logger.error(f'{admin_name}:removed:{remove_username}')
return True, f'{remove_username}: removed'
def del_user_interface(admin_name, del_username):
user_dict = db.db_handler.select(del_username)
name = user_dict.get('user_name')
if name in lib.common.get_file_names():
os.chdir(conf.setting.user_db)
os.remove(f'{del_username}.json')
print(del_username)
logger.info(f'{admin_name}removed:{del_username}')
logger.error(f'{admin_name}:delete:{del_username}')
return True, f'{del_username}: deleted'
def check_user_interface(admin_name,check_username):
user_dict = db.db_handler.select(check_username)
return True, f'{user_dict}'
业务逻辑层——ATM功能
'''
interface
业务逻辑层——ATM功能
'''
# coding:utf-8
import db.db_handler
from db import db_handler
from lib import common
import time
logger = common.get_logger('bank')
def check_balance_interface(user_name):
user_dict = db_handler.select(user_name)
user_balance = user_dict.get('all_money')
return True, f'{user_name},your all money is {user_balance}'
def withdraw_money_interface(user_name, withdraw_money_number):
flag, value = common.get_number(withdraw_money_number)
if not flag:
return False, 'Please input right number'
user_dict = db_handler.select(user_name)
now_money = user_dict.get('all_money')
if now_money < value:
return False, 'Your balance is not enough!'
else:
now_money -= value
user_dict['all_money'] = now_money
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
user_dict['water_flow'].append(f'time{ctime}: withdraw money {now_money}')
db_handler.save(user_dict)
logger.info(f'time{ctime}: withdraw money {now_money}')
return True, 'Withdraw success'
def return_money_interface(user_name, deposit_money):
flag, value = common.get_number(deposit_money)
user_dict = db_handler.select(user_name)
if not flag:
return False, 'Please input right number'
user_money = user_dict.get('all_money')
if user_money:
user_money += value
user_dict['all_money'] = user_money
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
user_dict['water_flow'].append(f'time{ctime}:deposit money {user_name}')
logger.info(f'time{ctime}:deposit money {user_name}')
db_handler.save(user_dict)
return True, 'deposit_money is success'
else:
user_money = value
user_dict['all_money'] = user_money
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
user_dict['water_flow'].append(f'time{ctime}:deposit money {user_name}')
logger.info(f'time{ctime}:deposit money {user_name}')
db_handler.save(user_dict)
return True, 'deposit_money is success'
def transfer_money_interface(user_name, target_user, target_money):
target_user_dict = db_handler.select(target_user)
if not target_user_dict:
return False, f'Your need input real username!'
flag, value = common.get_number(target_money)
if not flag:
return False, 'Please input right number'
user_dict = db_handler.select(user_name)
gold_user_money = user_dict.get('all_money')
if value < gold_user_money:
gold_user_money -= value
user_dict['all_money'] = gold_user_money
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
# user_dict['all_money'].append(f'time{ctime}:转出了{gold_user_money}')
target_user_dict['all_money'] += value
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
# target_user_dict['all_money'].append(f'time{ctime}:收到了{value}')
logger.info(f'time{ctime}:转出了{gold_user_money}')
db_handler.save(user_dict)
db_handler.save(target_user_dict)
return True, f'transfer success!'
def money_view_interface(user_name):
user_dict = db.db_handler.select(user_name)
water_flow = user_dict.get('water_flow')
return f'{water_flow}'
业务逻辑层——用户功能
'''
interface
业务逻辑层——用户功能
'''
# coding:utf-8
from db import db_handler
from lib import common
import logging.config
logger = logging.getLogger('user')
def register_interface(user_name, pass_word):
# 校验用户名是否存在
user_dict = db_handler.select(user_name)
if user_dict:
return False, f' Username: {user_name} already exists!'
# 密码加密处理
hash_pwd = common.get_hash(pass_word)
# 构造用户字典
user_dict = {
'user_name': user_name,
'pass_word': hash_pwd,
'all_money': 0,
'user_shopping': {},
'water_flow': [],
'is_admin': False,
'is_lock': False
}
db_handler.save(user_dict)
logger.info(f'{user_name}register success')
return True, f'{user_name}register success'
def login_interface(user_name, pass_word):
logger.info(f'Username :{user_name} loging success!')
user_dict = db_handler.select(user_name)
# 密码加密处理
hash_pwd = common.get_hash(pass_word)
if not user_dict:
return False, f'Username :{user_name} not exists!'
if hash_pwd == user_dict.get('pass_word'):
return True, f'Username :{user_name} loging success!'
else:
return False, f'Password is error!'
业务逻辑层——用户功能
'''
interface
业务逻辑层——用户功能
'''
# coding:utf-8
import db.db_handler
from db import db_handler
import time
def add_shop_car(user_name):
temp_shop_car = {}
while True:
goods_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 66],
['土耳其土豆', 99],
['伊拉克拌面', 100],
['董卓戏张飞公仔', 200],
['仿真玩偶', 1000]
]
for goods_number, goods_info in enumerate(goods_list, start=1):
print(goods_number, goods_info)
choose_shopping = input('Please input you need shopping(q = quit add shopping)>>>:')
user_dict = db_handler.select(user_name)
if choose_shopping == 'q':
old_car = user_dict.get('user_shopping')
for g_name, g_number in temp_shop_car.items():
if g_name in old_car:
old_car[g_name][0] += temp_shop_car[g_name][0]
else:
old_car = temp_shop_car
user_dict['user_shopping'] = old_car
db_handler.save(user_dict)
return f'add shopping success'
if not choose_shopping.isdigit():
print('Please input digit!')
continue
choose_shopping = int(choose_shopping)
if choose_shopping not in range(1, len(goods_list)):
print('Please right number!')
continue
target_shopping = goods_list[choose_shopping - 1]
shopping_name = target_shopping[0]
shopping_price = target_shopping[1]
need_number = input(f'Please input your need {shopping_name} number>>>:')
need_number = int(need_number)
if shopping_name in temp_shop_car:
temp_shop_car.get(shopping_name)[0] += need_number
else:
temp_shop_car[shopping_name] = [need_number, shopping_price]
print(temp_shop_car)
def check_shop_interface(user_name):
user_dict = db.db_handler.select(user_name)
return f'{user_dict}'
def pay_shop_interface(user_name):
user_dict = db.db_handler.select(user_name)
shopping_car = user_dict.get('user_shopping')
user_money = user_dict.get('all_money')
if not shopping_car:
return f'Your shopping is None!'
shopping_money = 0
for shopping_number, shopping_price in shopping_car.values():
shopping_money += shopping_number * shopping_price
if shopping_money < user_money:
user_money -= shopping_money
user_dict['all_money'] = user_money
user_dict['user_shopping'] = {}
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
user_dict['water_flow'].append(f'time:{ctime}:cost{user_money}')
db.db_handler.save(user_dict)
print(user_dict)
return f'shopping success'
return f'your money is not enough'
'''
interface
业务逻辑层——shopping功能
'''
# coding:utf-8
import db.db_handler
from db import db_handler
import time
def add_shop_car(user_name):
temp_shop_car = {}
while True:
goods_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 66],
['土耳其土豆', 99],
['伊拉克拌面', 100],
['董卓戏张飞公仔', 200],
['仿真玩偶', 1000]
]
for goods_number, goods_info in enumerate(goods_list, start=1):
print(goods_number, goods_info)
choose_shopping = input('Please input you need shopping(q = quit add shopping)>>>:')
user_dict = db_handler.select(user_name)
if choose_shopping == 'q':
old_car = user_dict.get('user_shopping')
for g_name, g_number in temp_shop_car.items():
if g_name in old_car:
old_car[g_name][0] += temp_shop_car[g_name][0]
else:
old_car = temp_shop_car
user_dict['user_shopping'] = old_car
db_handler.save(user_dict)
return f'add shopping success'
if not choose_shopping.isdigit():
print('Please input digit!')
continue
choose_shopping = int(choose_shopping)
if choose_shopping not in range(1, len(goods_list)):
print('Please right number!')
continue
target_shopping = goods_list[choose_shopping - 1]
shopping_name = target_shopping[0]
shopping_price = target_shopping[1]
need_number = input(f'Please input your need {shopping_name} number>>>:')
need_number = int(need_number)
if shopping_name in temp_shop_car:
temp_shop_car.get(shopping_name)[0] += need_number
else:
temp_shop_car[shopping_name] = [need_number, shopping_price]
print(temp_shop_car)
def check_shop_interface(user_name):
user_dict = db.db_handler.select(user_name)
return f'{user_dict}'
def pay_shop_interface(user_name):
user_dict = db.db_handler.select(user_name)
shopping_car = user_dict.get('user_shopping')
user_money = user_dict.get('all_money')
if not shopping_car:
return f'Your shopping is None!'
shopping_money = 0
for shopping_number, shopping_price in shopping_car.values():
shopping_money += shopping_number * shopping_price
if shopping_money < user_money:
user_money -= shopping_money
user_dict['all_money'] = user_money
user_dict['user_shopping'] = {}
ctime = time.strftime('%Y-%m-%d %H:%M:%S')
user_dict['water_flow'].append(f'time:{ctime}:cost{user_money}')
db.db_handler.save(user_dict)
print(user_dict)
return f'shopping success'
return f'your money is not enough'
common.py——存储公共方法
'''
lib目录下common.py
用来存储公共方法
'''
# coding:utf-8
import hashlib
import db.db_handler
from core import src
from conf import setting
import logging
import logging.config
import os
def get_hash(msg):
md5 = hashlib.md5()
md5.update(msg.encode('utf-8'))
return md5.hexdigest()
def outer(user_type):
def status(func_name):
def inner(*args, **kwargs):
if user_type == 'normal':
if src.user_status.get('user_name'):
user_dict = db.db_handler.select(src.user_status.get('user_name'))
is_locked = user_dict.get('is_lock')
if not is_locked:
res = func_name(*args, **kwargs)
return res
else:
print('user is locked!')
else:
print('user is not login!')
src.login()
elif user_type == 'admin':
if src.user_status.get('user_name'):
if src.user_status.get('user_name') == src.user_status.get('is_admin'):
res = func_name(*args, **kwargs)
return res
else:
print('you not admin, no root')
else:
print("user is not login!")
src.login()
return inner
return status
def get_number(target_number):
try:
target_number = float(target_number)
except ValueError:
return False, 'Please input right number'
else:
return True, target_number
def get_logger(msg):
logging.config.dictConfig(setting.LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger(msg)
return logger1
def get_file_names():
data_list = os.listdir(setting.user_db)
file_list = [data.split('.')[0] for data in data_list if data.endswith('.json')]
return file_list