利用装饰器模拟博客园登陆

要求:

项目分析:一.首先程序启动,页面显示下面内容供用户选择:

1.请登录2.请注册3.进入文章页面4.进入评论页面5.进入日记页面6.进入收藏页面7.注销账号8.退出整个程序

二.必须实现的功能:

1.注册功能要求:a.用户名、密码要记录在文件中。b.用户名要求:只能含有字母或者数字不能含有特殊字符并且确保用户名唯一。c.密码要求:长度要在6~14个字符之间。d.超过三次登录还未成功,则退出整个程序。

2.登录功能要求:a.用户输入用户名、密码进行登录验证。b.登录成功之后,才可以访问3 ~~ 7选项,如果没有登录或者登录不成功时访问3 ~~7选项,不允许访问,让其先登录。(装饰器)

3.进入文章页面要求:a.提示欢迎xx进入文章页面。b.此时用户可以选择:直接写入内容,还是导入md文件。①如果选择直接写内容:让学生直接写文件名|文件内容......最后创建一个文章。

②如果选择导入md文件:让用户输入已经准备好的md文件的文件路径(相对路径即可:比如函数的进阶.md),然后将此md文件的全部内容写入文章(函数的进阶.text)中。

4.进入评论页面要求:提示欢迎xx进入评论页面。

5.进入日记页面要求:提示欢迎xx进入日记页面。6.进入收藏页面要求:提示欢迎xx进入收藏页面。

7.注销账号要求:不是退出整个程序,而是将已经登录的状态变成未登录状态(访问3~7选项时需要重新登录)。

8.退出整个程序要求:就是结束整个程序。

三.选做功能:

1.评论页面要求:a.提示欢迎xx进入评论页面。b.让用户选择要评论的文章。这个需要借助于os模块实现此功能。将所有的文章文件单独放置在一个目录中,利用os模块listdir功能,可以将一个目录下所有的文件名以字符串的形式存在一个列表中并返回。例如:

代码:import osprint(os.listdir(r'D:\teaching_show\article'))



import
os # 登录状态 status_dic = { 'username': None, 'status': False } flag = True # 用户名,密码 以字典形式打开 def user_pwd(): with open("user", encoding="utf-8") as f: dic = {} for i in f: li = i.strip().split("|") dic[li[0].strip()] = li[1] return dic # 登录函数 def login(): u_p = user_pwd() count = 0 while count < 3: username = input("请输入姓名: ").strip() password = input("请输入密码: ").strip() if username in u_p and password == u_p[username]: status_dic["username"] = username status_dic['status'] = True # 状态改为True print("登陆成功") return True else: print("账号或密码错误,请重新登录") count += 1 # 注册函数 def register(): while 1: dict1 = user_pwd() username = input("请输入新账号: ").strip() password = input("请输新入密码: ").strip() if username in dict1: # 判断用户是否在文件中存在 print("用户名已存在,请重新输入") continue elif not username.isalnum(): # 判断用户是否是字母或数字组成 print("账号含有非法字符,请重新输入") continue elif 5 < len(password) < 15: # 限制密码在6-14位之间 with open("user", encoding="utf-8", mode="a") as f1: f1.write(username+"|"+password+"\n") print("恭喜!注册成功") return True else: print("密码不合规范,请重新输入") # 装饰器 def auth(f): # 限制3-7选项,没有登陆不能访问 def inner(*args, **kwargs): if status_dic["status"]: ret = f(*args, **kwargs) return ret else: print("-------登录页面-------") login() ret = f(*args, **kwargs) return ret return inner @auth def article(): print(f'欢迎{status_dic["username"]}访问文章页面') print(""" 1.写入文件 2.导入md文件 """) while 1: choice = input("请输入要选择的操作:").strip() if choice == "1": file_name = input("输入文件名:").strip() content = input("请输入内容").strip() with open(r'article/'+file_name, encoding="utf-8", mode="a") as f1: f1.write(content) print("写入文章成功") break if choice == "2": with open("函数的进阶.md", encoding="utf-8") as f2,\ open(r"article/"+"函数的进阶.text", encoding="utf-8", mode="w") as f3: f3.seek(0) for i in f2: f3.write(i) print("导入文件成功") break else: print("您输入的不合规范") @auth def diary(): print(f'欢迎{status_dic["username"]}访问日记页面') @auth def comment(): print(f'欢迎{status_dic["username"]}访问评论页面') file = os.listdir(os.path.dirname(__file__)+'/article') # 把article文件夹里的文件,变成列表形式 for index, obj in enumerate(file, 1): # 循环列表 print(index, obj) while 1: choice = input("请输入要评论的文章的序号:").strip() if choice.isdigit(): choice = int(choice) if 0 < choice <= len(file): # 限制用户输入序号的范围 path = os.path.join(os.path.dirname(__file__)+'/article', file[choice-1]) # 拼接路径,找到该文件 with open(path, encoding="utf-8", mode="r+") as f1: ret = f1.read() print(ret) content = input("请输入要评论的内容") sensitive = ["苍老师", "东京热", "武藤兰", "波多野结衣"] # 此列表为敏感字符 for i in range(len(sensitive)): # 敏感字符替换等长度* if sensitive[i] in content: content = content.replace(sensitive[i], '*' * len(sensitive[i])) if "-"*20 not in ret: # 判断如果不在这里加上"评论区"三个字 f1.write("评论区:" + "\n" + "-"*20 + "\n" + f'{status_dic["username"]}:\n{content}' + "\n") print("评论成功") return True else: # 否则直接写入评论 f1.write(f'{status_dic["username"]}:\n{content}' + "\n") print("评论成功") return True else: print("请选择正确的文章序号") else: print("输入内容含有非法字符") @auth def enshrine(): print(f'欢迎{status_dic["username"]}访问收藏页面') # 注销 def login_out(): status_dic['username'] = None status_dic['status'] = False print('注销成功') # 退出程序 def exit_program(): global flag flag = False return flag def run(): choice_dict = { 1: login, 2: register, 3: article, 4: diary, 5: comment, 6: enshrine, 7: login_out, 8: exit_program, } while flag: print(''' 欢迎来到博客园首页 1:请登录 2:请注册 3:文章页面 4:日记页面 5:评论页面 6:收藏页面 7:注销 8:退出程序''') choice = input('请输入您选择的序号:').strip() if choice.isdigit(): choice = int(choice) if 0 < choice <= len(choice_dict): choice_dict[choice]() else: print("您输入的超出范围") else: print("输入不合规范,重新输入") if __name__ == '__main__': run()

 

转载于:https://www.cnblogs.com/duyu123/p/11116754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值