python3 模拟博客园登录

'''
作业题目:
模拟博客园登录
    作业需求:
    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):    #装饰器函数,也是一个闭包函数,记录日志
    def auth(func):
        def record_log():
            if auth_flag:   #需要登录
                login()
            time_lst = time.strftime("%Y %m %d", time.localtime()).split()
            with open(log_file, mode="a", encoding="utf-8") as f: #追加日志
                f.write("用户:%s 在%s年%s月%s日 执行了 %s函数\n" % (username, time_lst[0], time_lst[1], time_lst[2], func.__name__))
            return func()    #调用被装饰函数
        return record_log
    return auth

@write_log(1) # 这里相当于 xx = write_log(1) 和 article_page = xx(artical_page)
def article_page(): #文章页面
    print("\033[32;0m欢迎%s用户访问文章页面.\033[0m".center(50, "*") % username)

@write_log(1)
def diary_page():   #日记页面
    print("\033[32;0m欢迎%s用户访问日记页面.\033[0m".center(50, "*") % username)

@write_log(1)
def comment_page(): #评论页面
    print("\033[32;0m欢迎%s用户访问评论页面.\033[0m".center(50, "*") % username)

@write_log(1)
def collect_page(): #收藏页面
    print("\033[32;0m欢迎%s用户访问收藏页面.\033[0m".center(50, "*") % username)

@write_log(0) #这里相当于 xx = write_log(0) 和 article_page = xx(artical_page)
def logout():   #注销
    global username
    usr_dic = get_file_content()
    usr_dic[username]["status"] = "logout"
    edit_file_content(usr_dic)
    print("\033[32;0m用户%s已成功注销.\033[0m" % username)
    username = ""

import os
import time
menu = ["请登录", "请注册", "文章页面", "日记页面", "评论页面", "收藏页面", "注销", "退出程序"] #菜单列表
register_file = "register" #用户注册文件
log_file = "log"    #日志文件
username = ""   #用户名,默认为空
print("\033[32;0m欢迎%s来到博客园首页\033[0m".center(50, "*") % username)
while 1:
    for k, item in enumerate(menu, 1):  #显示菜单
        if username == "":
            print("%d:%s" % (k, item))
        else:
            if k <= 2:
                continue
            print("%d:%s" % (k, item))

    user_choice = 1 #定义用户选择的菜单序号默认为1
    while 1:    #用户选择菜单序号
        user_choice = input("请输入菜单序号: ").strip()
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice >=1 and user_choice <= len(menu):
                break
            else:
                print("\033[31;0m输入有误,请重新输入菜单序号!\033[0m")
        else:
            print("\033[31;0m输入有误,请重新输入菜单序号!\033[0m")

    if user_choice == 1:    #登录
        login()
    elif user_choice == 2:  #注册
        print("\033[31;0m请先注销.\033[0m") if username != "" else register()
    elif user_choice == 3:  #文章页面
        article_page()
    elif user_choice == 4: #日记页面
        diary_page()
    elif user_choice == 5:  #评论页面
        comment_page()
    elif user_choice == 6: #收藏页面
        collect_page()
    elif user_choice == 7:  #注销
        logout() if username != "" else print("\033[31;0m您还没有登录,不能注销.\033[0m")
    else:   #退出程序
        exit("\033[32;0m退出程序.\033[0m")

 

 

 

posted on 2019-04-27 18:26  lilyxiaoyy  阅读(308)  评论(0编辑  收藏  举报

返回
顶部