博客园需求,利用装饰器添加功能
项目需求:
1、用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
2、用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志,日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢迎xx用户 访问评论(文章,日记,收藏)页面
3、如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录,然后进入首页选择。
4、注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
5、退出程序为结束整个程序运行。
1 def decorator(func): 2 ''' 3 增加相关页面的功能 4 :param func: 相关页面函数 5 :return: 6 ''' 7 menu_list = [3,4,5,6] 8 def inner(*args,**kwargs): 9 for i in menu_list: 10 if user_choose == i and user_list == []: 11 info = login() 12 user_list.append(info) 13 log_info = '%s在%s执行了%s函数'%(info,time,func.__name__) 14 logfile(log_info) 15 ret = func(*args,**kwargs) 16 if info == '未知账户': 17 print('%s不允许访问,可以选择注册菜单进行注册!'%info) 18 else: 19 print('欢迎%s用户访问%s' % (info, ret)) 20 return ret 21 elif user_choose == i and user_list != []: 22 log_info = '%s在%s执行了%s函数' % (user_list[0], time, func.__name__) 23 logfile(log_info) 24 ret = func(*args, **kwargs) 25 print('欢迎%s用户访问%s' % (user_list[0], ret)) 26 return ret 27 28 return inner 29 def exit_program(): 30 ''' 31 退出程序 32 :return: 33 ''' 34 print('再见!') 35 exit() 36 return 37 def cancellation(): 38 39 ''' 40 注销 41 :return: 42 ''' 43 user = user_list[0] 44 print('已经注销“%s”账户'%user) 45 user_list.clear() 46 return 47 48 @decorator 49 def collection_page(): 50 51 ''' 52 收藏页面 53 :return: 54 ''' 55 return ' 收藏页面' 56 @decorator 57 def comment_page(): 58 59 ''' 60 评论页面 61 :return: 62 ''' 63 return '评论页面' 64 @decorator 65 def diary_page(): 66 67 ''' 68 日记页面 69 :return: 70 ''' 71 return '日记页面' 72 @decorator 73 def article_page(): 74 75 ''' 76 文章页面 77 :return: 78 ''' 79 return '文章页面' 80 def register(): 81 ''' 82 用户注册功能函数 83 :return: 返回注册后的 84 ''' 85 while True: 86 username = input('请输入注册的账户:') 87 userpasswd1 = input('请输入注册的密码:') 88 userpasswd2 = input('请再次输入注册的密码:') 89 if username == str(username): 90 if userpasswd2 == userpasswd1: 91 with open('register.txt',mode='a',encoding='utf-8') as f: 92 f.write('%s|%s|%d\n'%(username,userpasswd2,3)) 93 user_list.append(username) 94 print('注册成功!可以直接登录相关页面!') 95 return 96 else: 97 print('两次密码不同,请重新输入!') 98 continue 99 else: 100 print('用户名密码不符合要求,账号不能是数字!') 101 continue 102 103 def login(): 104 ''' 105 用户登录功能函数 106 :return: 返回登录的账户 107 ''' 108 while True: 109 username = input('请输入登录账户:') 110 userpasswd = input('请输入登录密码:') 111 if username in user_dic and user_dic[username][1] == 0: 112 print('账户已经锁定!退出程序') 113 exit() 114 elif username in user_dic and userpasswd != user_dic[username][0]: 115 user_dic[username][1] -= 1 116 print('账户密码无效,还有%s次机会'%user_dic[username][1]) 117 continue 118 elif username in user_dic and userpasswd == user_dic[username][0]: 119 user_dic[username][1] = 3 120 user_list.append(username) 121 print('登录成功!') 122 return username 123 else: 124 print('无效账号密码!') 125 return '未知账户' 126 127 128 def user_dict(): 129 ''' 130 账户文件重新写入字典,用于日后认证 131 :return: 132 ''' 133 with open('register.txt',mode='r',encoding='utf-8') as reg: 134 for i in reg: 135 user_info = i.strip('\n').split('|') 136 user_info[2]=int(user_info[2]) 137 user_dic[user_info[0]] = [user_info[1],user_info[2]] 138 139 def logfile(log): 140 ''' 141 用于记录用户账户和调用函数的日志 142 :param log: 143 :return: 144 ''' 145 with open('log.txt',mode='a',encoding='utf-8') as f: 146 f.write(log+'\n') 147 148 def homepage(): 149 ''' 150 主页显示 151 :return: 152 ''' 153 print('欢迎来到博客园首页') 154 for i in menu: 155 print('%d:%s' % (i, menu[i][0])) 156 157 menu = {1:['请登录',login], 158 2:['请注册',register], 159 3:['文章页面',article_page], 160 4:['日记页面',diary_page], 161 5:['评论页面',comment_page], 162 6:['收藏页面',collection_page], 163 7:['注销',cancellation], 164 8:['退出程序',exit_program] 165 } 166 time = time.strftime('%y年%m月%d日 %H:%M:%S') 167 user_list = [] 168 user_dic = {} 169 user_dict() 170 print('欢迎来到博客园首页') 171 for i in menu: 172 print('%d:%s' % (i, menu[i][0])) 173 while True: 174 user_choose = input('请选择页面ID:') 175 if user_choose.isdecimal(): 176 user_choose = int(user_choose) 177 if user_choose in menu: 178 menu[user_choose][1]() 179 180 else: 181 print('输入的不是数字,请输入数字ID')

浙公网安备 33010602011771号