python 个人博客开发,注释详细,适合新手阅读

'''
个人博客开发
    登录菜单
    注册菜单
    首页菜单
    查看所有文章
    查看个人文章
    查看文章详情
    回收站

    注册
    登录
    发表文章

    用户users = dict()
        u1 = {"username":"admin","password":"123","nickname":"小刘" }

    文章articles = dict("标题":a1)
        a1 = {"title":"标题","author":u1,"count":"内容",readed_count:0}
'''
# 引入依赖的模块
import os, sys,time,shelve
users = dict()
emails = dict()
articles = dict()
online = None
# 定义函数
def show_login():
    '''展示登录首页'''
    print("\t\t个人博客项目开发")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")
    print("\t\t1.用户登录")
    print("\t\t2.用户注册")
    print("\t\t3.退出系统")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")

    # 用户输入选项
    choice = input("请输入选项:")
    # if choice == "1":
    #     # 展示用户登录菜单
    #     pass
    # elif choice == "2":
    #     # 展示注册菜单
    #     pass
    # elif choice =="3":
    #     # 调用退出系统函数
    #     return exit_system()
    # else:
    #     # 输入的选项不存在,请重新输入
    #     print("您输入的选项不存在,请重新输入")
    #     return show_login()

    return login_menu_dict.get(choice)() if choice in login_menu_dict else show_login()


def show_register():
    '''展示注册菜单'''
    print("\t\t系统用户注册")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")
    print("\t欢迎来到PY1901个人博客系统")
    print("\t请按照提示信息,录入个人资料,完成注册")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")
    time.sleep(2)

    # 用户开始注册
    return register()

def show_index():
    '''展示首页菜单'''
    print("\t\t个人博客项目")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")
    print("\t\t1.查看所有文章")
    print("\t\t2.查看个人文章")
    print("\t\t3.发表文章")
    print("\t\t4.个人信息维护")
    print("\t\t5.查看个人信息")
    print("\t\t6.修改密码")
    print("\t\t7.回收站")
    print("\t\t8.返回上一级")
    print("\t\t9.退出系统")
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")

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

    # 调用首页菜单的选项函数并判断选项是否存在,存在执行choice选项,否则继续执行show_index()
    return index_menu_dict.get(choice)() if choice in index_menu_dict else show_index()

def look_articles():
    '''查看所有文章'''
    # 循环查看文章详情即可
    print("\t\t标题\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_article_detail(title)
        else:
            print("没有这篇文章")
            time.sleep(1)
            return look_articles()

def look_articles_self():
    '''查看并删除自己的文章'''
    print("标题","\t作者")
    # 在全部文章中循环遍历出 articles 的键值 ,并赋值给 title_key 变量; 输出 title_key 即为依次输出字典 articles 里的所有key值
    # articles.keys 查询字典中的key值
    for title_key in articles.keys():
        # 如果在循环遍历出的全部文章这个大字典中存在 articles 的键值 title_key
        # (即大字典 articles 不是空字典,里面已经有文章存在)并通过键值找到 title_key 对应的 value 值中的小字典的 key值 "author"
        # 如果"author"对应的value值中存在更小一级的字典,且字典中有key值"username",
        # 判断该"username"对应的value值是否等于当前在线用户online:的key值"username",
        # 所对应的value值;如果两个key值"username" 对应的value值相同
        if articles.get(title_key).get("author").get("username") == online.get("username")\
                and articles.get(title_key).get("state") == "normal":
                # 并且articles 的其中一个键值 title_key所对应的value值是一个小字典,
                # 并且该小字典中的key值"state"对应的value值为"normal"则执行下面一行代码
            print(title_key,"\t\t",articles.get(title_key).get("author").get("username"))
            # print(title_key,"\t\t",online.get("username"))
    title = input("请输入要查找的文章标题(R键返回首页):")
    if title.upper() == "R":
        return show_index()
    else:
        #判断文章是否存在,如果存在,展示
        if title in articles:
            choice = input("按任意键查看文章,按“D”删除文章:")
            # 如果选择D则修改文章的状态为abnormal
            if choice == "D":
                articles[title]["state"] = "abnormal"
                print("删除成功,可在回收站内恢复")
                time.sleep(1)
                return look_articles_self()
            else:
                return look_article_detail(title)
        else:
            print("没有这篇文章或文章已被删除")
            time.sleep(1)
            return look_articles_self()

def look_article_detail(title):
    '''查看文章详情'''
    #获取文章
    article = articles.get(title)
    #更改阅读次数
    rc = article.get("read_count")
    rc += 1
    article["read_count"] = rc
    #展示文章
    print("文章标题:{}".format(article.get("title")))
    print("文章作者:{}".format(article.get("author").get("username")))
    print("阅读次数:{}".format(article.get("read_count")))
    print("文章内容:{}".format(article.get("content")))
    input("按任意键返回首页")
    return show_index()

def login():
    '''登录函数'''
    #判断使用邮箱登录还是使用密码登录
    choice = input("输入“1”选择账号登录;输入“2”选择邮箱登录:")
    if choice == "1":
        username = input("请输入账号:")
        password = input("请输入密码:")
        if username in users and users.get(username).get("password") == password:
            global online
            online = users.get(username)
            return show_index()
        else:
            choice = input("您输入的账号或者密码有误,请重新输入(按R退出登录)")
            if choice =="R":
                return show_login()
            return login()
    if choice == "2":
        email = input("请输入邮箱:")
        password = input("请输入密码:")
        if email in emails and emails.get(email).get("password") == password:
            # global online
            online = emails.get(email)
            return show_index()
        else:
            choice = input("您输入的邮箱或者密码有误,请重新输入(按R退出登录)")
            if choice == "R":
                return show_login()
            return login()
    if choice != "1" or "2" :
        print("您输入的选项不存在")
        return login()

def register():
    '''注册函数'''
    # 邮箱
    email = input("请输入邮箱:")
    if email in users:
        print("您输入的邮箱已存在,请重新输入:")
        return register()
    else:
        if email.endswith("@qq.com") or email.endswith("@163.com"):
            # 账号
            username = input("请输入账号:")
            # 判断账号是否在全局变量users字典中
            if username in users:
                print("您输入的账号已存在,请重新输入")
                return register()
            nickname = input("请输入昵称:")
            password = input("请输入密码:")
            confirm = input("请确认密码:")
            if password != confirm:
                print("两次密码不一致,请重新输入")
                time.sleep(1)
                return register()
            print("恭喜您,注册成功!")
            time.sleep(1)
            # 创建用户信息,注册
            user = {"email":email,"username":username,"password":password,"nickname":nickname}
            # 将用户信息录入到全局变量中
            users[username] = user   #人有名字,名字属于人的一部分,用人的名字作为key值区分人的唯一性,也就是用户的唯一性
            emails[email] = user
            save_data()
            return show_login()
        else:
            print("您输入的邮箱格式有误,请重新注册")
            time.sleep(1)
            return register()

def xiu_gai_mi_ma():
    '''修改密码函数'''
    #输入原密码
    yuan_mi_ma = input ("请输入原密码:")
    if yuan_mi_ma in users:
        new_password = input("请输入修改密码:")
        confirm = input("请确认修改密码:")
        if new_password != confirm:
            print("您输入的两次密码不一致,请重新输入")
            return xiu_gai_mi_ma()
        else:
            online["password"]=new_password
            print("密码修改成功,请使用新密码重新登录")
            time.sleep(1)
            return show_login()

    else:
        print("您输入的原密码有误,请重新输入")
        time.sleep(1)
        return xiu_gai_mi_ma()

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,"read_count":0,"state":"normal"}

    # 将文章添加到系统
    articles[title] = article

    print("文章发表中......")
    time.sleep(1)
    print("文章发表成功!")
    time.sleep(1)
    return show_index()

def recycle_bin():
    '''回收站函数'''
    print("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~")
    print("\t\t回收站")
    # 如果在循环遍历出的全部文章这个大字典中存在 articles 的键值 title_key
    # (即大字典 articles 不是空字典,里面已经有文章存在)并通过键值找到 title_key 对应的 value 值中的小字典的 key值 "author"
    # 如果"author"对应的value值中存在更小一级的字典,且字典中有key值"username",
    # 判断该"username"对应的value值是否等于当前在线用户online:的key值"username",
    #所对应的value值;如果两个key值"username" 对应的value值相同
    # 并且在全部文章中循环遍历出articles的键(key)值 ,并赋值给title_key变量; 如果输出
    # title_key即为依次输出字典articles里的所有key值,不输出(print)则只是循环遍历一遍
    # !!articles.keys 查询字典中的key值;articles.get(title_key) 查询key值对应的value值
    for title_key in articles.keys():
        # 如果在循环遍历出的全部文章这个大字典中存在articles的键值title_key (即大字典articles
        # 不是空字典,里面已经有文章存在)并通过键值找到 title_key对应的value值中的小字典的key值"state"
        # 如果"state"对应的value值为"abnormal"则执行此if语句中的代码
        if articles.get(title_key).get("author").get("username") ==online.get("username") and\
           articles.get(title_key).get("state") == "abnormal":
            print("###########################################################")
            print("\t\t\t标题\t\t\t作者")
            print("\t\t",title_key,"\t\t\t",articles[title_key].get("author").get("username"))
            print("###########################################################")
            title = input("输入要恢复或者删除的文章“标题名称”R键退出回收站")
            if title == title_key:
                res = input("选择R恢复文章,其他任意键彻底删除")
                if res == "R":
                    articles[title_key]["state"] = "normal"
                    input("文章已恢复,按任意返回")
                    return recycle_bin()
                else:
                    articles.pop(title_key)
                    print("文章正在删除中...")
                    time.sleep(1)
                    input("删除成功,任意键返回...")
                    return recycle_bin()
            if title == "R":
                return show_index()
            else:
                print("没有该文章,请确认后重新输入")
                time.sleep(1)
                return recycle_bin()
    else:
        input("回收站空空如也,什么也没留下(按任意键退出回收站)~~")
        return show_index()

def userinfo_percent():
    '''个人信息维护'''
    #TODO 个人信息维护
    pass
    # # 手机号
    # tel = input("请输入手机号:")
    # # 性别
    # sex = input("请输入性别:")
    # # 年龄
    # age = input("请输入年龄:")
    # # 将个人信息存储起来
    # user = {"tel":tel,"sex":sex,"age":age}
    # users[online]["username"] = user
    # print("信息录入完成")
    # time.sleep(1)
    # return show_index()

def look_xin_xi():
    '''查看个人信息'''
    #TODO 查看个人信息
    pass
    # print("手机号:",users.get("username").get("tel"))
    # print("性别:",users.get("username").get("sex"))
    # print("年龄:",users.get("username").get("age"))
    # choice = input("按任意键返回首页,按R修改个人资料")
    # if choice == "R":
    #     return userinfo_percent()
    # else:
    #     return show_index()


def save_data():
    '''定义一个将数据存储到文件中的函数'''
    # 用shelve函数创建/打开本地文件夹:{(位置) ./data/blog.data } 并将该文件夹赋值给变量file,方便存入数据时调用
    file = shelve.open("./data/blog.data")
    # 将全局变量users、articles,分别以"users"、"articles"的名称作为key值, file作为字典名称保存到本地文件夹中
    file["users"] = users
    file["articles"] = articles
    file["emails"] = emails

def get_data():
    '''定义一个将保存到本地的文件中的数据读取出来的函数'''
    # 每次登录的用户不一定是同一个人,所以要声明能够修改users和articles的数据
    global users,articles,emails
    # 用shelve函数打开本地文件夹:{(位置)./ data / blog.data} 并将该文件夹赋值给变量file,方便读取文件夹内的数据时调用
    file = shelve.open("./data/blog.data")
    # 将file字典中的key值"users"对应的 value值:也就是保存到文件夹中的users内的信息调取出来并赋值给users
    users = file["users"]
    # 将file字典中的key值"users"对应的value值:也就是保存到文件夹中的articles内的信息调取出来并赋值给users
    articles = file["articles"]
    emails = file["emails"]
def exit_system():
    '''退出系统'''
    # 先保存数据到本地文件夹中
    save_data()
    for i in range(0,3):
        print("系统将在{}s后退出".format(3-i))
        time.sleep(1)
    sys.exit(1)

# 定义首页登录页面的选项和函数的对应关系
login_menu_dict ={
    "1":login,
    "2":register,
    "3":exit_system
}
# 定义首页菜单页面的选项和函数的对应关系
index_menu_dict = {
    "1":look_articles,
    "2":look_articles_self,
    "3":article_publish,
    "4":userinfo_percent,
    "5": look_xin_xi,
    "6":xiu_gai_mi_ma,
    "7":recycle_bin,
    "8":show_login,
    "9":exit_system
}

def engine():
    # 初始化引擎:展示登录菜单
    is_ok = os.path.exists("./data/blog.data.dat")
    if not is_ok:
        save_data()
    # 引入保存到文件夹中的数据
    get_data()
    # 展示首页
    show_login()

# 执行engine函数
engine()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值