codernew-api-frontend/src/pages/list/search-table/index.tsx
gaoziman f77675e5fc feat(核心): 添加项目源代码
- 实现 React + Arco Design Pro 基础框架
- 添加页面路由和布局组件
- 实现用户认证和权限管理
- 添加数据可视化图表组件
- 实现列表、表单等常用页面模块
- 配置 Redux 状态管理
- 添加工具函数和自定义 Hooks
2025-11-05 09:48:31 +08:00

121 lines
3.0 KiB
TypeScript

import React, { useState, useEffect, useMemo } from 'react';
import {
Table,
Card,
PaginationProps,
Button,
Space,
Typography,
} from '@arco-design/web-react';
import PermissionWrapper from '@/components/PermissionWrapper';
import { IconDownload, IconPlus } from '@arco-design/web-react/icon';
import axios from 'axios';
import useLocale from '@/utils/useLocale';
import SearchForm from './form';
import locale from './locale';
import styles from './style/index.module.less';
import './mock';
import { getColumns } from './constants';
const { Title } = Typography;
export const ContentType = ['图文', '横版短视频', '竖版短视频'];
export const FilterType = ['规则筛选', '人工'];
export const Status = ['已上线', '未上线'];
function SearchTable() {
const t = useLocale(locale);
const tableCallback = async (record, type) => {
console.log(record, type);
};
const columns = useMemo(() => getColumns(t, tableCallback), [t]);
const [data, setData] = useState([]);
const [pagination, setPatination] = useState<PaginationProps>({
sizeCanChange: true,
showTotal: true,
pageSize: 10,
current: 1,
pageSizeChangeResetCurrent: true,
});
const [loading, setLoading] = useState(true);
const [formParams, setFormParams] = useState({});
useEffect(() => {
fetchData();
}, [pagination.current, pagination.pageSize, JSON.stringify(formParams)]);
function fetchData() {
const { current, pageSize } = pagination;
setLoading(true);
axios
.get('/api/list', {
params: {
page: current,
pageSize,
...formParams,
},
})
.then((res) => {
setData(res.data.list);
setPatination({
...pagination,
current,
pageSize,
total: res.data.total,
});
setLoading(false);
});
}
function onChangeTable({ current, pageSize }) {
setPatination({
...pagination,
current,
pageSize,
});
}
function handleSearch(params) {
setPatination({ ...pagination, current: 1 });
setFormParams(params);
}
return (
<Card>
<Title heading={6}>{t['menu.list.searchTable']}</Title>
<SearchForm onSearch={handleSearch} />
<PermissionWrapper
requiredPermissions={[
{ resource: 'menu.list.searchTable', actions: ['write'] },
]}
>
<div className={styles['button-group']}>
<Space>
<Button type="primary" icon={<IconPlus />}>
{t['searchTable.operations.add']}
</Button>
<Button>{t['searchTable.operations.upload']}</Button>
</Space>
<Space>
<Button icon={<IconDownload />}>
{t['searchTable.operation.download']}
</Button>
</Space>
</div>
</PermissionWrapper>
<Table
rowKey="id"
loading={loading}
onChange={onChangeTable}
pagination={pagination}
columns={columns}
data={data}
/>
</Card>
);
}
export default SearchTable;