项目案例——个人博客网站

初学函数,将大量的重复代码封装到函数中,写了一个简单的个人博客网站。。。

个人博客开发需求

用户相关功能:

  1. 注册【邮箱、账号、密码、昵称】
  2. 登录【账号+密码 | 邮箱+密码】
  3. 修改登录密码【原密码、两次输入新密码-> 重新登录】
  4. 完善个人资料【手机、性别、年龄】

文章相关功能:

  1. 发表文章【标题、内容】
  2. 查看所有文章
  3. 查看个人文章
  4. 修改个人文章
  5. 删除个人文章
  6. 回收站【可以恢复删除的文章或者清空回收站】
  7. 评论相关功能【可以评论别人的文章
    不可以评论自己的文章】

下面是详细代码:

"""
 用户users = dict()
        u1 = {'username': 'admin', 'password': '123', 'nickname': '小刘'}
    文章articles = dict('标题': a1)
        a1 = {'title': '标题', author: u1, content='内容', readed_count: 0}
"""

#引入依赖的模块
import os, sys, time, pickle


#定义函数
def show_login():
    """展示登录菜单"""
    print("\t\t个人博客登录首页")
    print("\t\t1.用户登录")
    print("\t\t2.用户注册")
    print("\t\t3.退出系统")

    #用户输入选项
    choice = input("请输入您的选项: ")
    return login_menu_dict.get(choice)() if choice in login_menu_dict else show_login()


def show_register():
    """展示注册菜单"""
    print("\t\t系统用户注册")
    print("*" * 30)
    print("\t\t请按照提示完成注册")
    print("*" * 30)
    time.sleep(1)

    #用户开始注册
    return register()


def show_index():
    """展示首页菜单"""
    print("\t\t个人博客首页")
    print("\t\t1.查看所有文章")
    print("\t\t2.查看个人文章")
    print("\t\t3.发表文章")
    print("\t\t4.修改登录密码")
    print("\t\t5.完善个人资料")
    print("\t\t6.回收站")
    print("\t\t7.返回登录菜单")
    print("\t\t8.退出系统")

    #用户输入选项
    choice = input("请输入您的选项: ")

    return index_menu_dict.get(choice)() if choice in index_menu_dict else show_index()


def look_articles():
    """查看所有文章"""
    #循环查看所有文章的标题即可
    print("标题\t\t作者")
    for title_key in articles.keys():
        print(title_key, "\t\t", articles.get(title_key).get('author').get('username'))

    title = input("请输入要查看的文章标题(R键返回首页):")
    if title.upper() == "R":
        return show_index()
    else:
        #判断用户输入的标题是否存在,并展示文章
        if title in articles:
            look_articles_detail(title)

        else:
            print("没有这篇文章")
            return show_index()

def look_articles_self():
    """查看自己的所有文章"""
    print("标题\t\t作者")
    for title_key in articles.keys():
        if articles.get(title_key).get("author").get("username") == online.get("username"):
            print(title_key, "\t\t", articles.get(title_key).get("author").get("username"))

    title = input("请输入要查看的文章标题(R键返回首页):")
    if title.upper() == "R":
        return show_index()
    else:
        #判断用户输入的标题是否存在,并展示文章
        if title in articles:
            print("\t\t1.查看个人文章")
            print("\t\t2.修改个人文章")
            print("\t\t3.删除个人文章")

            choice = input("请输入您的选项:(1/2/3)")
            if choice == "1":
                #查看个人文章
                look_articles_detail(title)
            elif choice == "2":
                #修改个人文章
                new_content = input("请输入您的新内容: ")
                if new_content == "R":
                    print("放弃修改")
                    look_articles_detail(title)
                else:
                    #将修改后的文章内容更新
                    articles[title]["content"] = new_content

                    #返回博客首页
                    save_data()
                    return look_articles_self()
            elif choice == "3":
                #删除个人文章
                delete = input("确定删除您的文章吗?(Y/N): ")
                if delete.upper() == "Y":
                    #将文章删除
                    print("正在删除文章...")
                    d = articles.pop(title)
                    #放入回收站
                    recycle.setdefault(title, d)
                    time.sleep(1)
                    print("删除成功")
                    save_data()
                    return show_index()
                else:
                    print("放弃删除...")
                    return look_articles_self()
            else:
                print("没有这个选项,请重新输入")
                return look_articles_self()

        else:
            print("没有这篇文章")
            time.sleep(1)
            return look_articles()

def look_articles_detail(title):
    """查看文章详情"""
    #获取文章
    article = articles.get(title)
    #更改阅读次数
    rc = article.get("readed_count")
    rc += 1
    article["readed_count"] = rc
    #展示文章
    print("文章标题: {}".format(article.get("title")))
    print("文章作者: {}".format(article.get("author").get("username")))
    print("阅读次数: {}".format(article.get("readed_count")))
    print("文章内容: {}".format(article.get("content")))

    choice = input("是否进行评论(Y/N)")
    if choice.upper() == "Y":
        # 判断是否为自己的文章
        if articles[title]["author"]["username"] == online.get("username"):
            print("不可以评论自己的文章")
            return look_articles_self()
        else:
            comment = input("请输入评论内容: ")
            print("评论成功!")
            time.sleep(1)
            # 将评论内容加到文章末尾
            comment = "\n文章评论: " + comment
            articles[title]["content"] += comment

            #将文章评论保存
            save_data()
            return show_index()

    else:
        print("放弃评论...")
        input("按任意键返回首页")
        return show_index()


def login():
    """登录函数"""
    print("\t\t1.账号+密码登录")
    print("\t\t2.邮箱+密码登录")

    choice = input("请输入您的登录方式(1/2): ")
    if choice == "1":
        #账号密码登录
        username = input("请输入账号(按R键退出): ")
        if username.upper() == "R":
            return show_login()
        password = input("请输入密码(按R键退出): ")
        if password.upper() == "R":
            return show_login()

        #验证账号和密码是否正确
        if username in users and password == users.get(username).get("password"):
            #登录成功,记录登录用户并跳转到首页
            global online
            online = users.get(username)
            return show_index()
        else:
            res = input("账号或者密码输入有误,请重新输入: ")
            if res.upper() == "R":
                return show_login()
            else:
                time.sleep(1)
                return login()
    elif choice == "2":
        #邮箱密码登录
        email = input("请输入您的邮箱: ")
        pwd = input("请输入您的密码: ")
        #验证邮箱和密码是否正确
        if email in users and pwd == users.get(email).get("password"):
            #登录成功,记录当前用户
            online = users.get(email)
            return show_index()
        else:
            res = input("邮箱或者密码输入有误,请重新输入(按R键回到登录首页): ")
            if res.upper() == "R":
                return show_login()
            else:
                time.sleep(1)
                return login()
    else:
        print("没有这个选项,请重新输入")
        return login()

def register():
    """注册函数"""
    #用户输入注册信息
    username = input("请输入注册账号: ")
    if username in users:
        print("账号已经存在,请使用其他账号注册")
        time.sleep(1)
        return register()

    email = input("请输入您的邮箱:")
    if not email.endswith(".com"):
        print("邮箱格式不正确,请重新注册")
        return register()

    password = input("请输入密码: ")
    confirm = input("请再次输入密码: ")
    if password != confirm:
        print("两次密码输入不一致,请重新输入")
        time.sleep(1)
        return register()

    nickname = input("请为您的账号起一个特别的名字吧:")

    #创建用户信息,注册
    user = {"username": username,"email": email, "password": password, "nickname":nickname}
    #注册,录入到系统全局变量中
    users[username] = user
    users[email] = user

    #注册成功,将数据存储
    save_data()

    #展示登录菜单
    return show_login()

def article_publish():
    """发表文章函数"""
    #用户输入发表文章的标题、内容
    title = input("请输入文章标题: ")
    if title in articles:
        print("标题已经存在,请使用其他标题")
        time.sleep(1)
        return article_publish()

    #用户输入内容
    content = input("请输入文章内容 :")

    #创建文章
    article = {"title": title, "content": content, "author": online, "readed_count": 0}
    #将文章添加到系统中
    articles[title] = article
    save_data()
    print("文章发表中...")
    time.sleep(1)
    print("文章发表成功...")


    #跳转到首页
    return show_index()

def change_password():
    """修改登录密码"""
    password = input("请输入您的旧密码: ")
    if password != online.get("password"):
        print("密码输入错误,请重新输入")
        return change_password()

    new_password = input("请输入您的新密码: ")
    if new_password == password:
        print("新密码与旧密码一致,请重新输入")
        return change_password()

    confirm_password = input("请确认您的新密码: ")
    if confirm_password != new_password:
        print("两次新密码输入不一致,请重新输入")
        return change_password()

    #修改完成,将新密码保存到系统中
    print("密码修改成功,请使用新密码登录")
    online["password"] = new_password

    save_data()
    #返回登录首页
    time.sleep(1)
    return show_login()


def userinfo_perfect():
    """个人信息完善"""
    print("完善一下您的信息吧")
    phone = input("请输入您的手机号: ")
    if len(phone) != 11:
        print("手机号码格式不正确,请重新输入")
        return userinfo_perfect()

    gender = input("请输入您的性别(男/女): ")

    age = int(input("请输入您的年龄: "))

    #将完善的信息添加到系统中
    online.setdefault("phone",phone)
    online.setdefault("gender",gender)
    online.setdefault("age", age)

    print("信息完善成功...")

    for k, v in users.items():
        print(k,v)
    time.sleep(1)

    save_data()
    return show_index()


def recycle_bin():
    """回收站"""
    global recycle
    global articles
    #查看回收站
    for i,v in recycle.items():
        print("回收站内容: ", i,v)
    print("\t\t1.恢复删除的文章")
    print("\t\t2.清空回收站")

    #用户输入选项
    if len(recycle) > 0:
        choice = input("请输入您的选项(1/2): ")
        if choice == "1":
            #恢复删除的文章
            articles.setdefault(i,v)
            print("文章恢复成功!")
            recycle.clear()

            save_data()
            return show_index()

        elif choice == "2":
            #清空回收站
            print("回收站即将清空...")
            recycle.clear()
            print("回收站内容: ", recycle)
            time.sleep(1)
            save_data()
            return show_index()
        else:
            print("没有这个选项")
            return show_index()
    else:
        print("回收站为空,即将回到首页")
        time.sleep(1)
        return show_index()

def exit_system():
    """退出系统"""
    for i in range(0, 3):
        print("系统将在{}秒后退出".format(3 - i))
        time.sleep(1)
    sys.exit(1)

def save_data():
    """将数据存储到文件中"""
    f = open("./data/1.txt", "wb")
    pickle.dump(users, f)
    pickle.dump(articles, f)
    f.close()

def get_data():
    """从文件中读取数据"""
    global  users, articles
    f1 = open("./data/1.txt", "rb")
    users = pickle.load(f1)
    articles = pickle.load(f1)
    f1.close()


#用户数据
users = dict()
#文章数据
articles = dict()
#回收站数据
recycle = dict()

#创建一个变量,记录在线登录的用户
online = None

#定义登录选项和函数的对应关系
login_menu_dict = {
    "1": login,
    "2": show_register,
    "3": exit_system
}

#定义首页选项和函数的对应关系
index_menu_dict = {
    "1": look_articles,
    "2": look_articles_self,
    "3": article_publish,
    "4": change_password,
    "5": userinfo_perfect,
    "6": recycle_bin,
    "7": show_login,
    "8": exit_system
}


def engine():
    """引擎"""
    #初始化数据
    get_data()
    #展示登录菜单
    show_login()

#启动程序
engine()

猜你喜欢

转载自blog.csdn.net/qq_41828603/article/details/86659550
今日推荐