[REFACTOR] user_service.py: Added id to user name, word and frequency for click to execute AJAX request in JS (#30)

1. Add jquery.js and word_operation.js to the static folder.

2. Changed the return type of the familiar, unfamiliar and deleteword methods of user_service.py.
    ```
    original: return redirect(url_for('userpage', username=username))
    now: return "success"
    ```
3. In order to get elements in JS to make ajax requests we add ids in userpage_get.html for familiar, unfamiliar, delete buttons and so on.

4. When the user's word book was retrieved, the list returned was already sorted in descending order of frequency, so redundant code was removed in userpage_get.html.

Co-authored-by: PeterQiu <www.1392993990@qq.com>
Co-authored-by: Lan Hui <1348141770@qq.com>
Reviewed-on: http://121.4.94.30:3000/mrlan/EnglishPal/pulls/30
Co-authored-by: 邱忠辉 <1392993990@qq.com>
Co-committed-by: 邱忠辉 <1392993990@qq.com>
Bug477-ChenJingyi
邱忠辉 2022-07-18 13:29:04 +08:00 committed by mrlan
parent e48008550a
commit 9d420acd8b
6 changed files with 150 additions and 33 deletions

View File

@ -6,8 +6,8 @@ css:
# 全局引入的js文件地址 # 全局引入的js文件地址
js: js:
head: # 在页面加载之前加载 head: # 在页面加载之前加载
# - static/js/APlayer.js - static/js/jquery.js
# - static/js/Meting.js - static/js/word_operation.js
bottom: # 在页面加载完之后加载 bottom: # 在页面加载完之后加载
- static/js/fillword.js - static/js/fillword.js
- static/js/highlight.js - static/js/highlight.js

2
app/static/js/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,43 @@
function familiar(index) {
let username = $("#username").text();
let word = $("#word_" + index).text();
let freq = $("#freq_" + index).text();
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/familiar",
success:function(response){
let new_freq = freq - 1;
if(new_freq <1) {
$("#p_" + index).remove();
} else {
$("#freq_" + index).text(new_freq);
}
}
});
}
function unfamiliar(index) {
let username = $("#username").text();
let word = $("#word_" + index).text();
let freq = $("#freq_" + index).text();
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/unfamiliar",
success:function(response){
let new_freq = parseInt(freq) + 1;
$("#freq_" + index).text(new_freq);
}
});
}
function delete_word(index) {
let username = $("#username").text();
let word = $("#word_" + index).text();
$.ajax({
type:"GET",
url:"/" + username + "/" + word + "/del",
success:function(response){
$("#p_" + index).remove();
}
});
}

View File

@ -22,7 +22,7 @@
</head> </head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
<p><b>English Pal for <font color="red">{{ username }}</font></b> <p><b>English Pal for <font id="username" color="red">{{ username }}</font></b>
<a class="btn btn-secondary" href="/logout" role="button">退出</a> <a class="btn btn-secondary" href="/logout" role="button">退出</a>
<a class="btn btn-secondary" href="/reset" role="button">重设密码</a> <a class="btn btn-secondary" href="/reset" role="button">重设密码</a>
</p> </p>
@ -57,37 +57,18 @@
<p><b>我的生词簿</b></p> <p><b>我的生词簿</b></p>
{% for x in lst3 %} {% for x in lst3 %}
{% set word = x[0] %} {% set word = x[0] %}
{% set freq = x[1] %} {% set freq = x[1] %}
{% if session.get('thisWord') == x[0] and session.get('time') == 1 %} {% if session.get('thisWord') == x[0] and session.get('time') == 1 %}
<a name="aaa"></a> <a name="aaa"></a>
{% endif %} {% endif %}
{% if freq > 1 %} <p id='p_{{ loop.index0 }}' class="new-word" >
<p class="new-word"> <a id="word_{{ loop.index0 }}" class="btn btn-light" href='http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'
<a class="btn btn-light" href='http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'
role="button">{{ word }}</a> role="button">{{ word }}</a>
( ( <a id="freq_{{ loop.index0 }}" title="{{ word }}">{{ freq }}</a> )
<a title="{{ word }}">{{ freq }}</a> <a class="btn btn-success" onclick="familiar({{ loop.index0 }})" role="button">熟悉</a>
) <a class="btn btn-warning" onclick="unfamiliar({{ loop.index0 }})" role="button">不熟悉</a>
<a class="btn btn-danger" onclick="delete_word({{ loop.index0 }})" role="button">删除</a>
<a class="btn btn-success" href={{ username }}/{{ word }}/familiar role="button">熟悉</a>
<a class="btn btn-warning" href={{ username }}/{{ word }}/unfamiliar role="button">不熟悉</a>
<a class="btn btn-danger" href={{ username }}/{{ word }}/del role="button">删除</a>
</p> </p>
{% else %}
<p class="new-word">
<a class="btn btn-light" href='http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'
role="button">{{ word }}</a>
(
<a title="{{ word }}">{{ freq }}</a>
)
<a class="btn btn-success" href={{ username }}/{{ word }}/familiar role="button">熟悉</a>
<a class="btn btn-warning" href={{ username }}/{{ word }}/unfamiliar role="button">不熟悉</a>
<a class="btn btn-danger" href={{ username }}/{{ word }}/del role="button">删除</a>
</p>
{% endif %}
{% else %}
<a href='http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'>{{ word }}</a>{{ freq }}
{% endfor %} {% endfor %}
<input id="selected-words2" type="hidden" value="{{ words }}"> <input id="selected-words2" type="hidden" value="{{ words }}">
{% endif %} {% endif %}

View File

@ -0,0 +1,91 @@
from time import sleep
from selenium import webdriver
# 获取浏览器驱动,并且打开响应的网址
driver = webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\ChromeDriver\chromedriver.exe")
HOME_PAGE = "http://127.0.0.1:5000/"
def test_word_operation():
try:
login()
unfamiliar()
familiar()
delete()
finally:
driver.quit()
def login():
driver.get(HOME_PAGE)
assert 'English Pal -' in driver.page_source
# login
elem = driver.find_element_by_link_text('登录')
elem.click()
sleep(2)
uname = 'peter'
password = 'peter'
elem = driver.find_element_by_name('username')
elem.send_keys(uname)
elem = driver.find_element_by_name('password')
elem.send_keys(password)
# find the login button
elem = driver.find_element_by_xpath('/html/body/form/p[3]/input')
elem.click()
assert 'EnglishPal Study Room for ' + uname in driver.title
def familiar():
sleep(5)
elem = driver.find_element_by_xpath('//*[@id="p_0"]/a[3]')
count = int(elem.find_element_by_xpath('//*[@id="freq_0"]').text)
loop = 3
for i in range(loop):
elem.click()
sleep(1)
new_count = int(driver.find_element_by_xpath('//*[@id="freq_0"]').text)
assert count - loop == new_count
def unfamiliar():
sleep(5)
elem = driver.find_element_by_xpath('//*[@id="p_0"]/a[4]')
count = int(elem.find_element_by_xpath('//*[@id="freq_0"]').text)
loop = 2
for i in range(loop):
elem.click()
sleep(1)
new_count = int(driver.find_element_by_xpath('//*[@id="freq_0"]').text)
assert count + loop == new_count
def delete():
sleep(3)
word = driver.find_element_by_xpath('//*[@id="word_0"]').text
elem = driver.find_element_by_xpath('//*[@id="p_0"]/a[5]')
elem.click()
sleep(5)
driver.refresh()
driver.refresh()
driver.refresh()
find_word = word in driver.page_source
assert find_word is False

View File

@ -48,7 +48,7 @@ def unfamiliar(username, word):
pickle_idea.unfamiliar(user_freq_record, word) pickle_idea.unfamiliar(user_freq_record, word)
session['thisWord'] = word # 1. put a word into session session['thisWord'] = word # 1. put a word into session
session['time'] = 1 session['time'] = 1
return redirect(url_for('user_bp.userpage', username=username)) return "success"
@userService.route("/<username>/<word>/familiar", methods=['GET', 'POST']) @userService.route("/<username>/<word>/familiar", methods=['GET', 'POST'])
@ -63,7 +63,7 @@ def familiar(username, word):
pickle_idea.familiar(user_freq_record, word) pickle_idea.familiar(user_freq_record, word)
session['thisWord'] = word # 1. put a word into session session['thisWord'] = word # 1. put a word into session
session['time'] = 1 session['time'] = 1
return redirect(url_for('user_bp.userpage', username=username)) return "success"
@userService.route("/<username>/<word>/del", methods=['GET', 'POST']) @userService.route("/<username>/<word>/del", methods=['GET', 'POST'])
@ -77,7 +77,7 @@ def deleteword(username, word):
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
pickle_idea2.deleteRecord(user_freq_record, word) pickle_idea2.deleteRecord(user_freq_record, word)
flash(f'<strong>{word}</strong> is no longer in your word list.') flash(f'<strong>{word}</strong> is no longer in your word list.')
return redirect(url_for('user_bp.userpage', username=username)) return "success"
@userService.route("/<username>", methods=['GET', 'POST']) @userService.route("/<username>", methods=['GET', 'POST'])