diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c0cf055
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ 文章卡片展示
+
+
+
+
+
+
+
+
diff --git a/static/img/rili.png b/static/img/rili.png
new file mode 100644
index 0000000..aaba4d5
Binary files /dev/null and b/static/img/rili.png differ
diff --git a/static/script.js b/static/script.js
new file mode 100644
index 0000000..2781486
--- /dev/null
+++ b/static/script.js
@@ -0,0 +1,62 @@
+document.addEventListener("DOMContentLoaded", function () {
+ const container = document.getElementById('articles-container');
+ let start = 0;
+ const batchSize = 20; // 每次加载的卡片数量
+
+ function loadMoreArticles() {
+ fetch('./all.json')
+ .then(response => response.json())
+ .then(data => {
+ const articles = data.article_data.slice(start, start + batchSize);
+ articles.forEach(article => {
+ const card = document.createElement('div');
+ card.className = 'card';
+
+ const title = document.createElement('div');
+ title.className = 'card-title';
+ title.innerText = article.title;
+ card.appendChild(title);
+
+ title.onclick = () => {
+ window.open(article.link, '_blank');
+ };
+
+ const author = document.createElement('div');
+ author.className = 'card-author';
+ const authorImg = document.createElement('img');
+ authorImg.src = article.avatar;
+ author.appendChild(authorImg);
+ author.appendChild(document.createTextNode(article.author));
+ card.appendChild(author);
+
+ const date = document.createElement('div');
+ date.className = 'card-date';
+ const dateImg = document.createElement('img');
+ dateImg.src = './static/img/rili.png'; // 替换为实际的图标路径
+ date.appendChild(dateImg);
+ date.appendChild(document.createTextNode(article.created.substring(0, 10)));
+ card.appendChild(date);
+
+ const bgImg = document.createElement('img');
+ bgImg.className = 'card-bg';
+ bgImg.src = article.avatar;
+ card.appendChild(bgImg);
+
+ container.appendChild(card);
+ });
+
+ start += batchSize;
+
+ if (start >= data.article_data.length) {
+ // 如果加载完所有卡片,隐藏加载更多按钮
+ document.getElementById('load-more-btn').style.display = 'none';
+ }
+ });
+ }
+
+ // 初始加载
+ loadMoreArticles();
+
+ // 加载更多按钮点击事件
+ document.getElementById('load-more-btn').addEventListener('click', loadMoreArticles);
+});
diff --git a/static/styles.css b/static/styles.css
new file mode 100644
index 0000000..7db17ee
--- /dev/null
+++ b/static/styles.css
@@ -0,0 +1,127 @@
+body {
+ font-family: Arial, sans-serif;
+ background-color: #f4f4f9;
+ margin: 0;
+ padding: 20px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ min-height: 100vh;
+}
+
+.articles-container {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 8px;
+ width: 100%;
+ max-width: 1200px;
+}
+
+#load-more-btn {
+ font-size: 15px;
+ background-color: white;
+ margin-top: 20px;
+ width: 50%;
+ border-radius: 20px;
+ padding: 3px;
+ border:#b5b5b5 solid 1px;
+ transition: all 0.3s;
+}
+
+#load-more-btn:hover {
+ background-color: #0088ff;
+ width: 52%;
+ color: white;
+
+}
+
+.card {
+ background-color: white;
+ border-radius: 10px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ padding: 15px;
+ position: relative;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ height: 120px;
+}
+
+.card-title {
+ font-size: 17px;
+ margin-bottom: 10px;
+ line-height: 1.5;
+ max-height: 4.5em; /* 三行高度 */
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ transition: color 0.3s; /* 添加过渡效果 */
+}
+
+.card-title:hover {
+ /* 字体变成蓝色,下划线 */
+ color: #007bff;
+ text-decoration: underline;
+}
+
+.card-author,
+.card-date {
+ display: inline-block;
+ font-size: 12px;
+ color: #888;
+ background-color: white; /* 白色背景 */
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 阴影 */
+ border-radius: 15px; /* 圆角 */
+ padding: 5px; /* 内边距 */
+ transition: box-shadow 0.2s; /* 过渡效果 */
+}
+
+.card-author:hover,
+.card-date:hover {
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 鼠标悬停时加深阴影 */
+}
+
+.card-author {
+ display: flex;
+ padding-right: 10px;
+ width: fit-content;
+ align-items: center;
+}
+
+.card-author img {
+ border-radius: 50%;
+ width: 15px;
+ height: 15px;
+ margin-right: 5px;
+}
+
+.card-date {
+ position: absolute;
+ z-index: 1;
+ bottom: 15px;
+ right: 15px;
+ display: flex;
+ align-items: center;
+}
+
+.card-date img {
+ width: 15px;
+ height: 15px;
+ border-radius: 20%;
+ margin-right: 5px;
+}
+
+.card-bg {
+ z-index: 0;
+ border-radius: 50%;
+ position: absolute;
+ bottom: -30px;
+ right: -30px;
+ width: 150px;
+ height: 150px;
+ opacity: 0.1;
+}