first commit
This commit is contained in:
@@ -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>
|
||||
Reference in New Issue
Block a user