diff --git a/src/components/BugReportSection.tsx b/src/components/BugReportSection.tsx
new file mode 100644
index 0000000..a512fc6
--- /dev/null
+++ b/src/components/BugReportSection.tsx
@@ -0,0 +1,159 @@
+import React, { useState, useEffect } from 'react';
+import { List, Button, Form, Input, Select, message, Typography, Tag, Divider, Pagination } from 'antd';
+import { BugOutlined } from '@ant-design/icons';
+import WorkAPI from '../api/workApi';
+import type { BugReport } from '../api/otherType';
+
+const { Text } = Typography;
+const { Option } = Select;
+const { TextArea } = Input;
+
+interface BugReportForm {
+  title: string;
+  description: string;
+  severity: 'low' | 'medium' | 'high';
+}
+
+const BugReportSection: React.FC<{ workId: number }> = ({ workId }) => {
+  const [bugs, setBugs] = useState<BugReport[]>([]);
+  const [loading, setLoading] = useState(false);
+  const [form] = Form.useForm();
+  const [currentPage, setCurrentPage] = useState(1);
+  const [pageSize, setPageSize] = useState(5); // 每页显示5条
+
+  // 加载Bug反馈列表
+  useEffect(() => {
+    const loadBugs = async () => {
+      try {
+        setLoading(true);
+        const bugList = await WorkAPI.getBugReports(workId);
+        setBugs(bugList);
+      } catch (error) {
+        message.error('加载Bug反馈失败');
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    loadBugs();
+  }, [workId]);
+
+  // 获取当前页的Bug数据
+  const getCurrentPageBugs = () => {
+    const startIndex = (currentPage - 1) * pageSize;
+    const endIndex = startIndex + pageSize;
+    return bugs.slice(startIndex, endIndex);
+  };
+
+  // 提交Bug反馈
+  const handleSubmit = async (values: BugReportForm) => {
+    try {
+      await WorkAPI.reportBug(workId, values);
+      message.success('Bug反馈提交成功');
+      form.resetFields();
+      // 重新加载Bug列表
+      const bugList = await WorkAPI.getBugReports(workId);
+      setBugs(bugList);
+      // 重置到第一页
+      setCurrentPage(1);
+    } catch (error) {
+      message.error('Bug反馈提交失败');
+    }
+  };
+
+  const getSeverityColor = (severity: string) => {
+    switch (severity) {
+      case 'high': return 'red';
+      case 'medium': return 'orange';
+      default: return 'green';
+    }
+  };
+
+  return (
+    <div className="bug-report-section">
+      <Divider orientation="left">
+        <BugOutlined /> Bug反馈
+      </Divider>
+
+      <Form form={form} onFinish={handleSubmit} layout="vertical">
+        <Form.Item
+          name="title"
+          label="Bug标题"
+          rules={[{ required: true, message: '请输入Bug标题' }]}
+        >
+          <Input placeholder="简要描述Bug" />
+        </Form.Item>
+
+        <Form.Item
+          name="severity"
+          label="严重程度"
+          initialValue="medium"
+          rules={[{ required: true }]}
+        >
+          <Select>
+            <Option value="low">低</Option>
+            <Option value="medium">中</Option>
+            <Option value="high">高</Option>
+          </Select>
+        </Form.Item>
+
+        <Form.Item
+          name="description"
+          label="详细描述"
+          rules={[{ required: true, message: '请详细描述Bug' }]}
+        >
+          <TextArea rows={4} placeholder="请详细描述Bug出现的步骤、现象和预期结果" />
+        </Form.Item>
+
+        <Form.Item>
+          <Button type="primary" htmlType="submit">
+            提交Bug
+          </Button>
+        </Form.Item>
+      </Form>
+
+      <Divider orientation="left">Bug列表</Divider>
+
+      <List
+        dataSource={getCurrentPageBugs()}
+        loading={loading}
+        renderItem={bug => (
+          <List.Item>
+            <div className="bug-item">
+              <div className="bug-header">
+                <Text strong>{bug.title}</Text>
+                <Tag color={getSeverityColor(bug.severity)}>
+                  {bug.severity === 'high' ? '严重' : bug.severity === 'medium' ? '中等' : '轻微'}
+                </Tag>
+              </div>
+              <Text type="secondary">报告人: {bug.reporter} | 时间: {new Date(bug.createTime).toLocaleString()}</Text>
+              <div className="bug-content">
+                <Text>{bug.description}</Text>
+              </div>
+              <Tag color={bug.status === 'open' ? 'red' : bug.status === 'resolved' ? 'green' : 'gray'}>
+                {bug.status === 'open' ? '未解决' : bug.status === 'resolved' ? '已解决' : '不予解决'}
+              </Tag>
+            </div>
+          </List.Item>
+        )}
+      />
+
+      <div style={{ textAlign: 'right', marginTop: 16 }}>
+        <Pagination
+          current={currentPage}
+          pageSize={pageSize}
+          total={bugs.length}
+          onChange={(page, size) => {
+            setCurrentPage(page);
+            setPageSize(size);
+          }}
+          showSizeChanger
+          showQuickJumper
+          showTotal={total => `共 ${total} 条`}
+        />
+      </div>
+    </div>
+  );
+};
+
+export default BugReportSection;
\ No newline at end of file
