def get_view(user_name, passwd): """ :param user_name: <str> 用户名 :param passwd: <str> 密码 :return: <core.views.BaseView> view对象 """ # 初始化view view = None # 如果用户存在则获取用户角色对应的view if user_name in db.all_admin: user = db.all_admin.get(user_name) if check_pwd(user.password, passwd): view = ManageView(user) elif user_name in db.all_teachers: user = db.all_teachers.get(user_name) if check_pwd(user.password, passwd): view = TeacherView(user) elif user_name in db.all_students: user = db.all_students.get(user_name) if check_pwd(user.password, passwd): view = StudentView(user) else: print("用户不存在") return if not view: # 如果view为None则说明,没有获取到view,用户又存在 则原因是密码错误 print("密码错误") access_log.info("%s登陆了系统!" % user) return view
def commen_user_menu(user_data, user): """ :param user_data:<list> 包含所有用户账号的列表 :param user:<core.user.User object> 用户实例 :return:None 这个函数用来和普通用户交互,并分发功能。或者让管理员也可以使用这个系统 """ # 初始化一个交易中心实例 tc = TradingCenter(user) print("当前余额为%s" % user.balances) while True: print(""" 请输入序号选择功能 1. 购物 2. 转账 3. 提现 4. 还款 5. 查询流水 6. 退出 """) choice = input(">>>").strip() if choice == "1": # 用户输入的值为1时,初始化一个购物车实例,调用购物方法 shopping = ShoppingCar(user.balances, tc) shopping.display_menu() elif choice == "2": # 用户输入的值为2时,判断用户是否存在,如果存在,调用交易中心的转账方法 outer_user = input("请输入转入账户的账户名:") if outer_user in user_data: money = input_int("请输入转账金额:") tc.transfer(User(outer_user), money) else: # 不存在则提示用户 print("账户不存在,请重新输入!") elif choice == "3": # 如果用户的输入值为3 ,调用交易中心的提现方法 money = input_int("请输入提现金额:") tc.cash_out(money) elif choice == "4": # 如果用户的输入值为4,调用交易中心的还款方法 money = input_int("还款金额") tc.reimbursement(money) elif choice == "5": # 调用交易中心的显示日志的方法 tc.display_user() elif choice == "6": # 用户选择退出时,退出程序 access_log.info("用户%s退出程序" % user.account) # 这里休眠0.1秒是为了 输出的日志消息 不会影响用户的输入 sleep(0.1) exit() else: # 用户输入错误时提示用户 print("输入的选项有误,请重新输入!")
def authentication(user_account, user_password, count=0): """ :param user_account:<str>用户账户 :param user_password: <str>用户密码 :param count: <int>判断当前输了几次密码 :return: <core.user.User object> or <core.user.User object> 返回值是用户对象 用来判段用户输入的账号和密码是否正确的函数,当用户输错密码次数太多时,退出程序 """ if count < 2: # 当前不是第三次输入密码 count += 1 if user_account in user_data: # 用户存在 user = User(user_account) if user.state: # 用户未被锁定 if user_password == user._password and user.role == 10: #密码正确,而且是普通用户 access_log.info("%s登陆了系统" % user_account) sleep(0.2) return user elif user.role == 20 and user_password == user._password: #密码正确而且是管理员 access_log.info("管理员%s登陆了系统。" % user_account) sleep(0.2) return Administrator(user_data, user_account) else: # 密码错误 print("密码输入错误") inner_password = input("请重新输入密码:") return authentication(user_account, inner_password, count) else: # 用户已被冻结 退出程序 print("该用户已被冻结") exit() else: # 用户不存在, 提示用户重新输入用户名和密码 print("该用户不存在:") inner_account = input("请输入用户账户:") inner_password = input("请输入密码:") return authentication(inner_account, inner_password, count) else: # 用户输错了三次密码 退出程序 access_log.warning("用户已经输错了三次密码:") exit()
def admin_user_menu(user): """ :param user: <core.user.Administrator object> 管路员实例 :return:None 这个函数用来和管理员用户交互,并分发功能。 """ print(""" 请输入序号选择功能 1. 添加用户 2. 冻结用户 3. 解冻账户 4. 以普通用户身份进入ATM系统 5. 退出 """) choice = input(">>>") if choice == "1": # 添加用户功能 可以自定义余额。 username = input("请输入用户名:") password = input("请输入密码:") select = input("是否自定义余额?y/n") if select == "y": balances = input_int("请输入余额:") else: balances = 15000 user.create_user(username, password, balances) elif choice == "2": # 冻结用户功能,调用管理员实例的方法冻结账户 user_account = input("请输入要冻结的账户:") user.bind_user(user_account, False) elif choice == "4": # 进入普通用户的菜单 commen_user_menu(user_data, user) elif choice == "3": # 冻结用户功能,调用管理员实例的方法解冻账户 user_account = input("请输入要解冻的账户:") user.bind_user(user_account, True) elif choice == "5": access_log.info("用户%s退出程序" % user.account) # 退出程序 return # 输入的选项错误 重新执行改函数 return admin_user_menu(user)
def exit_program(user): """ :param user: <core.user.User>用户对象 """ access_log.info("%s退出了系统" % user) exit()