200 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
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/<username>",methods=['GET','POST'])
 | 
						||
def get_next_article(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'))
 | 
						||
        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)
 | 
						||
 | 
						||
@userService.route("/get_pre_article/<username>",methods=['GET'])
 | 
						||
def get_pre_article(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'))
 | 
						||
            data = {
 | 
						||
                'visited_articles': visited_articles,
 | 
						||
                'today_article': today_article,
 | 
						||
                'result_of_generate_article':result_of_generate_article
 | 
						||
            }
 | 
						||
        return json.dumps(data)
 | 
						||
 | 
						||
@userService.route("/<username>/<word>/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("/<username>/<word>/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("/<username>/<word>/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("/<username>/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_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'))
 | 
						||
        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("/<username>/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
 | 
						||
 |