我是人,我做了悬赏中心,可以进行悬赏哦

Change-Id: I845de799a633be286a6fadee2b7aa533238c3652
diff --git a/src/pages/Bounty/List.tsx b/src/pages/Bounty/List.tsx
new file mode 100644
index 0000000..ca789c5
--- /dev/null
+++ b/src/pages/Bounty/List.tsx
@@ -0,0 +1,183 @@
+import React, { useState, useEffect } from 'react';
+import { Table, Button, message, Space, Modal } from 'antd';
+import axios from 'axios'; // 新增 axios 导入
+import { useNavigate } from 'umi';
+
+import { getBountyList } from '@/services/bounty/bounty';
+import BountyPublish from './BountyPublish';
+import BountyReply from './BountyReply';
+const BountyList: React.FC = () => {
+  const [dataSource, setDataSource] = useState<API.Bounty[]>([]);
+  const [loading, setLoading] = useState(false);
+  const [publishVisible, setPublishVisible] = useState(false);
+  const [replyVisible, setReplyVisible] = useState(false);
+  const [selectedId, setSelectedId] = useState<number | null>(null);
+
+  const navigate = useNavigate();
+
+  // 加载悬赏列表(修改请求方式)
+
+    const loadBountyList = async () => {
+      try {
+        setLoading(true);
+        const res = await getBountyList();
+
+        // 添加详细日志输出
+        console.log('接口原始响应:', res);
+
+        // 修改数据处理逻辑以适配实际数据结构
+        if (res && Array.isArray(res)) {
+          // 当接口直接返回数组时
+          setDataSource(res);
+        } else if (res && res.code === 200) {
+          // 当接口返回标准分页结构时
+          setDataSource(res.data.records || res.data || []);
+        } else {
+          throw new Error('接口返回异常结构');
+        }
+      } catch (err) {
+        console.error('加载数据异常:', err);
+        console.error('完整错误:', err);
+
+        // 添加网络错误处理
+        // @ts-ignore
+        if (err?.response?.status === 401) {
+          message.error('认证失效,请重新登录');
+          navigate('/login');
+        } else {
+          message.error('加载悬赏列表失败');
+        }
+      } finally {
+        setLoading(false);
+      }
+    };
+
+  useEffect(() => {
+    loadBountyList();
+  }, []);
+
+  // ✅ 发布成功回调(普通函数,无需useEffect)
+  const handlePublishSuccess = () => {
+    setPublishVisible(false);
+    loadBountyList(); // 重新加载数据
+    message.success('悬赏发布成功');
+  };
+
+  // ✅ 回复成功回调(普通函数,无需useEffect)
+  const handleReplySuccess = () => {
+    setReplyVisible(false);
+    loadBountyList(); // 重新加载数据
+    message.success('回复提交成功');
+  };
+
+
+  // 跳转详情页
+  const goDetail = (id: number) => {
+    navigate(`/bounty/detail/${id}`);
+  };
+
+  // 表格列配置
+  const columns = [
+    {
+      title: '标题',
+      dataIndex: 'title',
+      width: 200,
+      ellipsis: true,
+    },
+    {
+      title: '发布者ID',
+      dataIndex: 'creator_id', // ✅ 新增列
+      width: 100,
+      align: 'center' as const,
+    },
+    {
+      title: '奖励',
+      dataIndex: 'reward',
+      width: 100,
+      align: 'center' as const,
+    },
+    {
+      title: '状态',
+      dataIndex: 'status',
+      width: 100,
+      render: (status: number) => (
+        status === 0 ? '未回复' : status === 1 ? '已回复' : '已关闭'
+      )
+    },
+    {
+      title: '操作',
+      width: 160,
+      render: (value: unknown, record: API.Bounty) => (
+        <Space>
+          <Button
+            type="link"
+            onClick={() => navigate(`/bounty/detail/${record.id}`)}
+          >
+            查看详情
+          </Button>
+          <Button
+            type="link"
+            onClick={() => {
+              setSelectedId(record.id);
+              setReplyVisible(true);
+            }}
+          >
+            回复悬赏
+          </Button>
+        </Space>
+      )
+    }
+  ];
+
+  return (
+    <div className="page-container">
+      {/* 顶部操作区 */}
+      <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 16 }}>
+        <h2>悬赏列表</h2>
+        {/* 发布按钮 */}
+        <Button
+          type="primary"
+          onClick={() => setPublishVisible(true)}
+        >
+          发布悬赏
+        </Button>
+      </div>
+
+      {/* 悬赏列表 */}
+      <Table
+        dataSource={dataSource}
+        columns={columns}
+        rowKey="id"
+        pagination={{ pageSize: 10 }}
+        loading={loading}
+      />
+
+      {/* 发布悬赏模态框 */}
+      <Modal
+        title="发布新悬赏"
+        open={publishVisible}
+        onCancel={() => setPublishVisible(false)}
+        footer={null}
+      >
+        <BountyPublish onSuccess={handlePublishSuccess} />
+      </Modal>
+
+      {/* 回复悬赏模态框 */}
+      <Modal
+        title="回复悬赏"
+        open={replyVisible}
+        onCancel={() => setReplyVisible(false)}
+        footer={null}
+      >
+        {selectedId && (
+          <BountyReply
+            bountyId={selectedId}
+            onSuccess={handleReplySuccess}
+          />
+        )}
+      </Modal>
+    </div>
+  );
+};
+
+export default BountyList;