forked from mrlan/EnglishPal
				
			Fix the problem when user click Familiar or Unfamiliar button will refresh page
							parent
							
								
									843ed03d4f
								
							
						
					
					
						commit
						c6b895e8eb
					
				| 
						 | 
					@ -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
 | 
				
			||||||
							
								
								
									
										69
									
								
								app/main.py
								
								
								
								
							
							
						
						
									
										69
									
								
								app/main.py
								
								
								
								
							| 
						 | 
					@ -22,20 +22,24 @@ app.secret_key = 'lunch.time!'
 | 
				
			||||||
path_prefix = '/var/www/wordfreq/wordfreq/'
 | 
					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):
 | 
					def get_random_image(path):
 | 
				
			||||||
    img_path = random.choice(glob.glob(os.path.join(path, '*.jpg')))
 | 
					    img_path = random.choice(glob.glob(os.path.join(path, '*.jpg')))
 | 
				
			||||||
    return img_path[img_path.rfind('/static'):]
 | 
					    return img_path[img_path.rfind('/static'):]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_random_ads():
 | 
					def get_random_ads():
 | 
				
			||||||
    ads = random.choice(['个性化分析精准提升', '你的专有单词本', '智能捕捉阅读弱点,针对性提高你的阅读水平'])
 | 
					    ads = random.choice(['个性化分析精准提升', '你的专有单词本', '智能捕捉阅读弱点,针对性提高你的阅读水平'])
 | 
				
			||||||
    return ads + '。 <a href="/signup">试试</a>吧!'
 | 
					    return ads + '。 <a href="/signup">试试</a>吧!'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def load_freq_history(path):
 | 
					def load_freq_history(path):
 | 
				
			||||||
    d = {}
 | 
					    d = {}
 | 
				
			||||||
    if os.path.exists(path):
 | 
					    if os.path.exists(path):
 | 
				
			||||||
        d = pickle_idea.load_record(path)
 | 
					        d = pickle_idea.load_record(path)
 | 
				
			||||||
    return d
 | 
					    return d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def verify_user(username, password):
 | 
					def verify_user(username, password):
 | 
				
			||||||
    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
					    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
				
			||||||
    rq.instructions("SELECT * FROM user WHERE name='%s' AND password='%s'" % (username, password))
 | 
					    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()
 | 
					    result = rq.get_results()
 | 
				
			||||||
    return result != []
 | 
					    return result != []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def add_user(username, password):
 | 
					def add_user(username, password):
 | 
				
			||||||
    start_date = datetime.now().strftime('%Y%m%d')
 | 
					    start_date = datetime.now().strftime('%Y%m%d')
 | 
				
			||||||
    expiry_date = '20211230'
 | 
					    expiry_date = '20211230'
 | 
				
			||||||
| 
						 | 
					@ -58,6 +63,7 @@ def check_username_availability(username):
 | 
				
			||||||
    result = rq.get_results()
 | 
					    result = rq.get_results()
 | 
				
			||||||
    return result == []
 | 
					    return result == []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_expiry_date(username):
 | 
					def get_expiry_date(username):
 | 
				
			||||||
    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
					    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
				
			||||||
    rq.instructions("SELECT expiry_date FROM user WHERE name='%s'" % (username))
 | 
					    rq.instructions("SELECT expiry_date FROM user WHERE name='%s'" % (username))
 | 
				
			||||||
| 
						 | 
					@ -69,13 +75,11 @@ def get_expiry_date(username):
 | 
				
			||||||
        return '20191024'
 | 
					        return '20191024'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
def within_range(x, y, r):
 | 
					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):
 | 
					def get_today_article(user_word_list, articleID):
 | 
				
			||||||
 | 
					 | 
				
			||||||
    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
					    rq = RecordQuery(path_prefix + 'static/wordfreqapp.db')
 | 
				
			||||||
    if articleID == None:
 | 
					    if articleID == None:
 | 
				
			||||||
        rq.instructions("SELECT * FROM article")
 | 
					        rq.instructions("SELECT * FROM article")
 | 
				
			||||||
| 
						 | 
					@ -91,7 +95,8 @@ def get_today_article(user_word_list, articleID):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d = {}
 | 
					    d = {}
 | 
				
			||||||
    d_user = load_freq_history(user_word_list)
 | 
					    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.
 | 
					    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
 | 
					    random.shuffle(result)  # shuffle list
 | 
				
			||||||
    d = random.choice(result)
 | 
					    d = random.choice(result)
 | 
				
			||||||
    text_level = text_difficulty_level(d['text'], d3)
 | 
					    text_level = text_difficulty_level(d['text'], d3)
 | 
				
			||||||
| 
						 | 
					@ -103,7 +108,8 @@ def get_today_article(user_word_list, articleID):
 | 
				
			||||||
                d = reading
 | 
					                d = reading
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s = '<p><i>According to your word list, your level is <b>%4.2f</b> and we have chosen an article with a difficulty level of <b>%4.2f</b> for you.</i></p>' % (user_level, text_level)
 | 
					    s = '<p><i>According to your word list, your level is <b>%4.2f</b> and we have chosen an article with a difficulty level of <b>%4.2f</b> for you.</i></p>' % (
 | 
				
			||||||
 | 
					        user_level, text_level)
 | 
				
			||||||
    s += '<p><b>%s</b></p>' % (d['date'])
 | 
					    s += '<p><b>%s</b></p>' % (d['date'])
 | 
				
			||||||
    s += '<p><font size=+2>%s</font></p>' % (d['text'])
 | 
					    s += '<p><font size=+2>%s</font></p>' % (d['text'])
 | 
				
			||||||
    s += '<p><i>%s</i></p>' % (d['source'])
 | 
					    s += '<p><i>%s</i></p>' % (d['source'])
 | 
				
			||||||
| 
						 | 
					@ -171,7 +177,6 @@ def get_answer_part(s):
 | 
				
			||||||
    return html_code
 | 
					    return html_code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
@app.route("/<username>/reset", methods=['GET', 'POST'])
 | 
					@app.route("/<username>/reset", methods=['GET', 'POST'])
 | 
				
			||||||
def user_reset(username):
 | 
					def user_reset(username):
 | 
				
			||||||
    if request.method == 'GET':
 | 
					    if request.method == 'GET':
 | 
				
			||||||
| 
						 | 
					@ -196,7 +201,6 @@ def mark_word():
 | 
				
			||||||
        return 'Under construction'
 | 
					        return 'Under construction'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
@app.route("/", methods=['GET', 'POST'])
 | 
					@app.route("/", methods=['GET', 'POST'])
 | 
				
			||||||
def mainpage():
 | 
					def mainpage():
 | 
				
			||||||
    if request.method == 'POST':  # when we submit a form
 | 
					    if request.method == 'POST':  # when we submit a form
 | 
				
			||||||
| 
						 | 
					@ -206,7 +210,8 @@ def mainpage():
 | 
				
			||||||
        page = '<form method="post" action="/mark">\n'
 | 
					        page = '<form method="post" action="/mark">\n'
 | 
				
			||||||
        count = 1
 | 
					        count = 1
 | 
				
			||||||
        for x in lst:
 | 
					        for x in lst:
 | 
				
			||||||
            page += '<p><font color="grey">%d</font>: <a href="%s">%s</a> (%d)  <input type="checkbox" name="marked" value="%s"></p>\n' % (count, youdao_link(x[0]), x[0], x[1], x[0])
 | 
					            page += '<p><font color="grey">%d</font>: <a href="%s">%s</a> (%d)  <input type="checkbox" name="marked" value="%s"></p>\n' % (
 | 
				
			||||||
 | 
					                count, youdao_link(x[0]), x[0], x[1], x[0])
 | 
				
			||||||
            count += 1
 | 
					            count += 1
 | 
				
			||||||
        page += ' <input type="submit" value="确定并返回"/>\n'
 | 
					        page += ' <input type="submit" value="确定并返回"/>\n'
 | 
				
			||||||
        page += '</form>\n'
 | 
					        page += '</form>\n'
 | 
				
			||||||
| 
						 | 
					@ -270,17 +275,35 @@ def user_mark_word(username):
 | 
				
			||||||
        return 'Under construction'
 | 
					        return 'Under construction'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@app.route("/<username>/<word>/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("/<username>/<word>/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("/<username>", methods=['GET', 'POST'])
 | 
					@app.route("/<username>", methods=['GET', 'POST'])
 | 
				
			||||||
def userpage(username):
 | 
					def userpage(username):
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if not session.get('logged_in'):
 | 
					    if not session.get('logged_in'):
 | 
				
			||||||
        return '<p>请先<a href="/login">登录</a>。</p>'
 | 
					        return '<p>请先<a href="/login">登录</a>。</p>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    user_expiry_date = session.get('expiry_date')
 | 
					    user_expiry_date = session.get('expiry_date')
 | 
				
			||||||
    if datetime.now().strftime('%Y%m%d') > user_expiry_date:
 | 
					    if datetime.now().strftime('%Y%m%d') > user_expiry_date:
 | 
				
			||||||
        return '<p>账号 %s 过期。</p><p>为了提高服务质量,English Pal 收取会员费用, 每天0元。</p> <p>请决定你要试用的时间长度,扫描下面支付宝二维码支付。 支付时请注明<i>English Pal Membership Fee</i>。 我们会于12小时内激活账号。</p><p><img src="static/donate-the-author-hidden.jpg" width="120px" alt="支付宝二维码" /></p><p>如果有问题,请加开发者微信 torontohui。</p> <p><a href="/logout">登出</a></p>' % (username)
 | 
					        return '<p>账号 %s 过期。</p><p>为了提高服务质量,English Pal 收取会员费用, 每天0元。</p> <p>请决定你要试用的时间长度,扫描下面支付宝二维码支付。 支付时请注明<i>English Pal Membership Fee</i>。 我们会于12小时内激活账号。</p><p><img src="static/donate-the-author-hidden.jpg" width="120px" alt="支付宝二维码" /></p><p>如果有问题,请加开发者微信 torontohui。</p> <p><a href="/logout">登出</a></p>' % (
 | 
				
			||||||
 | 
					            username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    username = session.get('username')
 | 
					    username = session.get('username')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -298,13 +321,22 @@ def userpage(username):
 | 
				
			||||||
        count = 1
 | 
					        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:
 | 
					        for x in lst:
 | 
				
			||||||
            page += '<p><font color="grey">%d</font>: <a href="%s" title="%s">%s</a> (%d)  <input type="checkbox" name="marked" value="%s"></p>\n' % (count, youdao_link(x[0]), appears_in_test(x[0], words_tests_dict), x[0], x[1], x[0])
 | 
					            page += '<p><font color="grey">%d</font>: <a href="%s" title="%s">%s</a> (%d)  <input type="checkbox" name="marked" value="%s"></p>\n' % (
 | 
				
			||||||
 | 
					                count, youdao_link(x[0]), appears_in_test(x[0], words_tests_dict), x[0], x[1], x[0])
 | 
				
			||||||
            count += 1
 | 
					            count += 1
 | 
				
			||||||
        page += '</form>\n'
 | 
					        page += '</form>\n'
 | 
				
			||||||
        return page
 | 
					        return page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    elif request.method == 'GET':  # when we load a html page
 | 
					    elif request.method == 'GET':  # when we load a html page
 | 
				
			||||||
        page = '<meta charset="UTF8">\n'
 | 
					        page = '<meta charset="UTF8">\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if session.get('thisWord'):
 | 
				
			||||||
 | 
					            page += '''
 | 
				
			||||||
 | 
					            <script type="text/javascript">
 | 
				
			||||||
 | 
					                location.href = "#aaa"  // 2. define a anchor URL and point to the anchor in the page whose id is aaa
 | 
				
			||||||
 | 
					            </script> 
 | 
				
			||||||
 | 
					            '''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        page += '<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=3.0, user-scalable=yes" />\n'
 | 
					        page += '<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=3.0, user-scalable=yes" />\n'
 | 
				
			||||||
        page += '<meta name="format-detection" content="telephone=no" />\n'  # forbid treating numbers as cell numbers in smart phones
 | 
					        page += '<meta name="format-detection" content="telephone=no" />\n'  # forbid treating numbers as cell numbers in smart phones
 | 
				
			||||||
        page += '<title>EnglishPal Study Room for %s</title>' % (username)
 | 
					        page += '<title>EnglishPal Study Room for %s</title>' % (username)
 | 
				
			||||||
| 
						 | 
					@ -343,17 +375,20 @@ def userpage(username):
 | 
				
			||||||
            for x in sort_in_descending_order(lst2):
 | 
					            for x in sort_in_descending_order(lst2):
 | 
				
			||||||
                word = x[0]
 | 
					                word = x[0]
 | 
				
			||||||
                freq = x[1]
 | 
					                freq = x[1]
 | 
				
			||||||
 | 
					                if session.get('thisWord') == x[0]:
 | 
				
			||||||
 | 
					                    page += '<a name="aaa"></a>'    # 3. anchor
 | 
				
			||||||
                if isinstance(d[word], list):  # d[word] is a list of dates
 | 
					                if isinstance(d[word], list):  # d[word] is a list of dates
 | 
				
			||||||
                    if freq > 1:
 | 
					                    if freq > 1:
 | 
				
			||||||
                        page += '<p class="new-word"> <a href="%s">%s</a>                     (<a title="%s">%d</a>) </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq)
 | 
					                        page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>  </p>\n' % (
 | 
				
			||||||
 | 
					                            youdao_link(word), word, '; '.join(d[word]), freq, username, word, username, word)
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        page += '<p class="new-word"> <a href="%s">%s</a> <font color="white">(<a title="%s">%d</a>)</font> </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq)
 | 
					                        page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>   </p>\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.
 | 
					                elif isinstance(d[word], int):  # d[word] is a frequency. to migrate from old format.
 | 
				
			||||||
                    page += '<a href="%s">%s</a>%d\n' % (youdao_link(word), word, freq)
 | 
					                    page += '<a href="%s">%s</a>%d\n' % (youdao_link(word), word, freq)
 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
        return page
 | 
					        return page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Sign-up, login, logout ###
 | 
					### Sign-up, login, logout ###
 | 
				
			||||||
@app.route("/signup", methods=['GET', 'POST'])
 | 
					@app.route("/signup", methods=['GET', 'POST'])
 | 
				
			||||||
def signup():
 | 
					def signup():
 | 
				
			||||||
| 
						 | 
					@ -388,7 +423,8 @@ def login():
 | 
				
			||||||
        if not session.get('logged_in'):
 | 
					        if not session.get('logged_in'):
 | 
				
			||||||
            return render_template('login.html')
 | 
					            return render_template('login.html')
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return '你已登录 <a href="/%s">%s</a>。 登出点击<a href="/logout">这里</a>。' % (session['username'], session['username'])
 | 
					            return '你已登录 <a href="/%s">%s</a>。 登出点击<a href="/logout">这里</a>。' % (
 | 
				
			||||||
 | 
					                session['username'], session['username'])
 | 
				
			||||||
    elif request.method == 'POST':
 | 
					    elif request.method == 'POST':
 | 
				
			||||||
        # check database and verify user
 | 
					        # check database and verify user
 | 
				
			||||||
        username = request.form['username']
 | 
					        username = request.form['username']
 | 
				
			||||||
| 
						 | 
					@ -418,4 +454,3 @@ if __name__ == '__main__':
 | 
				
			||||||
    app.run(debug=True)
 | 
					    app.run(debug=True)
 | 
				
			||||||
    # app.run(debug=True, port='6000')
 | 
					    # app.run(debug=True, port='6000')
 | 
				
			||||||
    # app.run(host='0.0.0.0', debug=True, port='6000')
 | 
					    # app.run(host='0.0.0.0', debug=True, port='6000')
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue