import { prisma } from "@/lib/prisma"; import { getFileUrl } from "@/lib/minio"; import FeedMasonry from "@/app/components/FeedMasonry"; import BackButton from "@/app/components/BackButton"; import { FeedItem } from "@/app/types/feed"; import { notFound } from "next/navigation"; import Image from "next/image"; export default async function AuthorPage({ params }: { params: Promise<{ secUid: string }> }) { const secUid = (await params).secUid; const author = await prisma.author.findUnique({ where: { sec_uid: secUid }, }); if (!author) { notFound(); } // Initial feed fetch const limit = 24; const [videos, posts] = await Promise.all([ prisma.video.findMany({ where: { authorId: secUid }, orderBy: { created_at: 'desc' }, take: limit, include: { author: true }, }), prisma.imagePost.findMany({ where: { authorId: secUid }, orderBy: { created_at: 'desc' }, take: limit, include: { author: true, images: { orderBy: { order: 'asc' }, take: 1 } }, }), ]); const initialItems: FeedItem[] = [ ...videos.map((v) => ({ type: "video" as const, aweme_id: v.aweme_id, created_at: v.created_at, desc: v.desc, video_url: getFileUrl(v.video_url), cover_url: getFileUrl(v.cover_url ?? 'default_cover.png'), width: v.width ?? null, height: v.height ?? null, author: { nickname: v.author.nickname, avatar_url: getFileUrl(v.author.avatar_url ?? ''), sec_uid: v.author.sec_uid }, likes: Number(v.digg_count) })), ...posts.map((p) => ({ type: "image" as const, aweme_id: p.aweme_id, created_at: p.created_at, desc: p.desc, cover_url: getFileUrl(p.images?.[0]?.url ?? null), width: p.images?.[0]?.width ?? null, height: p.images?.[0]?.height ?? null, author: { nickname: p.author.nickname, avatar_url: getFileUrl(p.author.avatar_url ?? ''), sec_uid: p.author.sec_uid }, likes: Number(p.digg_count) })), ].sort((a, b) => +new Date(b.created_at) - +new Date(a.created_at)) .slice(0, limit); const initialCursor = initialItems.length > 0 ? new Date(initialItems[initialItems.length - 1].created_at as any).toISOString() : null; return (

{author.nickname}

{/* Author Profile Header */}
{author.nickname}

{author.nickname}

抖音号:{author.unique_id || author.short_id || '未知'}

{author.signature && (

{author.signature}

)}
{Number(author.total_favorited).toLocaleString()} 获赞
{Number(author.follower_count).toLocaleString()} 粉丝

作品

); }