Example #1
0
def check_out(user, cash_total, *args):
    """
    1.如果返回True,表示 扣款成功
    2.清空购物车.序列化文件
    3.记日志
    :param user:
    :param cash_total:
    :param args:
    :return:
    """
    username = user['user_data']['account']['username']  # 商城账户名
    # 调用ATM 结算
    result = logics.mall_interface(user, cash_total, *args)
    if result:
        # 写日志
        msg = '%s cost %s pay for by ID:%s to buy something(%s)' % (
            username, cash_total, result[1],
            user['user_data']['shopping_cart'])
        file = os.path.join(setting_mall.LOG_PATH,
                            setting_mall.LOG_TYPES['transactions'])
        logger.logger(file, msg)
        # 将清空购物车的 账户数据序列化
        user['user_data']['shopping_cart'] = {}
        file = os.path.join(setting_mall.ACCOUNT_MALL_PATH,
                            '%s.json' % username)
        db_handler.json_data(user['user_data'], file, status=1)
        msg1 = 'Settlement of success!'
        message_utils.print_succeed(msg1)
        return result
Example #2
0
def func_controller(user_obj):
    """
    推出 也要记录日志
    :param user_obj:
    :return:
    """
    while True:
        print('\033[1;30;0m')
        print('------ Welcome to ATM ------')
        for index, val in enumerate(features):
            print(index, '>', val[0])
        print('\033[0m')
        choice = input('\033[1;34;0m enter your choice/q>>\033[0m').strip()
        if choice.isdigit():
            choice = int(choice)
            if 0 <= choice < len(features):
                features[choice][1](user_obj['user_data'])
            else:
                msg1 = 'Wrong number'
                message_utils.print_error(msg1)
        elif choice == 'q':
            msg = 'user %s Logged out' % user_obj['user_data']['id']
            log_file = os.path.join(setting.LOG_path,
                                    setting.LOG_TYPES['access'])
            logger.logger(log_file, msg)
            msg2 = 'Exit ATM'
            message_utils.print_error(msg2)
            break
        else:
            msg3 = 'error enter!'
            message_utils.print_error(msg3)
Example #3
0
def run_mall(user):
    while True:
        print('\033[1;30;0m')
        print('------Welcome to shopping_mall------')
        for i, v in enumerate(setting_mall.mall_home):
            print(i, '>>', v[0])
        print('\033[1;30;0m')
        choice = input(
            '\033[1;34;0mPlease enter your choice/q>>\033[0m').strip()
        if choice.isdigit():
            choice = int(choice)
            if 0 <= choice <= len(setting_mall.mall_home):
                setting_mall.mall_home[choice][1](user)
            else:
                msg1 = 'Wrong number'
                message_utils.print_error(msg1)
        elif choice == 'q':
            msg2 = 'Exit shopping mall'
            message_utils.print_info(msg2)
            # 日志
            msg = 'user %s just logged out mall' % user['user_data'][
                'account']['username']
            log_file = os.path.join(setting_mall.LOG_PATH,
                                    setting_mall.LOG_TYPES['access'])
            logger.logger(log_file, msg)
            break
        else:
            msg3 = 'error enter!'
            message_utils.print_error(msg3)
Example #4
0
def frozen_account(user, *args):
    """
    冻结就是使账户无法登陆
    把status 赋值成 -1
    :param user:
    :return:
    """
    frozen_acc = input(
        '\033[1;34;0mEnter a ID which you want frozen>>\033[0m').strip()
    # 根据输入的账号 反序列化
    account_file = os.path.join(setting.DB_path, '%s.json' % frozen_acc)
    frozen_data_old = db_handler.load_account_data(account_file)
    if frozen_data_old:
        if frozen_data_old['status'] == -1:
            msg1 = 'This account has been frozen before!'
            message_utils.print_error(msg1)
        elif frozen_data_old['status'] == 0:
            frozen_data_old['status'] = -1
            # 序列化
            file = os.path.join(setting.DB_path,
                                '%s.json' % (frozen_data_old['id']))
            frozen_data = db_handler.json_data(frozen_data_old, file, status=1)
            if frozen_data:
                # 记日志
                msg = 'admin %s frozen account %s' % (user['user_data']['id'],
                                                      frozen_acc)
                log_file = os.path.join(setting.LOG_path,
                                        setting.LOG_TYPES['admin'])
                logger.logger(log_file, msg)
                msg2 = 'frozen succeed!'
                message_utils.print_succeed(msg2)
Example #5
0
def add_account(user, *args):
    """
    user_date:{'id': 888888, 'password': '******', 'credit': 15000, 'balance': 15000, 'enroll_date': '2016-01-02',
    'expire_date': '2021-01-01', 'pay_day': 22, 'status': 0}
    1.输入id
    2.输入password
    3.输入还款日
    4.自动设定 注册日期和有效日期
    5.根据id 创建 数据文件
    6.记录日志
    :return:
    """
    enroll_data = setting.account_dic  # 提取账号数据格式
    while True:
        enroll_data['id'] = input(
            '\033[1;34;0mPlease enter a id what you want>>\033[0m').strip()
        if enroll_data['id'].isdigit() and len(enroll_data['id']) >= 6:
            file = os.path.join(setting.DB_path,
                                '%s.json' % (enroll_data['id']))
            if not os.path.isfile(file):
                enroll_data['password'] = input(
                    '\033[1;34;0mPlease enter a password what you want>>\033[0m'
                ).strip()
                if 4 <= len(enroll_data['password']):  # 密码长度要求
                    enroll_data['pay_back'] = input(
                        '\033[1;34;0mPlease enter a date when you want to repay>>\033[0m'
                    ).strip()
                    enroll_data['enroll_date'] = time.strftime('%Y-%m-%d')
                    enroll_data['expire_date'] = (
                        datetime.datetime.now() + datetime.timedelta(
                            days=365 * 5 + 1)).strftime('%Y-%m-%d')
                    # 序列化
                    file = os.path.join(setting.DB_path,
                                        '%s.json' % (enroll_data['id']))
                    enroll_data = db_handler.json_data(enroll_data,
                                                       file,
                                                       status=0)
                    if enroll_data:
                        # 记日志
                        msg = 'admin %s add a account %s' % (
                            user['user_data']['id'], enroll_data['id'])
                        log_file = os.path.join(setting.LOG_path,
                                                setting.LOG_TYPES['admin'])
                        logger.logger(log_file, msg)
                        msg1 = 'Add succeed!'
                        message_utils.print_succeed(msg1)
                        break
                    else:
                        msg2 = 'add failed!'
                        message_utils.print_error(msg2)
                else:
                    msg3 = 'The password must be greater than six!'
                    message_utils.print_error(msg3)
            else:
                msg4 = 'Account already exists,try another!'
                message_utils.print_error(msg4)
        else:
            msg5 = 'need a number that is at least six!'
            message_utils.print_error(msg5)
Example #6
0
def adjust_credit(user, *args):
    """
1.输入要调整的账号
2.输入调整 大小
3.修改数据,保存
4.记录日志
    :param user:
    :return:
    """
    while True:
        # 根据输入的账号 查找 并反序列化
        adjust_account = input(
            '\033[1;34;0m Enter a ID which you want adjust>>\033[0m').strip()
        account_file = os.path.join(setting.DB_path,
                                    '%s.json' % adjust_account)
        adjust_data = db_handler.load_account_data(account_file)
        if adjust_data:
            new_credit = input(
                '\033[1;34;0mPlease enter a new cash of credit>>\033[0m'
            ).strip()
            if new_credit.isdigit():
                new_credit = float(new_credit)
                if 0 < new_credit:
                    adjust_data['credit'] = new_credit
                    # 序列化
                    file = os.path.join(setting.DB_path,
                                        '%s.json' % (adjust_data['id']))
                    adjust_data = db_handler.json_data(adjust_data,
                                                       file,
                                                       status=1)
                    if adjust_data:
                        # 记日志
                        msg = 'admin %s adjust credit for account %s' % (
                            user['user_data']['id'], adjust_account)
                        log_file = os.path.join(setting.LOG_path,
                                                setting.LOG_TYPES['admin'])
                        logger.logger(log_file, msg)
                        msg1 = 'Adjust succeed'
                        message_utils.print_succeed(msg1)
                        break
                    else:
                        msg2 = 'Adjust failed!'
                        message_utils.print_error(msg2)
                else:
                    msg3 = 'Enter a wrong credit!'
                    message_utils.print_error(msg3)
            else:
                msg4 = 'Need a number here!'
                message_utils.print_error(msg4)
        else:
            msg5 = 'Non-existent account'
            message_utils.print_error(msg5)
Example #7
0
def deduction(card_id,amount):
    '''
    结账扣款
    :param card_id: 卡号
    :param amount: 金额
    :return:
    '''

    TOP_DIR = os.path.dirname(WORK_DIR)
    sys.path.append(TOP_DIR)
    from atm.core.login_auth import md5sum
    from atm.conf import setting
    log_type = 'trade'
    trade_type = setting.TRADE_TYPE[2]   #repayment
    log_o = logger.logger(log_type)
    data = readcard(card_id)
    userpwd = input("Pls input card password:"******"trade_type:%s - card_id:%d - amount:%.2f" % (trade_type, card_id, amount))
        else:
            log_o.error("trade_type:%s - card_id:%d - amount:%.2f - [Insufficient Balance]"
                        % (trade_type, card_id, amount))
    else:
        return False
Example #8
0
def view_account_info(user_obj, *args, **kwargs):
    """
    1打印信息
    2记录日志
    :param user_data:{'id': 888888, 'password': '******', 'credit': 15000, 'balance': 15000, 'enroll_data': '2016-01-02',
    'expire_data': '2021-01-01', 'pay_day': 22, 'status': 0}
    :return:
    """
    print('\033[1;36;0m')
    print('Account Info'.center(30, '-'))
    for k, v in user_obj['user_data'].items():
        if not k == 'password':
            print('%12s:%s' % (k, v))
    print('END'.center(30, '-'))
    print('\033[0m')
    msg = 'user %s just View account information' % user_obj['user_data']['id']
    log_file = os.path.join(setting.LOG_path, setting.LOG_TYPES['access'])
    logger.logger(log_file, msg)
Example #9
0
def shopping_mall_cart(user, *args):
    """
    {"account": {"username": "******", "password":"******"}, "shopping_cart": {"电脑": {"number": 2, "price": 3998},
    "美女": {"number": 2, "price": 1996}, "游艇": {"number": 5, "price": 100}}}
    :param user:
    :return:
    """
    account = user['user_data']['account']['username']  # 帐户名
    # 进入函数,先记日志
    msg = 'user %s view shopping cart' % account
    file = os.path.join(setting_mall.LOG_PATH, setting_mall.LOG_TYPES['access'])
    logger.logger(file, msg)

    shopping_list = []   # 用于打印购物车列表
    user_data_cart = user['user_data']['shopping_cart']
    if user_data_cart:
        cash_total = 0
        print('\033[1;30;0m')
        print('goods list'.center(40, '*'))
        for key, value in user_data_cart.items():
            shopping_list.append([key, value['number'], value['price'] / value['number'], value['price']])
            cash_total += value['price']
        print(tabulate(shopping_list, headers=('商品', '数量', '单价', '总价'), tablefmt='grid'))
        print('total of consumption:%s' % cash_total)
        print('END'.center(40, '*'))
        print('\033[0m')
        # 选择 是否结账
        while True:
            print("""\033[1;30;0m
         1. Check out by ATM
         2. Return to the mall
                         \033[0m""")
            choice = input('\033[1;34;0m enter your choice>>\033[0m').strip()
            if choice == '1':
                result = check_out_mall.check_out(user, cash_total, *args)
                if result:
                    break
            elif choice == '2':
                break
            else:
                msg1 = 'Error enter!'
                message_utils.print_error(msg1)
    else:
        print('Dear\033[1;31;0m%s\033[0m\n you have no goods in cart!' % account)
Example #10
0
 def inner(*args, **kwargs):
     global user_obj
     if user_obj['authenticated']:
         return func(user_obj, *args)
     else:
         while not user_obj['authenticated']:
             username = input('\033[1;34;0menter your username>>\033[0m')
             password = input('\033[1;34;0menter your password>>\033[0m')
             user_data = auth_mall.auth_mall_authenticated(username, password)
             if user_data:
                 user_obj['authenticated'] = True
                 user_obj['user_data'] = user_data
                 # 日志
                 msg = 'user %s just logged in mall' % user_obj['user_data']['account']['username']
                 log_file = os.path.join(setting_mall.LOG_PATH, setting_mall.LOG_TYPES['access'])
                 logger.logger(log_file, msg)
                 return func(user_obj, *args)
             else:
                 msg1 = 'Account number or password error'
                 message_utils.print_error(msg1)
Example #11
0
 def inner(*args, **kwargs):
     global flag, user_obj
     if user_obj['authenticated']:
         return func(user_obj, *args)
     else:
         while not user_obj['authenticated']:
             account = input('\033[1;34;0m enter your ATM ID>>\033[0m')
             password = input('\033[1;34;0m enter your Password>>\033[0m')
             user_data = auth.atm_authenticated(account, password)
             if user_data:
                 flag = True
                 user_obj['authenticated'] = True
                 user_obj['user_data'] = user_data
                 msg = 'user %s just logged in' % user_obj['user_data']['id']
                 log_file = os.path.join(setting.LOG_path,
                                         setting.LOG_TYPES['access'])
                 logger.logger(log_file, msg)
                 return func(user_obj, *args)
             else:
                 msg1 = 'Account number or password error'
                 message_utils.print_error(msg1)
Example #12
0
def shopping_mall(user, *args):
    account = user['user_data']['account']['username']  # 账号名
    while True:
        print('\033[1;30;0m')
        print('Shopping Mall'.center(36, '-'))
        for i, k in enumerate(setting_mall.GOODS_LIST):   # 循环购物车,选择商品
            print(i, k['name'], k['price'])
        print('\033[0m')
        choice = input('\033[1;34;0mEnter your choice /q >>\033[0m')
        shopping_cart = user['user_data']['shopping_cart']   # 这是用户购物车
        if choice.isdigit():
            choice = int(choice)
            if 0 <= choice <= len(setting_mall.GOODS_LIST):
                goods_name = setting_mall.GOODS_LIST[choice]['name']  # 这是用户选择的商品
                if shopping_cart.get(goods_name) is None:
                    shopping_cart[goods_name] = {'number': 1, 'price': setting_mall.GOODS_LIST[choice]['price']}

                else:
                    shopping_cart[goods_name]['number'] += 1
                    shopping_cart[goods_name]['price'] += setting_mall.GOODS_LIST[choice]['price']
                # 记日志
                msg = 'user %s add a %s to shopping cart' % (account, goods_name)
                file = os.path.join(setting_mall.LOG_PATH, setting_mall.LOG_TYPES['access'])
                logger.logger(file, msg)
                # 序列化
                file_mall = os.path.join(setting_mall.ACCOUNT_MALL_PATH, '%s.json' % account)
                db_handler.json_data(user['user_data'], file_mall, status=1)
            else:
                print('\033[1;31;0m\033[0mWrong number!\033[0m')
        elif choice == 'q':
            if shopping_cart:
                # 调用函数,将购物车的商品信息提取出来,打印成表格显示
                shopping_mall_cart(user)
                break
            else:
                print('Dear\033[1;31;0m%s\033[0m\n you have no goods in cart!' % account)
                break
        else:
            print('\033[1;31;0mWrong number!\033[0m')
Example #13
0
def make_transaction(user_data, tran_type, cash):
    """
    1.确定tran_type 在setting设定的 类型中
    2.根据设定的类型对数据进行操作
    3.把数据跟新到文件
    4.写日志
    :param user_data:
    :param tran_type:
    :param cash:
    :return:
    """
    new_balance = 0
    if tran_type in setting.TRANSACTION_TYPE:
        interest = cash * setting.TRANSACTION_TYPE[tran_type]['interest']
        old_balance = user_data['balance']
        if setting.TRANSACTION_TYPE[tran_type]['action'] == 'plus':
            new_balance = old_balance + cash + interest
        elif setting.TRANSACTION_TYPE[tran_type]['action'] == 'minus':
            new_balance = old_balance - cash - interest
        if new_balance > 0:
            user_data['balance'] = new_balance
            # 序列化
            file = os.path.join(setting.DB_path, '%s.json' % (user_data['id']))
            user_data = db_handler.json_data(user_data, file, status=1)
            # 记日志
            msg = 'user %s %s cash: %s' % (user_data['id'], tran_type, cash)
            log_file = os.path.join(setting.LOG_path,
                                    setting.LOG_TYPES['transactions'])
            logger.logger(log_file, msg)
            return '%s succeeded!' % tran_type
        else:
            msg1 = 'There is not enough balance!'
            message_utils.print_error(msg1)
    else:
        print("\033[1;34;0mTransaction type [%s] is not exist!\033[0m" %
              tran_type)
Example #14
0
def repayment(card_id,amount):
    '''
    ATM存入还款
    :param card_id: 卡号
    :param amount: 还款金额
    :return:
    '''
    from conf import setting
    log_type = 'trade'
    trade_type = setting.TRADE_TYPE[3]   #repayment
    log_o = logger.logger(log_type)

    data = readcard(card_id)
    data['credit_quota'] = data['credit_quota'] + amount
    data['repayment'] = data['repayment'] - amount
    writecard(data,card_id)
    log_o.info("trade_type:%s - account:%d - amount:%.2f" %(trade_type,card_id,amount))
    print("您本次还款金额为:",amount)
Example #15
0
def auth(card_id):
    log_type = 'login'
    log_o = logger.logger(log_type)

    def outter(func):
        def inner(*args, **kwargs):
            from core import iccard
            data_card = iccard.readcard(card_id)
            count = 0
            while count < 3:
                user_input = input("Pls input password:"******"您的账号处于锁定状态,请到柜台进行处理.")
                        return False
                    else:
                        if time.strftime(
                                '%Y-%m-%d') > data_card['expire_date']:
                            print(
                                "Your account has expired.Pls contact counter staff."
                            )
                        else:
                            print("Login sucess!")
                            log_o.info("Login sucess - account:%d" % (card_id))
                            auth_status = True
                            break
                else:
                    print("密码错误,请重新输入.")
                    count += 1
                    continue
            else:
                print("密码输入错误已达3次,您的账号已被锁定,请到柜台进行处理.")
                data_card['lock_status'] = 1
                iccard.writecard(data_card, card_id)
                log_o.error(
                    "Too many attempts account:%d - account was locked " %
                    (card_id))
                return 'account lock'
            if auth_status == True:
                return func(*args, **kwargs)

        return inner

    return outter
Example #16
0
#!/usr/bin/env python
# coding:utf8
__author__ = "willian"

from atm.core.main import consume
from atm.core.main import user_data
from atm.core.logger import logger
from atm.core import auth

trans_logger = logger('transaction')
access_logger = logger('access')


def run():
    # dictionary
    shop_list = [
        ['iphone', 6500],
        ['mac', 12000],
        ['office', 30],
        ['bag', 200],
        ['watch', 2000],
    ]

    welcome_message = """\033[31;0m
        欢迎来购物,祝您购物愉快!
        \033[0m
    """

    print(welcome_message)

    car = []