Python之第二十四天的努力--模拟博客园登录系统程序

模拟博客园登录系统程序

'''
用代码模拟博客园系统。

项目分析:
一.首先启动程序,页面显示下面内容供用户选择:

    1.请登录
    2.请注册')
    3.进入文章页面
    4.进入评论页面
    5.进入日记页面
    6.进入收藏页面
    7.注销账号
    8.退出整个程序

二.必须实现的功能:

    1.注册功能要求:
        a.用户名、密码要记录在文件(username)中。
        b.用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。
        c.密码要求:长度要在6~14个字符之间。

    2.登录功能要求:
        a.用户输入用户名、密码进行登录验证。
        b.登录成功之后才能访问3~7选项,如果没有登录或登录不成功是访问3~7选项。
    不允许访问,让其先登录。(装饰器)
        c.超过三次登录还未成功,则退出整个程序。

    3.进入文章页面要求:
        a.提示欢迎xx进入文章页面。
        b.此时用户可以选择:直接写入内容,还是导入md文件。
            ① 如果选择直接写入内容:让用户直接写文件名|文件内容。最后创建一个文章。
            ② 如果选择导入md文件:让用户输入已经准备好的md文件的文件路径
        (相对路径即可:比如 一.md ),然后将此md文件的全部内容写入文章(一.text)中。

    4.进入评论页面要求:
        提示欢迎xx进入评论页面。

    5.进入日记页面要求:
        提示欢迎xx进入日记页面。

    6.进入收藏页面要求:
        提示欢迎xx进入收藏页面。

    7.注销账号要求:
        不是退出整个程序,而是将已经登录的状态变成未登录的状态(访问3~7选项时
    需要重新登录)。

    8.退出整个程序要求:
        就是结束整个程序。
'''
def table_print():
    '''
    打印目录
    '''
    print('1.请登录')
    print('2.请注册')
    print('3.进入文章页面')
    print('4.进入评论页面')
    print('5.进入日记页面')
    print('6.进入收藏页面')
    print('7.注销账号')
    print('8.退出整个程序')


def get_user_pwd():
    '''
    获取用户名及密码,加入一个列表中
    @return: user_dict 用户名,密码的字典
    '''
    user_dict = {}          # 建立用户名,密码的字典,字典的键为用户名,值为密码
    with open('username', encoding='utf-8') as f:       # 读取包含用户名密码的文件
        for line in f:      # 按行读取,并把用户名,密码分开,填入字典
            line_list = line.strip().split('|')
            user_dict[line_list[0].strip()] = line_list[1].strip()
    return user_dict


def registration():
    '''
    注册操作
    @return:
    '''
    while 1:
        registration_name = input('请输入用户名(只能含有字母或数字):')
        registration_pwd = input('请输入密码(长度6~14个字符):')
        if registration_name.isalnum() and 6 <= len(registration_pwd) <= 14:    # 判断输入的用户名是否符合要求
            u_dict = get_user_pwd()
            if registration_name in list(u_dict.keys()):                        # 用户名存在
                print('您输入的用户名已存在,请重新输入')
            else:
                with open('username', encoding='utf-8', mode='a') as f2:
                    f2.write(registration_name + '|' + registration_pwd + '\n') # 符合要求者,添加到用户名密码文件中
                break
        else:
            print('您输入的用户名或密码不正确,请重新输入')
            continue
    print('注册成功')


# 登录状态字典,用于判断是否有用户已经登录。
login_status_dict = {
    'username': None,
    'status': False,
}


def login():
    '''
    登录操作
    @return:
    '''
    u_dict = get_user_pwd()
    count = 1
    print('请登录')
    while count < 4:                                                    # 超过三次登录还未成功,则退出整个程序。
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        if username in u_dict.keys() and password == u_dict[username]:  # 判断用户名密码是否正确
            print('登录成功')
            login_status_dict['username'] = username                    # 修改登录状态字典的,登录用户名。
            login_status_dict['status'] = True                          # 修改登录状态字典的,登录状态。
            return True
        else:
            print('用户名或密码错误')
        count += 1
    print('用户名密码输入三次均不正确,自动退出程序。')
    return False


def auth(f):
    '''
    判断是否有用户已经登录的装饰器
    @param f: 修饰的函数名
    @return: inner
    '''
    def inner(*args,**kwargs):
        if login_status_dict['status']:             # 如果已有用户登录,则直接运行被修饰函数

            ret = f(*args,**kwargs)
            return ret
        else:
            if login():                             # 如果没有用户登录,则进行登录操作。
                ret = f(*args,**kwargs)
                return ret
    return inner


@auth
def article():
    '''
    文章页面
    @return:
    '''

    while 1:
        print(f'欢迎{login_status_dict["username"]}进入文章页面')
        write_art_num = input('选择直接写入内容输入1,选择导入md文件输入2,输入B或b返回上一个页面,输入Q或q直接退出:').strip()
        if write_art_num.isdecimal():                                                   # 选择进行的操作
            write_art_num = int(write_art_num)
            if write_art_num == 1:                                                      # 进行直接写入操作
                article_name = input('请输入文件名:')
                article_content = input('请输入文件内容:')
                with open(article_name,encoding='utf-8',mode='w') as f3:                # 直接写入用户输入的内容
                    f3.write(article_content)
            elif write_art_num == 2:                                                    # 进行md文件写入操作
                article_name = input('请输入md文件的路径:')
                with open(article_name,encoding='utf-8',mode='r') as f4,\
                    open(article_name[:-2] + 'text',encoding='utf-8',mode='w') as f5:
                    f5.write(f4.read())                                                 # 读取并写入
            else:
                print('您输入有误,请重新输入')
        elif write_art_num.upper() == 'B':                                              # 返回上一页面
            break
        elif write_art_num.upper() == 'Q':                                              # 直接退出程序
            return
    return True


@auth
def comment():
    '''
    评论页面
    @return:
    '''
    print(f'欢迎{login_status_dict["username"]}进入评论页面')
    if back_quit():
        return True
    else:
        return


@auth
def dariy():
    '''
    日记页面
    @return:
    '''
    print(f'欢迎{login_status_dict["username"]}进入日记页面')
    if back_quit():
        return True
    else:
        return

@auth
def collect():
    '''
    收藏页面
    @return:
    '''
    print(f'欢迎{login_status_dict["username"]}进入收藏页面')
    if back_quit():
        return True
    else:
        return


@auth
def cancel_login():
    '''
    注销登录
    @return:
    '''
    login_status_dict['username'] = None            # 把登录状态字典的登录者姓名改为None
    login_status_dict['status'] = False             # 把登录状态改为False
    print('您已注销')

    if back_quit():
        return True
    else:
        return


def back_quit():
    '''
    返回或直接退出
    @return:
    '''
    while 1:
        s_quit = input('输入B或b返回上一个页面,输入Q或q直接退出:').strip()
        if s_quit.upper() == 'B':
            break
        elif s_quit.upper() == 'Q':
            return
        else:
            print('您输入有误请重新输入')
    return True


def main():
    '''
    主函数
    @return:
    '''
    while 1:
        table_print()                                               # 打印目录
        open_num = input('请输入您要进行的操作的序号:').strip()         # 选择进行的操作
        if open_num.isdecimal():                                    # 判断用户输入的序号是否符合规定
            open_num = int(open_num)                                # 将序号变为int 类型
            if open_num == 1:
                login()                                             # 执行登录操作

            elif open_num == 2:
                registration()                                      # 执行注册操作

            elif open_num == 3:
                if article():                                       # 进入文章页面
                    continue
                else:
                    return

            elif open_num == 4:
                if comment():                                       # 进入评论页面
                    continue
                else:
                    return

            elif open_num == 5:
                if dariy():                                         # 进入日记页面
                    continue
                else:
                    return

            elif open_num == 6:
                if collect():                                       # 进入收藏页面
                    continue
                else:
                    return

            elif open_num == 7:

                if cancel_login():                                  # 进入注销账号页面
                    continue
                else:
                    return

            elif open_num == 8:
                return

            else:
                print('您输入有误,请重新输入。')

        else:
            print('您输入有误,请重新输入。')



if __name__ == '__main__':
    main()

你可能感兴趣的:(Python之第二十四天的努力--模拟博客园登录系统程序)