'''
个人博客开发
登录菜单
注册菜单
首页菜单
查看所有文章
查看个人文章
查看文章详情
回收站
注册
登录
发表文章
用户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()
python 个人博客开发,注释详细,适合新手阅读
最新推荐文章于 2023-09-25 12:54:36 发布