diff --git a/frontend/src/app/blog/[slug]/page.tsx b/frontend/src/app/blog/[slug]/page.tsx index 894cb1e..fa000c4 100644 --- a/frontend/src/app/blog/[slug]/page.tsx +++ b/frontend/src/app/blog/[slug]/page.tsx @@ -64,6 +64,16 @@ export default async function BlogDetailPage({ params }: { params: Promise<{ slu )} + +
+

接着探索

+
+ 社区讨论 + 电子书 + 下一站 + 投稿 +
+
); diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index bf0403b..15f4e10 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -4532,6 +4532,12 @@ img { max-width: 100%; display: block; } margin: 24px 0; } +.dest-depth-loading { + color: var(--text-muted); + font-size: 0.9rem; + margin: 0 0 1rem; +} + .dest-detail-extras { display: grid; grid-template-columns: 1.2fr 1fr; @@ -10641,6 +10647,12 @@ img { max-width: 100%; display: block; } color: var(--text-primary); } +.newsletter-note { + margin-top: 10px; + font-size: 0.8rem; + color: var(--text-muted); +} + @media (max-width: 768px) { .report-grid { grid-template-columns: 1fr; } } diff --git a/frontend/src/app/tools/page.tsx b/frontend/src/app/tools/page.tsx index bc0dec3..e8a73ce 100644 --- a/frontend/src/app/tools/page.tsx +++ b/frontend/src/app/tools/page.tsx @@ -104,7 +104,27 @@ export default function ToolsHubPage() { )} - {filtered.length === 0 &&

没有匹配的工具,试试其他关键词

} + {filtered.length === 0 && ( +
+

没有匹配的工具,试试其他关键词

+
+ + + 去下一站 + +
+
+ )} diff --git a/frontend/src/components/ContentSubmitClient.tsx b/frontend/src/components/ContentSubmitClient.tsx index f36fea3..094e0bc 100644 --- a/frontend/src/components/ContentSubmitClient.tsx +++ b/frontend/src/components/ContentSubmitClient.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { api } from "@/lib/api"; @@ -17,43 +17,102 @@ export default function ContentSubmitClient() { const [url, setUrl] = useState(""); const [notes, setNotes] = useState(""); const [contentType, setContentType] = useState("article"); + const [busy, setBusy] = useState(false); + const [done, setDone] = useState(false); const submit = async () => { if (!token) { router.push("/login?next=/submit"); return; } + if (!title.trim() || title.trim().length < 4) { + toast("请填写更完整的标题", "info"); + return; + } + setBusy(true); try { - await api.submitContent({ title, url, notes, content_type: contentType, name: "" }, token); + await api.submitContent( + { + title: title.trim(), + url: url.trim(), + notes: notes.trim(), + content_type: contentType, + name: "", + }, + token + ); toast(t.submit.ok, "success"); setTitle(""); setUrl(""); setNotes(""); + setDone(true); } catch { toast(t.submit.fail, "error"); + } finally { + setBusy(false); } }; return (
- +
{t.submit.tag}

{t.submit.title}

{t.submit.subtitle}

-
- - setTitle(e.target.value)} /> - setUrl(e.target.value)} /> -