# coding: utf-8
"""
练习题2 —— 模拟登陆-听课后升级:
用户输入帐号密码进行登陆
用户信息保存在文件内
用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了
知识点:
1、运用字典,对字符串str()和字典eval()互转,在文本中存储和读取账号信息。
2、暂时不写功能的方法内,可以写pass,我看Alex喜欢这样写。
3、缩进:选中+tab。左移:选择+shift+tab
注意:
1、文本中 只能存储str字符串(存入的字典也是字符串)。
2、文本的 读取 和 写入,不能同时进行,建议读完就close,写完就close,及时关闭。
思路:【Alex的思路,是拆分功能,一块一块的实现。由上到下(需求),一点一点啃出来。】
1、先创建一个字典,填好数据,按照层级存放账号信息。
2、编写代码,读取字典,实现账号登录逻辑,以及账号锁定等修改字典的逻辑。
3、创建一个文本,把字典模拟数据,放入文本中。
4、编写读取文本信息,转为字典(赋值给1中创建的字典),套用2中逻辑,并进行对应的写入。
"""
"""
# 创建字典,存储模拟登录账号信息
user_info_dict = {
"Alex" : ["abc123", 0], # 姓名:[密码,锁定状态(0未锁定,1锁定)]
"李祯" : ["123456", 1],
"牛魔王" : ["abcde12345!", 0]
}
# 创建文件,写入字典中的用户账号信息
with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
f.write(str(user_info_dict)) # 把dict转为str后,存入到文件
"""
# 读取文件,把文件中存的用户账号信息,读取出来、并且存入字典中
with open("模拟登录_听课后升级.txt", mode="r", encoding="utf-8") as f:
# 创建字典,存储模拟登录账号信息(把读取的str转换为dict)
user_info_dict = eval(f.read())
# 登录次数(输入账号密码),连续失败3次后锁定账号
login_count = 0
# 3次登录过程中,是否为相同账号
is_same_user = True
# 上一次登录的账号
last_login_user = None
# 通过while循环,实现用户登录逻辑
while login_count < 3:
# 用户输入账号
user_input_name = input("请输入您的账号:")
# 用户输入密码
user_input_pwd = input("请输入您的密码:")
# 用户登录次数加1
login_count += 1
# 更新上次登录账号状态
if last_login_user is None: # 肯定是第一次登录
last_login_user = user_input_name
# 判断登录账号是否与上次登录账号一致,账号有变更,则更新 last_login_user 和 last_login_user 状态
if user_input_name != last_login_user:
is_same_user = False
# 账号存在
if user_input_name in user_info_dict:
# 账号未锁定
if user_info_dict[user_input_name][1] == 0:
last_login_user = user_input_name
# 密码正确
if user_input_pwd == user_info_dict[user_input_name][0]:
print("密码正确,您已登录...")
break
# 密码连续错误3次(没有别的账号登录),账号锁定
elif is_same_user is True and login_count == 3:
print("密码连续输错3次,账号{0}已被锁定...".format(user_input_name))
# 修改字典中存储的用户账号信息,变更锁定状态
user_info_dict[user_input_name][1] = 1
# 修改文件,把字典中用户账号信息,更新(存入)到文件中
with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
f.write(str(user_info_dict))
break
# 密码错误
else:
print("密码错误,登录失败...")
# 账号锁定
else:
print("账号{0}已被锁定".format(user_input_name))
# 账号不存在
else:
print("账号不存在")
# 打印看一下字典状态
print(user_info_dict)