page.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import "antd/dist/reset.css"
  2. import MainTitle from "@/components/MainTitle";
  3. import Image from "next/image";
  4. import PaginationClient from "@/components/PaginationClient";
  5. import {serverGet} from "@/utils/request";
  6. import AnimatedSection from "@/components/AnimatedSection";
  7. import News from "@/components/news/NewsList";
  8. // 调整NewsUpdates类型,对齐Article的结构
  9. interface NewsUpdates {
  10. id: string;
  11. newsUrl: string;
  12. newsName: string;
  13. newsDesc: string;
  14. newsAuthor?: string; // 可选字段
  15. content: string;
  16. newsCategory: string; // 补充分类字段(原逻辑依赖)
  17. }
  18. const getNewsList = async (pageNum: number, pageSize: number) => {
  19. return serverGet<Page<NewsUpdates>>("/webSite/getNewsUpdatesListWithoutSpecialNews", {
  20. pageNum,
  21. pageSize
  22. }, {
  23. next: {
  24. revalidate: 180
  25. },
  26. cache: "force-cache"
  27. })
  28. }
  29. const getSpecialNews = async () => {
  30. return serverGet<Page<NewsUpdates>>("/webSite/getSpecialNewsUpdatesList", {
  31. pageNum: 1,
  32. pageSize: 1
  33. }, {
  34. next: {
  35. revalidate: 180
  36. },
  37. cache: "force-cache"
  38. })
  39. }
  40. export default async function NewsPage({
  41. searchParams,
  42. }: {
  43. searchParams: Promise<{ page?: string }>
  44. }) {
  45. const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL;
  46. // 等待 searchParams 解析
  47. const params = await searchParams
  48. const pageNum = Number.parseInt(params.page || "1", 10)
  49. const pageSize = 6
  50. const newsListRes = await getNewsList(pageNum, pageSize)
  51. const specialNewsRes = await getSpecialNews()
  52. const specialNews = specialNewsRes.data.records[0]
  53. const newsList = newsListRes.data.records
  54. const totalNews = newsListRes.data.total
  55. return (
  56. <>
  57. <AnimatedSection effect="slide" direction="left">
  58. <div className="w-full h-full flex items-center justify-center text-white text-4xl font-bold">
  59. <Image src={"/assets/news/1.png"} alt={"banner"} width={1920} height={1080}/>
  60. </div>
  61. </AnimatedSection>
  62. <div className="py-6 sm:py-10">
  63. <MainTitle title={"新闻动态"} titleLetter={"NEWS_DYNAMIC"}/>
  64. </div>
  65. <News newsList={newsList}></News>
  66. {/*<AnimatedSection effect="slide" direction="right">*/}
  67. {/* /!*<div className="container sm:max-w-7/12 mx-auto p-4 space-y-6">*!/*/}
  68. {/* <div className="sm:max-w-7/12 mx-auto p-4 space-y-6">*/}
  69. {/* /!* 顶部大新闻 *!/*/}
  70. {/* <div className="bg-white rounded-2xl p-6">*/}
  71. {/* <div className="flex flex-col sm:flex-row gap-6">*/}
  72. {/* /!* 模拟图片色块 *!/*/}
  73. {/* <div*/}
  74. {/* className="w-full sm:w-1/3 bg-gray-300 rounded-lg sm:h-auto flex items-center justify-center">*/}
  75. {/* <Image src={specialNews?.newsUrl ? BASE_URL + specialNews?.newsUrl : ""}*/}
  76. {/* alt={"特别新闻图片"}*/}
  77. {/* width={300} height={300}/>*/}
  78. {/* </div>*/}
  79. {/* /!* 右侧文字 *!/*/}
  80. {/* <div className="flex-1 flex flex-col justify-between">*/}
  81. {/* <div>*/}
  82. {/* <h2 className="text-lg sm:text-xl font-bold mb-2">{specialNews?.newsName}</h2>*/}
  83. {/* <p className="text-gray-500 text-xs sm:text-sm mb-4">{specialNews?.releaseTime}</p>*/}
  84. {/* <p className="text-gray-700 text-sm sm:text-base leading-relaxed line-clamp-7">*/}
  85. {/* {removeHTMLTags(specialNews?.newsDetails || "")}*/}
  86. {/* </p>*/}
  87. {/* </div>*/}
  88. {/* <Link href={`/news/${specialNews?.id}`}*/}
  89. {/* className="text-blue-500 hover:underline mt-4 self-start text-sm sm:text-base">*/}
  90. {/* 了解更多 &gt;*/}
  91. {/* </Link>*/}
  92. {/* </div>*/}
  93. {/* </div>*/}
  94. {/* </div>*/}
  95. {/* /!* 下方小新闻卡片 *!/*/}
  96. {/* <div className="grid sm:grid-cols-2 gap-4">*/}
  97. {/* {newsList.map((item) => (*/}
  98. {/* <div*/}
  99. {/* key={item.id}*/}
  100. {/* className="bg-white rounded-2xl shadow p-4 flex flex-col justify-between"*/}
  101. {/* >*/}
  102. {/* <div>*/}
  103. {/* <h3 className="text-sm sm:text-base font-semibold mb-2">{item.newsName}</h3>*/}
  104. {/* <p className="text-gray-500 text-xs sm:text-sm">{item.releaseTime}</p>*/}
  105. {/* </div>*/}
  106. {/* <Link href={`/news/${item.id}`}*/}
  107. {/* className="text-blue-500 hover:underline mt-2 self-end text-xs sm:text-sm">*/}
  108. {/* 了解更多 &gt;*/}
  109. {/* </Link>*/}
  110. {/* </div>*/}
  111. {/* ))}*/}
  112. {/* </div>*/}
  113. {/* /!* 分页器 *!/*/}
  114. <div className="flex justify-center mt-6">
  115. <PaginationClient
  116. current={pageNum}
  117. total={totalNews}
  118. pageSize={pageSize}
  119. />
  120. </div>
  121. {/* </div>*/}
  122. {/*</AnimatedSection>*/}
  123. </>
  124. )
  125. }