• 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:	eaching_showarticle'))
    
    # ['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'datausers_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('
    ')
                    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'datausers_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.
    PRESS 2: write an article by markdown.
    PRESS 3:exit.
    ')
            if choice == '1':
                temp_info = input('PLS input ur filename and contents, divided by "|".
    ')
                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.
    ')
                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('
    ' + str(user) + ':')  
                        # 虽然user运行到这里必然是一个字符串类型,可是全局变量设置的时候把它设置成了None,所以为了安全起见还是在外面套了一个str函数
                        file_handler.write('
    ' + comment)
                    else:
                        file_handler.write('
    ' + '评论区:')
                        file_handler.write('
    ' + '-----------------------------------------')
                        file_handler.write('
    ' + str(user) + ':')
                        file_handler.write('
    ' + 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()
    
  • 相关阅读:
    vue 回到顶部效果实现
    C# rabbitmq 安装步骤以及使用方法
    ​Everspin MRAM常见问题解答
    带有ECC的异步SRAM存储器适用于各种应用
    ​MCU是控制电子产品的大脑
    全球MCU市场供需失衡情况愈发严重
    如何选择非易失性SRAM
    SRAM VS DRAM
    SoC上的内存
    EEPROM和FLASH在大多数应用场合中无法替代SRAM
  • 原文地址:https://www.cnblogs.com/raygor/p/13299415.html
Copyright © 2020-2023  润新知