import pickle import os.path from datetime import datetime from admin_service import ADMIN_NAME from flask import * # from app import Yaml # from app.Article import get_today_article, load_freq_history # from app.WordFreq import WordFreq # from app.wordfreqCMD import sort_in_descending_order import Yaml from Article import get_today_article, load_freq_history from WordFreq import WordFreq from wordfreqCMD import sort_in_descending_order import pickle_idea import pickle_idea2 import logging logging.basicConfig(filename='log.txt', format='%(asctime)s %(message)s', level=logging.DEBUG) # 初始化蓝图 userService = Blueprint("user_bp", __name__) path_prefix = '/var/www/wordfreq/wordfreq/' path_prefix = './' # comment this line in deployment @userService.route("/get_next_article/",methods=['GET','POST']) def get_next_article(username): user_articlesWithoutNewWords_record = path_prefix + 'static/frequency/' + 'ArticlesWithoutNewWords_%s.pickle' % (username) user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) session['old_articleID'] = session.get('articleID') if request.method == 'GET': visited_articles = session.get("visited_articles") if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来,无需index+=1 visited_articles['article_ids'].pop() else: # 当前不为“null”,直接 index+=1 visited_articles["index"] += 1 session["visited_articles"] = visited_articles logging.debug('/get_next_article: start calling get_today_arcile()') visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'),user_articlesWithoutNewWords_record) logging.debug('/get_next_arcile: done.') data = { 'visited_articles': visited_articles, 'today_article': today_article, 'result_of_generate_article': result_of_generate_article } else: return 'Under construction' return json.dumps(data) #保存前端传来 用户阅读时长超过15秒且不含高亮生词的文章(用户阅读完后没有添加生词的文章)的id,level @userService.route("/submit_article_id_without_new_words///",methods=['GET']) def set_article_id_without_new_words(username,article_id,text_level): user_articles_without_new_words_record_path = path_prefix + 'static/frequency/' + 'ArticlesWithoutNewWords_%s.pickle' % (username) if os.path.exists(user_articles_without_new_words_record_path)==False: #若不存在 存储用户阅读时长超过15秒且不含高亮生词的文章索引信息的文件 则新建 f = open(user_articles_without_new_words_record_path, 'wb') list=[] pickle.dump(list,f) f.close() fp=open(user_articles_without_new_words_record_path,'rb') user_article_id_record=pickle.load(fp) fp.close() dic = {} dic['article_id'] = article_id dic['text_level'] = text_level if dic not in user_article_id_record: #若已存在记录(即这篇文章之前被阅读过且没有添加生词,且已加入索引信息记录文件中),则不再重复加入,避免重复刷分 user_article_id_record.append(dic) print(f"编号为{article_id}的文章,阅读时间大于15秒且未有生词,记录于ArticlesWithoutNewWords_.pickle") print(user_article_id_record) f=open(user_articles_without_new_words_record_path,'wb') pickle.dump(user_article_id_record,f) f.close() return "success" @userService.route("/get_pre_article/",methods=['GET']) def get_pre_article(username): user_articlesWithoutNewWords_record = path_prefix + 'static/frequency/' + 'ArticlesWithoutNewWords_%s.pickle' % ( username) user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) if request.method == 'GET': visited_articles = session.get("visited_articles") if(visited_articles["index"]==0): data='' else: visited_articles["index"] -= 1 # 上一篇,index-=1 if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来 visited_articles['article_ids'].pop() session["visited_articles"] = visited_articles visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'),user_articlesWithoutNewWords_record) data = { 'visited_articles': visited_articles, 'today_article': today_article, 'result_of_generate_article':result_of_generate_article } return json.dumps(data) @userService.route("///unfamiliar", methods=['GET', 'POST']) def unfamiliar(username, word): ''' :param username: :param word: :return: ''' user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) pickle_idea.unfamiliar(user_freq_record, word) session['thisWord'] = word # 1. put a word into session session['time'] = 1 return "success" @userService.route("///familiar", methods=['GET', 'POST']) def familiar(username, word): ''' :param username: :param word: :return: ''' user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) pickle_idea.familiar(user_freq_record, word) session['thisWord'] = word # 1. put a word into session session['time'] = 1 return "success" @userService.route("///del", methods=['GET', 'POST']) def deleteword(username, word): ''' 删除单词 :param username: 用户名 :param word: 单词 :return: 重定位到用户界面 ''' user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) pickle_idea2.deleteRecord(user_freq_record, word) # 模板userpage_get.html中删除单词是异步执行,而flash的信息后续是同步执行的,所以注释这段代码;同时如果这里使用flash但不提取信息,则会影响 signup.html的显示。bug复现:删除单词后,点击退出,点击注册,注册页面就会出现提示信息 # flash(f'{word} is no longer in your word list.') return "success" @userService.route("//userpage", methods=['GET', 'POST']) def userpage(username): ''' 用户界面 :param username: 用户名 :return: 返回用户界面 ''' # 未登录,跳转到未登录界面 if not session.get('logged_in'): return render_template('not_login.html') # 用户过期 user_expiry_date = session.get('expiry_date') if datetime.now().strftime('%Y%m%d') > user_expiry_date: return render_template('expiry.html', expiry_date=user_expiry_date) # 获取session里的用户名 username = session.get('username') user_articlesWithoutNewWords_record = path_prefix + 'static/frequency/' + 'ArticlesWithoutNewWords_%s.pickle' % ( username) user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) if request.method == 'POST': # when we submit a form content = request.form['content'] f = WordFreq(content) lst = f.get_freq() return render_template('userpage_post.html',username=username,lst = lst, yml=Yaml.yml) elif request.method == 'GET': # when we load a html page d = load_freq_history(user_freq_record) lst = pickle_idea2.dict2lst(d) lst2 = [] for t in lst: lst2.append((t[0], len(t[1]))) lst3 = sort_in_descending_order(lst2) words = '' for x in lst3: words += x[0] + ' ' visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles'),user_articlesWithoutNewWords_record) session['visited_articles'] = visited_articles # 通过 today_article,加载前端的显示页面 return render_template('userpage_get.html', admin_name=ADMIN_NAME, username=username, session=session, # flashed_messages=get_flashed_messages(), 仅有删除单词的时候使用到flash,而删除单词是异步执行,这里的信息提示是同步执行,所以就没有存在的必要了 today_article=today_article, result_of_generate_article=result_of_generate_article, d_len=len(d), lst3=lst3, yml=Yaml.yml, words=words) @userService.route("//mark", methods=['GET', 'POST']) def user_mark_word(username): ''' 标记单词 :param username: 用户名 :return: 重定位到用户界面 ''' username = session[username] user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) if request.method == 'POST': # 提交标记的单词 d = load_freq_history(user_freq_record) lst_history = pickle_idea2.dict2lst(d) lst = [] for word in request.form.getlist('marked'): lst.append((word, [get_time()])) d = pickle_idea2.merge_frequency(lst, lst_history) if len(lst_history) > 999: flash('You have way too many words in your difficult-words book. Delete some first.') else: pickle_idea2.save_frequency_to_pickle(d, user_freq_record) flash('Added %s.' % (', '.join(request.form.getlist('marked')))) return redirect(url_for('user_bp.userpage', username=username)) else: return 'Under construction' def get_time(): ''' 获取当前时间 :return: 当前时间 ''' return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes