Exemplo n.º 1
0
def withdraw(user_obj, *args, **kwargs):
    """
    显示额度信息
    提示可取现金额
    判断是否可以提现,可能取现额度已经用完
    1.输入金额
    2.提示最大可取现金额
    3.对比,并提示
    4.调用transaction
    :param user_data:user_data:{'id': 888888, 'password': '******', 'credit': 15000, 'balance': 15000, 'enroll_data': '2016-01-02',
    'expire_data': '2021-01-01', 'pay_day': 22, 'status': 0}
    :param args:
    :param kwargs:
    :return:
    """
    balance_info(user_obj['user_data'])
    withdraw_cash = round(user_obj['user_data']['balance']-user_obj['user_data']['credit']/2, 2)  # 可取现金额
    if withdraw_cash > 0:
        print('\033[1;36;0mThe amount you can cash out:\033[0m', withdraw_cash)
        cash = input('\033[1;34;0mPlease enter the cash of withdrawal >>\033[0m').strip()
        if cash.isdigit():
            if user_obj['user_data']['balance'] > withdraw_cash:
                cash = float(cash)
                if 0 <= cash <= withdraw_cash:
                    result_val = transaction.make_transaction(user_obj['user_data'], 'withdraw', cash)
                    if result_val:
                        print(result_val)
                else:
                    print('\033[1;36;0mThe amount you can cash out:\033[0m', withdraw_cash)
        else:
            msg = 'Please enter a correct number'
            message_utils.print_error(msg)
    else:
        msg2 = 'Unable to withdraw(The maximum withdrawal amount is half the amount!)'
        message_utils.print_error(msg2)
Exemplo n.º 2
0
def admin(user_obj, *args, **kwargs):
    """
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
1.需要输入管理员账号,装饰器吗?
2. 调用bin/manage.py

    :param args:
    :param kwargs:
    :return:
    """
    if user_obj['user_data']['id'] == 'admin' and user_obj['user_data']['password'] == 'admin':
        manage.manage(user_obj)
    else:
        print('\033[1;30;0m')
        print('admin'.center(30, '-'))
        print('\033[0m')
        admin_user = input('\033[1;34;0m admin>>\033[0m')
        admin_password = input('\033[1;34;0m password>>\033[0m')
        user_data = auth.atm_authenticated(admin_user, admin_password)
        if user_data:
            decorator.user_obj['user_data'] = user_data
            manage.manage(user_obj)
        else:
            msg = 'Admin account error'
            message_utils.print_error(msg)
Exemplo n.º 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)
Exemplo n.º 4
0
def atm_authenticated(account_number, password):
    """
     1、对比成功,就返回数据
    :param account_number:
    :param password:
    :return:
    """
# 反序列化
    account_file = os.path.join(setting.DB_path, '%s.json' % account_number)
    account_data = db_handler.load_account_data(account_file)
    if account_data:
        if account_data['password'] == password:
            if account_data['status'] == 0:
                time_now = time.time()
                time_expire = time.mktime(time.strptime(account_data['expire_date'], format('%Y-%m-%d')))
                if time_expire - time_now > 0:
                    return account_data
                else:
                    msg = 'The account over time'
                    message_utils.print_error(msg)
                    return None
            elif account_data['status'] == -1:
                msg2 = 'The account has been frozen!'
                message_utils.print_error(msg2)
                return None
        else:
            return None
Exemplo n.º 5
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)
Exemplo n.º 6
0
def mall_interface(user_obj, user, cash_total, *args):
    """

    :return:
    """
    ATM_account_date = user_obj['user_data']  # ATM 账号数据
    mall_account_data = user['user_data']  # 商城账户数据
    if ATM_account_date['balance'] > cash_total:  # 比较 ATM余额 和 消费总额
        settlement_result = transaction.make_transaction(ATM_account_date, 'consume', cash_total)
        if settlement_result:
            return [settlement_result, user_obj['user_data']['id']]
    else:
        msg = 'There is not enough balance'
        message_utils.print_error(msg)
Exemplo n.º 7
0
def home():
    while True:
        print(info)
        choice_home = input('\033[1;34;0menter your choice>>\033[0m').strip()
        if choice_home == '1':
            shopping_mall.run_mall()
        elif choice_home == '2':
            # atm.atm_run()
            atm.atm_run()
        elif choice_home == '3':
            exit('bye')
        else:
            msg = 'error enter!'
            message_utils.print_error(msg)
Exemplo n.º 8
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)
Exemplo n.º 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)
Exemplo n.º 10
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)
Exemplo n.º 11
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)
Exemplo n.º 12
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)
Exemplo n.º 13
0
def pay_back(user_obj, *args, **kwargs):
    """
    1.显示额度信息
    2.显示需还款信息
    3.输入还款金额
    4.调用transaction

    :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}
    :param args:
    :param kwargs:
    :return:
    """
    balance_info(user_obj['user_data'])
    pay_back_cash = user_obj['user_data']['credit']-user_obj['user_data']['balance']
    print('\033[1;36;0mThe cash you need pay back:\033[0m', pay_back_cash)
    if pay_back_cash > 0:
        cash = input('\033[1;34;0mPlease input the amount you want to pay>>\033[0m').strip()
        if cash.isdigit():
            cash = float(cash)
            if 0 < cash:
                result_val = transaction.make_transaction(user_obj['user_data'], 'pay_back', cash)
                if result_val:
                    print(result_val)
            else:
                msg = 'Please enter a correct number!'
                message_utils.print_error(msg)
        else:
            msg1 = 'Please enter a correct number!'
            message_utils.print_error(msg1)
    else:
        msg2 = 'Unable to pay back!'
        message_utils.print_error(msg2)
Exemplo n.º 14
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)
Exemplo n.º 15
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)
Exemplo n.º 16
0
def transfer(user_obj, *args, **kwargs):
    """
    1.显示额度信息 调用balance_info(user_data)
    2.判断账户余额 是否大于0 ,可能卡已经刷爆
    2.输入转入帐户 账号
    3.输入转出金额
    4。调用transaction
    :param user_data:
    :param args:
    :param kwargs:
    :return:
    """
    balance_info(user_obj['user_data'])
    if user_obj['user_data']['balance'] > 0:
        account_trans = input('\033[1;34;0mPlease input transfer to account>>\033[0m').strip()
        account_file = os.path.join(setting.DB_path, '%s.json' % account_trans)
        trans_account_data = db_handler.load_account_data(account_file)
        if trans_account_data:
            cash_trans = input('\033[1;34;0mPlease enter transfer cash>>\033[0m').strip()
            if cash_trans.isdigit():
                cash_trans = float(cash_trans)
                if 0 < cash_trans < user_obj['user_data']['balance']:
                    result_val = transaction.make_transaction(user_obj['user_data'], 'transfer', cash_trans)
                    if result_val:
                        result_val_rec = transaction.make_transaction(trans_account_data, 'transfer_rec', cash_trans)
                        if result_val_rec:
                            print(result_val)
                else:
                    msg = 'You number is not in a valid range!'
                    message_utils.print_error(msg)
            else:
                msg1 = 'Please enter a correct number'
                message_utils.print_error(msg1)
        else:
            msg2 = 'Wrong transfer account!'
            message_utils.print_error(msg2)
    else:
        msg3 = 'You balance is not enough to transfer!'
        message_utils.print_error(msg3)