diff --git a/src/pages/Heritage/Detail.tsx b/src/pages/Heritage/Detail.tsx index a960f49..e8b9dbe 100644 --- a/src/pages/Heritage/Detail.tsx +++ b/src/pages/Heritage/Detail.tsx @@ -4,12 +4,14 @@ import React, { useEffect, useState } from 'react' import { useParams } from 'react-router-dom' -import { Row, Col, Tag, Breadcrumb, Image, Tabs, Spin, Empty, Space } from 'antd' -import { HomeOutlined, EnvironmentOutlined, EyeOutlined, HeartOutlined } from '@ant-design/icons' +import { Row, Col, Tag, Breadcrumb, Image, Tabs, Spin, Empty, Space, message } from 'antd' +import { HomeOutlined, EnvironmentOutlined, EyeOutlined, LikeOutlined } from '@ant-design/icons' import { Link } from 'react-router-dom' import type { HeritageItem } from '@types/index' -import { getHeritageById } from '@services/api' +import { getHeritageDetail } from '@services/heritageApi' +import { transformHeritageDetail } from '@utils/heritageTransform' import FavoriteButton from '@components/FavoriteButton' +import LikeButton from '@components/LikeButton' import CommentSection from '@components/CommentSection' import './Detail.css' @@ -37,10 +39,14 @@ const HeritageDetail: React.FC = () => { const fetchData = async (heritageId: string) => { setLoading(true) try { - const result = await getHeritageById(heritageId) - setData(result) - } catch (error) { + // 调用后端API获取详情 + const result = await getHeritageDetail(heritageId) + // 转换数据格式 + const transformedData = transformHeritageDetail(result) + setData(transformedData) + } catch (error: any) { console.error('Failed to fetch heritage detail:', error) + message.error(error.message || '获取非遗详情失败') } finally { setLoading(false) } @@ -89,7 +95,7 @@ const HeritageDetail: React.FC = () => { {levelLabels[data.level]} {data.province} {data.viewCount.toLocaleString()} - {data.likeCount.toLocaleString()} + {data.likeCount.toLocaleString()} @@ -127,13 +133,27 @@ const HeritageDetail: React.FC = () => { {/* 评论区 */} - +
- + + + +
diff --git a/src/pages/Heritage/List.tsx b/src/pages/Heritage/List.tsx index d4e207f..83afa95 100644 --- a/src/pages/Heritage/List.tsx +++ b/src/pages/Heritage/List.tsx @@ -3,11 +3,12 @@ */ import React, { useEffect, useState } from 'react' -import { Row, Col, Spin, Empty, Input, Select, Space, Button } from 'antd' +import { Row, Col, Spin, Empty, Input, Select, Space, Button, message } from 'antd' import { SearchOutlined, FilterOutlined, ReloadOutlined } from '@ant-design/icons' import HeritageCard from '@components/HeritageCard' import CustomPagination from '@components/CustomPagination' -import { getHeritageList } from '@services/api' +import { getHeritageList as getHeritageListApi } from '@services/heritageApi' +import { transformHeritageListItem } from '@utils/heritageTransform' import type { HeritageItem, PaginationResult, HeritageCategory } from '@types/index' import './List.css' @@ -26,23 +27,14 @@ const categoryOptions = [ { label: '传统美术', value: 'traditional-art' }, ] -// 常用标签选项 -const tagOptions = [ - '传统技艺', - '传统美术', - '传统音乐', - '传统戏剧', - '民俗', - '金属工艺', - '刺绣', - '陶瓷', - '古琴', - '书法', - '造纸', - '宫廷艺术', - '江南文化', - '文人艺术', - '文房四宝', +// 级别选项 +const levelOptions = [ + { label: '全部级别', value: '' }, + { label: '世界级', value: 'world' }, + { label: '国家级', value: 'national' }, + { label: '省级', value: 'provincial' }, + { label: '市级', value: 'municipal' }, + { label: '县级', value: 'county' }, ] const HeritageList: React.FC = () => { @@ -54,23 +46,42 @@ const HeritageList: React.FC = () => { // 筛选条件状态 const [searchKeyword, setSearchKeyword] = useState('') const [selectedCategory, setSelectedCategory] = useState('') - const [selectedTags, setSelectedTags] = useState([]) + const [selectedLevel, setSelectedLevel] = useState('') // 实际应用的筛选条件(用于提交后生效) const [appliedFilters, setAppliedFilters] = useState({ keyword: '', category: '', - tags: [] as string[], + level: '', }) const fetchData = async () => { setLoading(true) try { - // 获取所有数据(设置一个很大的 pageSize) - const result = await getHeritageList({ page: 1, pageSize: 1000 }) - setData(result) - } catch (error) { + // 调用后端API,使用服务器端分页和筛选 + const result = await getHeritageListApi({ + pageNum: currentPage, + pageSize: pageSize, + keyword: appliedFilters.keyword || undefined, + category: appliedFilters.category || undefined, + level: appliedFilters.level || undefined, + sortField: 'create_time', + sortOrder: 'desc', + }) + + // 转换后端数据为前端格式 + const transformedData: PaginationResult = { + data: result.records.map(transformHeritageListItem), + total: result.total, + page: result.current, + pageSize: result.size, + totalPages: result.pages, + } + + setData(transformedData) + } catch (error: any) { console.error('Failed to fetch heritage list:', error) + message.error(error.message || '获取非遗列表失败') } finally { setLoading(false) } @@ -78,7 +89,7 @@ const HeritageList: React.FC = () => { useEffect(() => { fetchData() - }, []) + }, [currentPage, pageSize, appliedFilters]) const handlePageChange = (page: number, size: number) => { // 只改变页码,不改变 pageSize @@ -103,7 +114,7 @@ const HeritageList: React.FC = () => { setAppliedFilters({ keyword: searchKeyword, category: selectedCategory, - tags: selectedTags, + level: selectedLevel, }) setCurrentPage(1) window.scrollTo({ top: 0, behavior: 'smooth' }) @@ -113,62 +124,16 @@ const HeritageList: React.FC = () => { const handleResetFilters = () => { setSearchKeyword('') setSelectedCategory('') - setSelectedTags([]) + setSelectedLevel('') setAppliedFilters({ keyword: '', category: '', - tags: [], + level: '', }) setCurrentPage(1) window.scrollTo({ top: 0, behavior: 'smooth' }) } - // 客户端筛选和分页数据 - const getFilteredData = () => { - if (!data) return null - - let filteredItems = [...data.data] - - // 按名字搜索 - if (appliedFilters.keyword) { - const keyword = appliedFilters.keyword.toLowerCase() - filteredItems = filteredItems.filter( - (item) => - item.name.toLowerCase().includes(keyword) || - item.description.toLowerCase().includes(keyword) - ) - } - - // 按分类筛选 - if (appliedFilters.category) { - filteredItems = filteredItems.filter((item) => item.category === appliedFilters.category) - } - - // 按标签筛选 - if (appliedFilters.tags.length > 0) { - filteredItems = filteredItems.filter((item) => - appliedFilters.tags.some((tag) => item.tags.includes(tag)) - ) - } - - // 客户端分页 - const total = filteredItems.length - const totalPages = Math.ceil(total / pageSize) - const start = (currentPage - 1) * pageSize - const end = start + pageSize - const paginatedItems = filteredItems.slice(start, end) - - return { - data: paginatedItems, - total: total, - page: currentPage, - pageSize: pageSize, - totalPages: totalPages, - } - } - - const filteredData = getFilteredData() - return (
@@ -205,15 +170,13 @@ const HeritageList: React.FC = () => { allowClear /> - {/* 标签选择 */} + {/* 级别选择 */} } + value={searchKeyword} + onChange={(e) => setSearchKeyword(e.target.value)} + onPressEnter={handleApplyFilters} + style={{ width: 300 }} + allowClear + /> + + {/* 级别选择 */} + setSelectedProvince(e.target.value)} + style={{ width: 180 }} + allowClear + /> + + {/* 操作按钮 */} + + + + + {/* 筛选结果提示 */} + {(appliedFilters.keyword || appliedFilters.level || appliedFilters.province) && ( +
+ + 当前筛选: + {appliedFilters.keyword && ( + 关键词: {appliedFilters.keyword} + )} + {appliedFilters.level && ( + + 级别:{' '} + {levelOptions.find((opt) => opt.value === appliedFilters.level) + ?.label} + + )} + {appliedFilters.province && ( + 省份: {appliedFilters.province} + )} + +
+ )} + +
+ + {/* 内容区域 */} {loading ? (
@@ -69,9 +210,9 @@ const InheritorsList: React.FC = () => { ))}