模拟博客园登录系统程序
'''
用代码模拟博客园系统。
项目分析:
一.首先启动程序,页面显示下面内容供用户选择:
1.请登录
2.请注册')
3.进入文章页面
4.进入评论页面
5.进入日记页面
6.进入收藏页面
7.注销账号
8.退出整个程序
二.必须实现的功能:
1.注册功能要求:
a.用户名、密码要记录在文件(username)中。
b.用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。
c.密码要求:长度要在6~14个字符之间。
2.登录功能要求:
a.用户输入用户名、密码进行登录验证。
b.登录成功之后才能访问3~7选项,如果没有登录或登录不成功是访问3~7选项。
不允许访问,让其先登录。(装饰器)
c.超过三次登录还未成功,则退出整个程序。
3.进入文章页面要求:
a.提示欢迎xx进入文章页面。
b.此时用户可以选择:直接写入内容,还是导入md文件。
① 如果选择直接写入内容:让用户直接写文件名|文件内容。最后创建一个文章。
② 如果选择导入md文件:让用户输入已经准备好的md文件的文件路径
(相对路径即可:比如 一.md ),然后将此md文件的全部内容写入文章(一.text)中。
4.进入评论页面要求:
提示欢迎xx进入评论页面。
5.进入日记页面要求:
提示欢迎xx进入日记页面。
6.进入收藏页面要求:
提示欢迎xx进入收藏页面。
7.注销账号要求:
不是退出整个程序,而是将已经登录的状态变成未登录的状态(访问3~7选项时
需要重新登录)。
8.退出整个程序要求:
就是结束整个程序。
'''
def table_print():
'''
打印目录
'''
print('1.请登录')
print('2.请注册')
print('3.进入文章页面')
print('4.进入评论页面')
print('5.进入日记页面')
print('6.进入收藏页面')
print('7.注销账号')
print('8.退出整个程序')
def get_user_pwd():
'''
获取用户名及密码,加入一个列表中
@return: user_dict 用户名,密码的字典
'''
user_dict = {} # 建立用户名,密码的字典,字典的键为用户名,值为密码
with open('username', encoding='utf-8') as f: # 读取包含用户名密码的文件
for line in f: # 按行读取,并把用户名,密码分开,填入字典
line_list = line.strip().split('|')
user_dict[line_list[0].strip()] = line_list[1].strip()
return user_dict
def registration():
'''
注册操作
@return:
'''
while 1:
registration_name = input('请输入用户名(只能含有字母或数字):')
registration_pwd = input('请输入密码(长度6~14个字符):')
if registration_name.isalnum() and 6 <= len(registration_pwd) <= 14: # 判断输入的用户名是否符合要求
u_dict = get_user_pwd()
if registration_name in list(u_dict.keys()): # 用户名存在
print('您输入的用户名已存在,请重新输入')
else:
with open('username', encoding='utf-8', mode='a') as f2:
f2.write(registration_name + '|' + registration_pwd + '\n') # 符合要求者,添加到用户名密码文件中
break
else:
print('您输入的用户名或密码不正确,请重新输入')
continue
print('注册成功')
# 登录状态字典,用于判断是否有用户已经登录。
login_status_dict = {
'username': None,
'status': False,
}
def login():
'''
登录操作
@return:
'''
u_dict = get_user_pwd()
count = 1
print('请登录')
while count < 4: # 超过三次登录还未成功,则退出整个程序。
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
if username in u_dict.keys() and password == u_dict[username]: # 判断用户名密码是否正确
print('登录成功')
login_status_dict['username'] = username # 修改登录状态字典的,登录用户名。
login_status_dict['status'] = True # 修改登录状态字典的,登录状态。
return True
else:
print('用户名或密码错误')
count += 1
print('用户名密码输入三次均不正确,自动退出程序。')
return False
def auth(f):
'''
判断是否有用户已经登录的装饰器
@param f: 修饰的函数名
@return: inner
'''
def inner(*args,**kwargs):
if login_status_dict['status']: # 如果已有用户登录,则直接运行被修饰函数
ret = f(*args,**kwargs)
return ret
else:
if login(): # 如果没有用户登录,则进行登录操作。
ret = f(*args,**kwargs)
return ret
return inner
@auth
def article():
'''
文章页面
@return:
'''
while 1:
print(f'欢迎{login_status_dict["username"]}进入文章页面')
write_art_num = input('选择直接写入内容输入1,选择导入md文件输入2,输入B或b返回上一个页面,输入Q或q直接退出:').strip()
if write_art_num.isdecimal(): # 选择进行的操作
write_art_num = int(write_art_num)
if write_art_num == 1: # 进行直接写入操作
article_name = input('请输入文件名:')
article_content = input('请输入文件内容:')
with open(article_name,encoding='utf-8',mode='w') as f3: # 直接写入用户输入的内容
f3.write(article_content)
elif write_art_num == 2: # 进行md文件写入操作
article_name = input('请输入md文件的路径:')
with open(article_name,encoding='utf-8',mode='r') as f4,\
open(article_name[:-2] + 'text',encoding='utf-8',mode='w') as f5:
f5.write(f4.read()) # 读取并写入
else:
print('您输入有误,请重新输入')
elif write_art_num.upper() == 'B': # 返回上一页面
break
elif write_art_num.upper() == 'Q': # 直接退出程序
return
return True
@auth
def comment():
'''
评论页面
@return:
'''
print(f'欢迎{login_status_dict["username"]}进入评论页面')
if back_quit():
return True
else:
return
@auth
def dariy():
'''
日记页面
@return:
'''
print(f'欢迎{login_status_dict["username"]}进入日记页面')
if back_quit():
return True
else:
return
@auth
def collect():
'''
收藏页面
@return:
'''
print(f'欢迎{login_status_dict["username"]}进入收藏页面')
if back_quit():
return True
else:
return
@auth
def cancel_login():
'''
注销登录
@return:
'''
login_status_dict['username'] = None # 把登录状态字典的登录者姓名改为None
login_status_dict['status'] = False # 把登录状态改为False
print('您已注销')
if back_quit():
return True
else:
return
def back_quit():
'''
返回或直接退出
@return:
'''
while 1:
s_quit = input('输入B或b返回上一个页面,输入Q或q直接退出:').strip()
if s_quit.upper() == 'B':
break
elif s_quit.upper() == 'Q':
return
else:
print('您输入有误请重新输入')
return True
def main():
'''
主函数
@return:
'''
while 1:
table_print() # 打印目录
open_num = input('请输入您要进行的操作的序号:').strip() # 选择进行的操作
if open_num.isdecimal(): # 判断用户输入的序号是否符合规定
open_num = int(open_num) # 将序号变为int 类型
if open_num == 1:
login() # 执行登录操作
elif open_num == 2:
registration() # 执行注册操作
elif open_num == 3:
if article(): # 进入文章页面
continue
else:
return
elif open_num == 4:
if comment(): # 进入评论页面
continue
else:
return
elif open_num == 5:
if dariy(): # 进入日记页面
continue
else:
return
elif open_num == 6:
if collect(): # 进入收藏页面
continue
else:
return
elif open_num == 7:
if cancel_login(): # 进入注销账号页面
continue
else:
return
elif open_num == 8:
return
else:
print('您输入有误,请重新输入。')
else:
print('您输入有误,请重新输入。')
if __name__ == '__main__':
main()