diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts
index ffad02f..919ae3b 100644
--- a/react-ui/config/routes.ts
+++ b/react-ui/config/routes.ts
@@ -73,6 +73,7 @@
       },
     ]
   },
+
   {
     name: 'tool',
     path: '/tool',
diff --git a/react-ui/package.json b/react-ui/package.json
index 4763d98..7c9ffe2 100644
--- a/react-ui/package.json
+++ b/react-ui/package.json
@@ -90,6 +90,7 @@
     "@types/react": "^18.3.0",
     "@types/react-dom": "^18.3.0",
     "@types/react-helmet": "^6.1.11",
+    "@types/react-highlight": "^0.12.8",
     "@umijs/fabric": "^2.14.1",
     "@umijs/lint": "^4.2.9",
     "@umijs/max": "^4.2.9",
diff --git a/react-ui/src/pages/Torrent/data.d.ts b/react-ui/src/pages/Torrent/data.d.ts
new file mode 100644
index 0000000..e16c819
--- /dev/null
+++ b/react-ui/src/pages/Torrent/data.d.ts
@@ -0,0 +1,59 @@
+
+
+/** 种子主表 */
+export interface BtTorrent {
+  /** 种子ID */
+  torrentId: number;
+  /** InfoHash */
+  infoHash: string;
+  /** 种子名称 */
+  name: string;
+  /** 总大小（字节） */
+  length: number;
+  /** 每个 piece 的长度 */
+  pieceLength: number;
+  /** piece 总数 */
+  piecesCount: number;
+  /** 创建工具（如 qBittorrent） */
+  createdBy: string;
+  /** .torrent 内的创建时间 */
+  torrentCreateTime: Date | null;
+  /** 上传用户ID（sys_user.userId） */
+  uploaderId: number;
+  /** 上传时间 */
+  uploadTime: Date;
+  /** 种子文件存储路径（服务器端路径或 URL） */
+  filePath: string;
+}
+
+/** 种子文件列表 */
+export interface BtTorrentFile {
+  /** 文件记录ID */
+  id: number;
+  /** 种子ID */
+  torrentId: number;
+  /** 文件路径 */
+  filePath: string;
+  /** 文件大小 */
+  fileSize: number;
+}
+
+/** announce 列表 */
+export interface BtTorrentAnnounce {
+  /** ID */
+  id: number;
+  /** 种子ID */
+  torrentId: number;
+  /** Tracker URL */
+  announceUrl: string;
+}
+
+/** 标签表（可选） */
+export interface BtTorrentTag {
+  /** ID */
+  id: number;
+  /** 种子ID */
+  torrentId: number;
+  /** 标签内容 */
+  tag: string;
+}
diff --git a/react-ui/src/pages/Torrent/index.tsx b/react-ui/src/pages/Torrent/index.tsx
new file mode 100644
index 0000000..6990da7
--- /dev/null
+++ b/react-ui/src/pages/Torrent/index.tsx
@@ -0,0 +1,186 @@
+import React, { useRef, useState } from 'react';
+import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined } from '@ant-design/icons';
+import {
+  Button,
+  Modal,
+  message,
+  Drawer,
+  Form,
+  Input,
+  InputNumber,
+  DatePicker,
+  Card,
+  Layout,
+} from 'antd';
+import {
+  ProTable,
+  ActionType,
+  ProColumns,
+  ProDescriptions,
+  ProDescriptionsItemProps,
+} from '@ant-design/pro-components';
+import type { BtTorrent } from './data';
+import {
+  listBtTorrent,
+  getBtTorrent,
+  addBtTorrent,
+  updateBtTorrent,
+  removeBtTorrent,
+} from './service';
+
+const { Content } = Layout;
+
+const BtTorrentPage: React.FC = () => {
+  const actionRef = useRef<ActionType>();
+  const [form] = Form.useForm();
+  const [modalVisible, setModalVisible] = useState(false);
+  const [drawerVisible, setDrawerVisible] = useState(false);
+  const [current, setCurrent] = useState<Partial<BtTorrent>>({});
+
+  const columns: ProColumns<BtTorrent>[] = [
+    {
+      title: '种子ID',
+      dataIndex: 'torrentId',
+      hideInForm: true,
+      render: (dom, entity) => (
+        <a
+          onClick={async () => {
+            const res = await getBtTorrent(entity.torrentId!);
+            setCurrent(res);
+            setDrawerVisible(true);
+          }}
+        >
+          {dom}
+        </a>
+      ),
+    },
+    { title: '名称', dataIndex: 'name' },
+    { title: 'infoHash', dataIndex: 'infoHash' },
+    { title: '大小 (bytes)', dataIndex: 'length', valueType: 'digit' },
+    { title: '分片大小', dataIndex: 'pieceLength', valueType: 'digit' },
+    { title: '片段数', dataIndex: 'piecesCount', valueType: 'digit' },
+    { title: '创建工具', dataIndex: 'createdBy', hideInSearch: true },
+    { title: '上传时间', dataIndex: 'uploadTime', valueType: 'dateTime', hideInSearch: true },
+    {
+      title: '操作',
+      valueType: 'option',
+      render: (_, record) => [
+        <Button key="view" type="link" icon={<EyeOutlined />} onClick={() => {
+          setCurrent(record);
+          setDrawerVisible(true);
+        }}>查看</Button>,
+        <Button key="edit" type="link" icon={<EditOutlined />} onClick={() => {
+          setCurrent(record);
+          form.setFieldsValue(record);
+          setModalVisible(true);
+        }}>编辑</Button>,
+        <Button key="delete" type="link" icon={<DeleteOutlined />} danger onClick={() => {
+          Modal.confirm({
+            title: '删除确认',
+            content: '确定删除该种子？',
+            onOk: async () => {
+              await removeBtTorrent([record.torrentId!]);
+              message.success('删除成功');
+              actionRef.current?.reload();
+            },
+          });
+        }}>删除</Button>,
+      ],
+    },
+  ];
+
+  const handleSubmit = async () => {
+    const values = await form.validateFields();
+    if (current?.torrentId) {
+      await updateBtTorrent({ ...current, ...values });
+      message.success('更新成功');
+    } else {
+      await addBtTorrent(values as BtTorrent);
+      message.success('新增成功');
+    }
+    setModalVisible(false);
+    form.resetFields();
+    actionRef.current?.reload();
+  };
+
+  return (
+    <Content>
+      <Card bordered={false}>
+        <ProTable<BtTorrent>
+          headerTitle="种子列表"
+          actionRef={actionRef}
+          rowKey="torrentId"
+          search={{ labelWidth: 100 }}
+          toolBarRender={() => [
+            <Button
+              key="add"
+              type="primary"
+              icon={<PlusOutlined />}
+              onClick={() => {
+                form.resetFields();
+                setCurrent({});
+                setModalVisible(true);
+              }}
+            >
+              新增
+            </Button>,
+          ]}
+          request={async (params) => {
+            const res = await listBtTorrent(params);
+            return { data: res.rows || res.data || [], success: true };
+          }}
+          columns={columns}
+        />
+
+        {/* 编辑/新增弹窗 */}
+        <Modal
+          title={current?.torrentId ? '编辑种子' : '新增种子'}
+          open={modalVisible}
+          onOk={handleSubmit}
+          onCancel={() => setModalVisible(false)}
+          destroyOnClose
+        >
+          <Form form={form} layout="vertical">
+            <Form.Item name="name" label="名称" rules={[{ required: true }]}>
+              <Input />
+            </Form.Item>
+            <Form.Item name="infoHash" label="infoHash" rules={[{ required: true }]}>
+              <Input />
+            </Form.Item>
+            <Form.Item name="length" label="总大小 (bytes)" rules={[{ required: true }]}>
+              <InputNumber style={{ width: '100%' }} />
+            </Form.Item>
+            <Form.Item name="pieceLength" label="分片大小" rules={[{ required: true }]}>
+              <InputNumber style={{ width: '100%' }} />
+            </Form.Item>
+            <Form.Item name="piecesCount" label="片段数">
+              <InputNumber style={{ width: '100%' }} />
+            </Form.Item>
+            <Form.Item name="createdBy" label="创建工具">
+              <Input />
+            </Form.Item>
+          </Form>
+        </Modal>
+
+        {/* 详情抽屉 */}
+        <Drawer
+          width={500}
+          open={drawerVisible}
+          onClose={() => setDrawerVisible(false)}
+          title="种子详情"
+        >
+          {current && (
+            <ProDescriptions<BtTorrent>
+              column={1}
+              title={current.name}
+              request={async () => ({ data: current })}
+              columns={columns as ProDescriptionsItemProps<BtTorrent>[]}
+            />
+          )}
+        </Drawer>
+      </Card>
+    </Content>
+  );
+};
+
+export default BtTorrentPage;
diff --git a/react-ui/src/pages/Torrent/service.ts b/react-ui/src/pages/Torrent/service.ts
new file mode 100644
index 0000000..c1d8e26
--- /dev/null
+++ b/react-ui/src/pages/Torrent/service.ts
@@ -0,0 +1,175 @@
+import { request } from '@umijs/max';
+import type {
+  BtTorrent,
+  BtTorrentFile,
+  BtTorrentAnnounce,
+  BtTorrentTag,
+} from '@/pages/Torrent/data'; // 假设你把 data.d.ts 放这里
+
+// ================================
+// 种子主表（bt_torrent）接口
+// ================================
+
+/** 查询种子列表 */
+export async function listBtTorrent(params?: Partial<BtTorrent>) {
+  const queryString = params ? `?${new URLSearchParams(params as any)}` : '';
+  return request(`/api/system/torrent/list${queryString}`, {
+    method: 'get',
+  });
+}
+
+/** 获取种子详情 */
+export async function getBtTorrent(torrentId: number) {
+  return request<BtTorrent>(`/api/system/torrent/${torrentId}`, {
+    method: 'get',
+  });
+}
+
+/** 新增种子 */
+export async function addBtTorrent(data: BtTorrent) {
+  return request('/api/system/torrent', {
+    method: 'post',
+    data,
+  });
+}
+
+/** 修改种子 */
+export async function updateBtTorrent(data: BtTorrent) {
+  return request('/api/system/torrent', {
+    method: 'put',
+    data,
+  });
+}
+
+/** 删除种子（支持批量） */
+export async function removeBtTorrent(torrentIds: number[]) {
+  return request(`/api/system/torrent/${torrentIds.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// 种子文件（bt_torrent_file）接口
+// ================================
+
+/** 查询种子文件列表 */
+export async function listBtTorrentFile(params?: Partial<BtTorrentFile>) {
+  const queryString = params ? `?${new URLSearchParams(params as any)}` : '';
+  return request(`/api/system/file/list${queryString}`, {
+    method: 'get',
+  });
+}
+
+/** 获取文件详情 */
+export async function getBtTorrentFile(id: number) {
+  return request<BtTorrentFile>(`/api/system/file/${id}`, {
+    method: 'get',
+  });
+}
+
+/** 新增文件 */
+export async function addBtTorrentFile(data: BtTorrentFile) {
+  return request('/api/system/file', {
+    method: 'post',
+    data,
+  });
+}
+
+/** 修改文件 */
+export async function updateBtTorrentFile(data: BtTorrentFile) {
+  return request('/api/system/file', {
+    method: 'put',
+    data,
+  });
+}
+
+/** 删除文件（支持批量） */
+export async function removeBtTorrentFile(ids: number[]) {
+  return request(`/api/system/file/${ids.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// Tracker 列表（bt_torrent_announce）接口
+// ================================
+
+/** 查询 Tracker 列表 */
+export async function listBtTorrentAnnounce(params?: Partial<BtTorrentAnnounce>) {
+  const queryString = params ? `?${new URLSearchParams(params as any)}` : '';
+  return request(`/api/system/announce/list${queryString}`, {
+    method: 'get',
+  });
+}
+
+/** 获取单个 Tracker */
+export async function getBtTorrentAnnounce(id: number) {
+  return request<BtTorrentAnnounce>(`/api/system/announce/${id}`, {
+    method: 'get',
+  });
+}
+
+/** 新增 Tracker */
+export async function addBtTorrentAnnounce(data: BtTorrentAnnounce) {
+  return request('/api/system/announce', {
+    method: 'post',
+    data,
+  });
+}
+
+/** 修改 Tracker */
+export async function updateBtTorrentAnnounce(data: BtTorrentAnnounce) {
+  return request('/api/system/announce', {
+    method: 'put',
+    data,
+  });
+}
+
+/** 删除 Tracker（支持批量） */
+export async function removeBtTorrentAnnounce(ids: number[]) {
+  return request(`/api/system/announce/${ids.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// 种子标签（bt_torrent_tags）接口
+// ================================
+
+/** 查询标签列表 */
+export async function listBtTorrentTags(params?: Partial<BtTorrentTag>) {
+  const queryString = params ? `?${new URLSearchParams(params as any)}` : '';
+  return request(`/api/system/tags/list${queryString}`, {
+    method: 'get',
+  });
+}
+
+/** 获取标签详情 */
+export async function getBtTorrentTag(id: number) {
+  return request<BtTorrentTag>(`/api/system/tags/${id}`, {
+    method: 'get',
+  });
+}
+
+/** 新增标签 */
+export async function addBtTorrentTag(data: BtTorrentTag) {
+  return request('/api/system/tags', {
+    method: 'post',
+    data,
+  });
+}
+
+/** 修改标签 */
+export async function updateBtTorrentTag(data: BtTorrentTag) {
+  return request('/api/system/tags', {
+    method: 'put',
+    data,
+  });
+}
+
+/** 删除标签（支持批量） */
+export async function removeBtTorrentTag(ids: number[]) {
+  return request(`/api/system/tags/${ids.join(',')}`, {
+    method: 'delete',
+  });
+}
diff --git a/react-ui/src/pages/Tracker/Projects/index.tsx b/react-ui/src/pages/Tracker/Projects/index.tsx
new file mode 100644
index 0000000..b5bf106
--- /dev/null
+++ b/react-ui/src/pages/Tracker/Projects/index.tsx
@@ -0,0 +1,203 @@
+import React, { useState, useRef, useEffect } from 'react';
+import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined } from '@ant-design/icons';
+import {
+  Button,
+  message,
+  Drawer,
+  Modal,
+  Form,
+  Input,
+  Select,
+  DatePicker,
+  Card,
+  Layout,
+} from 'antd';
+import type { FormInstance } from 'antd';
+import {
+  ProTable,
+  ActionType,
+  ProColumns,
+  FooterToolbar,
+  ProDescriptions,
+  ProDescriptionsItemProps,
+} from '@ant-design/pro-components';
+import type { TrackerProject } from '../data.d.ts';
+import {
+  listTrackerProject,
+  getTrackerProject,
+  addTrackerProject,
+  updateTrackerProject,
+  removeTrackerProject,
+} from '../service';
+
+const { Content } = Layout;
+
+const TrackerProjectPage: React.FC = () => {
+  const actionRef = useRef<ActionType>();
+  const [detailVisible, setDetailVisible] = useState(false);
+  const [editVisible, setEditVisible] = useState(false);
+  const [current, setCurrent] = useState<TrackerProject>();
+  const [form] = Form.useForm();
+
+  const columns: ProColumns<TrackerProject>[] = [
+    {
+      title: '项目ID',
+      dataIndex: 'projectId',
+      render: (_, row) => (
+        <a
+          onClick={async () => {
+            const res = await getTrackerProject(row.projectId!);
+            setCurrent(res.data);
+            setDetailVisible(true);
+          }}
+        >
+          {row.projectId}
+        </a>
+      ),
+    },
+    { title: '项目名称', dataIndex: 'projectName' },
+    { title: '描述', dataIndex: 'description', hideInSearch: true },
+    { title: '状态', dataIndex: 'status', valueEnum: { active: { text: '激活' }, inactive: { text: '不活跃' } } },
+    { title: '创建者', dataIndex: 'createBy', hideInSearch: true },
+    { title: '创建时间', dataIndex: 'createTime', hideInSearch: true },
+    { title: '更新时间', dataIndex: 'updateTime', hideInSearch: true },
+    {
+      title: '操作',
+      valueType: 'option',
+      render: (_, row) => [
+        <Button
+          key="view"
+          type="link"
+          icon={<EyeOutlined />}
+          onClick={async () => {
+            const res = await getTrackerProject(row.projectId!);
+            setCurrent(res.data);
+            setDetailVisible(true);
+          }}
+        >
+          查看
+        </Button>,
+        <Button
+          key="edit"
+          type="link"
+          icon={<EditOutlined />}
+          onClick={() => {
+            setCurrent(row);
+            form.setFieldsValue(row);
+            setEditVisible(true);
+          }}
+        >
+          编辑
+        </Button>,
+        <Button
+          key="delete"
+          type="link"
+          icon={<DeleteOutlined />}
+          danger
+          onClick={() => {
+            Modal.confirm({
+              title: '删除项目',
+              content: '确认删除该项目？',
+              onOk: async () => {
+                await removeTrackerProject([row.projectId!]);
+                message.success('删除成功');
+                actionRef.current?.reload();
+              },
+            });
+          }}
+        >
+          删除
+        </Button>,
+      ],
+    },
+  ];
+
+  /** 新增或更新 */
+  const handleSubmit = async (values: any) => {
+    if (current?.projectId) {
+      await updateTrackerProject({ ...current, ...values });
+      message.success('更新成功');
+    } else {
+      await addTrackerProject(values);
+      message.success('新增成功');
+    }
+    setEditVisible(false);
+    actionRef.current?.reload();
+  };
+
+  return (
+    <Content>
+      <Card bordered={false}>
+        <ProTable<TrackerProject>
+          headerTitle="项目列表"
+          actionRef={actionRef}
+          rowKey="projectId"
+          search={{ labelWidth: 100 }}
+          toolBarRender={() => [
+            <Button
+              key="add"
+              type="primary"
+              icon={<PlusOutlined />}
+              onClick={() => {
+                form.resetFields();
+                setCurrent(undefined);
+                setEditVisible(true);
+              }}
+            >
+              新增
+            </Button>,
+          ]}
+          request={async (params) => {
+            const res = await listTrackerProject(params);
+            return { data: res.rows, success: true, total: res.total };
+          }}
+          columns={columns}
+        />
+
+        {/* 详情 Drawer */}
+        <Drawer
+          width={500}
+          open={detailVisible}
+          onClose={() => setDetailVisible(false)}
+        >
+          {current && (
+            <ProDescriptions<TrackerProject>
+              column={1}
+              title="项目详情"
+              dataSource={current}
+              columns={columns as ProDescriptionsItemProps<TrackerProject>[]}
+            />
+          )}
+        </Drawer>
+
+        {/* 新增/编辑 Modal */}
+        <Modal
+          title={current?.projectId ? '编辑项目' : '新增项目'}
+          open={editVisible}
+          onCancel={() => setEditVisible(false)}
+          onOk={() => {
+            form.validateFields().then(handleSubmit);
+          }}
+        >
+          <Form form={form} layout="vertical">
+            <Form.Item name="projectName" label="项目名称" rules={[{ required: true }]}>
+              <Input />
+            </Form.Item>
+            <Form.Item name="description" label="描述">
+              <Input.TextArea />
+            </Form.Item>
+            <Form.Item name="status" label="状态" initialValue="active">
+              <Select>
+                <Select.Option value="active">激活</Select.Option>
+                <Select.Option value="inactive">不活跃</Select.Option>
+              </Select>
+            </Form.Item>
+            {/* TODO: 补充其他字段 */}
+          </Form>
+        </Modal>
+      </Card>
+    </Content>
+  );
+};
+
+export default TrackerProjectPage;
diff --git a/react-ui/src/pages/Tracker/data.d.ts b/react-ui/src/pages/Tracker/data.d.ts
new file mode 100644
index 0000000..be71092
--- /dev/null
+++ b/react-ui/src/pages/Tracker/data.d.ts
@@ -0,0 +1,71 @@
+// data.d.ts
+
+/** 项目表 */
+export interface TrackerProject {
+  /** 项目ID */
+  projectId: number;
+  /** 项目名称 */
+  projectName: string;
+  /** 项目描述 */
+  description: string;
+  /** 项目状态（active: 激活, inactive: 不活跃） */
+  status: 'active' | 'inactive';
+  /** 创建者 */
+  createBy: string;
+  /** 创建时间 */
+  createTime: Date | null;
+  /** 更新者 */
+  updateBy: string;
+  /** 更新时间 */
+  updateTime: Date | null;
+}
+
+/** 项目与用户关联表 */
+export interface TrackerProjectUser {
+  /** 项目ID */
+  projectId: number;
+  /** 用户ID */
+  userId: number;
+  /** 角色（管理员、成员等） */
+  role: string;
+  /** 加入时间 */
+  createTime: Date;
+}
+
+/** 任务表 */
+export interface TrackerTask {
+  /** 任务ID */
+  taskId: number;
+  /** 所属项目ID */
+  projectId: number;
+  /** 任务名称 */
+  taskName: string;
+  /** 任务描述 */
+  description: string;
+  /** 分配给的用户ID */
+  assignedTo: number;
+  /** 任务状态（open: 待办, in_progress: 进行中, closed: 完成） */
+  status: 'open' | 'in_progress' | 'closed';
+  /** 任务优先级（low, medium, high） */
+  priority: 'low' | 'medium' | 'high';
+  /** 创建时间 */
+  createTime: Date | null;
+  /** 更新时间 */
+  updateTime: Date | null;
+}
+
+/** 任务日志表 */
+export interface TrackerTaskLog {
+  /** 日志ID */
+  logId: number;
+  /** 任务ID */
+  taskId: number;
+  /** 操作用户ID */
+  userId: number;
+  /** 操作类型（创建、更新、删除） */
+  action: '创建' | '更新' | '删除';
+  /** 操作描述 */
+  description: string;
+  /** 创建时间 */
+  createTime: Date | null;
+}
diff --git a/react-ui/src/pages/Tracker/service.ts b/react-ui/src/pages/Tracker/service.ts
new file mode 100644
index 0000000..c550cf4
--- /dev/null
+++ b/react-ui/src/pages/Tracker/service.ts
@@ -0,0 +1,199 @@
+import { request } from '@umijs/max';
+import type {
+  TrackerProject,
+  TrackerProjectUser,
+  TrackerTask,
+  TrackerTaskLog,
+} from '@/pages/Tracker/data';
+
+// ================================
+// 项目接口
+// ================================
+
+/** 查询项目分页列表 */
+export async function listTrackerProject(params?: TrackerProject) {
+  const queryString = params
+    ? `?${new URLSearchParams(params as Record<string, any>).toString()}`
+    : '';
+  return request(`/api/tracker/project/list${queryString}`, {
+    data: params,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8',
+    },
+  });
+}
+
+/** 获取单个项目详情 */
+export async function getTrackerProject(projectId: number) {
+  return request<TrackerProject>(`/api/tracker/project/${projectId}`, {
+    method: 'get',
+  });
+}
+
+/** 新增项目 */
+export async function addTrackerProject(data: TrackerProject) {
+  return request('/api/tracker/project', {
+    data,
+    method: 'post',
+  });
+}
+
+/** 更新项目 */
+export async function updateTrackerProject(data: TrackerProject) {
+  return request('/api/tracker/project', {
+    data,
+    method: 'put',
+  });
+}
+
+/** 删除项目（支持批量，传入 ID 数组） */
+export async function removeTrackerProject(projectIds: number[]) {
+  return request(`/api/tracker/project/${projectIds.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// 项目与用户关联接口
+// ================================
+
+/** 查询项目-用户关联分页列表 */
+export async function listTrackerProjectUser(params?: TrackerProjectUser) {
+  const queryString = params
+    ? `?${new URLSearchParams(params as Record<string, any>).toString()}`
+    : '';
+  return request(`/api/tracker/user/list${queryString}`, {
+    data: params,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8',
+    },
+  });
+}
+
+/** 获取单个项目-用户关联详情 */
+export async function getTrackerProjectUser(projectId: number) {
+  return request<TrackerProjectUser>(`/api/tracker/user/${projectId}`, {
+    method: 'get',
+  });
+}
+
+/** 新增项目-用户关联 */
+export async function addTrackerProjectUser(data: TrackerProjectUser) {
+  return request('/api/tracker/user', {
+    data,
+    method: 'post',
+  });
+}
+
+/** 更新项目-用户关联 */
+export async function updateTrackerProjectUser(data: TrackerProjectUser) {
+  return request('/api/tracker/user', {
+    data,
+    method: 'put',
+  });
+}
+
+/** 删除项目-用户关联（支持批量，传入项目 ID 数组） */
+export async function removeTrackerProjectUser(projectIds: number[]) {
+  return request(`/api/tracker/user/${projectIds.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// 任务接口
+// ================================
+
+/** 查询任务分页列表 */
+export async function listTrackerTask(params?: TrackerTask) {
+  const queryString = params
+    ? `?${new URLSearchParams(params as Record<string, any>).toString()}`
+    : '';
+  return request(`/api/tracker/task/list${queryString}`, {
+    data: params,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8',
+    },
+  });
+}
+
+/** 获取单个任务详情 */
+export async function getTrackerTask(taskId: number) {
+  return request<TrackerTask>(`/api/tracker/task/${taskId}`, {
+    method: 'get',
+  });
+}
+
+/** 新增任务 */
+export async function addTrackerTask(data: TrackerTask) {
+  return request('/api/tracker/task', {
+    data,
+    method: 'post',
+  });
+}
+
+/** 更新任务 */
+export async function updateTrackerTask(data: TrackerTask) {
+  return request('/api/tracker/task', {
+    data,
+    method: 'put',
+  });
+}
+
+/** 删除任务（支持批量，传入任务 ID 数组） */
+export async function removeTrackerTask(taskIds: number[]) {
+  return request(`/api/tracker/task/${taskIds.join(',')}`, {
+    method: 'delete',
+  });
+}
+
+// ================================
+// 任务日志接口
+// ================================
+
+/** 查询任务日志分页列表 */
+export async function listTrackerTaskLog(params?: TrackerTaskLog) {
+  const queryString = params
+    ? `?${new URLSearchParams(params as Record<string, any>).toString()}`
+    : '';
+  return request(`/api/tracker/log/list${queryString}`, {
+    data: params,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8',
+    },
+  });
+}
+
+/** 获取单个任务日志详情 */
+export async function getTrackerTaskLog(logId: number) {
+  return request<TrackerTaskLog>(`/api/tracker/log/${logId}`, {
+    method: 'get',
+  });
+}
+
+/** 新增任务日志 */
+export async function addTrackerTaskLog(data: TrackerTaskLog) {
+  return request('/api/tracker/log', {
+    data,
+    method: 'post',
+  });
+}
+
+/** 更新任务日志 */
+export async function updateTrackerTaskLog(data: TrackerTaskLog) {
+  return request('/api/tracker/log', {
+    data,
+    method: 'put',
+  });
+}
+
+/** 删除任务日志（支持批量，传入日志 ID 数组） */
+export async function removeTrackerTaskLog(logIds: number[]) {
+  return request(`/api/tracker/log/${logIds.join(',')}`, {
+    method: 'delete',
+  });
+}
