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