{article.title}
{article.description &&{article.description}
} {article.tags.length > 0 && }---
import Base from '../layouts/Base.astro';
import { readApi, postUrl, displayDate, assetUrl, type Metadata } from '../lib/api';
const query = (Astro.url.searchParams.get('q') || '').trim().slice(0, 100);
const selectedTag = Astro.url.searchParams.get('tag') || '';
let articles: Metadata[] = [];
let failed = false;
try { articles = (await readApi<{ posts: Metadata[] }>('/api/posts')).posts; }
catch { failed = true; Astro.response.status = 503; }
const tags = [...new Set(articles.flatMap((article) => article.tags))].sort((a, b) => a.localeCompare(b, 'zh-CN'));
const filtered = articles.filter((article) => (!selectedTag || article.tags.includes(selectedTag)) && (!query || `${article.title} ${article.description} ${article.author} ${article.tags.join(' ')}`.toLocaleLowerCase().includes(query.toLocaleLowerCase())));
const totalPages = Math.max(1, Math.ceil(filtered.length / 15));
const page = Math.min(totalPages, Math.max(1, Number.parseInt(Astro.url.searchParams.get('page') || '1', 10) || 1));
const visible = filtered.slice((page - 1) * 15, page * 15);
const urlFor = (page: number) => { const params = new URLSearchParams(); if (query) params.set('q', query); if (selectedTag) params.set('tag', selectedTag); params.set('page', String(page)); return `/articles?${params}`; };
---
写下的文字,按时间排列。
{query || selectedTag ? '换个关键词,或查看全部文章。' : '文章发布后会出现在这里。'}
{query || selectedTag ? '查看全部文章' : '前往账户'}{article.description}
} {article.tags.length > 0 && }