LecturerList.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //主讲人列表
  2. import { useNavigate } from "react-router-dom";
  3. import { useEffect, useState } from "react";
  4. import { Card, List, message, Typography } from "antd";
  5. import { ICourse } from "../../../pages/library/course/course";
  6. import { API_HOST, get } from "../../../request";
  7. import { ICourseListResponse } from "../../api/Course";
  8. const { Meta } = Card;
  9. const { Paragraph } = Typography;
  10. const Widget = () => {
  11. const [data, setData] = useState<ICourse[]>();
  12. const navigate = useNavigate();
  13. useEffect(() => {
  14. get<ICourseListResponse>(`/v2/course?view=new&limit=4`).then((json) => {
  15. if (json.ok) {
  16. console.log(json.data);
  17. const course: ICourse[] = json.data.rows.map((item) => {
  18. return {
  19. id: item.id,
  20. title: item.title,
  21. subtitle: item.subtitle,
  22. teacher: item.teacher,
  23. intro: item.content,
  24. coverUrl: item.cover,
  25. };
  26. });
  27. setData(course);
  28. } else {
  29. message.error(json.message);
  30. }
  31. });
  32. }, []);
  33. return (
  34. <List
  35. grid={{ gutter: 16, column: 4 }}
  36. dataSource={data}
  37. renderItem={(item) => (
  38. <List.Item>
  39. <Card
  40. hoverable
  41. style={{ width: "100%", height: 300 }}
  42. cover={
  43. <img
  44. alt="example"
  45. src={API_HOST + "/" + item.coverUrl}
  46. width="240"
  47. height="200"
  48. />
  49. }
  50. onClick={(e) => {
  51. navigate(`/course/show/${item.id}`);
  52. }}
  53. >
  54. <Meta
  55. title={item.title}
  56. description={
  57. <Paragraph ellipsis={{ rows: 2, expandable: false }}>
  58. {item.intro}
  59. </Paragraph>
  60. }
  61. />
  62. </Card>
  63. </List.Item>
  64. )}
  65. />
  66. );
  67. };
  68. export default Widget;