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