page.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import Link from "next/link";
  2. import { getBooks, getBookStructureStats } from "@/lib/book-catalog";
  3. export default async function LibraryPage() {
  4. const books = await getBooks();
  5. return (
  6. <main className="page-shell">
  7. <section className="library-shell">
  8. <div className="library-grid">
  9. {books.map((book) => {
  10. const stats = getBookStructureStats(book);
  11. return (
  12. <article className="book-card" key={book.id}>
  13. <div className="book-cover" style={{ ["--cover" as string]: book.coverStyle }}>
  14. <div className="book-cover__chip">{book.category}</div>
  15. <h2 className="book-cover__title">{book.title}</h2>
  16. <p className="book-cover__author">{book.author}</p>
  17. </div>
  18. <div className="book-body">
  19. <div className="chip-row">
  20. <span className="chip">{book.wordCount}</span>
  21. <span className="chip">{stats.loreCount} 条资料</span>
  22. <span className="chip">{stats.novelCount} 条正文</span>
  23. </div>
  24. <p>{book.description}</p>
  25. <Link className="button button--primary" href={`/reader/${book.id}`}>
  26. 开始阅读
  27. </Link>
  28. </div>
  29. </article>
  30. )})}
  31. </div>
  32. </section>
  33. </main>
  34. );
  35. }