diff --git a/app/templates/userpage_get.html b/app/templates/userpage_get.html index 571051a..762221f 100644 --- a/app/templates/userpage_get.html +++ b/app/templates/userpage_get.html @@ -114,6 +114,11 @@ <input type="checkbox" id="highlightCheckbox" onclick="toggleHighlighting()" />生词高亮 <input type="checkbox" id="readCheckbox" onclick="onReadClick()" />大声朗读 <input type="checkbox" id="chooseCheckbox" onclick="onChooseClick()" />划词入库 + <button onclick="saveArticle()" class="btn btn-primary">标记文章</button> + <select id="saved_articles_dropdown" style="height: 50px"> + <!-- 这里将显示已经保存的文章 --> + <option></option> + </select> <div class="range"> <div class="field"> <div class="sliderValue"> @@ -297,6 +302,85 @@ $('#read_all').show(); } } + function saveArticle() { + const article = { + user_level: document.getElementById('user_level').innerText, + text_level: document.getElementById('text_level').innerText, + date: document.getElementById('date').innerText.replace('Article added on: ', ''), + article_title: document.getElementById('article_title').innerText, + article_body: document.getElementById('article').innerText, + source: document.getElementById('source').innerText, + question: document.getElementById('question').innerText, + answer: document.getElementById('answer').innerText + }; + + const articleJSON = JSON.stringify(article); + const articleTitle = article.article_title; + const savedArticlesDropdown = document.getElementById('saved_articles_dropdown'); + + var option = document.createElement('option'); + option.text = articleTitle; + option.value = articleJSON; // 存储序列化的JSON字符串 + option.title = article.article_title; + savedArticlesDropdown.appendChild(option); + localStorage.setItem(articleTitle, articleJSON); // 以文章标题为键,序列化的JSON字符串为值存储 + alert("文章已标记"); +} + function loadSelectedArticle() { + const selectedOption = document.getElementById('saved_articles_dropdown'); + const selectedTitle = selectedOption.options[selectedOption.selectedIndex].text; + const articleJSON = localStorage.getItem(selectedTitle); + + if (articleJSON) { + const today_article = JSON.parse(articleJSON); // 解析JSON字符串为对象 + update(today_article); // 使用解析出的对象更新页面 + } +} + + window.onload = function() { + const savedArticlesDropdown = document.getElementById('saved_articles_dropdown'); + savedArticlesDropdown.addEventListener('change', loadSelectedArticle); + + // 先清空dropdown,以防有多余的选项或重新加载页面时出现重复 + savedArticlesDropdown.innerHTML = ''; + + // 获取localStorage中最后一个(最新)的键值对 + let latestKey, latestValue; + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + const value = localStorage.getItem(key); + if (!latestKey) { // 第一次迭代时设置最新文章 + latestKey = key; + latestValue = value; + } + } + + // 首先添加最新保存的文章到下拉菜单 + + if (latestKey && latestValue) { + var latestOption = document.createElement('option'); + latestOption.text = latestKey; + latestOption.value = latestValue; + latestOption.title = latestValue; + savedArticlesDropdown.appendChild(latestOption); + } + + // 接着遍历其余文章并添加到下拉菜单 + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + const value = localStorage.getItem(key); + // 确保不重复添加最新文章 + if (key !== latestKey && key !== 'selectedWords') { + var option = document.createElement('option'); + option.text = key; + option.value = value; + option.title = value; + savedArticlesDropdown.appendChild(option); + } + } + + savedArticlesDropdown.selectedIndex = -1; +} </script> </body> <style> diff --git a/app/test/test_bug540_xiongjiaming.py b/app/test/test_bug540_xiongjiaming.py new file mode 100644 index 0000000..c1e407b --- /dev/null +++ b/app/test/test_bug540_xiongjiaming.py @@ -0,0 +1,45 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +import logging + +from helper import signup + +def login(driver, home, uname, password): + driver.get(home) + WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '登录'))).click() + driver.find_element(By.ID, 'username').send_keys(uname) + driver.find_element(By.ID, 'password').send_keys(password) + driver.find_element(By.XPATH, '//button[text()="登录"]').click() + WebDriverWait(driver, 10).until(EC.title_is(f"EnglishPal Study Room for {uname}")) + +def logout(driver): + WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '退出'))).click() + +# 标记文章 +def collect_article(driver): + driver.find_element(By.XPATH, '//button[text()="标记文章"]').click() + +def test_collect_article(driver, URL): + try: + username, password = signup(URL, driver) + title = driver.find_element(By.ID, 'article_title').text + article = driver.find_element(By.ID, 'article').text + + collect_article(driver) + collected_title = driver.execute_script('return localStorage.getItem("articleTitle");') + assert title == collected_title, "Unable to add the article to your collection." + + # 退出登录 + logout(driver) + + # 再次登录并检查收藏状态 + login(driver, URL, username, password) + rechecked_title = driver.execute_script('return localStorage.getItem("articleTitle");') + assert title == rechecked_title, "Collected article not found after re-login." + + except Exception as e: + # 输出异常信息 + logging.error(e) + finally: + driver.quit() \ No newline at end of file