写程序完成下列功能:(20分,有5分加分项,共计25分)
1),启动程序,首页面应该显示成如下格式:
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程 序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志, 日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢 迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录(完成自动登录+5 分),然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。
mport time
dic = {
'name':None,
'flag':False
} #字典内的这个flag充当着很重要的作用 它是所有语句的起点 用来判断的
#这个字典用来存储你注册或者登陆后的名字
#再定义一个标志位用来结束整个执行的过程的
flag1 = True
def func1(*args,**kwargs): # 这个是登陆的信息
num = 0
while num < 3 :
if args: #这一步是为了判断你是否进行传参就是进行的登陆的操作
dic['name'] = args[0]
dic['flag'] = True
return True #为了让接下来的判断可以执行
else:
username = input('请输入您登陆的名字').strip()
password = input('asd').strip() #不用int是因为你熊文件中读取出来也是字符的类型
with open('register', encoding= 'UTF-8') as f :
for line in f :
line_list = line.strip().split()
if username == line_list[0] and password == line_list[1]:
print('登陆成功')
dic['name'] = username #把信息写入字典内 以便于后面的调用
dic['flag'] = True
return True
else :
print('登陆错误,请重新登陆,您还剩余%s次机会'%(2-num))
if num == 2 :break
num += 1
def func2(*args,**kwargs): #注册的功能
flag =True
while flag:
username = input('请输入您要注册的信息').strip()
with open('register', encoding = 'UTF-8', mode='r+')as f1:
for i in f1 :
l =i.strip().split()
if username == l [0]:
print('您输入的信息已经在里面了 所以请您重新注册')
break #结束for 循环回到while循环语句
else :
password = input('请输入您注册的密码').strip()
f1.write('\n{}\t{}'.format(username, password)) #把注册的信息写入register文件内
print('恭喜您已经登陆成功 已经为您自动登陆了')
return func1(username, password) #因为注册成功后要自动登陆 所以我们要调用登陆的信息把注册名字密码传递进去
def wrapper(func): #这个装饰器是用来判断你是否已经登陆了的,登陆过后的字典的flag会被改变 我们以这个为区分点
def inner(*args,**kwargs):
if dic['flag']: # 这个是登陆成功后
ret = func(*args,**kwargs)
return ret
else:
print('请先进行登陆')
if func1(): #这个是调用登陆的函数然后你登陆成功后把return True返回回来后再执行下面的
ret = func(*args, **kwargs)
return ret
return inner
def login(func): #这个是让你登陆后把你登陆的信息写入进去
def inner(*args, **kwargs):
struct_time = time.localtime()
time_now = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
with open('log',encoding = "UTF-8",mode = 'r+')as f:
f.write('用户:{} 在{} 执行了 {}函数\n'.format(dic['name'], time_now,func.__name__))
ret = func(*args,**kwargs)
return ret
return inner
@wrapper
@login
def func3():#文章页面
print('欢迎%s访问文章页面' % dic['name'])
@wrapper
@login
def func4():#日记页面
print('欢迎%s访问日记页面' % dic['name'])
@wrapper
@login
def func5(): #评论页面
print('欢迎%s访问评论页面' % dic['name'])
@wrapper
@login
def func6():# 收藏
print('欢迎%s访问收藏页面' % dic['name'])
@wrapper
@login
def func7(): #注销的页面
print('这是注销的页面')
dic['name'] = None
dic['flag'] = False #把所有的信息全部都设定为最开始为0 所有的 信息都不存在了
print('注销成功')
@wrapper
@login
def func8():
print('这个是退出')
global flag1 #先把全局变量引用进来
flag1 =False
return flag1 #还要把所有的信息都返还出去
choice_dic = {
1:func1,
2:func2,
3:func3,
4:func4,
5:func5,
6:func6,
7:func7,
8:func8
}
while flag1 :
s = '''
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
'''
print(s)
choice_num = input('请输入您要选择的序列号').strip()
if choice_num.isdigit():
choice_num = int(choice_num)
if 0 <choice_num < len(choice_dic ):
choice_dic[choice_num]()
else :
print('输入的超出范围请重新输入')
else :
print('您输入的有误请重新输入')