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
/>
- {/* 标签选择 */}
+ {/* 级别选择 */}