Files
SHITOUCUO/page-duanwen.php

276 lines
6.6 KiB
PHP
Raw Normal View History

2026-02-19 13:13:03 +08:00
<?php
/**
* 短文
* @package custom
*/
if (!defined("__TYPECHO_ROOT_DIR__")) {
exit();
} ?>
<!DOCTYPE html>
<html lang="zh">
<?php $this->need("header.php"); ?>
<body class="jasmine-body" style="margin-top:5rem;">
<div class="jasmine-container grid grid-cols-12">
<div class="flex col-span-12 lg:col-span-8 flex-col lg:border-x-2 border-stone-100 dark:border-neutral-600 lg:pt-0 lg:px-6 pb-10 px-3">
<?php $this->need("component/menu.php"); ?>
<div class="flex flex-col gap-y-12">
<div class="markdown-body dark:!bg-[#161829] dark:!bg-[#0d1117] !text-neutral-900 dark:!text-gray-400" itemprop="articleBody">
<?php echo handleContent($this->content);?>
</div>
<div id="memos-container">
<div id="memos-list"></div>
<div id="memos-pagination"></div>
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const bbUrl = "https://me.xgsd.cc/api/v1/memo?creatorId=1&rowStatus=NORMAL&limit=30";
let currentPage = 1;
const itemsPerPage = 10;
let allMemos = [];
// 获取数据
fetch(bbUrl)
.then(res => res.json())
.then(resdata => {
allMemos = resdata;
renderMemos();
renderPagination();
})
.catch(error => {
console.error('获取数据失败:', error);
document.getElementById('memos-list').innerHTML = '<div style="text-align: center; color: #666; padding: 20px;">暂时无法加载动态</div>';
});
// 渲染备忘录列表
function renderMemos() {
const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const currentMemos = allMemos.slice(startIndex, endIndex);
let html = '';
currentMemos.forEach(memo => {
const bbTime = new Date(memo.createdTs * 1000).toLocaleString();
let bbCont = memo.content;
// 处理图片
let imagesHTML = '';
if (memo.resourceList && memo.resourceList.length > 0) {
const images = memo.resourceList;
const imageCount = images.length >= 4 ? 4 : images.length >= 2 ? 2 : 0;
if (imageCount > 0) {
imagesHTML = '<div class="memo-images">';
for (let j = 0; j < imageCount; j++) {
const imgUrl = images[j].externalLink;
imagesHTML += `<img src="${imgUrl}" alt="Memo图片" onerror="this.style.display='none'">`;
}
imagesHTML += '</div>';
}
}
// 处理内容中的链接
const newbbCont = bbCont
.replace(/!\[.*?\]\((.*?)\)/g, ' <a href="$1" target="_blank">🌅</a> ')
.replace(/\[(.*?)\]\((.*?)\)/g, ' <a href="$2" target="_blank">$1 🔗</a> ');
html += `
<div class="memo-item">
<div class="memo-header">
<span class="memo-time">${bbTime}</span>
</div>
<div class="memo-content">${newbbCont}</div>
${imagesHTML}
</div>
`;
});
document.getElementById('memos-list').innerHTML = html;
}
// 渲染分页
function renderPagination() {
const totalPages = Math.ceil(allMemos.length / itemsPerPage);
let paginationHTML = '';
if (totalPages > 1) {
paginationHTML = '<div class="pagination">';
// 上一页
if (currentPage > 1) {
paginationHTML += `<button class="page-btn" onclick="changePage(${currentPage - 1})">上一页</button>`;
}
// 页码
for (let i = 1; i <= totalPages; i++) {
if (i === currentPage) {
paginationHTML += `<span class="page-current">${i}</span>`;
} else {
paginationHTML += `<button class="page-btn" onclick="changePage(${i})">${i}</button>`;
}
}
// 下一页
if (currentPage < totalPages) {
paginationHTML += `<button class="page-btn" onclick="changePage(${currentPage + 1})">下一页</button>`;
}
paginationHTML += '</div>';
}
document.getElementById('memos-pagination').innerHTML = paginationHTML;
}
// 切换页面
window.changePage = function(page) {
currentPage = page;
renderMemos();
renderPagination();
window.scrollTo(0, 0);
};
});
</script>
<style>
.dark .memo-item{
background: rgb(10 12 25 / 1);
}
.dark .memo-item:hover{border:1px solid #f15a22;}
.dark .memo-content {color: rgb(156 163 175 / 1) !important;}
#memos-container {
max-width: 800px;
margin: 0 auto;
}
.memo-item {
background: #fff;
border-radius: 10px;
padding: 16px;
margin-bottom: 30px;
border: 1px solid rgba(0, 0, 0, 0);
}
.memo-header {
margin-bottom: 8px;
}
.memo-time {
color: #657786;
font-size: 16px;
}
.memo-content {
color: #14171a;
font-size: 16px;
line-height: 1.5;
margin-bottom: 8px;
}
.memo-content a {
color: #1b95e0;
text-decoration: none;
}
.memo-content a:hover {
text-decoration: underline;
}
.memo-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 8px;
}
.memo-images img {
width: calc(25% - 6px);
aspect-ratio: 1/1;
object-fit: cover;
border-radius: 10px;
}
/* 1张图片时居中显示 */
.memo-images img:only-child {
width: 200px;
margin: 0 auto;
}
/* 2张图片时各占50% */
.memo-images img:nth-child(1):nth-last-child(2),
.memo-images img:nth-child(2):nth-last-child(1) {
width: calc(50% - 4px);
}
/* 3张图片时特殊处理 */
.memo-images img:nth-child(1):nth-last-child(3),
.memo-images img:nth-child(2):nth-last-child(2),
.memo-images img:nth-child(3):nth-last-child(1) {
width: calc(33.333% - 6px);
}
.pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 8px;
margin-top: 20px;
flex-wrap: wrap;
}
.page-btn {
padding: 4px 11px;
border: 1px solid #f15a22;
background: #fff;
border-radius: 50px;
cursor: pointer;
font-size: 14px;
}
.dark .page-btn{background: rgb(10 12 25 / 1);}
.page-current {
padding: 6px 13px;
background: #f15a22;
color: #fff;
border-radius: 50px;
font-size: 14px;
}
/* 响应式设计 */
@media (max-width: 768px) {
#memos-container {
padding: 10px;
}
.memo-item {
padding: 12px;
}
.memo-images img {
width: calc(50% - 4px);
}
/* 移动端3张图片时改为2+1布局 */
.memo-images img:nth-child(1):nth-last-child(3),
.memo-images img:nth-child(2):nth-last-child(2),
.memo-images img:nth-child(3):nth-last-child(1) {
width: calc(50% - 4px);
}
.memo-images img:nth-child(3):nth-last-child(1) {
width: 100%;
}
}
</style>
<!--<div class="border-b-2 border-stone-100 dark:border-neutral-600"></div>-->
</div>
</div>
</div>
<?php $this->need("footer.php"); ?>
</body>
</html>