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
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 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 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 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 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 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
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)
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 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 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')
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 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)
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
#!/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 = []