From e40ebac452bf8536e3f2746b75a15c9322bbba77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=87=AF?= <1183989703@qq.com>
Date: Sat, 11 Jun 2022 23:08:29 +0800
Subject: [PATCH 01/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'app/static/css/boot?=
=?UTF-8?q?strap.css'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/static/css/bootstrap.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/static/css/bootstrap.css b/app/static/css/bootstrap.css
index dcde7a8..cd8af32 100644
--- a/app/static/css/bootstrap.css
+++ b/app/static/css/bootstrap.css
@@ -417,7 +417,7 @@ progress {
}
.lead {
- font-size: 1.25rem;
+ font-size: 2rem;
font-weight: 300
}
From 4817557099617b241489a5d3cd423c1925f5218a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=87=AF?= <1183989703@qq.com>
Date: Sat, 11 Jun 2022 23:20:41 +0800
Subject: [PATCH 02/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'app/Article.py'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/Article.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/Article.py b/app/Article.py
index 774d25a..04a32ea 100644
--- a/app/Article.py
+++ b/app/Article.py
@@ -68,7 +68,7 @@ def get_today_article(user_word_list, articleID):
s += '
'
article_title = get_article_title(d['text'])
article_body = get_article_body(d['text'])
- s += '
%s
' % (article_title)
+ s += '
%s
' % (article_title)
s += '
%s
' % (article_body)
s += '
%s
' % (d['source'])
s += '
%s
' % (get_question_part(d['question']))
From b53e7031e5d1a21d300c8a40821694469e282e66 Mon Sep 17 00:00:00 2001
From: lin <1002171145@qq.com>
Date: Mon, 13 Jun 2022 11:40:20 +0800
Subject: [PATCH 03/51] Bug412-JiangLetian
---
app/static/js/highlight.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/app/static/js/highlight.js b/app/static/js/highlight.js
index 2e0d84a..d91fb24 100644
--- a/app/static/js/highlight.js
+++ b/app/static/js/highlight.js
@@ -29,9 +29,10 @@ function highLight() {
if (sel_word1 != null) {
var list = sel_word1.value.split(" ");
for (var i = 0; i < list.length; ++i) {
- list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");
+ list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");//消除字符串两边空字符
if (list[i] != "" && "
".indexOf(list[i]) == -1 && " ".indexOf(list[i]) == -1) {
- txt = txt.replace(new RegExp(list[i], "g"), "
" + list[i] + " ");
+
+ txt = txt.replace(new RegExp("\\s"+list[i]+"\\s", "g"), "
" + list[i] + " ");
}
}
}
@@ -40,7 +41,7 @@ function highLight() {
for (var i = 0; i < list2.length; ++i) {
list2[i] = list2[i].replace(/(^\s*)|(\s*$)/g, "");
if (list2[i] != "" && "
".indexOf(list2[i]) == -1 && " ".indexOf(list2[i]) == -1) {
- txt = txt.replace(new RegExp(list2[i], "g"), "
" + list2[i] + " ");
+ txt = txt.replace(new RegExp("\\s"+list2[i]+"\\s", "g"), "
" + list2[i] + " ");
}
}
}
From 041cbd97fc9e0b48126ed4dd633fac709599297b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=92=8B=E4=B9=90=E5=A4=A9?= <1249355696@qq.com>
Date: Mon, 13 Jun 2022 21:32:49 +0800
Subject: [PATCH 04/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'app/static/js/highl?=
=?UTF-8?q?ight.js'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/static/js/highlight.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/static/js/highlight.js b/app/static/js/highlight.js
index d91fb24..21417c1 100644
--- a/app/static/js/highlight.js
+++ b/app/static/js/highlight.js
@@ -31,7 +31,7 @@ function highLight() {
for (var i = 0; i < list.length; ++i) {
list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");//消除字符串两边空字符
if (list[i] != "" && "
".indexOf(list[i]) == -1 && " ".indexOf(list[i]) == -1) {
-
+ //将正则表达式进行修改 表示搜索的是两端带有空格的list[i] 那么搜索的便为一个完整单词 然后在mark标签的前后各加了一个空格对其进行替换
txt = txt.replace(new RegExp("\\s"+list[i]+"\\s", "g"), "
" + list[i] + " ");
}
}
@@ -41,6 +41,7 @@ function highLight() {
for (var i = 0; i < list2.length; ++i) {
list2[i] = list2[i].replace(/(^\s*)|(\s*$)/g, "");
if (list2[i] != "" && "
".indexOf(list2[i]) == -1 && " ".indexOf(list2[i]) == -1) {
+ //将正则表达式进行修改 表示搜索的是两端带有空格的list2[i] 那么搜索的便为一个完整单词 然后在mark标签的前后各加了一个空格对其进行替换
txt = txt.replace(new RegExp("\\s"+list2[i]+"\\s", "g"), "
" + list2[i] + " ");
}
}
From ee44372848027a477a322386c323110851d67879 Mon Sep 17 00:00:00 2001
From: stewy
Date: Tue, 14 Jun 2022 12:37:28 +0800
Subject: [PATCH 05/51] improved
---
app/templates/login.html | 148 +++++++++++++++++++++++++++++++++++---
app/templates/signup.html | 143 ++++++++++++++++++++++++++++++++++--
2 files changed, 278 insertions(+), 13 deletions(-)
diff --git a/app/templates/login.html b/app/templates/login.html
index e56b678..028e004 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -5,17 +5,147 @@ You're logged in already!
{% else %}
+
+
+
+
+
+
+
+
Sign Up
{% endif %}
{% endblock %}
+jjj
\ No newline at end of file
diff --git a/app/templates/signup.html b/app/templates/signup.html
index eb3e301..0252c18 100644
--- a/app/templates/signup.html
+++ b/app/templates/signup.html
@@ -7,13 +7,148 @@ You're logged in already!
Logout .
{{ get_flashed_messages()[0] | safe }}
-
Sign up here.
+
+
+
+
+
+
+
{% endif %}
{% endblock %}
From 6823c1004313b0b697caa9c0dc245825fa9f33b2 Mon Sep 17 00:00:00 2001
From: stewy
Date: Tue, 14 Jun 2022 13:25:42 +0800
Subject: [PATCH 06/51] improved
---
app/templates/login.html | 16 +---------------
app/templates/signup.html | 16 ----------------
2 files changed, 1 insertion(+), 31 deletions(-)
diff --git a/app/templates/login.html b/app/templates/login.html
index 028e004..15b9ec3 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -6,20 +6,7 @@ You're logged in already!
{% else %}
-
Sign In
diff --git a/app/templates/signup.html b/app/templates/signup.html
index 0252c18..190cf76 100644
--- a/app/templates/signup.html
+++ b/app/templates/signup.html
@@ -8,20 +8,6 @@ You're logged in already! Logout .
{{ get_flashed_messages()[0] | safe }}
-
-
Sign Up
From 9d420acd8bbf1cb22da9cf94d559822e4a0c3ef9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=82=B1=E5=BF=A0=E8=BE=89?= <1392993990@qq.com>
Date: Mon, 18 Jul 2022 13:29:04 +0800
Subject: [PATCH 07/51] [REFACTOR] user_service.py: Added id to user name, word
and frequency for click to execute AJAX request in JS (#30)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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
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>
---
app/static/config.yml | 4 +-
app/static/js/jquery.js | 2 +
app/static/js/word_operation.js | 43 ++++++++++++++++
app/templates/userpage_get.html | 37 ++++----------
app/test/test_word_operation.py | 91 +++++++++++++++++++++++++++++++++
app/user_service.py | 6 +--
6 files changed, 150 insertions(+), 33 deletions(-)
create mode 100644 app/static/js/jquery.js
create mode 100644 app/static/js/word_operation.js
create mode 100644 app/test/test_word_operation.py
diff --git a/app/static/config.yml b/app/static/config.yml
index 1ab8290..20aa396 100644
--- a/app/static/config.yml
+++ b/app/static/config.yml
@@ -6,8 +6,8 @@ css:
# 全局引入的js文件地址
js:
head: # 在页面加载之前加载
- # - static/js/APlayer.js
- # - static/js/Meting.js
+ - static/js/jquery.js
+ - static/js/word_operation.js
bottom: # 在页面加载完之后加载
- static/js/fillword.js
- static/js/highlight.js
diff --git a/app/static/js/jquery.js b/app/static/js/jquery.js
new file mode 100644
index 0000000..c4c6022
--- /dev/null
+++ b/app/static/js/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=" ",y.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
-
English Pal for {{ username }}
+
English Pal for {{ username }}
退出
重设密码
@@ -57,37 +57,18 @@
我的生词簿
{% for x in lst3 %}
{% set word = x[0] %}
-
{% set freq = x[1] %}
{% if session.get('thisWord') == x[0] and session.get('time') == 1 %}
{% endif %}
- {% if freq > 1 %}
-
- {{ word }}
- (
- {{ freq }}
- )
-
- 熟悉
- 不熟悉
- 删除
-
- {% else %}
-
- {{ word }}
- (
- {{ freq }}
- )
- 熟悉
- 不熟悉
- 删除
-
- {% endif %}
- {% else %}
-
{{ word }} {{ freq }}
+
+ {{ word }}
+ ( {{ freq }} )
+ 熟悉
+ 不熟悉
+ 删除
+
{% endfor %}
{% endif %}
diff --git a/app/test/test_word_operation.py b/app/test/test_word_operation.py
new file mode 100644
index 0000000..dafd51b
--- /dev/null
+++ b/app/test/test_word_operation.py
@@ -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
diff --git a/app/user_service.py b/app/user_service.py
index 139c140..c8ac8a1 100644
--- a/app/user_service.py
+++ b/app/user_service.py
@@ -48,7 +48,7 @@ def unfamiliar(username, word):
pickle_idea.unfamiliar(user_freq_record, word)
session['thisWord'] = word # 1. put a word into session
session['time'] = 1
- return redirect(url_for('user_bp.userpage', username=username))
+ return "success"
@userService.route("/
//familiar", methods=['GET', 'POST'])
@@ -63,7 +63,7 @@ def familiar(username, word):
pickle_idea.familiar(user_freq_record, word)
session['thisWord'] = word # 1. put a word into session
session['time'] = 1
- return redirect(url_for('user_bp.userpage', username=username))
+ return "success"
@userService.route("///del", methods=['GET', 'POST'])
@@ -77,7 +77,7 @@ def deleteword(username, word):
user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username)
pickle_idea2.deleteRecord(user_freq_record, word)
flash(f'{word} is no longer in your word list.')
- return redirect(url_for('user_bp.userpage', username=username))
+ return "success"
@userService.route("/", methods=['GET', 'POST'])
From c21659ba7e2259c795a4e53bb0331809fe5c29c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E9=9D=96=E6=AF=85?=
Date: Mon, 18 Jul 2022 16:00:08 +0800
Subject: [PATCH 08/51] =?UTF-8?q?Bug477=20=E9=87=8D=E6=9E=84=20and=20?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=9F=E8=83=BD=20(#48)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: cjybyjk
Co-authored-by: Lan Hui <1348141770@qq.com>
Reviewed-on: http://121.4.94.30:3000/mrlan/EnglishPal/pulls/48
Co-authored-by: 陈靖毅
Co-committed-by: 陈靖毅
---
app/static/js/fillword.js | 77 ++++++++++++++++++++++++---------
app/static/js/highlight.js | 67 ++++++++++++++--------------
app/templates/userpage_get.html | 9 +++-
3 files changed, 97 insertions(+), 56 deletions(-)
diff --git a/app/static/js/fillword.js b/app/static/js/fillword.js
index 3e3fbd9..505808e 100644
--- a/app/static/js/fillword.js
+++ b/app/static/js/fillword.js
@@ -1,29 +1,64 @@
-isRead = true;
-isChoose = true;
-var reader = window.speechSynthesis; // 全局定义朗读者,以便朗读和暂停
+let isRead = true;
+let isChoose = true;
+let reader = window.speechSynthesis; // 全局定义朗读者,以便朗读和暂停
+let current_position = 0; // 朗读文本的当前位置
+let original_position = 0; // 朗读文本的初始位置
+let to_speak = ""; // 朗读的初始内容
-function getWord(){
- var word = window.getSelection?window.getSelection():document.selection.createRange().text;
- return word;
+function getWord() {
+ return window.getSelection ? window.getSelection() : document.selection.createRange().text;
}
-function fillinWord(){
- var word = getWord();
- if (isRead) read(word);
- if (!isChoose) return;
- var element = document.getElementById("selected-words");
- element.value = element.value + " " + word;
+
+function fillInWord() {
+ let word = getWord();
+ if (isRead) read(word);
+ if (!isChoose) return;
+ const element = document.getElementById("selected-words");
+ element.value = element.value + " " + word;
}
-document.getElementById("text-content").addEventListener("click", fillinWord, false);
-function read(s){
- var msg = new SpeechSynthesisUtterance(s);
- reader.speak(msg);
+
+document.getElementById("text-content").addEventListener("click", fillInWord, false);
+
+function makeUtterance(str, rate) {
+ let msg = new SpeechSynthesisUtterance(str);
+ msg.rate = rate;
+ msg.lang = "en-US"; // TODO: add language options menu
+ msg.onboundary = ev => {
+ if (ev.name == "word") {
+ current_position = ev.charIndex;
+ }
+ }
+ return msg;
}
-function onReadClick(){
+
+const sliderValue = document.getElementById("rangeValue"); // 显示值
+const inputSlider = document.getElementById("rangeComponent"); // 滑块元素
+inputSlider.oninput = () => {
+ let value = inputSlider.value; // 获取滑块的值
+ sliderValue.textContent = value + '×';
+ if (!reader.speaking) return;
+ reader.cancel();
+ let msg = makeUtterance(to_speak.substring(original_position + current_position), value);
+ original_position = original_position + current_position;
+ current_position = 0;
+ reader.speak(msg);
+};
+
+function read(s) {
+ to_speak = s.toString();
+ original_position = 0;
+ current_position = 0;
+ let msg = makeUtterance(to_speak, inputSlider.value);
+ reader.speak(msg);
+}
+
+function onReadClick() {
isRead = !isRead;
- if(!isRead){
- reader.cancel();
+ if (!isRead) {
+ reader.cancel();
}
}
-function onChooseClick(){
+
+function onChooseClick() {
isChoose = !isChoose;
-}
\ No newline at end of file
+}
diff --git a/app/static/js/highlight.js b/app/static/js/highlight.js
index 2e0d84a..5ef3f3c 100644
--- a/app/static/js/highlight.js
+++ b/app/static/js/highlight.js
@@ -1,45 +1,44 @@
-var isHighlight = true;
+let isHighlight = true;
function cancelBtnHandler() {
cancel_highLight();
- document.getElementById("text-content").removeEventListener("click", fillinWord, false);
- document.getElementById("text-content").removeEventListener("touchstart", fillinWord, false);
- document.getElementById("text-content").addEventListener("click", fillinWord2, false);
- document.getElementById("text-content").addEventListener("touchstart", fillinWord2, false);
+ document.getElementById("text-content").removeEventListener("click", fillInWord, false);
+ document.getElementById("text-content").removeEventListener("touchstart", fillInWord, false);
+ document.getElementById("text-content").addEventListener("click", fillInWord2, false);
+ document.getElementById("text-content").addEventListener("touchstart", fillInWord2, false);
}
function showBtnHandler() {
- document.getElementById("text-content").removeEventListener("click", fillinWord2, false);
- document.getElementById("text-content").removeEventListener("touchstart", fillinWord2, false);
- document.getElementById("text-content").addEventListener("click", fillinWord, false);
- document.getElementById("text-content").addEventListener("touchstart", fillinWord, false);
+ document.getElementById("text-content").removeEventListener("click", fillInWord2, false);
+ document.getElementById("text-content").removeEventListener("touchstart", fillInWord2, false);
+ document.getElementById("text-content").addEventListener("click", fillInWord, false);
+ document.getElementById("text-content").addEventListener("touchstart", fillInWord, false);
highLight();
}
function getWord() {
- var word = window.getSelection ? window.getSelection() : document.selection.createRange().text;
- return word;
+ return window.getSelection ? window.getSelection() : document.selection.createRange().text;
}
function highLight() {
- if(!isHighlight) return;
- var txt = document.getElementById("article").innerText;
- var sel_word1 = document.getElementById("selected-words");
- var sel_word2 = document.getElementById("selected-words2");
+ if (!isHighlight) return;
+ let txt = document.getElementById("article").innerText;
+ let sel_word1 = document.getElementById("selected-words");
+ let sel_word2 = document.getElementById("selected-words2");
if (sel_word1 != null) {
- var list = sel_word1.value.split(" ");
- for (var i = 0; i < list.length; ++i) {
+ const list = sel_word1.value.split(" ");
+ for (let i = 0; i < list.length; ++i) {
list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list[i] != "" && "".indexOf(list[i]) == -1 && " ".indexOf(list[i]) == -1) {
+ if (list[i] !== "" && "".indexOf(list[i]) === -1 && " ".indexOf(list[i]) === -1) {
txt = txt.replace(new RegExp(list[i], "g"), "" + list[i] + " ");
}
}
}
if (sel_word2 != null) {
- var list2 = sel_word2.value.split(" ");
- for (var i = 0; i < list2.length; ++i) {
+ const list2 = sel_word2.value.split(" ");
+ for (let i = 0; i < list2.length; ++i) {
list2[i] = list2[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list2[i] != "" && "".indexOf(list2[i]) == -1 && " ".indexOf(list2[i]) == -1) {
+ if (list2[i] !== "" && "".indexOf(list2[i]) === -1 && " ".indexOf(list2[i]) === -1) {
txt = txt.replace(new RegExp(list2[i], "g"), "" + list2[i] + " ");
}
}
@@ -48,24 +47,24 @@ function highLight() {
}
function cancel_highLight() {
- var txt = document.getElementById("article").innerText;
- var sel_word1 = document.getElementById("selected-words");
- var sel_word2 = document.getElementById("selected-words2");
+ const list = sel_word1.value.split(" ");
+ let txt = document.getElementById("article").innerText;
+ let sel_word1 = document.getElementById("selected-words");
+ const sel_word2 = document.getElementById("selected-words2");
if (sel_word1 != null) {
- var list = sel_word1.value.split(" ");
- for (var i = 0; i < list.length; ++i) {
+ for (let i = 0; i < list.length; ++i) {
list[i] = list[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list[i] != "") {
+ if (list[i] !== "") {
txt = txt.replace("" + list[i] + " ", "list[i]");
}
}
}
if (sel_word2 != null) {
- var list2 = sel_word1.value.split(" ");
- for (var i = 0; i < list2.length; ++i) {
- var list2 = sel_word2.value.split(" ");
+ let list2 = sel_word1.value.split(" ");
+ for (let i = 0; i < list2.length; ++i) {
+ list2 = sel_word2.value.split(" ");
list2[i] = list2[i].replace(/(^\s*)|(\s*$)/g, "");
- if (list2[i] != "") {
+ if (list2[i] !== "") {
txt = txt.replace("" + list[i] + " ", "list[i]");
}
}
@@ -73,11 +72,11 @@ function cancel_highLight() {
document.getElementById("article").innerHTML = txt;
}
-function fillinWord() {
+function fillInWord() {
highLight();
}
-function fillinWord2() {
+function fillInWord2() {
cancel_highLight();
}
@@ -92,4 +91,4 @@ function ChangeHighlight() {
}
}
-showBtnHandler();
+showBtnHandler();
\ No newline at end of file
diff --git a/app/templates/userpage_get.html b/app/templates/userpage_get.html
index d807b4e..7fb3bb2 100644
--- a/app/templates/userpage_get.html
+++ b/app/templates/userpage_get.html
@@ -35,7 +35,14 @@
生词高亮
大声朗读
划词入库
-
+
收集生词吧 (可以在正文中划词,也可以复制黏贴)
-
+
-
+
- Sign In
+ 登录
- Sign Up
+ 注册
{% endif %}
{% endblock %}
diff --git a/app/templates/signup.html b/app/templates/signup.html
index 190cf76..1d31c20 100644
--- a/app/templates/signup.html
+++ b/app/templates/signup.html
@@ -123,13 +123,13 @@ h1{
-
+
-
+
-
+
- Sign Up
+ 注册
From fdb432031f74ab2955d1ee4bb9089a70d2e5f7fd Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Wed, 20 Jul 2022 17:06:11 +0800
Subject: [PATCH 12/51] Better indentation.
---
app/templates/login.html | 200 +++++++++++++++++++--------------------
1 file changed, 100 insertions(+), 100 deletions(-)
diff --git a/app/templates/login.html b/app/templates/login.html
index 852d750..71a3ceb 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -6,121 +6,121 @@ You're logged in already!
{% else %}
+
-
-
+
+
-
+
@@ -128,9 +128,9 @@ h1{
登录
-
+
-
注册
-{% endif %}
-{% endblock %}
+
注册
+ {% endif %}
+ {% endblock %}
From 8747f35fd8f1dd40400c44ed9ed955e5c1cce6ae Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Wed, 20 Jul 2022 17:07:09 +0800
Subject: [PATCH 13/51] Make up the enclosing >.
---
app/templates/login.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/templates/login.html b/app/templates/login.html
index 71a3ceb..54c61db 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -129,7 +129,7 @@ You're logged in already!
登录
-
+
注册
{% endif %}
{% endblock %}
From 8998d6e4afedd85da68a6d74cbf9213251331486 Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Wed, 20 Jul 2022 17:08:07 +0800
Subject: [PATCH 14/51] Improve spacing.
---
app/templates/login.html | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/templates/login.html b/app/templates/login.html
index 54c61db..e3e19d1 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -116,21 +116,21 @@ You're logged in already!
+
-
-
-
登录
-
-
-
注册
- {% endif %}
- {% endblock %}
+
+
+
+注册
+
+{% endif %}
+{% endblock %}
From 9beb1ad1d2fb5df12dffff1f6f990fd12cf891a7 Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Wed, 20 Jul 2022 17:09:04 +0800
Subject: [PATCH 15/51] Make up the enclosing >.
---
app/templates/signup.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/templates/signup.html b/app/templates/signup.html
index 1d31c20..610651f 100644
--- a/app/templates/signup.html
+++ b/app/templates/signup.html
@@ -132,6 +132,7 @@ h1{
注册
+
{% endif %}
{% endblock %}
From e9eb604a2255d563b61b56ed7f45f439255e8935 Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Wed, 20 Jul 2022 17:10:03 +0800
Subject: [PATCH 16/51] Improve spacing and indentation.
---
app/templates/signup.html | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/app/templates/signup.html b/app/templates/signup.html
index 610651f..bbc653a 100644
--- a/app/templates/signup.html
+++ b/app/templates/signup.html
@@ -117,22 +117,20 @@ h1{
-
{% endif %}
{% endblock %}
From 2c1bc98833e2427aab810e23248a9476e85bc030 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BE=90=E5=B9=B8?= <2567198082@qq.com>
Date: Thu, 21 Jul 2022 23:13:33 +0800
Subject: [PATCH 17/51] Bug422-XuXing (#46)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加了返回上一篇的按钮及相关功能的实现,当点击下一篇文章跳转至下一篇时,页面中会增加一个返回上一篇按钮,点击返回上一篇按钮后可以回到上一篇。
Co-authored-by: Lan Hui <1348141770@qq.com>
Reviewed-on: http://121.4.94.30:3000/mrlan/EnglishPal/pulls/46
Co-authored-by: 徐幸 <2567198082@qq.com>
Co-committed-by: 徐幸 <2567198082@qq.com>
---
app/templates/userpage_get.html | 8 +++++++-
app/user_service.py | 13 +++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/app/templates/userpage_get.html b/app/templates/userpage_get.html
index 8b11365..be503e6 100644
--- a/app/templates/userpage_get.html
+++ b/app/templates/userpage_get.html
@@ -28,7 +28,13 @@
{{ flashed_messages|safe }}
- 下一篇 Next Article
+ 下一篇 Next Article
+ {% if session.get('articleID') != session.get('old_articleID') %}
+ {% if session.get('old_articleID') != None %}
+ 上一篇 Previous Article
+ {% endif%}
+ {% endif %}
+
阅读文章并回答问题
{{ today_article|safe }}
diff --git a/app/user_service.py b/app/user_service.py
index c8ac8a1..5148a60 100644
--- a/app/user_service.py
+++ b/app/user_service.py
@@ -29,12 +29,25 @@ def user_reset(username):
:param username: 用户名
:return: 返回页面内容
'''
+ session['old_articleID'] = session.get('articleID')
if request.method == 'GET':
session['articleID'] = None
return redirect(url_for('user_bp.userpage', username=username))
else:
return 'Under construction'
+@userService.route("//back", methods=['GET'])
+def user_back(username):
+ '''
+ 用户界面
+ :param username: 用户名
+ :return: 返回页面内容
+ '''
+ if request.method == 'GET':
+ session['articleID'] = session.get('old_articleID')
+ return redirect(url_for('user_bp.userpage', username=username))
+
+
@userService.route("///unfamiliar", methods=['GET', 'POST'])
def unfamiliar(username, word):
From 828cef406ccc4996925359650312d3dc41625100 Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Fri, 29 Jul 2022 15:22:42 +0800
Subject: [PATCH 18/51] Escape user input first
---
app/main.py | 3 ++-
app/user_service.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/main.py b/app/main.py
index d903bf4..e311bb0 100644
--- a/app/main.py
+++ b/app/main.py
@@ -6,6 +6,7 @@
# Written permission must be obtained from the author for commercial uses.
###########################################################################
+from flask import escape
from Login import *
from Article import *
import Yaml
@@ -81,7 +82,7 @@ def mainpage():
:return: 主界面
'''
if request.method == 'POST': # when we submit a form
- content = request.form['content']
+ content = escape(request.form['content'])
f = WordFreq(content)
lst = f.get_freq()
# save history
diff --git a/app/user_service.py b/app/user_service.py
index 5148a60..79c7888 100644
--- a/app/user_service.py
+++ b/app/user_service.py
@@ -115,7 +115,7 @@ def userpage(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']
+ content = escape(request.form['content'])
f = WordFreq(content)
lst = f.get_freq()
return render_template('userpage_post.html',username=username,lst = lst, yml=Yaml.yml)
From 0098fa87469f918f2c4a84f5ef49031e8e63c4f0 Mon Sep 17 00:00:00 2001
From: Lan Hui <1348141770@qq.com>
Date: Fri, 29 Jul 2022 15:26:19 +0800
Subject: [PATCH 19/51] Prevent attribute injection
---
app/templates/userpage_post.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/templates/userpage_post.html b/app/templates/userpage_post.html
index ba3b38d..725ee09 100644
--- a/app/templates/userpage_post.html
+++ b/app/templates/userpage_post.html
@@ -30,7 +30,7 @@
:
{{word}}
({{x[1]}})
-
+
{% endfor %}
@@ -42,4 +42,4 @@
{% endfor %}
{% endif %}
-