first commit

This commit is contained in:
2026-09-11 15:49:41 +08:00
commit 5b69bc818a
98 changed files with 30551 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
---
import { desc, eq, sql } from "drizzle-orm";
import AdminLayout from "../../layouts/AdminLayout.astro";
import { getDb } from "../../lib/db";
import { cases, contentItems, posts } from "../../db/schema";
import { getEnv } from "../../lib/env";
export const prerender = false;
const db = getDb(getEnv().DB);
const all = await db.select().from(posts).orderBy(desc(posts.updatedAt));
const counts = await db
.select({ kind: contentItems.kind, n: sql<number>`count(*)` })
.from(contentItems)
.groupBy(contentItems.kind);
const countOf = (k: string) => counts.find((c) => c.kind === k)?.n ?? 0;
const [caseCount] = await db.select({ n: sql<number>`count(*)` }).from(cases);
---
<AdminLayout title="文章">
<h1>內容總覽</h1>
<p class="sub">管理文章、首頁內容同完成案例。前台會自動更新。</p>
<div class="card">
<h2>首頁內容</h2>
<div class="actions" style="margin-top:0">
<a class="btn secondary" href="/admin/content/service">服務({countOf("service")}</a>
<a class="btn secondary" href="/admin/content/feature">特色({countOf("feature")}</a>
<a class="btn secondary" href="/admin/content/step">流程({countOf("step")}</a>
<a class="btn secondary" href="/admin/content/faq">常見問題({countOf("faq")}</a>
<a class="btn secondary" href="/admin/cases">完成案例({caseCount?.n ?? 0}</a>
<a class="btn secondary" href="/admin/settings">網站設定</a>
</div>
</div>
<div class="actions">
<h2 style="font-size:18px;margin:0;flex:1">文章({all.length}</h2>
<a class="btn" href="/admin/post/new">+ 寫新文</a>
</div>
{
all.length === 0 ? (
<div class="card">
<p class="muted">仲未有任何文章。<a href="/admin/post/new">寫第一篇 →</a></p>
</div>
) : (
<table>
<thead>
<tr>
<th>標題</th>
<th style="width:110px">狀態</th>
<th style="width:130px">更新時間</th>
<th style="width:80px"></th>
</tr>
</thead>
<tbody>
{all.map((p) => (
<tr>
<td>
<a href={`/admin/post/${p.id}`}>{p.title}</a>
<div class="muted">/{p.slug}</div>
</td>
<td>
<span class={`badge ${p.status}`}>{p.status === "published" ? "已發布" : "草稿"}</span>
</td>
<td class="muted">{new Date(p.updatedAt).toLocaleDateString("zh-Hant-HK")}</td>
<td>{p.status === "published" && <a href={`/blog/${p.slug}`} target="_blank">睇</a>}</td>
</tr>
))}
</tbody>
</table>
)
}
</AdminLayout>