--- 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}`; }; ---

文章

写下的文字,按时间排列。

{tags.length > 0 && } {failed ?

文章暂时无法加载

请稍后重试。

重新加载
: visible.length === 0 ?

{query || selectedTag ? '没有匹配的文章' : '还没有公开文章'}

{query || selectedTag ? '换个关键词,或查看全部文章。' : '文章发布后会出现在这里。'}

{query || selectedTag ? '查看全部文章' : '前往账户'}
:
    {visible.map((article) =>
  1. {article.title}

    {article.description &&

    {article.description}

    } {article.tags.length > 0 && }
    {article.cover && }
  2. )}
} {totalPages > 1 && }