'''
作业题目:
模拟博客园登录
作业需求:
1),启动程序,首页面应该显示成如下格式:
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,
没成功则结束整个程序运行,成功之后,可以选择访问3~6项,访问页面之前,
必须要在log文件中打印日志,日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,
访问页面时,页面内容为:欢迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录,然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
'''
def mk_file(): #判断文件是否存在,不存在则创建空文件
if not os.path.exists(register_file):
f = open(register_file, mode="w", encoding="utf-8")
f.close()
def get_file_content(): #读取文件内容,返回一个字典
mk_file()
with open(register_file, mode="r", encoding="utf-8") as f:
content = f.read().strip()
if content != "":
content = eval(content)
else:
content = {}
return content
def edit_file_content(usr_dic): #修改文件内容
with open(register_file, mode="w", encoding="utf-8") as f:
f.write(str(usr_dic))
def login(): #用户登录
global username
usr_dic = get_file_content()
if username != "": #检查用户是否已登录
if usr_dic.get(username, {}) != {}:
if usr_dic[username]["status"] == "logged":
return
for i in range(3, 0, -1): # 三次机会
while 1:
print("\033[31;0m请先登录\033[0m".center(50, "*"))
name = input("Login Username: ").strip()
if name == "":
print("\033[31;0m用户名不能为空.\033[0m")
continue
pwd = input("Login Password: ").strip()
if pwd == "":
print("\033[31;0m密码不能为空.\033[0m")
continue
if name in usr_dic:
if usr_dic[name]["pwd"] == pwd: #验证通过
usr_dic[name]["status"] = "logged"
username = name
edit_file_content(usr_dic)
print("\033[32;0m恭喜您,用户名%s登录成功.\033[0m" % name)
return
if i == 1: #验证失败
exit("\033[31;0m用户名或密码错误,您的账号已锁住.\033[0m")
else:
print("\033[31;0m用户名或密码错误,您还有%d次机会.\033[0m" % (i-1))
break
def register(): #用户注册
global username
while 1:
name = input("Register Username: ").strip()
pwd = input("Register Password: ").strip()
if name != "" and pwd != "": #用户名和密码的合法性
if len(name) < 3 and len(name) > 30:
print("\033[31;0m用户名长度为3~30.\033[0m")
continue
if len(pwd) < 6 and len(pwd) > 20:
print("\033[31;0m用户密码长度为6~20.\033[0m")
continue
usr_dic = get_file_content()
if name in usr_dic: #检查用户名是否存在
print("\033[31;0m注册失败,用户名%s已存在.\033[0m" % name)
continue
else: #不存在,则添加用户名和密码
usr_dic.setdefault(name, {"pwd": pwd, "status": "logged"})
edit_file_content(usr_dic)
username = name
login()
print("\033[32;0m恭喜您,账号%s注册成功.\033[0m" % name)
return
else:
print("\033[31;0m用户名和密码不能为空.\033[0m")
def write_log(auth_flag): #装饰器函数,也是一个闭包函数,记录日志