diff --git a/frontend/app/board/[id]/page.tsx b/frontend/app/board/[id]/page.tsx
index e6504a4..7d7f385 100644
--- a/frontend/app/board/[id]/page.tsx
+++ b/frontend/app/board/[id]/page.tsx
@@ -1,7 +1,9 @@
import Link from "next/link";
import { Metadata } from "next";
+import { cookies } from "next/headers";
import { fetchPosts, fetchBoards } from "@/lib/api";
import Pagination from "@/components/Pagination";
+import LikeButton from "@/components/LikeButton";
interface PageProps {
params: Promise<{ id: string }>;
@@ -22,8 +24,9 @@ export default async function BoardPage({ params, searchParams }: PageProps) {
const { id } = await params;
const { page: pageStr } = await searchParams;
const page = Math.max(1, parseInt(pageStr || "1", 10) || 1);
+ const cookie = (await cookies()).toString();
const [postsData, boardsData] = await Promise.all([
- fetchPosts(page, 20, Number(id)),
+ fetchPosts(page, 20, Number(id), "latest", "", cookie),
fetchBoards(),
]);
const board = boardsData.boards.find((b) => b.id === Number(id));
@@ -41,10 +44,9 @@ export default async function BoardPage({ params, searchParams }: PageProps) {
{postsData.posts.map((post) => (
-
@@ -55,16 +57,21 @@ export default async function BoardPage({ params, searchParams }: PageProps) {
推荐
)}
-
{post.title}
-
-
- {post.user.nickname}
-
-
{new Date(post.created_at).toLocaleDateString("zh-CN")}
-
💬 {post.comment_count}
-
👁 {post.view_count}
+
+
{post.title}
+
+
+
+
+ {post.user.nickname}
+
+ {new Date(post.created_at).toLocaleDateString("zh-CN")}
+ 💬 {post.comment_count}
+ 👁 {post.view_count}
+
+
-
+
))}
{postsData.posts.length === 0 && (
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index b0138a1..d35df34 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -1,7 +1,9 @@
import Link from "next/link";
import { Metadata } from "next";
+import { cookies } from "next/headers";
import { fetchPosts, fetchBoards } from "@/lib/api";
import Pagination from "@/components/Pagination";
+import LikeButton from "@/components/LikeButton";
export const metadata: Metadata = {
title: "姜十三论坛 - 技术分享与讨论社区",
@@ -21,8 +23,9 @@ export default async function HomePage({ searchParams }: HomePageProps) {
const { q, page: pageStr } = await searchParams;
const keyword = q?.trim() || "";
const page = Math.max(1, parseInt(pageStr || "1", 10) || 1);
+ const cookie = (await cookies()).toString();
const [postsData, boardsData] = await Promise.all([
- fetchPosts(page, 20, undefined, "latest", keyword),
+ fetchPosts(page, 20, undefined, "latest", keyword, cookie),
fetchBoards(),
]);
@@ -35,10 +38,9 @@ export default async function HomePage({ searchParams }: HomePageProps) {
{postsData.posts.map((post) => (
-
@@ -55,18 +57,23 @@ export default async function HomePage({ searchParams }: HomePageProps) {
推荐
)}
-
- {post.title}
-
-
-
- {post.user.nickname}
-
-
{new Date(post.created_at).toLocaleDateString("zh-CN")}
-
💬 {post.comment_count}
-
👁 {post.view_count}
+
+
+ {post.title}
+
+
+
+
+
+ {post.user.nickname}
+
+ {new Date(post.created_at).toLocaleDateString("zh-CN")}
+ 💬 {post.comment_count}
+ 👁 {post.view_count}
+
+
-
+
))}
{postsData.posts.length === 0 && (
diff --git a/frontend/app/post/[id]/page.tsx b/frontend/app/post/[id]/page.tsx
index 92ae184..5034dc3 100644
--- a/frontend/app/post/[id]/page.tsx
+++ b/frontend/app/post/[id]/page.tsx
@@ -1,5 +1,6 @@
import { Metadata } from "next";
import Link from "next/link";
+import { cookies } from "next/headers";
import ReactMarkdown from "react-markdown";
import { fetchPostDetail, fetchComments } from "@/lib/api";
import CommentSection from "@/components/CommentSection";
@@ -30,7 +31,8 @@ export async function generateMetadata({ params }: PageProps): Promise
export default async function PostDetailPage({ params }: PageProps) {
const { id } = await params;
- const { post } = await fetchPostDetail(id);
+ const cookie = (await cookies()).toString();
+ const { post } = await fetchPostDetail(id, cookie);
const { comments } = await fetchComments(id);
const jsonLd = {
diff --git a/frontend/components/LikeButton.tsx b/frontend/components/LikeButton.tsx
index d38f83f..125fe85 100644
--- a/frontend/components/LikeButton.tsx
+++ b/frontend/components/LikeButton.tsx
@@ -8,9 +8,10 @@ interface LikeButtonProps {
postId: string;
liked: boolean;
likeCount: number;
+ variant?: "default" | "compact";
}
-export default function LikeButton({ postId, liked: initialLiked, likeCount: initialCount }: LikeButtonProps) {
+export default function LikeButton({ postId, liked: initialLiked, likeCount: initialCount, variant = "default" }: LikeButtonProps) {
const [liked, setLiked] = useState(initialLiked);
const [count, setCount] = useState(initialCount);
const [loading, setLoading] = useState(false);
@@ -33,17 +34,21 @@ export default function LikeButton({ postId, liked: initialLiked, likeCount: ini
}
};
+ const sizing = variant === "compact" ? "px-2 py-1 gap-1" : "px-3 py-1.5 gap-1.5";
+ const iconSize = variant === "compact" ? 14 : 16;
+
return (
);
diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts
index 28116ce..9dedc11 100644
--- a/frontend/lib/api.ts
+++ b/frontend/lib/api.ts
@@ -189,17 +189,26 @@ async function fetchWithRefresh(url: string, init: RequestInit): Promise {
const params = new URLSearchParams({ page: String(page), size: String(size), sort });
if (boardId) params.set("board_id", String(boardId));
if (keyword) params.set("keyword", keyword);
- const res = await fetch(`${API_BASE}/api/posts?${params}`, { cache: "no-store" });
+ const res = await fetch(`${API_BASE}/api/posts?${params}`, {
+ cache: "no-store",
+ headers: cookieHeaders(cookieHeader),
+ });
if (!res.ok) throw new Error("获取帖子失败");
return res.json();
}
@@ -210,8 +219,11 @@ export async function fetchBoards(): Promise<{ boards: Board[] }> {
return res.json();
}
-export async function fetchPostDetail(id: string): Promise<{ post: Post }> {
- const res = await fetch(`${API_BASE}/api/posts/${id}`, { cache: "no-store" });
+export async function fetchPostDetail(id: string, cookieHeader?: string): Promise<{ post: Post }> {
+ const res = await fetch(`${API_BASE}/api/posts/${id}`, {
+ cache: "no-store",
+ headers: cookieHeaders(cookieHeader),
+ });
if (!res.ok) throw new Error("获取帖子失败");
return res.json();
}
@@ -222,9 +234,12 @@ export async function fetchComments(postId: string): Promise<{ comments: Comment
return res.json();
}
-export async function fetchUserProfile(id: string, page = 1): Promise {
+export async function fetchUserProfile(id: string, page = 1, cookieHeader?: string): Promise {
const params = new URLSearchParams({ page: String(page), size: "20" });
- const res = await fetch(`${API_BASE}/api/users/${id}?${params}`, { cache: "no-store" });
+ const res = await fetch(`${API_BASE}/api/users/${id}?${params}`, {
+ cache: "no-store",
+ headers: cookieHeaders(cookieHeader),
+ });
if (res.status === 404) throw new Error("用户不存在");
if (!res.ok) throw new Error("获取用户资料失败");
return res.json();
diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts
index ce4e94a..a419cbe 100644
--- a/frontend/next-env.d.ts
+++ b/frontend/next-env.d.ts
@@ -1,7 +1,7 @@
///
///
-import "./.next/types/routes.d.ts";
-import "./.next/types/root-params.d.ts";
+import "./.next/dev/types/routes.d.ts";
+import "./.next/dev/types/root-params.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.