def transfer(acc_data): ''' 转账 :param acc_data: :return: ''' account_data = data_handler.get_user_db(acc_data['account_id']) log_obj = logger.logger(account_data['id'], 'transaction') all_user = data_handler.get_all_username() # 存在data/accounts文件夹下的所有用户 current_balance = '''---------------- BALABCE INFO -------------- Credit : %s Balance: %s -------------------------------------------''' % (account_data['credit'], account_data['balance']) print(current_balance) back_flag = False while not back_flag: tran_id = input( '\033[1;34mInput what account you want transfer: \033[0m').strip() if tran_id in all_user: # 用户存在 tran_amount = input( '\033[1;34mInput withdraw amount: \033[0m').strip() if tran_amount.isdigit(): # 数字 new_balance = transaction.make_transaction( log_obj, account_data, 'withdraw', tran_amount) if new_balance: # 返回的 new_balance 有效,即钱够 # 汇款方进行相关操作并进行相关日志记录 tran_data = data_handler.get_user_db(tran_id) tran_data['balance'] += int(tran_amount) data_handler.set_user_db(tran_id, tran_data) traned_log_obj = logger.logger(tran_id, 'transaction') traned_log_obj.info( 'Received account %s transfer amount %s' % (account_data['id'], tran_amount)) print('New:Balance:\033[32;1m %s \033[0m' % new_balance['balance']) elif tran_amount == 'b': # 返回 back_flag = True elif tran_amount == 'q': # 退出程序 exit('请保管好您的信用卡,欢迎下次使用!') else: # 错误输入 print( '\033[31;1m[%s] is not a valid amount, only accept integer!\033[0m' % tran_amount) elif tran_id == 'b': # 返回 back_flag = True elif tran_id == 'q': # 退出程序 exit('请保管好您的信用卡,欢迎下次使用!') else: # 错误输入 print('\033[31;1m[%s] is not a valid id' % tran_id)
def withdraw(acc_data): ''' 提现 :param acc_data: :return: ''' account_data = data_handler.get_user_db(acc_data['account_id']) log_obj = logger.logger(account_data['id'], 'transaction') current_balance = '''---------------- BALABCE INFO -------------- Credit : %s Balance: %s -------------------------------------------''' % (account_data['credit'], account_data['balance']) print(current_balance) back_flag = False while not back_flag: withdraw_amount = input( '\033[1;34mInput withdraw amount: \033[0m').strip() if withdraw_amount.isdigit(): new_balance = transaction.make_transaction(log_obj, account_data, 'withdraw', withdraw_amount) if new_balance: print('New:Balance:\033[32;1m %s \033[0m' % new_balance['balance']) elif withdraw_amount == 'b': # 返回 back_flag = True elif withdraw_amount == 'q': # 退出程序 exit('请保管好您的信用卡,欢迎下次使用!') else: # 错误输入 print( '\033[31;1m[%s] is not a valid amount, only accept integer!\033[0m' % withdraw_amount)
def account_info(acc_data): ''' 查询账户信息 :param acc_data: :return: ''' account_data = data_handler.get_user_db(acc_data['account_id']) log_obj = logger.logger(account_data['id'], 'access') info_title = ("\033[31;m %s's Bank info\033[0m" % acc_data['account_id']).center(55, '-') info_body = '''\033[32;m username: %s credit: %s balance: %s enroll date: %s expire date: %s last logout data: %s \033[0m''' % (account_data['id'], account_data['credit'], account_data['balance'], account_data['enroll_date'], account_data['expire_date'], account_data['last_login_time']) info = info_title + info_body + '-' * 45 print(info, flush=True) log_obj.info('account [%s] query the account information' % account_data['id'])
def repay(acc_data): ''' 还款 :param acc_data: 包含user_db和用户是否登陆 的字典 :return: ''' account_data = data_handler.get_user_db(acc_data['account_id']) tr_log_obj = logger.set_tr_logger(account_data['id']) current_balance = '''---------------- BALABCE INFO -------------- Credit : %s Balance: %s -------------------------------------------''' % (account_data['credit'], account_data['balance']) print(current_balance) back_flag = False while not back_flag: repay_amount = input('\033[1;34mInput repay amount: \033[0m').strip() if len(repay_amount) > 0 and repay_amount.isdigit(): new_balance = transaction.make_transaction(tr_log_obj, account_data, 'repay', repay_amount) if new_balance: print('New:Balance:\033[32;1m %s \033[0m' % new_balance['balance']) elif repay_amount == 'b': # 返回 back_flag = True elif repay_amount == 'q': # 退出程序 exit('请保管好您的信用卡,欢迎下次使用!') else: # 错误输入 print( '\033[31;1m[%s] is not a valid amount, only accept integer!\033[0m' % repay_amount)
def login(acc_data): username = input('account: ') ac_log_obj = logger.set_ac_logger(username, 'access') max_try_cnt, try_cnt = 3, 0 # 运行最大尝试次数 all_user = data_handler.get_all_username() # 存在data/accounts文件夹下的所有用户 if username in all_user: # 用户名存在 user_db = data_handler.get_user_db(username) last_login_time = user_db['last_login_time'] if user_db['status'] == 0: # 正常状态 while try_cnt < max_try_cnt: password = input('Please input your password(quit:q): ') # 认证成功后欢迎信息 ,判断密码是否与真实密码相等 if user_db['password'] == password: welcome_login() # 欢迎信息 ac_log_obj.info('you are login') acc_data['is_authenticated'] = True acc_data['account_id'] = username return acc_data # 退出循环 elif password == 'q': # 取消重新登陆,直接退出程序 exit() else: # 未达到三次,最大尝试次数减一 try_cnt += 1 print('You have \033[1;35m%s times chance\033[0m' % (max_try_cnt - try_cnt)) else: # 输入三次错误后锁定 # localTime = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime()) user_db['last_login_time'] = time.time() # 时间戳 user_db['status'] = 1 data_handler.set_user_db(username, user_db) ac_log_obj.error("too many login attempts") print("you have been locked...") exit() pass elif user_db['status'] == 1: # 锁定状态 print("you have been locked at the time:" "\033[1;32m %s\033[0m " % last_login_time) # 高亮显示锁定时间 pass elif user_db['status'] == 2: # 注销状态,即不可见 print("you have been revoke your account at the time: " "\033[1;32m %s\033[0m " % last_login_time) # 高亮显示吊销账号时间 pass pass else: # 用户名不存在,提示是否重新注册 want_add_user = input("Do you want add a new account (y/n)? ") if (want_add_user == 'y'): add_user = input('Please input a new account: ') # 输入用户名密码 add_passwd = input('Please input a passwd: ') user_db = default_db.default_db # 为新用户增加用户数据 user_db['id'] = add_user user_db['password'] = add_passwd data_handler.set_user_db(add_user, user_db) ac_log_obj = logger.set_ac_logger(username, 'access') ac_log_obj.info('account [%s] are login' % add_user) acc_data['is_authenticated'] = True acc_data['account_id'] = username return acc_data # 退出循环 else: exit()
def pay_check(acc_data): # 账单 account_data = data_handler.get_user_db(acc_data['account_id']) Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) tr_log_path = '%s/log/transaction_log/%s_transactions.log' % ( Base_path, account_data['id']) # print(tr_log_path) with open(tr_log_path, 'r', encoding='utf-8') as f: print(f.read())
def reset_passwd(): username = input('Please input a username: '******'[%s] is not been registered') else: user_db = data_handler.get_user_db(username) user_db['password'] = default_db.default_password data_handler.set_user_db(username, user_db) ac_log_obj = logger.set_ac_logger(username, 'access') ac_log_obj.info('reset password successful') print('\033[32;1maccount [%s] reset password successfull!\033[0m' % username)
def change_balance(): username = input('Please input a username: '******'No user named [%s]' % username) else: user_db = data_handler.get_user_db(username) new_balance = input('Please input new balance: ') # 输入旧密码 user_db['password'] = new_balance data_handler.set_user_db(username, user_db) ac_log_obj = logger.set_ac_logger(username, 'access') ac_log_obj.info('change balance successful') print('\033[32;1maccount [%s] change balance successfull\033[0m' % username)
def unfreeze(): ''' 解冻用户 :return: ''' username = input('Please input a username: '******'No user named [%s]' % username) else: user_db = data_handler.get_user_db(username) user_db['status'] = 0 data_handler.set_user_db(username, user_db) ac_log_obj = logger.set_ac_logger(username, 'access') ac_log_obj.info('freeze username [%s] successful!' % username) print('freeze username [%s] successful!' % username)
def logout(acc_data): ''' 退出登陆 :param acc_data: :return: ''' if acc_data['is_authenticated'] == False: print('\033[31;1mWarning,You are not login...\033[0m') else: account_data = data_handler.get_user_db(acc_data['account_id']) username = account_data['id'] ac_log_obj = logger.set_ac_logger(username) ac_log_obj.info('account [%s] are logout' % username) acc_data['is_authenticated'] = False if username in logger.log_id['ac_id']: logger.log_id['ac_id'].remove(username) elif username in logger.log_id['tr_id']: logger.log_id['tr_id'].remove(username) print('您已退出ATM系统,请保管好您的信用卡')
def change_passwd(): username = input('Please input a username: '******'No user named [%s]' % username) else: user_db = data_handler.get_user_db(username) old_passwd = input('Please input old password: '******'password']: new_passwd = input('Please input new password: '******'Please input new password: '******'': user_db['password'] = new_passwd data_handler.set_user_db(username, user_db) ac_log_obj = logger.set_ac_logger(username, 'access') ac_log_obj.info('change password successful') print('\033[32;1maccount [%s] change password successfull\033[0m' % username) else: print('You have input two different password') else : print('You input an error password')
def pay_for(acc_data, goods_list): account_data = data_handler.get_user_db(acc_data['account_id']) tr_log_obj = logger.set_tr_logger(account_data['id']) balance = account_data['balance'] print('Your balance is: %s' % balance) buy_flag = input('Do you really want to buy the goods(Y/N): ').strip() if buy_flag == 'Y': # 确定购买 all_goods_price = 0 # 所有商品的价格 for goods in goods_list: all_goods_price += goods[1] if all_goods_price <= account_data['balance']: account_data['balance'] -= all_goods_price for val in goods_list: tr_log_obj.info('Buy %s ,cost %s$' % (val[0], val[1])) print( '\033[33;1mYou have bought all the goods! Thanks for your Custom\033[0m' ) else: print( 'Your credit card have no enough money to pay for the goods!') elif buy_flag == 'N': exit() else: exit('Invalid input, see you next time!')