Python周总结——ATM+Shopping_car

Python周总结——ATM+Shopping_car

项目启动

'''
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'

业务逻辑层——shopping功能

'''
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


posted @ 2022-11-06 16:00  负剑远游行归来仍少年  阅读(37)  评论(0)    收藏  举报