Python课程设计:简单博客管理系统(完整代码)_文章管理系统python-程序员宅基地

技术标签: python  Python  


注意:程序中涉及到文件路径的,可以酌情修改电脑本地路径

这是我的Python语言的课程设计作业,代码有很多不足,望大佬不吝赐教!

1.框图及编程思路

在这里插入图片描述

2.程序执行

2.1主界面

在这里插入图片描述

2.2登录后界面

在这里插入图片描述

2.3注册信息保存格式

在这里插入图片描述

2.4文章保存格式

在这里插入图片描述

3.代码

''' Python面向对象实现简单博客管理系统
    要求:1.实现用户登录、注册界面
          2.实现对博客文章的增、删、查、改等功能
          3.博客文章保存到文件
          4.用户信息保存到json文件中
'''
import time
import os
import json
import datetime
class Main_interface():
    ''' 主界面 '''
    def __init__(self):
        self.user = User()
        self.article = Article()

    def welcome_interface(self):
        ''' 欢迎界面 '''
        print("欢迎使用博客管理系统!")
        print("1.登录")
        print("2.注册")
        print("3.退出")
        user = input("请输入序号:")
        if user == '1':
            self.user.login()
        elif user == '2':
            self.user.register()
        else:
            exit()

class After_login_interface():
    ''' 登录后界面类'''
    def __init__(self):
        # 实例化Article
        self.article = Article()

    def after_login(self):
        ''' 登录后界面 '''
        print("1.写文章")
        print("2.查看文章")
        print("3.全部文章")
        print("4.修改文章")
        print("5.删除文章")
        print("0.退出系统")
        user = input("请输入序号:")
        if user == '1':
            self.article.add_article()
        elif user == '2':
            self.article.find_one_articel()
        elif user == '3':
            self.article.show_all_article()
        elif user == '4':
            self.article.modify_article()
        elif user == '5':
            self.article.del_article()
        elif user == '0':
            exit()
        else:
            print("请输入正确的序号:")
            self.after_login()

class User():
    ''' 用户类 '''
    def __init__(self):
        self.after_login_interface = After_login_interface()
        self.info_dict = {
    }  # 以字典形式临时存放用户注册信息,便于随后存到json文件中
        self.username = ''
        self.name_info = []
        self.password = ''

    def login(self):
        ''' 用户登录 '''
        print("正在登录...")
        self.username = input("请输入用户名:")
        with open(r"H:\untitled\Spider\BlogData\user_info.json", 'r') as f:
            for info in f.readlines():
                try:
                    self.name_info.append(str(json.loads(info).keys()))
                    self.password = str(json.loads(info)[self.username])
                except:
                    pass
        if str("dict_keys(['" + self.username + "'])") in self.name_info:
            password = input("请输入密码:")
            if password == self.password:
                print("登陆成功!")

                self.after_login_interface.after_login()
            else:
                print("密码错误!")
        else:
            print('用户名不存在!')
            self.re_login()

    def re_login(self):
        '''重新登录 '''

        user_desicion = input("是否注册(1.注册帐号 2.重新登录 3.退出系统)")
        if user_desicion == '1':
            self.register()
        elif user_desicion == '2':
            self.login()
        elif user_desicion == '3':
            exit()
        else:
            print('输入有误,请重新输入!')
            self.re_login()

    def register(self):
        ''' 用户注册 '''
        print("正在注册...")
        self.username = input("请输入您想要使用的用户名:")
        with open(r"H:\untitled\Spider\BlogData\user_info.json", 'r') as f:
            for info in f.readlines():
                try:
                    self.name_info.append(str(json.loads(info).keys()))
                except:
                    pass
        #print(str("dict_keys([" + "'" + self.username + "'" + "])"))
        if str("dict_keys(['" + self.username + "'])") in self.name_info:
            print('您输入的用户名已存在,请重新输入:')
            self.register()
        else:
            # self.info_dict['self.username'] = self.username  # 将用户输入的self.username存到字典中
            password = input("请输入您想要使用的密码:")
            verify_password = input("请再次确认密码:")
            if password == verify_password:
                print("注册成功!")
                # 注册成功后创建一个名为self.username的文件夹
                try:
                    if not os.path.exists("H://untitled//Spider//BlogData//" + self.username + "//"):
                        os.mkdir("H://untitled//Spider//BlogData//" + self.username + "//")
                except:
                    print("个人文件夹创建失败")
                self.info_dict[self.username] = password # 将用户输入的password存到字典
                # print(self.info_dict)
                json_str = json.dumps(self.info_dict) # 将用户输入的self.username和password转换为json格式并存入json文件
                with open(r"H:\untitled\Spider\BlogData\user_info.json", 'a+') as json_file:
                    json_file.write(json_str + '\n')
                    json_file.close()

                print("正在返回登录界面,请稍后...")
                time.sleep(3)
                self.login()
            else:
                print("两次输入的密码不相同,注册失败!")
                print("正在返回注册界面,请稍后...")
                time.sleep(3)
                self.register()

class Article():
    ''' 博客文章类 '''
    def __init__(self):
        self.username = ''
        self.article_list = []
    def add_article(self):
        ''' 添加文章 -- 写文章 '''

        self.username = input("请验证您的用户名:")
        title = input("请输入文章名:")
        file_path = "H://untitled//Spider//BlogData//" + self.username + "//"
        if title  in os.listdir(file_path):
            print('文章已存在!请重新输入')
            self.add_article()
        else:
            try:
                with open("H://untitled//Spider//BlogData//" + self.username + "//"+ title + ".txt", 'w') as file:
                    file.write('标题:' + title )
                    file.write('时间:' + datetime.datetime.now().strftime('%Y-%m-%d'))
                    content = input("请输入文章内容:")
                    file.write('正文:'+ content)
                    file.close()
                    print('文章已保存!')
            except:
                print("用户名验证失败!")
            user_decision = input("是否继续写文章(1.继续 2.退出系统)")
            if user_decision == '1':
                self.add_article()
            else:
                exit()

    def find_one_articel(self):
        ''' 查找文章 '''
        print("正在调用查找一篇文章方法")

        self.show_all_article()

    def show_all_article(self):
        ''' 展示所有文章 '''
        print("正在调用展示所有文章方法")
        self.username = input("请验证您的用户名:")
        file_path = "H://untitled//Spider//BlogData//" + self.username + "//"
        self.article_list = os.listdir(file_path)
        print("*" * 20)
        if len(self.article_list) == 0:
            print("您还没有写文章!")
            exit()
        for article_name in self.article_list:
            print(article_name)
        print("*" * 20)
        user_decision = input("输入文章名:") + '.txt'
        if user_decision in self.article_list:
            with open("H://untitled//Spider//BlogData//" + self.username + "//" + user_decision, 'r') as f:
                for text in f.readlines():
                    print(text)
        else:
            print("您查找的文章不存在!")

    def del_article(self):
        ''' 删除文章 '''
        print("正在调用删除文章方法")
        self.username = input("请验证您的用户名:")
        file_path = "H://untitled//Spider//BlogData//" + self.username + "//"
        self.article_list = os.listdir(file_path)
        print("*" * 20)
        if len(self.article_list) == 0:
            print("您还没有写文章!")
        for article_name in self.article_list:
            print(article_name)
        print("*" * 20)
        user_decision = input("请输入要删除的文章名:") + '.txt'
        del_path = "H://untitled//Spider//BlogData//" + self.username + "//" + user_decision
        os.remove(del_path)
        if user_decision + '.txt' not in self.article_list:
            print("删除成功!")
        else:
            print('删除失败!')

    def modify_article(self):
        ''' 修改文章 '''
        print("正在调用修改文章方法")
        self.username = input("请验证您的用户名:")
        file_path = "H://untitled//Spider//BlogData//" + self.username + "//"
        self.article_list = os.listdir(file_path)
        print("*" * 20)
        if len(self.article_list) == 0:
            print("您还没有写文章!")
        for article_name in self.article_list:
            print(article_name)
        print("*" * 20)
        user_decision = input("请输入要修改的文章名:") + '.txt'
        change_path = "H://untitled//Spider//BlogData//" + self.username + "//" + user_decision
        user_selection = input("1.追加内容 2.覆盖内容")
        if user_selection == '1':
            text = input("请输入追加内容:")
            with open(change_path, 'a+') as fp:
                fp.write(text)
                fp.close()
        elif user_selection == '2':
            text = input("请输入覆盖内容:")
            with open(change_path, 'w') as fp:
                fp.write(text)
                fp.close()

def make_dirs():
    ''' 创建文件 '''
    file = os.path.exists('BlogData')
    if not file:
        os.makedirs('BlogData')
        print("创建成功,博客系统数据将保存在'BlogData'文件夹")
        print('请重新启动程序!')
        exit()
    else:
        print("文件已存在,博客系统数据将保存在'BlogData'文件夹")

make_dirs()

MI = Main_interface()
MI.welcome_interface()


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44744724/article/details/108278330

智能推荐

SKlearn学习笔记——神经网络概述_sklearn.neural_network-程序员宅基地

文章浏览阅读1.3w次,点赞15次,收藏98次。SKlearn学习笔记——神经网络概述1 打开深度学习的大门:神经网络概述1.1 打开深度学习的大门1.2 神经网络的基本原理1.3 sklearn中的神经网络2 neural_network.MLPClassifier2.1 隐藏层与神经元:重要参数hidden_layer_sizes2.2 激活函数:重要参数activation2.3 反向传播与梯度下降前言: scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matp_sklearn.neural_network

(网页)websocket后台调用Service层_websocket调用service-程序员宅基地

文章浏览阅读1.4k次。百度论坛里面有很多好的方法,借鉴. 重点:因为项目是StringBoot所以我用的是下面的方法很好使:    Service.... service = (Service....) Con..._websocket调用service

Rose双机热备两款软件原理介绍以及共享存储双机热备方案和镜像双机热备方案介绍_rose主备切换-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏7次。一. RoseHA的工作原理  RoseHA双机系统的两台服务器(主机)都与磁盘阵列(共享存储)系统直接连接,用户的操作系统、应用软件和RoseHA高可用软件分别安装在两台主机上,数据库等共享数据存放在存储系统上,两台主机之间通过私用心跳网络连接。配置好的系统主机开始工作后,RoseHA软件开始监控系统,通过私用网络传递的心跳信息,每台主机上的RoseHA软件都可监控另一台主机的状态。当工作主机..._rose主备切换

Redis缓存数据库SaaS多租户实现方案-程序员宅基地

文章浏览阅读2.7k次。一、前言上2个章节已经实现了mysql和MongoDB的多租户切实现方案,本章将继续学习Redis的多数据源切换。Redis服务器默认有16个database,我们可以将每个租户的数据放到其中一个database中,也可以部署多台Redis服务器,每个租户使用一个Redis服务器,也可以把两者结合起来,Redis服务器部署多台,先在一台的16个Database上放,放满了16个Database然后再往下一台Redis服务器上放。这种方式需要有一个MySQL数据库表存储每台Redis服务器的Databa

win10触摸键盘TabTip软件特性-程序员宅基地

文章浏览阅读2.3k次。win10触摸键盘通过::SendMessage隐藏方式没有效果HWND hWnd = ::FindWindow(L"OSKMainClass", NULL);if ( hWnd ){::SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);} win10触摸键盘无法找到状态窗口状态,isWidowsVisible,GetWindowPlacement,GetWindowLong,状态没有变化 ..._tabtip

android实时声音信号波形_【每日一题】(八上)通过波形图比较声音的特性(学苑帮你成长一每日一题精析)9月25日...-程序员宅基地

文章浏览阅读1.5k次。9月25日 通过波形图比较声音的特性中考频度:★★☆☆☆难易程度:★☆☆☆☆(2019·广东初二期末)把频率为256 Hz音叉发出的声音信号输入示波器,示波器展现的波形如图甲所示。若把频率为512 Hz音叉发出的声音信号输入同一设备的示波器,其波形可能图中的__________。【参考答案】丁【试题解析】由题知,原来音叉发出声音的频率为256 Hz,现在音叉发出声音的频率为512 Hz..._规格为256hz音叉声音波形如图所示,将512hz音叉的声音输入同一设置的示波器后,其波

随便推点

数学:求欧拉函数算法模板-程序员宅基地

文章浏览阅读499次。数学:求欧拉函数算法模板求欧拉函数求欧拉函数int phi(int x){ int res = x; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) x /= i; } if (x > 1) res = res / x * .

matplotlib绘图时横纵坐标和图例的字体大小如何设置_matplotlib绘图横纵坐标设置-程序员宅基地

文章浏览阅读8.8k次,点赞3次,收藏8次。横纵坐标字体大小调节:通过fontsize可以进行调节ax1.set_ylabel("AUC",fontsize=20)ax2.set_ylabel("Logloss",fontsize=20)图例字体大小调节:在plt.legend中加一个prop={"size":18,"weight":"black"}即可_matplotlib绘图横纵坐标设置

HTML5特效按钮_html5 特效按钮-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏19次。作为前端开发者,我们肯定都使用过非常多的jQuery插件,毋庸置疑,jQuery非常流行,尤其是结合HTML5和CSS3以后,让这些jQuery插件有了更多地动画效果,更为绚丽多彩。下面分享了一些超炫酷的jQuery/HTML5应用,一起来看看。1、HTML5/CSS3一组可爱的3D按钮这是一款利用HTML5和CSS3制作而成的按钮组合,这款CSS按钮非常具有个性化。该CSS3按钮_html5 特效按钮

树莓派(Raspberry Pi 4)开启和连接蓝牙_树莓派连接蓝牙耳机并使用麦克风-程序员宅基地

文章浏览阅读1.8w次,点赞4次,收藏43次。参考连接: link.1、查看树莓派蓝牙开启状态_树莓派连接蓝牙耳机并使用麦克风

Python3输入输出与字符串格式化_%s.%d' %()-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏12次。介绍了输入(input)、输出(print),及字符串格式化(F-string、format与%)方式_%s.%d' %()

EL表达式比较字符串或是数字格式的数值是否相等,为true,却不执行为true时的代码_el 表达式 判断字符串和数字相等-程序员宅基地

文章浏览阅读9.3k次。问题:EL表达式比较字符串或是数字格式的数值是否相等,为true,却不执行为true时的代码。示例:true原因:有可能是test="${ 1 == 1}(这里多个空格)",即大括号与双引号之间多了空格,这个时候,就不会打印true。去掉多余的空格就可以了_el 表达式 判断字符串和数字相等