Python 大作业2:模拟博客园系统

第二次周末大作业:博客园

作业:用代码简单地模拟博客园系统。

项目分析:

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

  1. 请登录

  2. 请注册

  3. 进入文章页面

  4. 进入评论页面

  5. 进入日记页面

  6. 进入收藏页面

  7. 注销账号

  8. 退出整个程序

二.必须实现的功能:

  1. 注册功能要求:

    a. 用户名、密码要记录在文件中。

    b. 用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。

    c. 密码要求:长度要在6~14个字符之间。

    d.超过三次登录还未成功,则推出整个程序。

  2. 登录功能要求:

    a. 用户输入用户名、密码进行登录验证。

    b. 登录成功之后,才可以访问37选项,如果没有登录或者登录不成功时访问37选项,不允许访问,让其先登录。(装饰器)

    c. 超过三次登录还未成功,则退出整个程序。

  3. 进入文章页面要求:

    a. 提示欢迎xx进入文章页面。

    b. 此时用户可以选择:直接写入内容,还是导入md文件。

    ​ ① 如果选择直接写内容:让学生直接写文件名|文件内容...... 最后创建一个文章。

    ​ ②如果选择导入md文件:让用户输入已经准备好的md文件 的文件路径(相对路径即可:比如函数的进阶.md),然后将 此md文件的全部内容写入文章(函数的进阶.text)中。

  4. 进入评论页面要求:

    提示欢迎xx进入评论页面。

  5. 进入日记页面要求:

    提示欢迎xx进入日记页面。

  6. 进入收藏页面要求:

    提示欢迎xx进入收藏页面。

  7. 注销账号要求:

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

  8. 退出整个程序要求:

    ​ 就是结束整个程序。

三.选做功能

  1. 评论页面要求:

    a. 提示欢迎xx进入评论页面。

    b. 让用户选择要评论的文章。

    ​ 这个需要借助于os模块实现此功能。将所有的文章文件单独 放置在一个目录中,利用os模块listdir功能,可以将一个目录下 所有的文件名以字符串的形式存在一个列表中并返回。

import os

print(os.listdir(r'D:\teaching_show\article'))

# ['01 函数的初识.text', '02 函数的进阶.text']

​ c. 选择要评论的文章之后,先要将原文章内容全部读一遍,然 后输入的你的评论,评论要过滤掉这些敏感字符:"苍老师", "东 京热", "武藤兰", "波多野结衣",替换成等长度的"*"之后,写在 文章的评论区最下面。

​ 文章的结构:

​ 文章具体内容

​ .......

​ 评论区:

​ -----------------------------------------

​ (用户名)xx:

​ 评论内容

​ (用户名)oo:

​ 评论内容

​ 原文章最下面如果没有以下两行:

​ """

​ 评论区:

​ -----------------------------------------

​ """

​ 就加上这两行在写入评论,如果有这两行则直接在下面顺延写 上:
​ (用户名)xx:
评论内容

import os
# 全局变量,表示正在登陆的用户名和状态
user = None  # 有登陆的时候是字符串形式的用户名,未登录为None
illegal_words = ['苍老师', '波多野结衣', '东京热', '武藤兰']  # 过滤词全局变量


# 显示菜单,无返回内容,也无传入内容
def display_menu():
    print('1. 请登录')
    print('2. 请注册')
    print('3. 进入文章页面')
    print('4. 进入评论页面')
    print('5. 进入日记页面')
    print('6. 进入收藏页面')
    print('7. 注销账号')
    print('8. 推出整个程序')
    print('*' * 20)


# 注册账号,无传入内容,返回布尔值,直接修改users_bak文件
def register():
    for i in range(3):
        new_username = input('new username:')
        password = input('password:')
        flag_rep = False
        with open(r'data\users_bak', encoding='utf-8', mode='r+') as file_handler:
            for line in file_handler:
                temp_info = line.strip().split('|')
                if new_username == temp_info[0]:
                    flag_rep = True
            if flag_rep == False and new_username.isalnum() and 6 <= len(new_username) <= 14:
                if file_handler.tell() != 0:
                    file_handler.write('\n')
                file_handler.write(new_username + '|' + password)
                global user
                user = new_username
                return True
    return False


# 登录账号,无传入内容,返回布尔值,直接修改user全局变量
def login():
    for i in range(3):
        username = input('username:')
        password = input('password:')
        with open(r'data\users_bak', encoding='utf-8', mode='r') as file_handler:
            for line in file_handler:
                temp_info = line.strip().split('|')
                if username == temp_info[0] and password == temp_info[1]:
                    global user
                    user = username
                    print('login success.')
                    return True
        print('login fail.')
    return False


# 装饰器,认证登录,装饰的函数没有传入值和返回值
def auth(func):
    def inner():
        if user is None:
            print('PLS login first.')
            login()  # 这里没有利用login函数的返回值
            print('Enter the pre-login page......')
        if user is not None:
            func()
        return

    return inner


# 文章页面
@auth
def article_page():
    print(f'欢迎{user}进入文章页面。')
    while 1:
        choice = input('PRESS 1: write an article directly.\nPRESS 2: write an article by markdown.\nPRESS 3:exit.\n')
        if choice == '1':
            temp_info = input('PLS input ur filename and contents, divided by "|".\n')
            file_info = temp_info.strip().split('|')
            with open(fr'users\{file_info[0]}', encoding='utf-8', mode='w') as file_handler1:
                file_handler1.write(file_info[1])
        elif choice == '2':
            file_temp = input('PLS input your filename:')
            file_name = file_temp.split('.')
            if not os.path.exists(file_temp):
                print('NOTFOUND file, pls input again.')
            else:
                with open(fr'{file_temp}', encoding='utf-8', mode='r') as file_handler2,\
                        open(fr'users\{file_name[0]}.txt', encoding='utf-8', mode='a') as file_handler3:
                    for line in file_handler2:
                        file_handler3.write(line)
        elif choice == '3':
            break
        else:
            print('illegal input, pls input again.')
    return


# 评论页面
@auth
def comment_page():
    print(f'欢迎{user}进入评论页面')
    print(os.listdir(rf'{os.path.dirname(__file__)}\users'))
    while 1:
        print('PLS choose article u wanna comment(input filename with extension), PRESS 0 to exit.')
        comment_filename = input()
        if comment_filename == '0':
            break
        elif not os.path.exists(fr'users\{comment_filename}'):
            print('NOTFOUND file, pls input again.')
        else:
            comment = input('pls input ur comment.\n')
            for word in illegal_words:
                if word in comment:
                    comment = comment.replace(word, len(word) * '*')
            with open(rf'users\{comment_filename}', encoding='utf-8', mode='r+') as file_handler:
                comment_flag = [False, False]
                for line in file_handler:
                    if '评论区:' in line:
                        comment_flag[0] = True
                    elif '-----------------------------------------' in line:
                        comment_flag[1] =True
                if comment_flag == [True, True]:
                    file_handler.write('\n' + str(user) + ':')  
                    # 虽然user运行到这里必然是一个字符串类型,可是全局变量设置的时候把它设置成了None,所以为了安全起见还是在外面套了一个str函数
                    file_handler.write('\n' + comment)
                else:
                    file_handler.write('\n' + '评论区:')
                    file_handler.write('\n' + '-----------------------------------------')
                    file_handler.write('\n' + str(user) + ':')
                    file_handler.write('\n' + comment)


# 收藏页面
@auth
def dairy_page():
    print('进入日记页面。')


# 日记页面
@auth
def favorite_page():
    print('进入收藏页面。')


# 注销账号,无传入值也无返回值
def logout():
    global user
    user = None


# 主函数
def main():
    while 1:
        display_menu()
        choice = input()
        if choice == '1':
            if not login():
                break
        if choice == '2':
            if not register():
                break
        if choice == '3':
            article_page()
        if choice == '4':
            comment_page()
        if choice == '5':
            dairy_page()
        if choice == '6':
            favorite_page()
        if choice == '7':
            logout()
        if choice == '8':
            break


if __name__ == '__main__':
    main()
posted @ 2020-07-14 15:40  Raigor  阅读(325)  评论(0编辑  收藏  举报