index.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import React, { useEffect, useState } from 'react';
  2. import { Button, Card, Form, Input, message, Modal, Space, Table } from 'antd';
  3. import { PlusCircleOutlined, ReloadOutlined, SearchOutlined } from '@ant-design/icons';
  4. import { PageContainer } from '@ant-design/pro-components';
  5. import type { ColumnsType } from 'antd/es/table';
  6. import Edit from './edit';
  7. import { delBanner, queryBanner } from '@/services/banner';
  8. interface DataType {
  9. name: string;
  10. level: string;
  11. record_id: string;
  12. }
  13. const BannerManagement: React.FC = () => {
  14. const [form] = Form.useForm();
  15. const [loading, setLoading] = useState(false);
  16. const [dataList, setDataList] = useState([]);
  17. const [editData, setEditData] = useState(null);
  18. const [visible, setVisible] = useState(false);
  19. const [searchData, setSearchData] = useState<object | null>({});
  20. const [pagination, setPagination] = useState({ total: 0, current: 1, pageSize: 10 });
  21. // 获取列表数据
  22. const getList = () => {
  23. const params = {
  24. q: 'page',
  25. current: pagination.current,
  26. pageSize: pagination.pageSize,
  27. ...searchData,
  28. };
  29. queryBanner(params).then((res) => {
  30. if (res && res.code === 0) {
  31. setDataList(res.data.list || []);
  32. setLoading(false);
  33. }
  34. });
  35. setDataList([]);
  36. setLoading(false);
  37. };
  38. useEffect(() => {
  39. setLoading(true);
  40. getList();
  41. }, []);
  42. const onFinish = () => {
  43. form.validateFields().then((data) => {
  44. setLoading(true);
  45. setSearchData(data);
  46. });
  47. };
  48. useEffect(() => {
  49. getList();
  50. }, [searchData]);
  51. // 分页切换
  52. const tableChange = () => {
  53. setLoading(true);
  54. const params = {
  55. q: 'page',
  56. current: pagination.current,
  57. pageSize: pagination.pageSize,
  58. ...searchData,
  59. };
  60. queryBanner(params).then((res) => {
  61. if (res?.code === 0) {
  62. setDataList(res?.data?.list || []);
  63. setPagination(res.data.pagination);
  64. setLoading(false);
  65. }
  66. });
  67. };
  68. // 重置
  69. const onReset = () => {
  70. form.resetFields();
  71. setLoading(true);
  72. setSearchData(null);
  73. };
  74. // 新增弹框打开
  75. const onAdd = () => {
  76. setEditData(null);
  77. setVisible(true);
  78. };
  79. // 编辑弹框打开
  80. const toEdit = (data: any) => {
  81. setEditData(data);
  82. setVisible(true);
  83. };
  84. // 编辑回调
  85. const onEditCallback = () => {
  86. setVisible(false);
  87. getList();
  88. };
  89. // 删除
  90. const toDel = (record: any) => {
  91. Modal.confirm({
  92. title: '删除',
  93. content: `确认删除banner图:[${record.title}]`,
  94. onOk: () => {
  95. delBanner(record.record_id)
  96. .then((res) => {
  97. if (res.code === 0) {
  98. message.success('删除成功');
  99. getList();
  100. } else {
  101. message.error('删除失败');
  102. }
  103. })
  104. .catch((e) => {
  105. message.error(e?.message);
  106. });
  107. },
  108. });
  109. };
  110. const columns: ColumnsType<DataType> = [
  111. {
  112. title: '序号',
  113. align: 'center',
  114. key: 'index',
  115. render: (_: any, row: any, index: number) => index + 1,
  116. },
  117. {
  118. title: '标题',
  119. dataIndex: 'title',
  120. key: 'title',
  121. },
  122. {
  123. title: '类型',
  124. dataIndex: 'type',
  125. key: 'type',
  126. },
  127. {
  128. title: '状态',
  129. dataIndex: 'status',
  130. key: 'status',
  131. render: (_, record: any) => {
  132. return <span>{{ 1: '停用', 2: '启用' }[record.status]}</span>;
  133. },
  134. },
  135. {
  136. title: '操作',
  137. key: 'action',
  138. render: (_, record) => (
  139. <Space size="middle">
  140. <a
  141. onClick={() => {
  142. toEdit(record);
  143. }}
  144. >
  145. 编辑
  146. </a>
  147. <a
  148. style={{ color: 'red' }}
  149. onClick={() => {
  150. toDel(record);
  151. }}
  152. >
  153. 删除
  154. </a>
  155. </Space>
  156. ),
  157. },
  158. ];
  159. return (
  160. <PageContainer>
  161. <div>
  162. <Card>
  163. <Form form={form} layout="inline" onFinish={onFinish}>
  164. <Form.Item name="name" label="区域名称">
  165. <Input placeholder="请输入区域名称" />
  166. </Form.Item>
  167. <Form.Item style={{ marginBottom: '10px' }}>
  168. <Space>
  169. <Button type="primary" htmlType="submit">
  170. <SearchOutlined />
  171. 查询
  172. </Button>
  173. <Button htmlType="button" onClick={onReset}>
  174. <ReloadOutlined />
  175. 重置
  176. </Button>
  177. </Space>
  178. </Form.Item>
  179. </Form>
  180. <Button htmlType="button" type="primary" style={{ margin: '20px 0' }} onClick={onAdd}>
  181. <PlusCircleOutlined />
  182. 新增banner图
  183. </Button>
  184. <Table
  185. columns={columns}
  186. dataSource={dataList}
  187. rowKey={(record) => record.record_id}
  188. pagination={pagination}
  189. loading={loading}
  190. onChange={tableChange}
  191. />
  192. {visible && <Edit editCallback={onEditCallback} params={editData} visible={visible} />}
  193. </Card>
  194. </div>
  195. </PageContainer>
  196. );
  197. };
  198. export default BannerManagement;