@ -5,8 +5,6 @@
< meta name = "viewport"
< meta name = "viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=3.0, user-scalable=yes"/>
content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=3.0, user-scalable=yes"/>
< meta name = "format-detection" content = "telephone=no" / >
< meta name = "format-detection" content = "telephone=no" / >
< link href = "https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel = "stylesheet" >
< script src = "https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" > < / script >
{{ yml['header'] | safe }}
{{ yml['header'] | safe }}
{% if yml['css']['item'] %}
{% if yml['css']['item'] %}
@ -28,40 +26,12 @@
}
}
@keyframes shakes {
@keyframes shakes {
10%, 90% {
10%, 90% { transform: translate3d(-1px, 0, 0); }
transform: translate3d(-1px, 0, 0);
20%, 50% { transform: translate3d(+2px, 0, 0); }
}
30%, 70% { transform: translate3d(-4px, 0, 0); }
20%, 50% {
40%, 60% { transform: translate3d(+4px, 0, 0); }
transform: translate3d(+2px, 0, 0);
50% { transform: translate3d(-4px, 0, 0); }
}
30%, 70% {
transform: translate3d(-4px, 0, 0);
}
40%, 60% {
transform: translate3d(+4px, 0, 0);
}
50% {
transform: translate3d(-4px, 0, 0);
}
}
}
.lead {
font-size: 22px;
font-family: Helvetica, sans-serif;
white-space: pre-wrap;
}
.arrow {
padding: 0;
font-size: 20px;
line-height: 21px;
display: inline-block;
}
.arrow:hover {
cursor: pointer;
}
< / style >
< / style >
< / head >
< / head >
< body >
< body >
@ -69,70 +39,53 @@
< p > < b > English Pal for < font id = "username" color = "red" > {{ username }}< / font > < / b >
< p > < b > English Pal for < font id = "username" color = "red" > {{ username }}< / font > < / b >
{% if username == admin_name %}
{% if username == admin_name %}
< a class = "btn btn-secondary" href = "/admin" role = "button" onclick = "stopRead()" > 管理< / a >
< a class = "btn btn-secondary" href = "/admin" role = "button" onclick = "stopRead()" > 管理< / a >
{% endif %}
{% endif %}
< a id = "quit" class = "btn btn-secondary" href = "/logout" role = "button" onclick = "stopRead()" > 退出< / a >
< a id = "quit" class = "btn btn-secondary" href = "/logout" role = "button" onclick = "stopRead()" > 退出< / a >
< a class = "btn btn-secondary" href = "/reset" role = "button" onclick = "stopRead()" > 重设密码< / a >
< a class = "btn btn-secondary" href = "/reset" role = "button" onclick = "stopRead()" > 重设密码< / a >
< / p >
< / p >
{% for message in get_flashed_messages() %}
{# {% for message in flashed_messages %}#} {# 根据user_service.userpage,取消了参数flashed_messages, 因此注释了这段代码 #}
< div class = "alert alert-warning alert-dismissible fade show" role = "alert" >
{# < div class = "alert alert-warning" role = "alert" > Congratulations! {{ message }}< / div > #}
{{ message }}
{# {% endfor %}#}
< button type = "button" class = "btn-close" data-bs-dismiss = "alert" aria-label = "Close" > < / button >
< / div >
{% endfor %}
< button class = "arrow" id = "load_next_article" onclick = "load_next_article();Reader.stopRead()"
< button class = "btn btn-success" id = "load_next_article" onclick = "load_next_article()" > 下一篇 Next Article < / button >
title="下一篇 Next Article">⇨
< button class = "btn btn-success" id = "load_pre_article" onclick = "load_pre_article()" > 上一篇 Previous Article < / button >
< / button >
< button class = "arrow" id = "load_pre_article" onclick = "load_pre_article();Reader.stopRead()" style = "display: none"
title="上一篇 Previous Article">⇦
< / button >
< p > < b > 阅读文章并回答问题< / b > < / p >
< p > < b > 阅读文章并回答问题< / b > < / p >
< div id = "text-content" >
< div id = "text-content" >
< div id = "found" >
< div id = "found" >
< div class = "alert alert-success" role = "alert" > According to your word list, your level is < span
< div class = "alert alert-success" role = "alert" > According to your word list, your level is < span class = "badge bg-success" id = "user-level" > {{ today_article["user_level"] }}< / span > and we have chosen an article with a difficulty level of < span class = "badge bg-success" id = "text_level" > {{ today_article["text_level"] }}< / span > for you.< / div >
class="text-decoration-underline" id="user_level">{{ today_article["user_level"] }}< / span > and we
< p class = "text-muted" id = "date" > Article added on: {{ today_article["date"] }}< / p > < br / >
have chosen an article with a difficulty level of < span class = "text-decoration-underline"
< div class = "p-3 mb-2 bg-light text-dark" > < br / >
id="text_level">{{ today_article["text_level"] }}< / span >
< p class = "display-5" id = "article_title" > {{ today_article["article_title"] }}< / p > < br / >
for you.
< p class = "lead" > < font id = "article" size = 2 > {{ today_article["article_body"] }}< / font > < / p > < br / >
< / div >
< p > < small class = "text-muted" id = "source" > {{ today_article['source'] }}< / small > < / p > < br / >
< p class = "text-muted" id = "date" > Article added on: {{ today_article["date"] }}< / p > < br / >
< p > < b id = "question" > {{ today_article['question'] }}< / b > < / p > < br / >
< div class = "p-3 mb-2 bg-light text-dark" style = "margin: 0 0.5%;" > < br / >
< p class = "display-6" id = "article_title" > {{ today_article["article_title"] }}< / p > < br / >
< p class = "lead" > < font id = "article" > {{ today_article["article_body"] }}< / font > < / p > < br / >
< div >
< p > < small class = "text-muted" id = "source" > {{ today_article['source'] }}< / small > < / p > < br / >
< / div >
< p > < b id = "question" > {{ today_article['question'] }}< / b > < / p > < br / >
< script type = "text/javascript" >
< script type = "text/javascript" >
function toggle_visibility(id) { {# https://css-tricks.com/snippets/javascript/showhide-element/#}
function toggle_visibility(id) { {# https://css-tricks.com/snippets/javascript/showhide-element/#}
const e = document.getElementById(id);
const e = document.getElementById(id);
if (e.style.display === 'block')
if(e.style.display === 'block')
e.style.display = 'none';
e.style.display = 'none';
else
else
e.style.display = 'block';
e.style.display = 'block';
}
}
< / script >
< / script >
< button onclick = "toggle_visibility('answer');" > ANSWER< / button >
< button onclick = "toggle_visibility('answer');" > ANSWER< / button >
< div id = "answer" style = "display:none;" > {{ today_article['answer'] }}< / div >
< div id = "answer" style = "display:none;" > {{ today_article['answer'] }}< / div > < br / >
< br / >
< / div >
< / div >
< / div >
< / div >
< div class = "alert alert-success" role = "alert" id = "not_found" style = "display:none;" >
< div class = "alert alert-success" role = "alert" id = "not_found" style = "display:none;" >
< p class = "text-muted" > < span class = "badge bg-success" > Notes:< / span > < br > No article is currently available for
< p class = "text-muted" > < span class = "badge bg-success" > Notes:< / span > < br > No article is currently available for you. You can try again a few times or mark new words in the passage to improve your level.< / p >
you. You can try again a few times or mark new words in the passage to improve your level.< / p >
< / div >
< / div >
< div class = "alert alert-success" role = "alert" id = "read_all" style = "display:none;" >
< div class = "alert alert-success" role = "alert" id = "read_all" style = "display:none;" >
< p class = "text-muted" > < span class = "badge bg-success" > Notes:< / span > < br > You've read all the articles.< / p >
< p class = "text-muted" > < span class = "badge bg-success" > Notes:< / span > < br > You've read all the articles.< / p >
< / div >
< / div >
< / div >
< / div >
< input type = "checkbox" id= "highlightCheckbox" onclick= "toggleHighlighting()" / > 生词高亮
< input type = "checkbox" onclick= "toggleHighlighting()" checked / > 生词高亮
< input type = "checkbox" id= "readCheckbox" onclick= "onReadClick()" / > 大声朗读
< input type = "checkbox" onclick= "onReadClick()" checked / > 大声朗读
< input type = "checkbox" id= "chooseCheckbox" onclick= "onChooseClick()" / > 划词入库
< input type = "checkbox" onclick= "onChooseClick()" checked / > 划词入库
< div class = "range" >
< div class = "range" >
< div class = "field" >
< div class = "field" >
< div class = "sliderValue" >
< div class = "sliderValue" >
@ -144,8 +97,8 @@
< p > < b > 收集生词吧< / b > (可以在正文中划词,也可以复制黏贴)< / p >
< p > < b > 收集生词吧< / b > (可以在正文中划词,也可以复制黏贴)< / p >
< form method = "post" action = "/{{ username }}/userpage" >
< form method = "post" action = "/{{ username }}/userpage" >
< textarea name = "content" id = "selected-words" rows = "10" cols = "120" > < / textarea > < br / >
< textarea name = "content" id = "selected-words" rows = "10" cols = "120" > < / textarea > < br / >
< button class = "btn btn-primary btn-lg" type = "submit" onclick = "Reader.stopRead()" > 把生词加入我的生词库< / button >
< input type = "submit" value = "把生词加入我的生词库" / >
< button class = "btn btn-primary btn-lg" type = "reset" onclick = "clearSelectedWords()" > 清除< / button >
< input type = "reset" value = "清除" / >
< / form >
< / form >
{% if session.get['thisWord'] %}
{% if session.get['thisWord'] %}
< script type = "text/javascript" >
< script type = "text/javascript" >
@ -173,10 +126,9 @@
{% 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 %}
{% endif %}
{% endif %}
< p id = 'p_{{ word }}' class = "new-word" >
< p id = 'p_{{ word }}' class = "new-word" >
< a id = "word_{{ word }}" class = "btn btn-light"
< a id = "word_{{ word }}" class = "btn btn-light" href = 'http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'
href='http://youdao.com/w/eng/{{ word }}/#keyfrom=dict2.index'
role="button">{{ word }}< / a >
role="button">{{ word }}< / a >
( < a id = "freq_{{ word }}" title = "{{ word }}" > {{ freq }}< / a > )
( < a id = "freq_{{ word }}" title = "{{ word }}" > {{ freq }}< / a > )
< a class = "btn btn-success" onclick = "familiar('{{ word }}')" role = "button" > 熟悉< / a >
< a class = "btn btn-success" onclick = "familiar('{{ word }}')" role = "button" > 熟悉< / a >
< a class = "btn btn-warning" onclick = "unfamiliar('{{ word }}')" role = "button" > 不熟悉< / a >
< a class = "btn btn-warning" onclick = "unfamiliar('{{ word }}')" role = "button" > 不熟悉< / a >
@ -195,127 +147,60 @@
{% endfor %}
{% endfor %}
{% endif %}
{% endif %}
< script type = "text/javascript" >
< script type = "text/javascript" >
window.onload = function () { // 页面加载时执行
function load_next_article(){
const settings = {
// initialize settings from localStorage
highlightChecked: localStorage.getItem('highlightChecked') !== 'false', // localStorage stores strings, default to true. same below
readChecked: localStorage.getItem('readChecked') !== 'false',
chooseChecked: localStorage.getItem('chooseChecked') !== 'false',
rangeValue: localStorage.getItem('rangeValue') || '1',
selectedWords: localStorage.getItem('selectedWords') || ''
};
const elements = {
highlightCheckbox: document.querySelector('#highlightCheckbox'),
readCheckbox: document.querySelector('#readCheckbox'),
chooseCheckbox: document.querySelector('#chooseCheckbox'),
rangeComponent: document.querySelector('#rangeComponent'),
rangeValueDisplay: document.querySelector('#rangeValue'),
selectedWordsInput: document.querySelector('#selected-words')
};
// 应用设置到页面元素
elements.highlightCheckbox.checked = settings.highlightChecked;
elements.readCheckbox.checked = settings.readChecked;
elements.chooseCheckbox.checked = settings.chooseChecked;
elements.rangeComponent.value = settings.rangeValue;
elements.rangeValueDisplay.textContent = `${settings.rangeValue}x`;
elements.selectedWordsInput.value = settings.selectedWords;
// 刷新页面或进入页面时判断,若不是首篇文章,则上一篇按钮可见
if (sessionStorage.getItem('pre_page_button') !== 'display' & & sessionStorage.getItem('pre_page_button')) {
$('#load_pre_article').show();
}
// 事件监听器
elements.selectedWordsInput.addEventListener('input', () => {
localStorage.setItem('selectedWords', elements.selectedWordsInput.value);
});
elements.rangeComponent.addEventListener('input', () => {
const rangeValue = elements.rangeComponent.value;
elements.rangeValueDisplay.textContent = `${rangeValue}x`;
localStorage.setItem('rangeValue', rangeValue);
});
};
function clearSelectedWords() {
localStorage.removeItem('selectedWords');
document.querySelector('#selected-words').value = '';
}
function load_next_article() {
$("#load_next_article").prop("disabled", true)
$.ajax({
$.ajax({
url: '/get_next_article/{{username}}',
url: '/get_next_article/{{username}}',
dataType: 'json',
dataType: 'json',
success: function (data) {
success: function(data) {
// 更新页面内容
// 更新页面内容
if (data['today_article']) {
if(data['today_article']){
update(data['today_article']);
update(data['today_article']);
check_pre(data['visited_articles']);
check_pre(data['visited_articles']);
check_next(data['result_of_generate_article']);
check_next(data['result_of_generate_article']);
}
}
}, complete: function (xhr, status) {
$("#load_next_article").prop("disabled", false)
}
}
});
});
}
}
function load_pre_article(){
function load_pre_article() {
$.ajax({
$.ajax({
url: '/get_pre_article/{{username}}',
url: '/get_pre_article/{{username}}',
dataType: 'json',
dataType: 'json',
success: function (data) {
success: function(data) {
// 更新页面内容
// 更新页面内容
if (data['today_article']) {
if(data['today_article']){
update(data['today_article']);
update(data['today_article']);
check_pre(data['visited_articles']);
check_pre(data['visited_articles']);
}
}
}
}
});
});
}
}
function update(today_article){
function update(today_article) {
$('#user-level').html(today_article['user_level']);
$('#user_level').html(today_article['user_level']);
$('#text_level').html(today_article["text_level"]);
$('#text_level').html(today_article["text_level"]);
$('#date').html('Article added on: ' + today_article["date"]);
$('#date').html('Article added on: '+today_article["date"]);
$('#article_title').html(today_article["article_title"]);
$('#article_title').html(today_article["article_title"]);
$('#article').html(today_article["article_body"]);
$('#article').html(today_article["article_body"]);
$('#source').html(today_article['source']);
$('#source').html(today_article['source']);
$('#question').html(today_article["question"]);
$('#question').html(today_article["question"]);
$('#answer').html(today_article["answer"]);
$('#answer').html(today_article["answer"]);
document.querySelector('#text_level').classList.add('mark'); // highlight text difficult level for 2 seconds
setTimeout(() => {
document.querySelector('#text_level').classList.remove('mark');
}, 2000);
document.querySelector('#user_level').classList.add('mark'); // do the same thing for user difficulty level
setTimeout(() => {
document.querySelector('#user_level').classList.remove('mark');
}, 2000);
}
}
<!-- 检查是否存在上一篇或下一篇,不存在则对应按钮隐藏 -->
<!-- 检查是否存在上一篇或下一篇,不存在则对应按钮隐藏 -->
function check_pre(visited_articles){
function check_pre(visited_articles) {
if((visited_articles=='')||(visited_articles['index']< =0)){
if ((visited_articles == '') || (visited_articles['index'] < = 0)) {
$('#load_pre_article').hide();
$('#load_pre_article').hide();
sessionStorage.setItem('pre_page_button', 'display')
}else{
} else {
$('#load_pre_article').show();
$('#load_pre_article').show();
sessionStorage.setItem('pre_page_button', 'show')
}
}
}
}
function check_next(result_of_generate_article){
function check_next(result_of_generate_article) {
if(result_of_generate_article == "found"){
if (result_of_generate_article == "found") {
$('#found').show();$('#not_found').hide();
$('#found').show();
$('#not_found').hide();
$('#read_all').hide();
$('#read_all').hide();
} else if (result_of_generate_article == "not found") {
}else if(result_of_generate_article == "not found"){
$('#found').hide();
$('#found').hide();
$('#not_found').show();
$('#not_found').show();
$('#read_all').hide();
$('#read_all').hide();
} else {
}else{
$('#found').hide();
$('#found').hide();
$('#not_found').hide();
$('#not_found').hide();
$('#read_all').show();
$('#read_all').show();