一、实现用户注册功能
思路:
用户输入用户名、密码
将用户输入的内容按照固定的格式,比如:egon:123,存入文件
可以往一个文件中重复注册新的用户名和密码
附加:
1. 对输入的用户名进行合法性监测,不能以数字开头,且如果输入的用户名已存在于文件中则要求用户重新输入
2. 对输入的密码进行合法性监测,密码的长度至少6位,并且不能包含特殊字符*&$
二、实现用户验证功能:
思路:
用户输入账号密码,从文件中读出账号密码,与用户输入的进行比对
附加:
新建黑名单文件,同一个账号名输错三次则将用户名写入黑名单文件中,如果用户输入的用户名存在于黑名单中则直接退出
spe_char = ['*', '&', '$'] # 定义特殊字符,方便后面与密码的对比
tag = True
dic = {} # 定义空字典,用来记录用户错误次数,三次加入黑名单
while True: # 判断用户是log in还是sign in
choice = input('Log in or Sign in >>:').strip().lower()
if choice == 'log in' or choice == 'sign in':
break
else:
print('Incorrect input, please re-enter.')
with open('account.txt', mode='a+', encoding='utf-8') as f:
while tag:
f.seek(0) # 追加模式,应该将光标移到开头,方便遍历文件,与用户输入用户名作对比
if choice == 'log in':
inp_name = input('Please enter the user name >>:').strip()
inp_pwd = input('Please enter your password>>:').strip()
with open('blacklist.txt', mode='r', encoding='utf-8') as f_lock: # 先判断用户输入用户名是否在黑名单中
if inp_name in f_lock:
print('Account has been locked.')
tag = False
break
for line in f: # 对比用户输入用户名密码与数据库中是否一致
msg = line.strip('\n').split('|')
if inp_name == msg[0] and inp_pwd == msg[1]:
print('Login successful.')
tag = False
break
else:
if inp_name == msg[0]:
if inp_name in dic:
dic[inp_name] += 1
else:
dic[inp_name] = 1
with open('blacklist.txt', mode='a', encoding='utf-8') as f_lock: # 如果错误次数达到三次,则将用户输入用户名加入黑名单
if dic[inp_name] == 3:
f_lock.write(inp_name)
else:
print('Username or password is incorrect, please re-enter. \n')
else:
sgn_name = input('Please enter the user name >>:').strip()
for line in f:
msg = line.strip('\n').split('|')
if sgn_name[0].isdigit(): # 合法性监测:用户名是否以数字开头
print('Incorrect input, please re-enter.')
break
if sgn_name == msg[0]: # 合法性监测:用户名是否已经在数据库中
print('Username already exists, please re-enter.')
break
else:
sgn_pwd = input('Please enter your password>>:').strip()
for s in sgn_pwd:
if s in spe_char or len(sgn_pwd) < 6: # 合法性监测:判断密码中是否有特殊字符或密码是否小于6位
print('Incorrect input, please re-enter.')
break
else:
print('Registration success')
info = ('%s|%s\n'%(sgn_name,sgn_pwd))
f.write(info) # 将用户注册信息写入账户文件中
tag = False