Python 大作业2:模拟博客园系统
第二次周末大作业:博客园
作业:用代码简单地模拟博客园系统。
项目分析:
一.首先程序启动,页面显示下面内容供用户选择:
-
请登录
-
请注册
-
进入文章页面
-
进入评论页面
-
进入日记页面
-
进入收藏页面
-
注销账号
-
退出整个程序
二.必须实现的功能:
-
注册功能要求:
a. 用户名、密码要记录在文件中。
b. 用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。
c. 密码要求:长度要在6~14个字符之间。
d.超过三次登录还未成功,则推出整个程序。
-
登录功能要求:
a. 用户输入用户名、密码进行登录验证。
b. 登录成功之后,才可以访问37选项,如果没有登录或者登录不成功时访问37选项,不允许访问,让其先登录。(装饰器)
c. 超过三次登录还未成功,则退出整个程序。
-
进入文章页面要求:
a. 提示欢迎xx进入文章页面。
b. 此时用户可以选择:直接写入内容,还是导入md文件。
① 如果选择直接写内容:让学生直接写文件名|文件内容...... 最后创建一个文章。
②如果选择导入md文件:让用户输入已经准备好的md文件 的文件路径(相对路径即可:比如函数的进阶.md),然后将 此md文件的全部内容写入文章(函数的进阶.text)中。
-
进入评论页面要求:
提示欢迎xx进入评论页面。
-
进入日记页面要求:
提示欢迎xx进入日记页面。
-
进入收藏页面要求:
提示欢迎xx进入收藏页面。
-
注销账号要求:
不是退出整个程序,而是将已经登录的状态变成未登录状态(访问3~7选项时需要重新登录)。
-
退出整个程序要求:
就是结束整个程序。
三.选做功能:
-
评论页面要求:
a. 提示欢迎xx进入评论页面。
b. 让用户选择要评论的文章。
这个需要借助于os模块实现此功能。将所有的文章文件单独 放置在一个目录中,利用os模块listdir功能,可以将一个目录下 所有的文件名以字符串的形式存在一个列表中并返回。
import os
print(os.listdir(r'D:\teaching_show\article'))
# ['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'data\users_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('\n')
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'data\users_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.\nPRESS 2: write an article by markdown.\nPRESS 3:exit.\n')
if choice == '1':
temp_info = input('PLS input ur filename and contents, divided by "|".\n')
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.\n')
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('\n' + str(user) + ':')
# 虽然user运行到这里必然是一个字符串类型,可是全局变量设置的时候把它设置成了None,所以为了安全起见还是在外面套了一个str函数
file_handler.write('\n' + comment)
else:
file_handler.write('\n' + '评论区:')
file_handler.write('\n' + '-----------------------------------------')
file_handler.write('\n' + str(user) + ':')
file_handler.write('\n' + 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()