diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..596df6f --- /dev/null +++ b/Readme.md @@ -0,0 +1,5 @@ +Click the Familiar or Unfamiliar button (current word frequency>1), the current word position is displayed at the top of the page; + +Click the Familiar or Unfamiliar button (current word frequency is 1), and the page will be displayed as the top of the entire page. + +Demo video link: https://b23.tv/QuB77m \ No newline at end of file diff --git a/app/main.py b/app/main.py index 1356f12..c862b83 100644 --- a/app/main.py +++ b/app/main.py @@ -20,22 +20,26 @@ app = Flask(__name__) app.secret_key = 'lunch.time!' path_prefix = '/var/www/wordfreq/wordfreq/' -path_prefix = './' # comment this line in deployment +path_prefix = './' # comment this line in deployment + def get_random_image(path): img_path = random.choice(glob.glob(os.path.join(path, '*.jpg'))) return img_path[img_path.rfind('/static'):] + def get_random_ads(): ads = random.choice(['个性化分析精准提升', '你的专有单词本', '智能捕捉阅读弱点,针对性提高你的阅读水平']) return ads + '。 试试吧!' + def load_freq_history(path): d = {} if os.path.exists(path): d = pickle_idea.load_record(path) return d + def verify_user(username, password): rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') rq.instructions("SELECT * FROM user WHERE name='%s' AND password='%s'" % (username, password)) @@ -43,6 +47,7 @@ def verify_user(username, password): result = rq.get_results() return result != [] + def add_user(username, password): start_date = datetime.now().strftime('%Y%m%d') expiry_date = '20211230' @@ -50,13 +55,14 @@ def add_user(username, password): rq.instructions("INSERT INTO user Values ('%s', '%s', '%s', '%s')" % (username, password, start_date, expiry_date)) rq.do() - + def check_username_availability(username): rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') rq.instructions("SELECT * FROM user WHERE name='%s'" % (username)) rq.do() result = rq.get_results() - return result == [] + return result == [] + def get_expiry_date(username): rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') @@ -64,26 +70,24 @@ def get_expiry_date(username): rq.do() result = rq.get_results() if len(result) > 0: - return result[0]['expiry_date'] + return result[0]['expiry_date'] else: return '20191024' - def within_range(x, y, r): - return x > y and abs(x - y) <= r + return x > y and abs(x - y) <= r def get_today_article(user_word_list, articleID): - rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') - if articleID == None: + if articleID == None: rq.instructions("SELECT * FROM article") else: rq.instructions('SELECT * FROM article WHERE article_id=%d' % (articleID)) rq.do() result = rq.get_results() - + # Choose article according to reader's level d1 = load_freq_history(path_prefix + 'static/frequency/frequency.p') d2 = load_freq_history(path_prefix + 'static/words_and_tests.p') @@ -91,24 +95,26 @@ def get_today_article(user_word_list, articleID): d = {} d_user = load_freq_history(user_word_list) - user_level = user_difficulty_level(d_user, d3) # more consideration as user's behaviour is dynamic. Time factor should be considered. - random.shuffle(result) # shuffle list + user_level = user_difficulty_level(d_user, + d3) # more consideration as user's behaviour is dynamic. Time factor should be considered. + random.shuffle(result) # shuffle list d = random.choice(result) text_level = text_difficulty_level(d['text'], d3) if articleID == None: for reading in result: text_level = text_difficulty_level(reading['text'], d3) - #print('TEXT_LEVEL %4.2f' % (text_level)) + # print('TEXT_LEVEL %4.2f' % (text_level)) if within_range(text_level, user_level, 0.5): d = reading break - - s = '

According to your word list, your level is %4.2f and we have chosen an article with a difficulty level of %4.2f for you.

' % (user_level, text_level) + + s = '

According to your word list, your level is %4.2f and we have chosen an article with a difficulty level of %4.2f for you.

' % ( + user_level, text_level) s += '

%s

' % (d['date']) s += '

%s

' % (d['text']) s += '

%s

' % (d['source']) s += '

%s

' % (get_question_part(d['question'])) - s = s.replace('\n', '
') + s = s.replace('\n', '
') s += '%s' % (get_answer_part(d['question'])) session['articleID'] = d['article_id'] return s @@ -122,7 +128,7 @@ def appears_in_test(word, d): def get_time(): - return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes + return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes def get_question_part(s): @@ -171,7 +177,6 @@ def get_answer_part(s): return html_code - @app.route("//reset", methods=['GET', 'POST']) def user_reset(username): if request.method == 'GET': @@ -196,7 +201,6 @@ def mark_word(): return 'Under construction' - @app.route("/", methods=['GET', 'POST']) def mainpage(): if request.method == 'POST': # when we submit a form @@ -206,18 +210,19 @@ def mainpage(): page = '
\n' count = 1 for x in lst: - page += '

%d: %s (%d)

\n' % (count, youdao_link(x[0]), x[0], x[1], x[0]) + page += '

%d: %s (%d)

\n' % ( + count, youdao_link(x[0]), x[0], x[1], x[0]) count += 1 page += ' \n' page += '
\n' - # save history + # save history d = load_freq_history(path_prefix + 'static/frequency/frequency.p') lst_history = pickle_idea.dict2lst(d) d = pickle_idea.merge_frequency(lst, lst_history) pickle_idea.save_frequency_to_pickle(d, path_prefix + 'static/frequency/frequency.p') - + return page - elif request.method == 'GET': # when we load a html page + elif request.method == 'GET': # when we load a html page page = ''' @@ -233,7 +238,7 @@ def mainpage(): page += ' %s

\n' % (session['username'], session['username']) else: page += '

登录 成为会员 使用说明

\n' - #page += '

advertisement

' % (get_random_image(path_prefix + 'static/img/')) + # page += '

advertisement

' % (get_random_image(path_prefix + 'static/img/')) page += '

%s

' % (get_random_ads()) page += '

粘帖1篇文章 (English only)

' page += '
' @@ -256,7 +261,7 @@ def mainpage(): @app.route("//mark", methods=['GET', 'POST']) def user_mark_word(username): username = session[username] - user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (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) @@ -270,48 +275,75 @@ def user_mark_word(username): return 'Under construction' +@app.route("///unfamiliar", methods=['GET', 'POST']) +def unfamiliar(username, word): + 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 + + return redirect(url_for('userpage', username=username)) + + +@app.route("///familiar", methods=['GET', 'POST']) +def familiar(username, word): + 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 + + return redirect(url_for('userpage', username=username)) + @app.route("/", methods=['GET', 'POST']) def userpage(username): - if not session.get('logged_in'): return '

请先登录

' user_expiry_date = session.get('expiry_date') if datetime.now().strftime('%Y%m%d') > user_expiry_date: - return '

账号 %s 过期。

为了提高服务质量,English Pal 收取会员费用, 每天0元。

请决定你要试用的时间长度,扫描下面支付宝二维码支付。 支付时请注明English Pal Membership Fee。 我们会于12小时内激活账号。

支付宝二维码

如果有问题,请加开发者微信 torontohui。

登出

' % (username) + return '

账号 %s 过期。

为了提高服务质量,English Pal 收取会员费用, 每天0元。

请决定你要试用的时间长度,扫描下面支付宝二维码支付。 支付时请注明English Pal Membership Fee。 我们会于12小时内激活账号。

支付宝二维码

如果有问题,请加开发者微信 torontohui。

登出

' % ( + username) - username = session.get('username') - user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%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() - page = '' - page += '' + page = '' + page += '' page += '

勾选不认识的单词

' page += '\n' % (username) - page += ' \n' + page += ' \n' count = 1 - words_tests_dict = pickle_idea.load_record(path_prefix + 'static/words_and_tests.p') + words_tests_dict = pickle_idea.load_record(path_prefix + 'static/words_and_tests.p') for x in lst: - page += '

%d: %s (%d)

\n' % (count, youdao_link(x[0]), appears_in_test(x[0], words_tests_dict), x[0], x[1], x[0]) + page += '

%d: %s (%d)

\n' % ( + count, youdao_link(x[0]), appears_in_test(x[0], words_tests_dict), x[0], x[1], x[0]) count += 1 page += '\n' return page - - elif request.method == 'GET': # when we load a html page + + elif request.method == 'GET': # when we load a html page page = '\n' + + if session.get('thisWord'): + page += ''' + + ''' + page += '\n' - page += '\n' # forbid treating numbers as cell numbers in smart phones + page += '\n' # forbid treating numbers as cell numbers in smart phones page += 'EnglishPal Study Room for %s' % (username) page += '

English Pal for %s 登出

' % (username) page += '

下一篇

' % (username) page += '

阅读文章并回答问题

\n' - page += '
%s
' % (get_today_article(user_freq_record, session['articleID'])) + page += '
%s
' % (get_today_article(user_freq_record, session['articleID'])) page += '

收集生词吧 (可以在正文中划词,也可以复制黏贴)

' page += '
' % (username) page += '
' @@ -332,7 +364,7 @@ def userpage(username): document.getElementById("text-content").addEventListener("touchstart", fillinWord, false); ''' - + d = load_freq_history(user_freq_record) if len(d) > 0: page += '

我的生词簿

' @@ -343,17 +375,20 @@ def userpage(username): for x in sort_in_descending_order(lst2): word = x[0] freq = x[1] - if isinstance(d[word], list): # d[word] is a list of dates + if session.get('thisWord') == x[0]: + page += '' # 3. anchor + if isinstance(d[word], list): # d[word] is a list of dates if freq > 1: - page += '

%s (%d)

\n' % (youdao_link(word), word, '; '.join(d[word]), freq) + page += '

%s(%d) 熟悉 不熟悉

\n' % ( + youdao_link(word), word, '; '.join(d[word]), freq, username, word, username, word) else: - page += '

%s (%d)

\n' % (youdao_link(word), word, '; '.join(d[word]), freq) - elif isinstance(d[word], int): # d[word] is a frequency. to migrate from old format. - page += '%s%d\n' % (youdao_link(word), word, freq) - - + page += '

%s(%d) 熟悉 不熟悉

\n' % ( + youdao_link(word), word, '; '.join(d[word]), freq, username, word, username, word) + elif isinstance(d[word], int): # d[word] is a frequency. to migrate from old format. + page += '%s%d\n' % (youdao_link(word), word, freq) return page + ### Sign-up, login, logout ### @app.route("/signup", methods=['GET', 'POST']) def signup(): @@ -388,7 +423,8 @@ def login(): if not session.get('logged_in'): return render_template('login.html') else: - return '你已登录 %s。 登出点击这里。' % (session['username'], session['username']) + return '你已登录 %s。 登出点击这里。' % ( + session['username'], session['username']) elif request.method == 'POST': # check database and verify user username = request.form['username'] @@ -413,9 +449,8 @@ def logout(): if __name__ == '__main__': - #app.secret_key = os.urandom(16) - #app.run(debug=False, port='6000') - app.run(debug=True) - #app.run(debug=True, port='6000') - #app.run(host='0.0.0.0', debug=True, port='6000') - + # app.secret_key = os.urandom(16) + # app.run(debug=False, port='6000') + app.run(debug=True) + # app.run(debug=True, port='6000') + # app.run(host='0.0.0.0', debug=True, port='6000')