62.ATM+购物车的实现

ATM+购物车项目实现

三层架构图:

创建功能字典:

FUNC_MSG = {
    '0': '注销',
    '1': '登录',
    '2': '注册',
    '3': '查看余额',
    '4': '转账',
    '5': '还款',
    '6': '取款',
    '7':'查看流水',
    '8': '购物',
    '9': '购物车',
    'q': '退出'
}

db/log文件夹路径:

ATM_PATH = os.path.dirname(os.path.dirname(__file__))
DB_PATH = os.path.join(ATM_PATH, 'db')
LOG_PATH = os.path.join(ATM_PATH, 'log')
GOODS_INFO_PATH = os.path.join(DB_PATH, 'goods_info.xlsx')

logging配置,定义三种日志输出格式

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

定义日志输出格式 结束

logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
logfile_dir = os.path.join(logfile_dir, 'log')

logfile_name = 'log.log'

日志配置:

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)

# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',
        },
    },
    'loggers': {
        '': {
            'handlers': ['d'
                         ''
                         'efault', 'console'],
            'level': 'DEBUG',
            'propagate': False,  # 向上(更高level的logger)传递
        },
    },
}
def save_json(username: str, content: dict):
    """保存json文件"""
    user_path = os.path.join(settings.DB_PATH, f'{username}.json')
    with open(user_path, 'w', encoding='utf8') as fw:
        json.dump(content, fw)


def read_json(username: str) -> dict:
    """读取json文件"""
    user_path = os.path.join(settings.DB_PATH, f'{username}.json')
    with open(user_path, 'r', encoding='utf8') as fr:
        data = json.load(fr)

    return data

银行接口:

import os
from conf import settings
from db import db_handler


def check_extra_interface(username):
    """检查余额接口"""
    data = db_handler.read_json(username)
    return data['extra']


def transfer_interface(from_username, to_username, money):
    from_username_data = db_handler.read_json(from_username)
    to_username_data = db_handler.read_json(to_username)

    if from_username_data['extra'] > money:
        to_username_data['extra'] += money
        from_username_data['extra'] -= money

        db_handler.save_json(from_username, from_username_data)
        db_handler.save_json(to_username, to_username_data)

        return True, '转账成功'

    return False, '转账失败'


def repay_interface(username):
    username_data = db_handler.read_json(username)
    extra = username_data['extra']

    if extra >= 15000:
        return True, '无需还款'
    else:
        username_data['extra'] = 15000
        db_handler.save_json(username, username_data)
        return True, f'还款{(15000-extra)*1.005}成功'


def withdraw_interface(username, money):
    username_data = db_handler.read_json(username)
    if username_data['extra'] > money:
        username_data['extra'] -= money
        db_handler.save_json(username, username_data)
        return True, f'取现{money}成功'

    return False, f'余额不足'


def history_interface(username):
    filename = os.path.join(settings.LOG_PATH, 'log.log')
    with open(filename, 'r', encoding='utf8') as fr:
        s = ''
        for i in fr:
            if i.split('[')[-1].startswith(username):
                s += i
    return s

购物接口

from db import db_handler
from conf import settings
from lib import common

shopping_car_dict = dict()


def read_goods_interface():
    df = db_handler.read_excel(settings.GOODS_INFO_PATH)

    return df


df = read_goods_interface()


def shopping_interface():
    while True:
        print(df)
        common.goods_visualize(df)
        # 打印商品信息
        goods = df.columns
        goods_choice = input('请选择你需要的商品,输入q退出>>>').strip()

        if goods_choice == 'q':
            break

        if goods_choice in goods:
            count_choice = input('请输入你需要购买的商品数量,输入q退出>>>').strip()

            if count_choice == 'q':
                break

            count_choice = int(count_choice)

            if int(df.loc['amount', goods_choice]) < count_choice:
                print('傻逼,库存不足')
                continue
            else:
                goods_price = int(df.loc['price', goods_choice])
                if shopping_car_dict.get(goods_choice):
                    shopping_car_dict[goods_choice] += (count_choice * goods_price)
                else:
                    shopping_car_dict[goods_choice] = (count_choice * goods_price)
                print(f'已经把{goods_choice}*{count_choice}加入购物车')
                df.loc['amount', goods_choice] -= count_choice
        else:
            print('傻逼,中文看不懂,英文也看不懂')

    return f'已加入购物车{shopping_car_dict}'


def shopping_car_interface(shopping_car_dict, username):
    goods_price = sum(shopping_car_dict.values())
    username_data = db_handler.read_json(username)

    if username_data['extra'] >= goods_price:
        username_data['extra'] -= goods_price
        username_data.update(shopping_car_dict)
        db_handler.save_json(username, username_data)
        new_shopping_car_dict = shopping_car_dict.copy()
        shopping_car_dict.clear()

        # 保存为excel文件
        db_handler.save_excel(df, settings.GOODS_INFO_PATH)
        return True, f'购物成功{new_shopping_car_dict}'
    else:
        shopping_car_dict.clear()

        return False, '穷逼也购物'


if __name__ == '__main__':
    read_goods_interface()

用户接口:

from lib import common
from db import db_handler

#实现用户注册功能
#用户存在不可注册,以及用户信息的初始化
def register_interface(username, pwd):
    """注册接口"""
    flag = common.check_user(username)
    if flag:
        return False, '用户已经存在'
    else:
        content = {'username': username, 'pwd': pwd, 'extra': 15000, 'locked': 0}
        db_handler.save_json(username, content)
        return True, '用户注册成功'

#判断用户是否已经存在
def login_interface(username, pwd):
    # 判断用户是否存在
    flag = common.check_user(username)
    if not flag:
        return False, '用户不存在', 1

    # 判断用户是否锁定
    data = db_handler.read_json(username)
    if data['locked']:
        return False, '用户已经锁定,去解锁', 2

    # 判断密码是否一致
    if pwd == data['pwd']:
        return True, '登陆成功', 0

    return False, '密码错误', 3


def locked_interface(username):
    """输入密码错误就锁"""
    data = db_handler.read_json(username)
    data['locked'] = 1
    db_handler.save_json(username, data)

公共方法:

import os
import hashlib
import logging
import logging.config
from conf import settings
from interface import store


#定义用户登录函数
def login_auth(func):
    from core import src
    def wrapper(*args, **kwargs):
        # 判断是否登陆
        if not src.user_auth.get('username'):
            src.login()
            res = func(*args, **kwargs)
            return res

        res = func(*args, **kwargs)
        return res

    return wrapper

#日志
def load_logging_config(name):
  logging.config.dictConfig(settings.LOGGING_DIC)
    logger = logging.getLogger(name)

    return logger

#定义用户注册函数以及保存形式和密码加密
def check_user(username):
    """注册接口"""
    username_filename = os.path.join(settings.DB_PATH, f'{username}.json')
    if os.path.exists(username_filename):
        return True


def input_username_pwd():
    username = input('请输入你的用户名>>>').strip()
    pwd = input('请输入你的密码>>>').strip()

    # 对用户密码进行加密操作
    m = hashlib.md5()
    m.update(pwd.encode('utf8'))
    pwd = m.hexdigest()

    return username, pwd

启动程序

from core import src

if __name__ == '__main__':
    src.run()
posted @ 2020-04-03 20:16  祥SHAO  阅读(147)  评论(0编辑  收藏  举报